当前位置: 首页 > news >正文

OpenAI Agents常用代理模式

OpenAI Agents常用代理模式

一.确定性流程

前一个代理的输出作为下一个代理的输入,负责任务转换为一系列较小的模式

主要特点:

通过多个代理构建处理pipeline

在步骤之间可以添加决策点

使用Pydantic定义结构化输出

本案例利用确定性流程,该项目是利用3个agent,第一个agent负责生成故事大纲,第二个agent负责判断大纲是否质量良好、是否是科幻故事,如果是科幻故事且大纲良好就进入第三个agent负责根据大纲写故事。

此示例演示了一个确定性流程,其中每个步骤由一个Agent执行。
1. 第一个Agent生成故事大纲
2. 我们将大纲提供给第二个Agent
3. 第二个Agent检查大纲是否质量良好,以及是否是科幻故事
4. 如果大纲质量不佳或不是科幻故事,我们就此停止
5. 如果大纲质量良好且是科幻故事,我们将大纲提供给第三个Agent
6. 第三个Agent撰写故事
7. 将最终的故事保存到本地文件

image

image

image

import asyncio
from openai import AsyncOpenAI
import re
from datetime import datetime
from pathlib import Pathfrom pydantic import BaseModelfrom agents import Agent, Runner, trace, ModelSettings, OpenAIChatCompletionsModel, set_default_openai_client"""
此示例演示了一个确定性流程,其中每个步骤由一个Agent执行。
1. 第一个Agent生成故事大纲
2. 我们将大纲提供给第二个Agent
3. 第二个Agent检查大纲是否质量良好,以及是否是科幻故事
4. 如果大纲质量不佳或不是科幻故事,我们就此停止
5. 如果大纲质量良好且是科幻故事,我们将大纲提供给第三个Agent
6. 第三个Agent撰写故事
7. 将最终的故事保存到本地文件
"""# 定义要使用的Ollama模型名称
MODEL_NAME = "qwen3:4b"# 配置参数
CONFIG = {"model_name": MODEL_NAME,"temperature": 0.5,  # 默认温度参数"output_dir": "deterministic_output",  # 输出目录"api_base": "http://localhost:11434/v1",  # Ollama API地址"timeout": 120.0,  # API超时时间
}# 设置OpenAI兼容的Ollama客户端
# 创建一个AsyncOpenAI客户端实例,但连接到本地Ollama服务器
external_client = AsyncOpenAI(api_key="qwq", base_url=CONFIG["api_base"], timeout=CONFIG["timeout"],  
)# 设置默认客户端(不设置就会用openai)
set_default_openai_client(external_client, use_for_tracing=False)#不跟踪# 代理1: 创建故事大纲代理
# 该代理负责根据用户输入生成初步的故事大纲
story_outline_agent = Agent(name="story_outline_agent",  # 代理名称instructions="根据用户输入生成一个非常简短的故事大纲。",  # 指令model=OpenAIChatCompletionsModel(  # 使用OpenAI兼容的聊天完成模型model=CONFIG["model_name"],  # 模型名称openai_client=external_client,  # 使用之前配置的Ollama客户端),model_settings=ModelSettings(temperature=CONFIG["temperature"]), 
)# 定义大纲检查代理的输出结构
# 使用Pydantic模型确保输出格式的一致性和类型安全
class OutlineCheckerOutput(BaseModel):good_quality: bool  # 大纲质量是否良好is_scifi: bool  # 是否为科幻故事# 代理2: 创建大纲检查代理
# 该代理负责评估故事大纲的质量并确定其类型
outline_checker_agent = Agent(name="outline_checker_agent",  # 代理名称instructions="阅读给定的故事大纲,并判断其质量。同时,确定它是否是一个科幻故事。", output_type=OutlineCheckerOutput,  # 指定结构化输出类型model=OpenAIChatCompletionsModel(  # 使用OpenAI兼容的聊天完成模型model=CONFIG["model_name"],  # 模型名称openai_client=external_client,  # 使用之前配置的Ollama客户端),model_settings=ModelSettings(temperature=CONFIG["temperature"]), 
)# 代理3: 创建故事撰写代理
# 该代理负责根据给定的大纲撰写一个短篇故事
story_agent = Agent(name="story_agent",  # 代理名称instructions="根据给定的大纲撰写一个短篇故事。",output_type=str,model=OpenAIChatCompletionsModel(model=CONFIG["model_name"], openai_client=external_client,),model_settings=ModelSettings(temperature=CONFIG["temperature"]),
)def save_story_to_file(story_content, user_prompt):"""将生成的故事保存到本地文件Args:story_content: 生成的故事内容user_prompt: 用户的初始提示Returns:保存的文件路径"""# 清理模型输出中的思考过程cleaned_story = remove_thinking_process(story_content)# 创建保存目录save_dir = Path(CONFIG["output_dir"])save_dir.mkdir(exist_ok=True)# 生成文件名 (使用时间戳确保唯一性)timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")filename = f"{timestamp}.txt"# 完整的文件路径file_path = save_dir / filename# 写入故事内容,包括用户提示和时间戳with open(file_path, "w", encoding="utf-8") as f:f.write(f"用户提示: {user_prompt}\n")f.write(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")f.write("\n==================\n\n")f.write(cleaned_story)return file_pathdef remove_thinking_process(text):"""移除文本中<think>标签之间的内容Args:text: 原始文本内容Returns:清理后的文本"""# 检查文本中是否存在<think>标签if "<think>" in text and "</think>" in text:print("检测到思考过程,正在清理...")# 使用正则表达式找到并移除所有<think>...</think>内容cleaned_text = re.sub(r'(?s)<think>.*?</think>', '', text)# 移除可能产生的多余空行cleaned_text = re.sub(r'\n{3,}', '\n\n', cleaned_text)return cleaned_text.strip()else:# 如果没有思考过程标签,返回原始文本return textasync def main():try:input_prompt = input("你想要什么类型的故事?")if not input_prompt.strip():print("提示不能为空,请重新运行程序并输入有效的提示。")return# 确保整个工作流是单个跟踪with trace("确定性故事流程"):print("正在生成故事大纲...")# 1. 生成大纲outline_result = await Runner.run(story_outline_agent,input_prompt,)print(f"已生成大纲:\n{outline_result.final_output}\n")# 2. 检查大纲print("正在检查大纲质量...")outline_checker_result = await Runner.run(outline_checker_agent,outline_result.final_output,)# 3. 添加一个门控,如果大纲质量不佳或不是科幻故事则停止assert isinstance(outline_checker_result.final_output, OutlineCheckerOutput)result = outline_checker_result.final_outputif not result.good_quality:print("大纲质量不佳,到此为止。")returnif not result.is_scifi:print("大纲不是科幻故事,到此为止。")returnprint("大纲质量良好且是科幻故事,因此我们继续撰写故事。")# 4. 撰写故事print("正在撰写故事...")story_result = await Runner.run(story_agent,outline_result.final_output,)# 故事初始版本current_story = story_result.final_outputprint(f"\n故事:\n{current_story}\n")# 5. 保存最终故事到本地文件saved_path = save_story_to_file(current_story, input_prompt)print(f"最终故事已保存到:{saved_path}")except KeyboardInterrupt:print("\n程序被用户中断")except Exception as e:print(f"发生错误: {str(e)}")if __name__ == "__main__":asyncio.run(main())

 

 

