使用OpenAI Agent SDK与Ollama实现函数调用失败,寻求解决方案
OpenAI Agent SDK与Ollama实现函数调用失败,寻求解决方案
我之前也碰到过类似的兼容性问题,结合你的代码和错误栈分析,这个TypeError: Cannot instantiate typing.Union错误主要是因为OpenAI Agent SDK在处理非官方OpenAI服务(比如Ollama)的工具调用时,类型序列化环节出现了兼容问题。以下是几个经过验证的解决方案:
1. 降级OpenAI Agent SDK版本
openai-agents 0.0.15版本在Python 3.12环境下,对非OpenAI官方服务的工具调用类型处理存在bug。你可以尝试降级到更稳定的0.0.14版本:
uv remove openai-agents uv add openai-agents==0.0.14
2. 确保Ollama模型与服务支持函数调用
部分开源模型需要明确配置才能启用函数调用能力,你可以:
- 重新拉取最新的qwen3:4b模型,确保模型本身支持函数调用:
ollama pull qwen3:4b - 启动Ollama服务时添加环境变量,强制开启工具调用支持:
OLLAMA_TOOL_CALLS=true ollama serve(部分模型需要此配置)
3. 优化代码中的模型与Agent配置
调整模型初始化参数,明确要求模型使用标准工具调用格式,同时强化Agent的指令,避免模型直接回答:
# 修改模型初始化部分 ollama_qwen3_4b_model = OpenAIChatCompletionsModel( model=model, openai_client=ollama_client, tool_choice="auto", # 强制模型选择合适的工具 response_format={"type": "json_object"} # 要求返回JSON格式的工具调用 ) # 修改Agent指令 simple_agent = Agent( name="simple_agent", instructions="你必须使用提供的math_tool来计算数值求和,绝对不能直接给出答案", tools=[math_tool], model=ollama_qwen3_4b_model )
4. 修复后的完整代码示例
from dotenv import load_dotenv from agents import Agent, Runner, AsyncOpenAI, OpenAIChatCompletionsModel, function_tool import asyncio load_dotenv(override=True) ollama_url = 'http://localhost:11434/v1' ollama_api_key = 'dummy' model = 'qwen3:4b' @function_tool def math_tool(a: int, b: int) -> int: """Send two integers and this returns their sum""" print(f"Adding {a} and {b}") return a + b async def main(): ollama_client = AsyncOpenAI(base_url=ollama_url, api_key=ollama_api_key) ollama_qwen3_4b_model = OpenAIChatCompletionsModel( model=model, openai_client=ollama_client, tool_choice="auto" ) simple_agent = Agent( name="simple_agent", instructions="你必须使用提供的math_tool来计算数值求和,绝对不能直接给出答案", tools=[math_tool], model=ollama_qwen3_4b_model ) output = await Runner.run(simple_agent, "What is 2 + 2?") print(output) asyncio.run(main())
额外排查方向
- 查看Ollama服务日志(
ollama logs),确认模型是否正确接收到工具调用请求 - 尝试用同步的
OpenAI客户端替代AsyncOpenAI,部分版本的SDK对同步客户端兼容性更好 - 如果使用的是macOS aarch64架构,确保Ollama和Python环境的架构一致(避免交叉编译的兼容问题)
如果以上方案还不能解决问题,可以把Ollama的详细日志贴出来,我们再进一步定位问题!




