参考:https://blog.csdn.net/qq_42869979/article/details/146226982

https://blog.csdn.net/gitblog_01417/article/details/150336713

Openai agent 调用时报错:

Error code: 400 - {‘object’: ‘error’, ‘message’: ‘“auto” tool choice requires --enable-auto-tool-choice and --tool-call-parser to be set’, ‘type’: ‘BadRequestError’, ‘param’: None, ‘code’: 400}

这个问题通常出现在使用 vLLM 或 Spring AI 等框架时,尤其是在尝试使用 "tool_choice": "auto" 时未配置必要的启动参数。

解决方法如下:

1. 启动 vLLM 服务时添加必要参数

如果你是通过 vLLM 启动服务,必须在启动命令中加入以下两个参数:

--enable-auto-tool-choice --tool-call-parser hermes 
  • --enable-auto-tool-choice:启用自动工具选择功能
  • --tool-call-parser hermes:指定使用Hermes格式解析工具调用

例如完整启动命令为:

nohup python -m vllm.entrypoints.openai.api_server \

--host 0.0.0.0 \

--port 3000 \

--model /data/Qwen/Qwen2.5-32B-Instruct-AWQ \

--tensor-parallel-size 2 \

--served-model-name Qwen25-32B-Chat-AWQ-A100 \

--quantization awq \

--gpu-memory-utilization 0.9 \

--trust-remote-code \

--enable-auto-tool-choice \

--tool-call-parser hermes \

--disable-log-request \

--enforce-eager \

--max-model-len 20000 \

>> /data/log/Qwen2.5-32B-Chat-AWQ.log 2>&1 &

2. 若使用 Spring AI 框架

确保在调用 AI 服务时,服务端已启用上述参数。如果使用的是 Spring 框架,还需检查客户端是否正确设置了工具调用逻辑,并确认服务端启动参数正确。

3. 模型选择要求

确保你使用的模型支持工具调用功能,如带有 Instruct 后缀的模型(例如 Qwen2.5-7B-Instruct),并避免使用不支持工具调用的模型(如 DeepSeek-R1 系列)。

4. 验证工具调用逻辑

确保客户端请求中使用了正确的 tool_choice 参数,如:

"tool_choice": "auto"

通过以上配置,可以有效避免因缺少必要参数导致的工具调用异常。

==========================================

可否在服务端不启用参数的其他解决办法

在服务端不启用 --enable-auto-tool-choice 和 --tool-call-parser 参数的情况下,依然可以实现工具调用功能,但需要在客户端进行相应的适配和处理。以下是几种可行的替代方案:


✅ 方案一:手动指定工具调用(而非使用 "auto"

你可以通过在请求中显式指定要使用的工具,而不是依赖 "auto" 模式。例如:

{ "tool_choice": { "type": "function", "function": { "name": "get_weather" } } } 

这样,即使服务端未启用自动工具选择,也可以通过手动指定工具来完成调用。


✅ 方案二:使用支持工具调用的模型并自定义工具格式

如果你使用的是支持工具调用的模型(如 Qwen2.5 系列、Llama3 系列等),你可以:

  • 在客户端构建符合模型要求的工具调用格式;
  • 将工具定义和调用逻辑封装在请求中;
  • 服务端仅需支持模型的推理能力,而不需要开启 --enable-auto-tool-choice

这种方式适用于你对模型和工具调用逻辑有较强控制能力的场景。


✅ 方案三:通过中间件或代理层处理工具调用

你可以通过部署一个中间层(如 API 网关或服务代理)来处理工具调用逻辑。这个中间层:

  • 接收客户端请求;
  • 根据上下文判断是否需要调用工具;
  • 构造符合模型要求的工具调用格式;
  • 将请求转发给模型服务;
  • 处理模型返回的工具调用结果并返回给客户端。

这种方式可以绕过服务端参数限制,同时保持逻辑清晰。


✅ 方案四:使用非工具调用模式(如返回 JSON 格式)

如果模型不支持工具调用,你可以通过以下方式实现类似功能:

  • 让模型返回一个结构化的 JSON 字符串,描述需要调用的工具和参数;
  • 客户端解析该 JSON 并调用实际工具;
  • 将工具调用结果传回模型,作为下一轮对话的输入。

这种方式虽然不是真正的“工具调用”,但可以实现类似功能。


以上方案均无需在服务端启用 --enable-auto-tool-choice 和 --tool-call-parser 参数,可根据实际需求灵活选择。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