http://www.jsqmd.com/news/377886/

相关文章:

  • 解析GEO优化:提升未来产品服务竞争力的策略,GEO优化AI工具排名/GEO优化服务,GEO优化广告公司找哪家 - 品牌推荐师
  • 对比一圈后,更懂研究生的AI论文软件,千笔·专业学术智能体 VS 万方智搜AI
  • 导师又让重写?AI论文写作软件 千笔AI VS 万方智搜AI,本科生专属神器!
  • 总结杭州靠谱婚礼宴会厅,诺丁山性价比及品牌优势解读 - 工业品网
  • 聊聊口碑不错的保姆月嫂公司,新疆这些品牌性价比超高 - 工业推荐榜
  • ​TPJ-50/100型机械式空气弹簧疲劳试验机​
  • 聊聊黄岛膜大师臻装工坊口碑,青岛地区汽车美容服务哪家更值得推荐 - 工业品网
  • 发际线种植品牌怎么挑?这份国内参考清单请收好,3D微针植发/发际线种植/美学植发/发际线调整,发际线种植品牌排名前十 - 品牌推荐师
  • 聊聊口碑好的礼物店加盟品牌,选哪家更靠谱 - 工业设备
  • Spring基础注解使用
  • 2026年哈尔滨四轮定位选购攻略,哪些服务值得选 - myqiye
  • IoT 固件中的 Web 漏洞挖掘:模拟运行、解包与逆向分析
  • 基于java的物联网智能监控平台设计与开发毕业设计源码
  • 基于STM32的AD7190四通道不连续采集模式实现代码
  • 408真题解析-2010-39-计算机网络-拥塞窗口/滑动窗口
  • 横评后发现!万众偏爱的降AIGC软件 —— 千笔·降AI率助手
  • 基于java的移动端数据可视化系统设计与实现毕设源码
  • 基于java的在线教育平台课程管理系统研究毕设源码
  • 基于java的区块链技术实现数字货币交易系统毕设
  • 基于java的企业资源计划(ERP)系统开发与改进毕设
  • 毕业论文神器 8个AI论文工具测评:专科生高效写作+格式规范全攻略
  • 律师咨询|基于java+ vue律师咨询系统(源码+数据库+文档)
  • 2026年靠谱的数码印花法兰绒/素色法兰绒公司口碑推荐哪家靠谱 - 品牌宣传支持者
  • 2026年重庆口碑好的古奥标识文旅景区标识设计公司推荐 - myqiye
  • 2026必备!降AIGC软件 千笔·降AI率助手 VS WPS AI,继续教育首选
  • 测完这批工具 8个AI论文平台测评:专科生毕业论文+开题报告高效写作指南
  • 基于电池二阶等效模型的SOC观测器设计
  • 详细介绍:ZooKeeper
  • 激关相关的模型,视频 增材制造.mph 激光焊接.mph run- 激光熔覆-可行.mph 激...
  • 不踩雷! 10个一键生成论文工具测评:专科生毕业论文+开题报告写作全攻略