把 Agent 运行时、工具执行和状态存储拆开看,Qoni 承担运行时比较自然;工具执行到底放平台还是自建回调,取决于超时控制权、重试策略和内网可达性;状态存储则按生命周期选择平台侧或自建库。没有一种归属能覆盖所有工具,建议先用一个最小工具在两条路径上各跑一遍,用日志和页面记录实际表现,再决定每个工具的落位。
工具执行归属不宜一刀切。平台内置执行适合公网可达、超时和重试由平台托管、不想额外维护服务的场景;自建回调适合需要访问内网、要自行控制超时阈值与重试细节、并且能接受维护回调服务的场景。可以先在 Qoni 侧配置一个测试 Agent,对同一工具分别走平台内置和自建回调,记录端到端耗时、失败信息原文和重试次数,再按记录结果分配。风险边界:平台侧超时和重试参数可能不可调,自建回调需要处理鉴权和网络放行,两者都要以控制台页面和实际日志为准。
列出工具调用的两种执行归属
在 Qoni 上,工具调用通常有两种落位:平台内置执行和自建回调。先把它们的前置条件、网络要求和鉴权方式摆出来,再判断具体工具适合哪种。
| 对比项 | 平台内置执行 | 自建回调 |
|---|---|---|
| 前置条件 | 在 Qoni 控制台注册工具,提供工具名称、入参 schema、工具服务公网可达 | 有一个可被 Qoni 访问的回调地址,服务端实现请求校验和业务逻辑,需要自行部署与运维 |
| 网络要求 | Qoni 平台能访问工具服务端点,通常要求 HTTPS,工具服务不能只在内网 | Qoni 平台能访问回调地址;若工具要访问内网资源,回调服务需部署在能访问内网的网段,平台到回调这段网络打通 |
| 鉴权方式 | 平台侧保存 API Key、OAuth 凭证或自定义 Header,工具服务校验 | 平台侧配置鉴权头(如 Authorization: Bearer token),回调服务校验签名或共享密钥 |
如果工具只查询公网接口、不需要接触内网,平台内置执行通常更省事;如果工具要连内网数据库、内部 API 或需要自定义超时重试,自建回调路径更合适。下面逐项对比超时、重试和错误返回。
逐项对比超时、重试与错误返回的表现
超时阈值、重试次数和错误信息粒度,不能凭推测,需要在 Qoni 控制台工具配置页和自建回调服务日志中确认。建议按下面表格逐项记录实测值,不要用默认值替代。
| 观察项 | 平台内置执行(实测填写) | 自建回调(实测填写) |
|---|---|---|
| 超时阈值 | 在工具配置页查看,记录单位与默认值 | 在回调服务框架或网关配置中查看 |
| 重试次数 | 在工具配置页或平台日志中查看 | 在回调服务日志或平台重试策略中查看 |
| 超时后错误返回原文 | 复制平台返回的错误码与消息 | 复制回调服务返回的 HTTP 状态码与响应体 |
| 鉴权失败错误返回原文 | 复制平台鉴权失败提示 | 复制回调服务返回的 401/403 原文 |
| 服务端故障错误返回原文 | 复制平台对工具 5xx 的封装信息 | 复制回调服务原始错误或网关错误页 |
错误信息粒度通常不同:平台内置执行返回的是平台封装后的错误摘要,便于 Agent 识别但可能丢失原始堆栈;自建回调可以返回原始 HTTP 状态码和业务错误体,但需要在回调服务里自己保证错误格式统一。记录时直接复制原文,不要改写。
为需要内网访问的工具保留自建回调路径
工具需要访问内网数据库、内部管理接口或只能在私有子网调用的服务时,通常不要让 Qoni 平台直接连内网,而是加一层自建回调服务做中转。回调地址一般配置在 Qoni 工具配置页的“回调 URL”或“Webhook URL”字段;鉴权头在工具配置的 Header 区域填写;网络侧需要在防火墙或安全组放行 Qoni 平台出口 IP 到回调服务的入站端口。
下面是一个通用的回调接入骨架,替换掉地址、令牌和校验逻辑即可:
# Qoni 工具配置页(示例字段名)
回调地址: https://your-callback.example.com/qoni/tool
鉴权头:
Authorization: Bearer {QONI_CALLBACK_TOKEN}
X-Qoni-Timestamp: {timestamp}
X-Qoni-Signature: sha256={hmac}
# 回调服务侧处理骨架
POST /qoni/tool
1. 读取 Header 中的 Authorization 和 X-Qoni-Signature
2. 用共享密钥校验签名和时间戳窗口
3. 解析 body 中的 tool、args
4. 访问内网资源并返回 JSON
5. 记录请求日志,包含 request_id、耗时、错误原文
白名单放行项通常包括:源地址为 Qoni 平台出口 IP 或 IP 段,目标端口为回调服务监听端口(常见 443),协议 TCP。如果 Qoni 提供出口 IP 列表,建议直接加入防火墙白名单;如果出口 IP 不固定,可以改用带鉴权的网关或只暴露回调路径,不要开放整个内网。
固定输入分别跑两条路径并记录数据
选一个无副作用的工具,例如回显参数或只读查询,准备同一组固定输入。在 Qoni 侧分别创建平台内置工具和自建回调工具,各跑若干次(建议至少 5 次),逐次记录端到端耗时、失败信息原文和重试次数。端到端耗时从发起调用开始,到收到最终响应结束;失败信息原文直接从平台日志或回调服务访问日志复制;重试次数记录平台侧和回调侧各自实际发生的重试。
| 运行序号 | 路径 | 端到端耗时(ms) | 失败信息原文 | 重试次数 |
|---|---|---|---|---|
| 1 | 平台内置 | |||
| 2 | 平台内置 | |||
| 3 | 自建回调 | |||
| 4 | 自建回调 | |||
| 5 | 两条路径各再补 |
记录时不要填入预估数字,只填实际观察到的值。若某次调用成功,失败信息原文留空;若平台侧没有暴露重试次数,写“平台未显示”并附上日志行。跑完两条路径后,对比超时触发点、错误可读性和重试是否带来额外副作用,再决定该工具放在哪一侧。
写出运行时、工具、状态三部分的归属表
把上面的记录整理成一张归属表,作为后续新增工具和调整配置的依据。组件、执行位置、关键配置项、失败兜底动作四列,按实际环境填写。
| 组件 | 执行位置 | 关键配置项 | 失败兜底动作 |
|---|---|---|---|
| Agent 运行时 | Qoni 平台 | 会话超时、并发上限、模型参数、工具调用白名单 | 超时后返回可读错误;有副作用的工具不自动重试 |
| 工具-公网查询 | Qoni 平台内置 | 工具描述、入参 schema、超时阈值、重试次数、鉴权密钥 | 重试到上限后返回平台错误码,必要时降级为提示 |
| 工具-内网查询 | 自建回调 | 回调 URL、鉴权头、连接内网超时、重试策略、白名单 | 回调返回 5xx 后由平台按配置重试或告警,不阻塞其他工具 |
| 短期会话状态 | Qoni 平台 | 会话 ID、状态 TTL、上下文窗口 | 状态丢失时重新初始化会话,不把旧状态写回 |
| 长期业务状态 | 自建数据库或 Redis | 连接串、表结构、备份策略、写入重试 | 写入失败先记录队列或日志,再告警,不阻塞主流程 |
这张表不需要一次定死。新增工具时先判断它是否需要内网访问、超时和重试是否要自己控制,再对照已有记录选择执行位置。每次调整后,用同一组固定输入再跑一遍两条路径,确认配置变化没有引入新的超时或鉴权问题。