开始之前:需要开发人员深刻理解模型的类型
模型:常规推理模型、Cot思维模型、tool、视觉
开发人员要深刻理解模型的作用,避免运行以下代码出错
要让openai-agent支持本地模型需要完成一下编程:
记得引入库名:AsyncOpenAI、OpenAIChatCompletionsModel、set_tracing_disabled
external_client = AsyncOpenAI(
api_key="ollama",
base_url="http://localhost:11434/v1"
)
# 配置模型
model = OpenAIChatCompletionsModel(
model="granite3.2",
openai_client=external_client
)
set_tracing_disabled(disabled=True)
完整的实例:
import asyncio
from openai import AsyncOpenAI
from agents import Agent, ItemHelpers, MessageOutputItem, OpenAIChatCompletionsModel, Runner, set_tracing_disabled, trace
"""
这个示例展示了将agents作为工具的模式。前台agent接收用户消息,
然后选择要调用哪些agents作为工具。在这个例子中,它从一组翻译agent中进行选择。
"""
external_client = AsyncOpenAI(
api_key="ollama",
base_url="http://localhost:11434/v1"
)
# 配置模型
model = OpenAIChatCompletionsModel(
model="granite3.2",
openai_client=external_client
)
set_tracing_disabled(disabled=True)
english_agent = Agent(
name="english_agent",
instructions="你负责将用户的消息翻译成英语",
handoff_description="一个中文到英语的翻译器",
model=model
)
french_agent = Agent(
name="french_agent",
instructions="你负责将用户的消息翻译成法语",
handoff_description="一个中文到法语的翻译器",
model=model
)
italian_agent = Agent(
name="italian_agent",
instructions="你负责将用户的消息翻译成意大利语",
handoff_description="一个中文到意大利语的翻译器",
model=model
)
orchestrator_agent = Agent(
name="orchestrator_agent",
instructions=(
"你是一个翻译协调员。你使用给定的工具来进行翻译。"
"如果用户要求多种语言的翻译,你需要按顺序调用相关的翻译工具。"
"你不要自己翻译,必须使用提供的翻译工具。"
),
tools=[
english_agent.as_tool(
tool_name="translate_to_english",
tool_description="将用户的消息翻译成英语",
),
french_agent.as_tool(
tool_name="translate_to_french",
tool_description="将用户的消息翻译成法语",
),
italian_agent.as_tool(
tool_name="translate_to_italian",
tool_description="将用户的消息翻译成意大利语",
),
],
model=model
)
synthesizer_agent = Agent(
name="synthesizer_agent",
instructions="你负责检查翻译结果,必要时进行修正,并生成最终的合并响应。最终用中文回复翻译结果。",
model=model
)
async def main():
msg = input("你好!你想要翻译什么内容,需要翻译成哪些语言?")
# 在单个跟踪中运行整个编排过程
with trace("Orchestrator evaluator"):
orchestrator_result = await Runner.run(orchestrator_agent, msg)
print(f"\n\n协调员响应:\n{orchestrator_result.final_output}")
for item in orchestrator_result.new_items:
if isinstance(item, MessageOutputItem):
text = ItemHelpers.text_message_output(item)
if text:
print(f" - 翻译步骤: {text}")
synthesizer_result = await Runner.run(synthesizer_agent, orchestrator_result.to_input_list())
print(f"\n\n最终响应:\n{synthesizer_result.final_output}")
if __name__ == "__main__":
asyncio.run(main())
基本工作原理:
graph TD
A[用户输入] --> B{协调员Agent}
B -->|检测到英语需求| C[英语翻译Agent]
B -->|检测到法语需求| D[法语翻译Agent]
B -->|检测到意大利语需求| E[意大利语翻译Agent]
C --> F[合成Agent]
D --> F
E --> F
F --> G[最终输出]
架构特点
- 控制流与执行流分离:协调员只负责决策,不直接处理翻译逻辑
- 工具注册机制:通过.as_tool()将agent转换为可调用工具
- 异步处理模式:使用asyncio实现非阻塞调用
- 结果验证机制:通过独立合成agent进行最终校验
工作流程解析
1. 用户输入阶段
msg = input("你好!你想要翻译什么内容,需要翻译成哪些语言?")
用户输入要翻译的内容和目标语言(如:"请把'你好'翻译成英语和法语")
- 协调员调度阶段(核心控制流)
-
orchestrator_result = await Runner.run(orchestrator_agent, msg)
3. 工具调用阶段(并行处理)
# 在协调员内部通过.as_tool()方法实现工具调用
tools=[
english_agent.as_tool(...),
french_agent.as_tool(...),
italian_agent.as_tool(...)
]
根据用户请求的语言选择,可能触发多个翻译agent的调用(如同时调用英语和法语翻译)
- 结果合成阶段
synthesizer_result = await Runner.run(synthesizer_agent, orchestrator_result.to_input_list())
- 最终输出阶段
print(f"\n\n最终响应:\n{synthesizer_result.final_output}")