mirror of
https://github.com/feigeCode/navop.git
synced 2026-09-22 00:01:25 +00:00
现象:内置 AI 里让模型保存连接时,整个任务直接失败:
模型调用失败: Invalid request: OpenAI: Invalid schema for function
'connections_save': schema must have type 'object' and not have
'oneOf'/'anyOf'/'allOf'/'enum'/'const'/'not' at the top level
根因有两层:
1. `connections.save` 的工具参数 schema 用顶层 `oneOf` 表达「创建 or 更新」,
分支里还带 `not`。provider 要求工具参数 schema 顶层是纯 object,遇到这些
组合关键字会拒绝整个模型请求,而不是拒绝这一个工具——所以是任务级失败。
2. 本仓的 `validate_function_calling_schema` 当时只要求顶层是 object、组合
分支自身是 object,因此放行了这份 schema,直到请求发到 provider 才炸,且
报错只带函数名,很难定位到具体工具。
修复:
- `connections.save` 改为扁平 object schema,把「不带 id 即创建、带 id 即更新」
写进 schema/字段描述,二选一约束仍由运行时 `save` 按是否携带 `id` 分流,行为
与之前一致。
- `agent_runtime` 的 function-calling 校验新增顶层关键字拦截
(oneOf/anyOf/allOf/enum/const/not),本地就报错并带上工具名与指针;嵌套层
(如 `properties.*` 内的 anyOf)不受影响。
验证:
- `cargo test -p navop_runtime --lib connections::` → 46 passed
- `cargo test -p agent_runtime --lib tools::spec` → 10 passed
- `cargo test -p main --bin navop
agent_runtime_tool_schemas_convert_to_function_calling` → 1 passed
- 新增回归契约:连接工具 schema 顶层 provider-safe;LLM 边界上所有已暴露工具都
必须能转换成 llm-connector 工具定义(旧代码下该测试必红)。