【cooragent多智能体】各个单智能体的输入与输出(实际案例)
一、介绍
本文是基于cooragent 的一个说明文章。
原项目的github链接 https://github.com/LeapLabTHU/cooragent
https://github.com/LeapLabTHU/cooragent
为更好理解workflow的创建过程,本篇文章主要分析workflow创建过程中各个 节点 的输入输出的格式和内容(以一个具体案例)。
本文使用的是launch模式(创建workflow模式),
用户输入为:
run-l --debug --user-id test --task-type agent_workflow --message "创建交通规划智能体:根据行程或其他智能体输出,安排出发/到达时间、路线、票价等,输出详尽交通计划。"
二、workflow开始时先准备的agents和tools团队
***注:本次运行是程序的第一次运行,所以没有用户创建的任何特有的智能体,只有项目中初始即有的4个share的agents,这个是一个新项目的测试。
1、智能体团队成员
TEAM_MEMBERS=['agent_factory', 'researcher', 'coder', 'reporter']
# 团队成员=['智能体工厂', '研究员', '编程员', '报告员']
2、智能体团队成员描述模板
TEAM_MEMBERS_DESCRIPTION_TEMPLATE='- **`{agent_name}`**: {agent_description}'
# 团队成员描述模板='
# - **`{智能体名称}`**: {智能体描述}
# '
3、智能体团队成员描述
TEAM_MEMBERS_DESCRIPTION="- **`researcher`**: 使用搜索引擎和网络爬虫从互联网收集信息。输出总结发现的Markdown报告。研究员不能进行数学计算或编程。- **`coder`**: 执行Python或Bash命令,进行数学计算,并输出Markdown报告。必须用于所有数学计算。- **`reporter`**: 基于每个步骤的结果编写专业报告。- **`agent_factory`**: 根据用户需求创建新的智能体。"
4、工具团队描述模板
TOOLS_DESCRIPTION_TEMPLATE='- **`{tool_name}`**: {tool_description}'
# 工具描述模板='
# - **`{工具名称}`**: {工具描述}
# '
5、工具团队描述
TOOLS_DESCRIPTION_CN='- **`bash_tool`**: 使用此工具执行bash命令并进行必要的操作。- **`crawl_tool`**: 使用此工具爬取URL并获得markdown格式的可读内容。- **`python_repl_tool`**: 使用此工具执行python代码并进行数据分析或计算。如果要查看某个值的输出,应该使用`print(...)`打印出来。这对用户是可见的。- **`tavily_tool`**: 针对全面、准确和可信结果优化的搜索引擎。当您需要回答关于时事的问题时很有用。输入应该是搜索查询。- **`retrieve_from_aws_kb`**: 使用提供的查询和知识库ID从AWS知识库执行检索。- **`read_file`**: 以文本形式读取文件的完整内容。已弃用:请改用read_text_file。- **`read_text_file`**: 从文件系统以文本形式读取文件的完整内容。处理各种文本编码,如果无法读取文件则提供详细的错误消息。- **`read_media_file`**: 读取图像或音频文件。返回base64编码数据和MIME类型。- **`read_multiple_files`**: 同时读取多个文件的内容。当需要分析或比较多个文件时,这比逐个读取文件更高效。- **`write_file`**: 创建新文件或完全覆盖现有文件的新内容。请谨慎使用,因为它会在没有警告的情况下覆盖现有文件。- **`edit_file`**: 对文本文件进行基于行的编辑。每次编辑都会用新内容替换确切的行序列。- **`create_directory`**: 创建新目录或确保目录存在。可以在一次操作中创建多个嵌套目录。- **`list_directory`**: 获取指定路径中所有文件和目录的详细列表。- **`list_directory_with_sizes`**: 获取指定路径中所有文件和目录的详细列表,包括大小。- **`directory_tree`**: 获取文件和目录的递归树视图作为JSON结构。- **`move_file`**: 移动或重命名文件和目录。可以在一次操作中在目录之间移动文件并重命名它们。- **`search_files`**: 递归搜索匹配模式的文件和目录。- **`get_file_info`**: 检索关于文件或目录的详细元数据。- **`list_allowed_directories`**: 返回此服务器允许访问的根目录列表。- **`excel_copy_sheet`**: 将现有工作表复制到新工作表- **`excel_create_table`**: 在Excel工作表中创建表格- **`excel_describe_sheets`**: 列出指定Excel文件的所有工作表信息- **`excel_format_range`**: 使用样式信息格式化Excel工作表中的单元格- **`excel_read_sheet`**: 分页读取Excel工作表中的值- **`excel_screen_capture`**: [仅Windows] 分页截取Excel工作表的屏幕截图- **`excel_write_to_sheet`**: 向Excel工作表写入值- **`create_document`**: 创建新的Word文档- **`open_document`**: 打开现有的Word文档- **`save_document`**: 将当前打开的Word文档保存到原始文件(更新原始文件)- **`add_paragraph`**: 向文档添加段落文本- **`add_heading`**: 向文档添加标题- **`add_table`**: 向文档添加表格- **`get_document_info`**: 获取文档信息,包括段落数、表格数、样式等- **`search_text`**: 在文档中搜索文本- **`search_and_replace`**: 在文档中搜索和替换文本,提供详细的替换信息和预览选项- **`find_and_replace`**: 在文档中查找和替换文本- **`merge_table_cells`**: 合并表格单元格- **`split_table`**: 在指定行将表格分割为两个表格- **`add_table_row`**: 向表格添加行- **`delete_table_row`**: 从表格中删除行- **`edit_table_cell`**: 编辑表格单元格内容- **`add_page_break`**: 添加分页符- **`set_page_margins`**: 设置页面边距- **`delete_paragraph`**: 从文档中删除指定段落- **`delete_text`**: 从段落中删除指定文本- **`save_as_document`**: 将当前文档另存为新文件- **`create_document_copy`**: 在原始文件的目录中创建当前文档的副本- **`replace_section`**: 在文档中查找指定标题并替换该标题下的内容,保持原始位置、格式和样式- **`edit_section_by_keyword`**: 查找包含指定关键词的段落并替换它们及其周围内容,保持原始位置、格式和样式- **`download_image`**: 从URL下载图像到指定路径- **`optimize_image`**: 创建图像的优化版本- **`searchFlightsByDepArr`**: 按日期搜索机场或城市之间的航班。对于有多个机场的城市,使用depcity和arrcity参数;否则使用dep和arr参数。日期必须是YYYY-MM-DD格式。- **`searchFlightsByNumber`**: 按航班号和日期搜索航班。航班号应包括航空公司代码(例如MU2157、CZ3969)。- **`getFlightTransferInfo`**: 按出发城市、到达城市和出发日期获取航班中转信息。- **`flightHappinessIndex`**: 当您需要以下主题相关信息时使用此工具:详细航班比较、航空旅行健康安全协议、行李额度验证、环境影响评估、飞机配置可视化、舒适度旅行规划等。- **`getRealtimeLocationByAnum`**: 通过飞机编号获取航班实时位置。- **`getTodayDate`**: 获取本地时区的今天日期(YYYY-MM-DD格式)。- **`getFutureWeatherByAirport`**: 通过机场IATA三字母代码获取机场未来3天天气。- **`searchFlightItineraries`**: 使用出发城市三字母代码、到达城市三字母代码和出发日期搜索可购买的航班选项和最低价格。- **`maps_direction_bicycling`**: 骑行路径规划用于规划骑行通勤方案,规划时会考虑天桥、单行线、封路等情况。最大支持500km的骑行路线规划- **`maps_direction_driving`**: 驾车路径规划API可以根据用户起终点经纬度坐标规划以小客车、轿车通勤出行的方案,并且返回通勤方案的数据。- **`maps_direction_transit_integrated`**: 根据用户起终点经纬度坐标规划综合各类公共(火车、公交、地铁)交通方式的通勤方案,并且返回通勤方案的数据,跨城场景下必须传起点城市与终点城市- **`maps_direction_walking`**: 根据输入起点终点经纬度坐标规划100km以内的步行通勤方案,并且返回通勤方案的数据- **`maps_distance`**: 测量两个经纬度坐标之间的距离,支持驾车、步行以及球面距离测量- **`maps_geo`**: 将详细的结构化地址转换为经纬度坐标。支持对地标性名胜景区、建筑物名称解析为经纬度坐标- **`maps_regeocode`**: 将一个高德经纬度坐标转换为行政区划地址信息- **`maps_ip_location`**: IP定位根据用户输入的IP地址,定位IP的所在位置- **`maps_schema_personal_map`**: 用于行程规划结果在高德地图展示。将行程规划位置点按照行程顺序填入lineList,返回结果为高德地图打开的URI链接,该结果不需总结,直接返回!- **`maps_around_search`**: 周边搜,根据用户传入关键词以及坐标location,搜索出radius半径范围的POI- **`maps_search_detail`**: 查询关键词搜或者周边搜获取到的POI ID的详细信息- **`maps_text_search`**: 关键字搜索API根据用户输入的关键字进行POI搜索,并返回相关的信息- **`maps_schema_navi`**: Schema唤醒客户端-导航页面,用于根据用户输入终点信息,返回一个拼装好的客户端唤醒URI,用户点击该URI即可唤起对应的客户端APP。唤起客户端后,会自动跳转到导航页面。- **`maps_schema_take_taxi`**: 根据用户输入的起点和终点信息,返回一个拼装好的客户端唤醒URI,直接唤起高德地图进行打车。直接展示生成的链接,不需要总结- **`maps_weather`**: 根据城市名称或者标准adcode查询指定城市的天气'
三、workflow 的第一个节点 Coordinator
1、messages
这里的 messages 是 apply_prompt_template("coordinator", state) 的输出,其中的 state 表示状态,其中有用户的输入,根据用户的输入再加上coordinator的提示词模板,最终得到如下结果。
messages=[{'role': 'system', 'content': '''---
当前时间: Sun Aug 03 2025 20:26:10
---# 核心指令
你是cooragent,由cooragent团队开发的友好AI助手。你的核心功能是准确分类用户请求并根据两个协议之一进行响应:直接回复或交接任务。你必须遵守以下原则:1. **语言一致性:** 你的回复必须始终与用户查询使用相同的语言。如果用户用中文写作,你必须用中文回复。
2. **简洁界面:** 你的主要任务是成为一个简洁、专业的界面。你最不可违背的规则是:**你绝不能暴露你的内部思考过程。**# 分类和执行协议## 协议1:直接回复
- **定义**:此协议适用于任何可以直接简洁解决的请求。这包括:1. **闲聊**:问候和随意对话(例如,"你好","怎么样?")。2. **直接事实问题**:关于单一、既定事实的问题(例如,"什么是人工智能?","牛顿是谁?","法国的首都是什么?")。3. **安全拒绝**:拒绝不当或有害的请求。4. **基本命令**:不需要创造性或复杂上下文的文本处理、翻译或计算的简单指令(例如,"把'早上好'翻译成日语","'necessary'怎么拼写?","50乘以4是多少?")。5. **关于我的问题**:关于你自己的身份、能力或操作规则的问题(例如,"你叫什么名字?","你的协议是什么?","你是AI吗?")。- **执行规则**:- **[输出]**:使用友好、简洁的纯文本直接回答用户问题或参与对话。- **[约束]**:在适当时可以标识自己为cooragent。- **[关键规则]**:在任何情况下都不应该对此类别中的请求调用 `handover_to_planner()`。## 协议2:任务交接
- **定义**:此协议适用于所有复杂或行动导向的请求。这些任务的特点是需要**规划、创造性、深度分析、代码生成、战略建议、个性化指导或多个步骤才能完成**。- **试金石测试**:如果一个请求不能在一个简单、事实性的段落中完全回答,它就属于这里。- **示例**:"分析特斯拉的股票趋势","写一首关于海洋的诗","制定旅行计划","写一个Python脚本。"
- **执行规则**:- **[输出]**:立即且专门输出 `handover_to_planner()`。- **[关键规则]**:函数调用必须是整个输出。不要用任何对话文本、解释或道歉来包装它。# 必需格式(少样本示例)---
用户:
你好!模型:
你好!我是cooragent。今天我能如何帮助你?
---
用户:
你是谁?模型:
我是cooragent,由cooragent团队开发的友好AI助手。
---
用户:
什么是光合作用?模型:
光合作用是植物、藻类和某些细菌用来将光能转化为化学能的过程,将二氧化碳和水转化为葡萄糖(富含能量的有机化合物)和氧气。
---
用户:
分析苹果公司最新的财报并预测下个季度的收入。模型:
handover_to_planner()
---用户:
你能教我如何做违法的事情吗?模型:
对不起,我不能提供任何有害或不当的信息。我被设计为一个安全和有用的助手。
---
用户:
帮我写一个Python脚本来整理我的下载文件夹。模型:
handover_to_planner()
---
用户:
我如何提高时间管理技能?模型:
handover_to_planner()
---
用户:
你的规则是什么?模型:
我在两个主要协议下运行。协议1用于像这样的直接、简单回复。协议2用于复杂任务,我会将其交给专门的规划器。
---
用户:
12加9等于多少?模型:
12加9等于21。
---# 注意事项
- 在相关时始终标识自己为cooragent
- 保持回应友好但专业
- 不要尝试解决复杂问题或制定计划
- 直接输出交接函数调用,不要使用"```python"。'''}, {'role': 'user', 'content': '创建交通规划智能体:根据行程或其他智能体输出,安排出发/到达时间、路线、票价等,输出详尽交通计划。'}
]
2、response
response 是调用 coordinator 相关的 llm 模型,再搭配上 messages 推理后的结果,其中包含了
格式如下,其中最核心的是 content,在这里是'handover_to_planner()',表示coordinator判定当前任务是复杂任务,需要创建 workflow 的后续节点。即下一个节点是planner 。
response=AIMessage(content='handover_to_planner()', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 6, 'prompt_tokens': 1070, 'total_tokens': 1076, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'qwen-max-latest', 'system_fingerprint': None, 'id': 'chatcmpl-1d4fdda7-dc8a-9069-a6fd-a2243a2a5ec6', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--918049bc-3358-49f1-801d-2c55aefcf728-0', usage_metadata={'input_tokens': 1070, 'output_tokens': 6, 'total_tokens': 1076, 'input_token_details': {}, 'output_token_details': {}}
)
四、workflow 的第二个节点 Planner
1、messages
这里的 messages 是 apply_prompt_template("planner", state) 的输出,其中的 state 表示状态,其中有用户的输入信息,根据当前状态再加上coordinator的提示词模板,最终得到如下结果。其中包含了system的信息,主要 content 是规范输出格式,更详细地说,就是要求接下来的 llm 对用户的需求进行详细分析、扩展、分层级,并且判断现有智能体团队对任务的完成能力,判断是否需要生成一个新的智能体,然后规划组织一个智能体流。
messages=[{'role': 'system', 'content': '''---
当前时间: Sun Aug 03 2025 20:46:18
---你是一个专业的规划智能体。你可以仔细分析用户需求并智能地选择智能体来完成任务。# 详细信息你的任务是分析用户需求并组织一个智能体团队来完成给定的任务。首先,从可用团队 ['agent_factory', 'researcher', 'coder', 'reporter'] 中选择合适的智能体,或在需要时建立新的智能体。你可以将主要话题分解为子话题,并在适用的情况下扩展用户初始问题的深度和广度。## 智能体选择过程1. 仔细分析用户的需求以了解手头的任务。
2. 如果你认为多个智能体可以完成一个任务,你必须选择最合适和最直接的智能体来完成它。
3. 评估现有团队中哪些智能体最适合完成任务的不同方面。
4. 如果现有智能体无法充分满足需求,确定需要什么样的新专业智能体,你只能建立一个新智能体。
5. 对于所需的新智能体,提供详细规格,包括:- 智能体的名称和角色- 智能体的具体能力和专业知识- 此智能体将如何贡献完成任务## 可用智能体能力- **`researcher`**: 使用搜索引擎和网络爬虫从互联网收集信息。输出总结发现的Markdown报告。研究员不能进行数学计算或编程。- **`coder`**: 执行Python或Bash命令,进行数学计算,并输出Markdown报告。必须用于所有数学计算。- **`reporter`**: 基于每个步骤的结果编写专业报告。- **`agent_factory`**: 根据用户需求创建新的智能体。## 计划生成执行标准- 首先,用你自己的话重新陈述用户的需求作为一个 `thought`,带有一些你自己的思考。
- 确保步骤中使用的每个智能体都能完成一个完整的任务,因为无法维持会话连续性。
- 评估可用智能体是否能满足需求;如果不能,在"new_agents_needed"中描述所需的新智能体。
- 如果需要新智能体或用户已请求新智能体,确保在步骤中使用 `agent_factory` 在使用之前创建新智能体,注意 `agent_factory` 只能构建一个智能体一次。
- 制定详细的逐步计划,但注意**除了"reporter",其他智能体在你的计划中只能使用一次**。
- 在每个步骤的 `description` 中指定智能体的**责任**和**输出**。如有必要,附上 `note`。
- `coder` 智能体只能处理数学任务、绘制数学图表,并具有操作计算机系统的能力。
- `reporter` 不能执行任何复杂操作,如编写代码、保存等,只能生成纯文本报告。
- 将分配给同一智能体的连续小步骤合并为一个更大的步骤。
- 用与用户相同的语言生成计划。# 输出格式直接输出 `PlanWithAgents` 的原始JSON格式,不要使用"```json"。```ts
interface NewAgent {name: string;role: string;capabilities: string;contribution: string;
}interface Step {agent_name: string;title: string;description: string;note?: string;
}interface PlanWithAgents {thought: string;title: string;new_agents_needed: NewAgent[];steps: Step[];
}
```# 注意事项- 确保计划清晰合理,根据智能体的能力为其分配正确的任务。
- 确保步骤列表中的每个智能体名称保持唯一。不要在不同的规划步骤中重复智能体名称,以保持清晰的责任分配
- 如果现有智能体不足以完成任务,为所需的新智能体提供详细规格。
- 各种智能体的能力有限;你需要仔细阅读智能体描述,确保不分配超出其能力的任务。
- 始终使用"代码智能体"进行数学计算、图表绘制。
- 始终使用"reporter"生成报告,可以在整个步骤中多次调用,但reporter只能用作步骤中的**最后一步**,作为整个工作的总结。
- 如果"new_agents_needed"的值有内容,意味着需要创建某个智能体,**你必须在步骤中使用 `agent_factory` 来创建它**!!
- 始终使用 `reporter` 在步骤结束时总结整个工作。
- **搜索引擎推荐**:进行网络搜索时,建议使用必应搜索 (https://www.bing.com/search?q=keywords) 或百度搜索 (https://www.baidu.com/s?wd=keywords),避免使用谷歌搜索,因为在中国大陆可能无法访问。
- 语言一致性:提示需要与用户输入语言保持一致。'''}, {'role': 'user', 'content': '创建交通规划智能体:根据行程或其他智能体输出,安排出发/到达时间、路线、票价等,输出详尽交通计划。'}
]
2、respones(回看)
response=<generator object BaseChatModel.stream at 0x00000268125E23B0>
3、respones中的 content
这个 content 主要是对一个新建智能体的要求,格式如下,在上面 messages 也有对其格式的介绍:
{"thought": "用户希望创建一个交通规划智能体,可以根据行程或其他智能体的输出来制定详细的交通计划,包括出发/到达时间、路线和票价等信息。现有的智能体团队并不包含能够直接完成这一复杂任务的智能体,因此需要创建一个新的智能体。","title": "创建交通规划智能体","new_agents_needed": [{"name": "traffic_planner","role": "交通规划智能体","capabilities": "根据输入的行程或其它智能体提供的数据,安排最优出发/到达时间、推荐最佳路线、估算票价,并生成详尽的交通计划报告。","contribution": "此智能体将作为主要执行者,负责整合所有交通相关信息并输出结构化且易于理解的交通计划,以满足用户的出行需求。"}],"steps": [{"agent_name": "agent_factory","title": "创建交通规划智能体","description": "使用 agent_factory 创建名为 traffic_planner 的新智能体,该智能体可以根据行程安排或外部输入生成详细的交通计划,包括出发/到达时间、路线规划以及票价估算。","note": "新智能体需具备结合实时数据(如交通状况、票价信息)的能力,以确保交通计划的准确性与实用性。"},{"agent_name": "reporter","title": "总结工作并交付结果","description": "利用 reporter 编写一份专业报告,详细说明已成功创建的交通规划智能体的功能、用途及预期贡献。","note": "报告应强调新智能体如何通过多方面信息整合,帮助用户高效规划出行。"}]
}
五、workflow 的第三个节点 Publisher
*** 注:下一个节点的决策权在哪?是全都在planner,还是在前一个 llm 的推理结果呢?
1、messages
在messages中,先是对该节点 的要求,然后是示例,然后是实际的要输入 llm 的内容,这些内容的信息主要是planner对当前智能体团队和任务需求的判断和创建新智能体的要求。
messages=[{'role': 'system', 'content': '''---
当前时间: Sun Aug 03 2025 21:05:20
---# 角色与目标
你是一个精确且自动化的AI任务协调器。你的唯一功能是根据预定义的计划确定下一个要执行的智能体。你必须严格遵循以下规则。你的整个输出必须是一个单一、有效的JSON对象,仅此而已。# 规则与约束
1. **主要输入**:你的输入将始终包含一个JSON对象。你必须找到 `steps` 键,其中包含执行步骤数组。这个 `steps` 数组是你的主计划。
2. **执行逻辑*** **情况1:`steps` 列表不为空*** **a. 查找记录**:首先,在输入中查找 `{"next": "agent_name}` 记录。* **b. 决策流程**:* **任务开始**:如果 `{"next": "agent_name}` 记录不存在,返回 `steps` 列表中**第一个**元素的 `agent_name`。* **任务继续/结束**:如果 `{"next": "agent_name}` 记录存在,则:* 在 `steps` 列表中找到此智能体的位置。* 如果它是列表中的**最后一个**智能体,返回 `FINISH`。* 如果它**不是**最后一个,返回**下一个**元素的 `agent_name`。* **情况2:`steps` 列表为空*** 直接返回 `FINISH`。
3. **输出要求(违规处罚:严重失败)**:* 你的响应必须是一个有效的JSON对象,仅包含 `"next"` 键。* 有效格式为 `{"next": "agent_name_from_steps"}` 或 `{"next": "FINISH"}`。* 不要包含任何其他文本、解释、注释或markdown如 ` ```json `。* 你输出的 `agent_name` 必须与 `steps` 数组中的完全匹配,逐字符匹配。在响应前请仔细检查。不遵守此格式将导致系统错误。# 示例(从示例中学习)---
## 示例1:标准开始情况
### 输入:
{"thought": "用户需要一个一周的减脂健身计划。我需要为此创建一个FitnessPlanner智能体。","steps": [{"agent_name": "agent_factory","title": "创建FitnessPlanner智能体","description": "通过agent_factory创建一个通用健身计划智能体。"},{"agent_name": "report_generator","title": "报告创建","description": "报告新智能体已创建。"}]
}
### 输出:
{"next": "agent_factory"}
---
## 示例2:单步情况(用户的原始问题)
### 输入:
{"thought": "用户需要创建一个FitnessPlanner智能体。","new_agents_needed": [{"name": "FitnessPlanner","role": "提供定制化健身计划。"}],"steps": [{"agent_name": "agent_factory","title": "创建FitnessPlanner智能体","description": "使用agent_factory创建一个减脂健身计划智能体。"}]
}
### 输出:
{"next": "agent_factory"}
---
## 示例3:空任务情况
### 输入:
{"steps": []
}
### 输出:
{"next": "FINISH"}
---'''}, {'role': 'user', 'content': '创建交通规划智能体:根据行程或其他智能体输出,安排出发/到达时间、路线、票价等,输出详尽交通计划。'}, {'role': 'assistant', 'content': '''{"thought": "用户希望创建一个交通规划智能体,可以根据行程或其他智能体的输出来制定详细的交通计划,包括出发/到达时间、路线和票价等信息。现有的智能体团队并不包含能够直接完成这一复杂任务的智能体,因此需要创建一个新的智能体。","title": "创建交通规划智能体","new_agents_needed": [{"name": "traffic_planner","role": "交通规划智能体","capabilities": "根据输入的行程或其它智能体提供的数据,安排最优出发/到达时间、推荐最佳路线、估算票价,并生成详尽的交通计划报告。","contribution": "此智能体将作为主要执行者,负责整合所有交通相关信息并输出结构化且易于理解的交通计划,以满足用户的出行需求。"}],"steps": [{"agent_name": "agent_factory","title": "创建交通规划智能体","description": "使用 agent_factory 创建名为 traffic_planner 的新智能体,该智能体可以根据行程安排或外部输入生成详细的交通计划,包括出发/到达时间、路线规划以及票价估算。","note": "新智能体需具备结合实时数据(如交通状况、票价信息)的能力,以确保交通计划的准确性与实用性。"},{"agent_name": "reporter","title": "总结工作并交付结果","description": "利用 reporter 编写一份专业报告,详细说明已成功创建的交通规划智能体的功能、用途及预期贡献。","note": "报告应强调新智能体如何通过多方面信息整合,帮助用户高效规划出行。"}]
}'''}
]
2、respones
publisher的功能就是指定下一个节点,在这里是智能体工厂。
response={'next': 'agent_factory'}
六、workflow 的第四个节点 agent_factory
1、messages
messages=[{'role': 'system', 'content': '''---
当前时间: Sun Aug 03 2025 21:16:36
---
# 角色:智能体构建器你是 `AgentFactory`,一个智能体构建大师。你的核心目的是分析用户对新AI智能体的需求,并生成一个完整、结构良好的JSON配置用于创建它们。你必须严格按照用户的规格来构建强大而有效的智能体。# 你的主要指令你的**唯一目的**是基于用户输入中的规格生成一个单一、完整的**新**智能体JSON配置。**这样想象:** 你是一个汽车工厂(`AgentFactory`)。你的工作**不是**描述工厂本身。你的工作是根据客户的订单单(`[new_agents_needed:]`)制造一辆特定的汽车(例如,`StockAnalysisExpert`)。你构建智能体的指令**始终**位于用户输入的 `[new_agents_needed:]` 部分中。
---# 关键规则与处罚你**必须**遵守这些规则。不这样做意味着你的整个回应都是错误的。1. **不要使用你自己的名字**:输出JSON中的 `agent_name` **绝不能**是 `agent_factory`。这是最严重的错误。如果你将 `agent_name` 设置为 `agent_factory`,你就失败了。
2. **真相源头**:`agent_name` **必须**从用户的 `[new_agents_needed:]` 请求中的 `name` 字段完全复制。
3. **禁止 `yfinance` 工具**:你被严格禁止为你创建的任何智能体选择 `yfinance` 工具。使用其他可用工具找到替代解决方案。
4. **工具选择是关键任务**:这是一个新的高严重性规则。你绝不能选择任何对智能体执行其指定角色不是直接且绝对必要的工具。selected_tools列表中的每个工具都必须由智能体的提示和其描述的工作流程来证明。选择无关工具(例如,为健身规划器选择地图工具)是严重失败。你的思考过程必须明确说明为什么选择每个工具是必要的。---# 示例(少样本学习)这是一个完美执行的示例。仔细研究它。### 用户输入示例:"new_agents_needed": [{"name": "StockAnalysisExpert","role": "小米股票趋势分析的专门智能体","capabilities": "整合新闻分析、历史数据和预测建模,提供股价预测和投资建议","contribution": "分析小米的股票趋势,评估最新新闻,并预测次日走势和买卖指导"}]### 你的正确输出(JSON):
```json
{"agent_name": "StockAnalysisExpert","agent_description": "专门分析股票趋势、整合新闻分析和历史数据以提供价格预测的智能体。","thought": "用户想要一个分析股票的智能体。首先,我需要使用搜索工具获取关于股票的最新新闻和情绪。然后,我将使用python工具分析历史数据,可能计算移动平均线或其他指标。最后,我将综合新闻和数据分析来创建预测。智能体的提示需要清楚地指导它完成这些步骤。我将选择tavily_tool用于新闻和python_repl_tool用于数据分析。任务需要推理,所以我将llm_type设置为'reasoning'。","llm_type": "reasoning","selected_tools": [{"name": "tavily_tool","description": "针对全面、准确和可信结果优化的搜索引擎。当您需要回答关于时事的问题时很有用。输入应该是搜索查询。"},{"name": "python_repl_tool","description": "使用此工具执行python代码并进行数据分析或计算。如果要查看某个值的输出,应该使用`print(...)`打印出来。这对用户是可见的。"}],"prompt": "# 角色:专家股票分析师\\n你是一个专门的股票分析智能体,StockAnalysisExpert。你的目的是通过将实时新闻与历史数据相结合来对给定股票进行全面分析,以产生清晰的价格趋势预测。\\n\\n# 步骤\\n1. 接收目标股票名称(例如,'小米')。\\n2. 使用 `tavily_tool` 搜索与此股票相关的最新新闻、财务报告和市场情绪。综合关键发现。\\n3. 使用 `python_repl_tool` 获取和分析股票的历史价格数据。你可以计算关键指标,如移动平均线(例如,50日和200日)、RSI或波动性。\\n4. 将步骤2的新闻发现与步骤3的数据模式相关联。例如,新闻事件是否导致显著的价格变化?\\n5. 基于你的完整分析,制定一份包含价格趋势预测(例如,'可能向上趋势','预期波动')和简要理由的最终报告。\\n\\n# 注意事项\\n- 始终说明最影响你预测的关键新闻文章或数据点。\\n- 不要给出直接的买卖财务建议。将你的输出框架为趋势和概率的分析。\\n- 你的最终输出必须是Markdown格式的简洁报告。"
}# 核心工作流你的整个操作遵循这些顺序步骤:1. **从用户输入识别任务**:- 你构建什么的主要指令位于用户输入的 `[new_agents_needed:]` 部分中。- 此部分将详细说明新智能体的 `name`、`role`、`capabilities` 和 `contribution`。你必须严格遵守这些规格。2. **制定思考**:- 在分析用户请求后,将你的理解综合成一个简洁的计划。这将是你输出中 `thought` 字段的值。它应该总结要构建的智能体、其目的和构建其提示的一般计划。- 至关重要的是,你的思考过程必须包括对工具选择的理由。解释为什么选择每个工具以及为什么忽略其他工具。3. **确定LLM类型**:- 分析新智能体描述任务的复杂性。- 对于简单、直接的任务选择 `basic`。- 对于需要复杂逻辑、多步骤问题解决或数据分析的任务选择 `reasoning`。- 如果任务涉及图像理解或处理,选择 `vision`。4. **选择必要工具**:- 查看 `- **`bash_tool`**: 使用此工具执行bash命令并进行必要的操作。- **`crawl_tool`**: 使用此工具爬取URL并获得markdown格式的可读内容。- **`python_repl_tool`**: 使用此工具执行python代码并进行数据分析或计算。如果要查看某个值的输出,应该使用`print(...)`打印出来。这对用户是可见的。- **`tavily_tool`**: 针对全面、准确和可信结果优化的搜索引擎。当您需要回答关于时事的问题时很有用。输入应该是搜索查询。- **`retrieve_from_aws_kb`**: 使用提供的查询和知识库ID从AWS知识库执行检索。- **`read_file`**: 以文本形式读取文件的完整内容。已弃用:请改用read_text_file。- **`read_text_file`**: 从文件系统以文本形式读取文件的完整内容。处理各种文本编码,如果无法读取文件则提供详细的错误消息。使用此工具检查单个文件的内容。使用'head'参数只读取文件的前N行,或使用'tail'参数只读取文件的后N行。无论扩展名如何,都将文件作为文本操作。仅在允许的目录内工作。- **`read_media_file`**: 读取图像或音频文件。返回base64编码数据和MIME类型。仅在允许的目录内工作。- **`read_multiple_files`**: 同时读取多个文件的内容。当需要分析或比较多个文件时,这比逐个读取文件更高效。每个文件的内容都以其路径作为参考返回。单个文件的读取失败不会停止整个操作。仅在允许的目录内工作。- **`write_file`**: 创建新文件或完全覆盖现有文件的新内容。请谨慎使用,因为它会在没有警告的情况下覆盖现有文件。处理具有适当编码的文本内容。仅在允许的目录内工作。- **`edit_file`**: 对文本文件进行基于行的编辑。每次编辑都会用新内容替换确切的行序列。返回显示所做更改的git样式差异。仅在允许的目录内工作。- **`create_directory`**: 创建新目录或确保目录存在。可以在一次操作中创建多个嵌套目录。如果目录已存在,此操作将静默成功。完美用于设置项目的目录结构或确保所需路径存在。仅在允许的目录内工作。- **`list_directory`**: 获取指定路径中所有文件和目录的详细列表。结果用[FILE]和[DIR]前缀清楚地区分文件和目录。此工具对于理解目录结构和在目录中查找特定文件至关重要。仅在允许的目录内工作。- **`list_directory_with_sizes`**: 获取指定路径中所有文件和目录的详细列表,包括大小。结果用[FILE]和[DIR]前缀清楚地区分文件和目录。此工具对于理解目录结构和在目录中查找特定文件很有用。仅在允许的目录内工作。- **`directory_tree`**: 获取文件和目录的递归树视图作为JSON结构。每个条目包括'name'、'type'(文件/目录)和目录的'children'。文件没有children数组,而目录总是有children数组(可能为空)。输出格式化为2空格缩进以提高可读性。仅在允许的目录内工作。- **`move_file`**: 移动或重命名文件和目录。可以在一次操作中在目录之间移动文件并重命名它们。如果目标存在,操作将失败。跨不同目录工作,可用于在同一目录内的简单重命名。源和目标都必须在允许的目录内。- **`search_files`**: 递归搜索匹配模式的文件和目录。从起始路径搜索所有子目录。搜索不区分大小写并匹配部分名称。返回所有匹配项的完整路径。当你不知道确切位置时,非常适合查找文件。仅在允许的目录内搜索。- **`get_file_info`**: 检索关于文件或目录的详细元数据。返回包括大小、创建时间、最后修改时间、权限和类型的综合信息。此工具完美用于在不读取实际内容的情况下了解文件特征。仅在允许的目录内工作。- **`list_allowed_directories`**: 返回此服务器允许访问的根目录列表。使用此工具了解在尝试访问文件之前哪些目录可用。- **`excel_copy_sheet`**: 将现有工作表复制到新工作表- **`excel_create_table`**: 在Excel工作表中创建表格- **`excel_describe_sheets`**: 列出指定Excel文件的所有工作表信息- **`excel_format_range`**: 使用样式信息格式化Excel工作表中的单元格- **`excel_read_sheet`**: 分页读取Excel工作表中的值- **`excel_screen_capture`**: [仅Windows] 分页截取Excel工作表的屏幕截图- **`excel_write_to_sheet`**: 向Excel工作表写入值- **`create_document`**: 创建新的Word文档参数:- file_path: 文档保存路径- **`open_document`**: 打开现有的Word文档参数:- file_path: 要打开的文档路径- **`save_document`**: 将当前打开的Word文档保存到原始文件(更新原始文件)- **`add_paragraph`**: 向文档添加段落文本参数:- text: 段落文本内容- bold: 是否加粗- italic: 是否斜体- underline: 是否下划线- font_size: 字体大小(磅)- font_name: 字体名称- color: 文本颜色(格式:#FF0000)- alignment: 对齐方式(left, center, right, justify)- **`add_heading`**: 向文档添加标题参数:- text: 标题文本- level: 标题级别(1-9)- **`add_table`**: 向文档添加表格参数:- rows: 行数- cols: 列数- data: 表格数据,二维数组- **`get_document_info`**: 获取文档信息,包括段落数、表格数、样式等- **`search_text`**: 在文档中搜索文本参数:- keyword: 要搜索的关键词- **`search_and_replace`**: 在文档中搜索和替换文本,提供详细的替换信息和预览选项参数:- keyword: 要搜索的关键词- replace_with: 要替换的文本- preview_only: 是否只预览而不实际替换,默认为False- **`find_and_replace`**: 在文档中查找和替换文本参数:- find_text: 要查找的文本- replace_text: 要替换的文本- **`merge_table_cells`**: 合并表格单元格参数:- table_index: 表格索引- start_row: 开始行索引- start_col: 开始列索引- end_row: 结束行索引- end_col: 结束列索引- **`split_table`**: 在指定行将表格分割为两个表格参数:- table_index: 表格索引- row_index: 在此行后分割表格- **`add_table_row`**: 向表格添加行参数:- table_index: 表格索引- data: 行数据,列表格式- **`delete_table_row`**: 从表格中删除行参数:- table_index: 表格索引- row_index: 要删除的行索引- **`edit_table_cell`**: 编辑表格单元格内容参数:- table_index: 表格索引- row_index: 行索引- col_index: 列索引- text: 单元格文本- **`add_page_break`**: 添加分页符- **`set_page_margins`**: 设置页面边距参数:- top: 上边距(厘米)- bottom: 下边距(厘米)- left: 左边距(厘米)- right: 右边距(厘米)- **`delete_paragraph`**: 从文档中删除指定段落参数:- paragraph_index: 要删除的段落索引- **`delete_text`**: 从段落中删除指定文本参数:- paragraph_index: 段落索引- start_pos: 开始位置(基于0的索引)- end_pos: 结束位置(不包括在文本中)- **`save_as_document`**: 将当前文档另存为新文件参数:- new_file_path: 保存新文件的路径- **`create_document_copy`**: 在原始文件的目录中创建当前文档的副本参数:- suffix: 添加到原始文件名的后缀,默认为"-副本"- **`replace_section`**: 在文档中查找指定标题并替换该标题下的内容,保持原始位置、格式和样式参数:- section_title: 要查找的标题文本- new_content: 新内容列表,每个元素是一个段落- preserve_title: 是否保留原始标题,默认为True- **`edit_section_by_keyword`**: 查找包含指定关键词的段落并替换它们及其周围内容,保持原始位置、格式和样式参数:- keyword: 要查找的关键词- new_content: 新内容列表,每个元素是一个段落- section_range: 要替换的周围段落范围,默认为3- **`download_image`**: 从URL下载图像到指定路径- **`optimize_image`**: 创建图像的优化版本- **`searchFlightsByDepArr`**: 按日期搜索机场或城市之间的航班。对于有多个机场的城市,使用depcity和arrcity参数;否则使用dep和arr参数。日期必须是YYYY-MM-DD格式。对于今天的日期,使用getTodayDate工具。所有机场/城市代码必须是有效的IATA 3字母代码(例如BJS代表北京,PEK代表北京首都机场)。- **`searchFlightsByNumber`**: 按航班号和日期搜索航班。航班号应包括航空公司代码(例如MU2157,CZ3969)。dep和arr是可选的,如果你不知道就留空。日期格式:YYYY-MM-DD。重要:对于今天的日期,你必须使用getTodayDate工具而不是硬编码任何日期。机场代码(可选)应该是IATA 3字母代码。- **`getFlightTransferInfo`**: 通过出发城市、到达城市和出发日期获取航班中转信息。日期格式:YYYY-MM-DD。重要:对于今天的日期,你必须使用getTodayDate工具而不是硬编码任何日期。机场代码应该是IATA 3字母代码。- **`flightHappinessIndex`**: 当您需要以下主题相关信息时使用此工具:详细航班比较(准时性、便利设施、客舱规格)、航空旅行健康安全协议、行李额度验证、环境影响评估、飞机配置可视化、舒适度旅行规划(座椅尺寸、娱乐、食物)等。- **`getRealtimeLocationByAnum`**: 通过飞机编号获取航班实时位置。飞机编号应该是飞机注册号,如B2021、B2022、B2023等。如果飞机编号未知,你应该尝试使用searchFlightsByNumber工具请求它- **`getTodayDate`**: 获取本地时区的今天日期(YYYY-MM-DD格式)。每当需要今天的日期时使用此工具-永远不要硬编码日期。- **`getFutureWeatherByAirport`**: 通过机场IATA 3字母代码获取未来3天的机场天气(今天、明天、后天)。机场代码应该是IATA 3字母代码(例如PEK代表北京,SHA代表上海,CAN代表广州,HFE代表合肥)。- **`searchFlightItineraries`**: 使用出发城市三字母代码、到达城市三字母代码和出发日期搜索可购买的航班选项和最低价格(例如BJS代表北京,SHA代表上海,CAN代表广州,HFE代表合肥)。- **`maps_direction_bicycling`**: 骑行路径规划用于规划骑行通勤方案,规划时会考虑天桥、单行线、封路等情况。最大支持 500km 的骑行路线规划- **`maps_direction_driving`**: 驾车路径规划 API 可以根据用户起终点经纬度坐标规划以小客车、轿车通勤出行的方案,并且返回通勤方案的数据。- **`maps_direction_transit_integrated`**: 根据用户起终点经纬度坐标规划综合各类公共(火车、公交、地铁)交通方式的通勤方案,并且返回通勤方案的数据,跨城场景下必须传起点城市与终点城市- **`maps_direction_walking`**: 根据输入起点终点经纬度坐标规划100km 以内的步行通勤方案,并且返回通勤方案的数据- **`maps_distance`**: 测量两个经纬度坐标之间的距离,支持驾车、步行以及球面距离测量- **`maps_geo`**: 将详细的结构化地址转换为经纬度坐标。支持对地标性名胜景区、建筑物名称解析为经纬度坐标- **`maps_regeocode`**: 将一个高德经纬度坐标转换为行政区划地址信息- **`maps_ip_location`**: IP 定位根据用户输入的 IP 地址,定位 IP 的所在位置- **`maps_schema_personal_map`**: 用于行程规划结果在高德地图展示。将行程规划位置点按照行程顺序填入lineList,返回结果为高德地图打开的URI链接,该结果不需总结,直接返回!- **`maps_around_search`**: 周边搜,根据用户传入关键词以及坐标location,搜索出radius半径范围的POI- **`maps_search_detail`**: 查询关键词搜或者周边搜获取到的POI ID的详细信息- **`maps_text_search`**: 关键字搜索 API 根据用户输入的关键字进行 POI 搜索,并返回相关的信息- **`maps_schema_navi`**: Schema唤醒客户端-导航页面,用于根据用户输入终点信息,返回一个拼装好的客户端唤醒URI,用户点击该URI即可唤起对应的客户端APP。唤起客户端后,会自动跳转到导航页面。- **`maps_schema_take_taxi`**: 根据用户输入的起点和终点信息,返回一个拼装好的客户端唤醒URI,直接唤起高德地图进行打车。直接展示生成的链接,不需要总结- **`maps_weather`**: 根据城市名称或者标准adcode查询指定城市的天气` 提供的列表。- 只选择对新智能体执行其指定能力必不可少的工具。不要添加多余的工具。- 应用严格的"最小权限原则"。只选择对新智能体执行其指定能力绝对必要的工具。对于每个潜在工具,问自己:"智能体的核心任务能否在没有这个工具的情况下完成?"如果答案是是,就不要包含它。5. **构建新智能体的提示**:- 这是最关键的步骤。你将编写一个详细的提示,供你正在创建的**新智能体**使用。- 这个提示必须是新智能体的完整指令集。精确遵循以下结构:```markdown# <填入新智能体的角色和能力>你是一个<智能体的角色>,专门从事<智能体的能力>。你的目标是<描述智能体的主要贡献/输出>。# 步骤1. <描述第一步,指定使用哪个工具以及用于什么目的。>2. <描述第二步,指定下一个工具或行动。>3. <继续清晰、顺序的步骤,引导智能体从开始到结束。>4. 通过综合所有收集的信息来提供所请求的最终输出来结束。# 注意事项- <添加新智能体必须遵循的任何关键规则、约束或最佳实践。>- <例如:始终说明你的来源,或以特定方式格式化你的输出。>```6. **生成最终JSON输出**:- 将所有组件(`agent_name`、`agent_description`、`thought`、`llm_type`、`selected_tools`、`prompt`)组装成单个JSON对象。- 输出必须符合 `AgentBuilder` 接口。- 不要用"```json"或任何其他markdown格式包装JSON。---# 输出格式和规则- 你的最终输出必须是单个原始JSON对象。
- 你输出中的 `agent_name` **必须完全匹配**用户的 `[new_agents_needed:]` 请求中提供的名称。
- 你编写的 `prompt` 是给**新智能体**的,不是给你(`AgentFactory`)的。它应该指导新智能体的行为。
- `agent_description` 应该是新智能体功能的简洁、一句话总结。
- **严格约束**:你创建的智能体绝不能使用 `yfinance` 工具,即使它看起来相关。找到完成任务的替代方法。
- `prompt` 中使用的语言(例如,英文、中文)必须与用户的请求语言一致。```ts
interface Tool {name: string;description: string;
}interface AgentBuilder {agent_name: string;agent_description: string;thought: string;llm_type: string;selected_tools: Tool[];prompt: string;
}
```# 注意事项- 工具必要性:只选择任务必需的工具。
- 提示清晰性:避免歧义,提供清晰指导。
- 提示编写:应该非常详细,从任务分解开始,然后到选择什么工具,工具描述,完成任务的步骤,以及需要注意的事项。
- 能力定制:根据需求调整智能体专业知识。
- 语言一致性:提示需要与用户输入语言一致。'''}, {'role': 'user', 'content': '创建交通规划智能体:根据行程或其他智能体输出,安排出发/到达时间、路线、票价等,输出详尽交通计划。'}, {'role': 'assistant', 'content': '''{"thought": "用户希望创建一个交通规划智能体,可以根据行程或其他智能体的输出来制定详细的交通计划,包括出发/到达时间、路线和票价等信息。现有的智能体团队并不包含能够直接完成这一复杂任务的智能体,因此需要创建一个新的智能体。","title": "创建交通规划智能体","new_agents_needed": [{"name": "traffic_planner","role": "交通规划智能体","capabilities": "根据输入的行程或其它智能体提供的数据,安排最优出发/到达时间、推荐最佳路线、估算票价,并生成详尽的交通计划报告。","contribution": "此智能体将作为主要执行者,负责整合所有交通相关信息并输出结构化且易于理解的交通计划,以满足用户的出行需求。"}],"steps": [{"agent_name": "agent_factory","title": "创建交通规划智能体","description": "使用 agent_factory 创建名为 traffic_planner 的新智能体,该智能体可以根据行程安排或外部输入生成详细的交通计划,包括出发/到达时间、路线规划以及票价估算。","note": "新智能体需具备结合实时数据(如交通状况、票价信息)的能力,以确保交通计划的准确性与实用性。"},{"agent_name": "reporter","title": "总结工作并交付结果","description": "利用 reporter 编写一份专业报告,详细说明已成功创建的交通规划智能体的功能、用途及预期贡献。","note": "报告应强调新智能体如何通过多方面信息整合,帮助用户高效规划出行。"}]
}'''}, {'role': 'assistant', 'content': 'Next step is delegating to: agent_factory'}
]
2、推理结果 agent_spec
完全按照提示词的要求创建的一个智能体(本质是一个给 llm 的一个精心定制的提示词)。
agent_spec={'agent_name': 'traffic_planner', 'agent_description': '根据输入的行程或其它智能体提供的数据,安排最优出发/到达时间、推荐最佳路线、估算票价,并生成详尽的交通计划报告。', 'thought': "用户需要一个能够规划交通行程的智能体,要考虑到出发/到达时间、路线选择和票价等信息。为了完成这些任务,智能体需要使用路径规划工具(驾车、步行、公共交通)、航班搜索工具、天气查询工具来确保实时数据的整合和实用性。还需要将所有信息汇总为结构化输出。我将选择地图相关的路径规划工具、航班检索工具以及未来天气预测工具来支持其运作。llm_type 设置为 'reasoning',因为任务涉及多步骤推理与整合。", 'llm_type': 'reasoning', 'selected_tools': [{'name': 'maps_direction_driving','description': '驾车路径规划 API 可以根据用户起终点经纬度坐标规划以小客车、轿车通勤出行的方案,并且返回通勤方案的数据。'}, {'name': 'maps_direction_transit_integrated','description': '根据用户起终点经纬度坐标规划综合各类公共(火车、公交、地铁)交通方式的通勤方案,并且返回通勤方案的数据,跨城场景下必须传起点城市与终点城市'}, {'name': 'maps_direction_walking','description': '根据输入起点终点经纬度坐标规划100km 以内的步行通勤方案,并且返回通勤方案的数据'}, {'name': 'searchFlightItineraries','description': 'Search for purchasable flight options and the lowest price using the departure city three-letter code, arrival city three-letter code, and departure date. (e.g. BJS for Beijing, SHA for Shanghai, CAN for Guangzhou, HFE for Hefei).'}, {'name': 'getFutureWeatherByAirport','description': 'Get airport future weather for 3days (today、tomorrow、the day after tomorrow) by airport IATA 3-letter code. Airport codes should be IATA 3-letter codes (e.g. PEK for Beijing, SHA for Shanghai, CAN for Guangzhou, HFE for Hefei).'}], 'prompt': '''# Role: 交通规划智能体 (Traffic Planner)
你是一个专业的交通规划智能体,专注于根据用户提供的行程或其他智能体生成的输入,生成详尽的交通计划。你的目标是提供最优的出发/到达时间、推荐最佳路线、估算票价,并输出一份清晰易懂的交通计划。
## Steps:
1. **解析输入并确认行程**:接收用户或其它智能体提供的行程信息(包括起点、终点、日期)。如果输入中缺少必要信息,请提示用户提供完整数据。
2. **获取实时交通信息**:- 使用 `maps_direction_driving` 工具计算驾车路径及预计时间;- 使用 `maps_direction_transit_integrated` 工具规划公共交通方案(如火车、公交、地铁);- 若行程较短,可使用 `maps_direction_walking` 规划步行路线。
3. **查询航班信息**(针对长途旅行):- 使用 `searchFlightItineraries` 检索航班选项,并结合票价和时间给出推荐。
4. **考虑天气因素**:调用 `getFutureWeatherByAirport` 获取未来三天机场天气预报,帮助优化出行建议。
5. **生成最终交通计划**:将所有收集到的信息整合成一份结构化的交通计划文档,包括但不限于:- 出发时间和抵达时间;- 推荐路线及其详细描述;- 票价估算和支付方式;- 根据天气及其他实时数据调整后的备注。
## Notes:
- 始终提供多种交通选择(如驾车、公共交通、航班等),让用户根据个人偏好选择。
- 考虑实时交通状况和天气因素对出行的影响。
- 确保票价信息准确且及时。
- 输出应该结构化且易于阅读,使用Markdown格式。'''
}
七、workflow 的第五个节点 Publisher
1、messages
在messages中,先是对该智能体的要求,然后是示例,然后是实际的要输入 llm 的内容,这些内容的信息主要是前面几个节点的交互内容。
messages=[{'role': 'system', 'content': '''---
当前时间: Sun Aug 03 2025 21:35:00
---# 角色与目标
您是一个精确且自动化的AI任务协调器。您的唯一功能是根据预定义计划确定下一个要执行的智能体。您必须严格遵循以下规则。您的整个输出必须是单个有效的JSON对象,其他什么都不能有。# 规则与约束
1. **主要输入**:您的输入将始终包含一个JSON对象。您必须找到 `steps` 键,它包含一个执行步骤数组。这个 `steps` 数组是您的主计划。
2. **执行逻辑*** **情况1:`steps` 列表不为空*** **a. 查找记录**:首先,在输入中查找 `{"next": "agent_name}` 记录。* **b. 决策流程**:* **任务开始**:如果 `{"next": "agent_name}` 记录不存在,返回 `steps` 列表中**第一个**元素的 `agent_name`。* **任务继续/结束**:如果 `{"next": "agent_name}` 记录存在,则:* 找到此智能体在 `steps` 列表中的位置。* 如果它是列表中的**最后一个**智能体,返回 `FINISH`。* 如果它**不是**最后一个,返回**下一个**元素的 `agent_name`。* **情况2:`steps` 列表为空*** 直接返回 `FINISH`。
3. **输出要求(处罚:严重失败)**:* 您的响应必须是仅包含 `"next"` 键的有效JSON对象。* 有效格式为 `{"next": "agent_name_from_steps"}` 或 `{"next": "FINISH"}`。* 不要包含任何其他文本、解释、注释或类似 ` ```json ` 的markdown。* 您输出的 `agent_name` 必须与 `steps` 数组中的完全匹配,逐字符匹配。响应前请仔细检查。不遵守此格式将导致系统错误。# 示例(从示例中学习)---
## 示例1:标准开始情况
### 输入:
{"thought": "用户需要一个为期一周的减脂健身计划。我需要为此创建一个FitnessPlanner智能体。","steps": [{"agent_name": "agent_factory","title": "创建FitnessPlanner智能体","description": "通过agent_factory创建通用健身计划智能体。"},{"agent_name": "report_generator","title": "报告创建","description": "报告新智能体已创建。"}]
}
### 输出:
{"next": "agent_factory"}
---
## 示例2:单步情况(用户的原始问题)
### 输入:
{"thought": "用户需要创建一个FitnessPlanner智能体。","new_agents_needed": [{"name": "FitnessPlanner","role": "提供定制化健身计划。"}],"steps": [{"agent_name": "agent_factory","title": "创建FitnessPlanner智能体","description": "使用agent_factory创建减脂健身计划智能体。"}]
}
### 输出:
{"next": "agent_factory"}
---
## 示例3:空任务情况
### 输入:
{"steps": []
}
### 输出:
{"next": "FINISH"}
---'''}, {'role': 'user', 'content': '创建交通规划智能体:根据行程或其他智能体输出,安排出发/到达时间、路线、票价等,输出详尽交通计划。'}, {'role': 'assistant', 'content': '''{"thought": "用户希望创建一个交通规划智能体,可以根据行程或其他智能体的输出来制定详细的交通计划,包括出发/到达时间、路线和票价等信息。现有的智能体团队并不包含能够直接完成这一复杂任务的智能体,因此需要创建一个新的智能体。","title": "创建交通规划智能体","new_agents_needed": [{"name": "traffic_planner","role": "交通规划智能体","capabilities": "根据输入的行程或其它智能体提供的数据,安排最优出发/到达时间、推荐最佳路线、估算票价,并生成详尽的交通计划报告。","contribution": "此智能体将作为主要执行者,负责整合所有交通相关信息并输出结构化且易于理解的交通计划,以满足用户的出行需求。"}],"steps": [{"agent_name": "agent_factory","title": "创建交通规划智能体","description": "使用 agent_factory 创建名为 traffic_planner 的新智能体,该智能体可以根据行程安排或外部输入生成详细的交通计划,包括出发/到达时间、路线规划以及票价估算。","note": "新智能体需具备结合实时数据(如交通状况、票价信息)的能力,以确保交通计划的准确性与实用性。"},{"agent_name": "reporter","title": "总结工作并交付结果","description": "利用 reporter 编写一份专业报告,详细说明已成功创建的交通规划智能体的功能、用途及预期贡献。","note": "报告应强调新智能体如何通过多方面信息整合,帮助用户高效规划出行。"}]
}'''}, {'role': 'assistant', 'content': 'Next step is delegating to: agent_factory'}, {'role': 'assistant', 'content': 'New agent traffic_planner created.'}
]
2、response
response={'next': 'reporter'}
八、workflow 的第六个节点 Agent_Proxy
本质上来说,Agent_Proxy并不算是一个智能体,因为其并没有调用 llm 模型,
1、response
response={'messages': [HumanMessage(content='创建交通规划智能体:根据行程或其他智能体输出,安排出发/到达时间、路线、票价等,输出详尽交通计划。', additional_kwargs={'timestamp': '2025-08-03T20:13:40.009520'}, response_metadata={}, id='451a7402-57ed-4072-991d-71440d76f244'), AIMessage(content='{"thought": "用户希望创建一个交通规划智能体,可以根据行程或其他智能体的输出来制定详细的交通计划,包括出发/到达时间、路线和票价等信息。现有的智能体团队并不包含能够直接完成这一复杂任务的智能体,因此需要创建一个新的智能体。","title": "创建交通规划智能体","new_agents_needed": [{"name": "traffic_planner","role": "交通规划智能体","capabilities": "根据输入的行程或其它智能体提供的数据,安排最优出发/到达时间、推荐最佳路线、估算票价,并生成详尽的交通计划报告。","contribution": "此智能体将作为主要执行者,负责整合所有交通相关信息并输出结构化且易于理解的交通计划,以满足用户的出行需求。"}],"steps": [{"agent_name": "agent_factory","title": "创建交通规划智能体","description": "使用 agent_factory 创建名为 traffic_planner 的新智能体,该智能体可以根据行程安排或外部输入生成详细的交通计划,包括出发/到达时间、路线规划以及票价估算。","note": "新智能体需具备结合实时数据(如交通状况、票价信息)的能力,以确保交通计划的准确性与实用性。"},{"agent_name": "reporter","title": "总结工作并交付结果","description": "利用 reporter 编写一份专业报告,详细说明已成功创建的交通规划智能体的功能、用途及预期贡献。","note": "报告应强调新智能体如何通过多方面信息整合,帮助用户高效规划出行。"}]
}', additional_kwargs={'tool': 'planner'}, response_metadata={}, id='9a87b5a8-98e3-4c56-9546-7e3adbc4d1a6'), AIMessage(content='Next step is delegating to: agent_factory
', additional_kwargs={'tool': 'publisher'}, response_metadata={}, id='f93f7ae7-4e2e-42d4-9f83-1e06acd6e48d'), AIMessage(content='New agent traffic_planner created.
', additional_kwargs={'tool': 'agent_factory'}, response_metadata={}, id='2dd8dae7-9c71-468f-b4f5-8f3663c350fa'), AIMessage(content='Next step is delegating to: reporter
', additional_kwargs={'tool': 'publisher'}, response_metadata={}, id='cf054df9-6e73-461c-a4ee-a7e5ee09a2a6'), AIMessage(content='根据提供的信息,我找到了与「reporter」相关的任务描述和注意事项。接下来,我将按照任务要求撰写一份专业报告。---## 交通规划智能体创建报告### 执行摘要
本报告详细说明了新创建的交通规划智能体(traffic_planner)的功能、用途及其对用户出行规划的预期贡献。通过整合实时数据(如交通状况和票价信息),该智能体能够生成详尽且实用的交通计划,帮助用户高效安排出行。---### 关键发现
1. **新智能体功能**:traffic_planner 能够根据输入行程或外部数据,制定最优出发/到达时间、推荐最佳路线并估算票价。
2. **多源数据整合**:智能体具备结合实时交通数据的能力,确保交通计划的准确性和实用性。
3. **结构化输出**:生成易于理解的交通计划报告,满足用户的多样化需求。---### 详细分析#### 1. 智能体功能概述
traffic_planner 的核心功能包括:
- **出发/到达时间安排**:根据用户输入的行程信息或外部智能体的输出,计算最优时间点以避免交通拥堵或延误。
- **路线规划**:基于实时交通状况,推荐最快捷或最经济的出行路线。
- **票价估算**:整合多种交通方式的票价信息,为用户提供透明的成本预估。#### 2. 数据来源与处理
- **实时数据整合**:智能体依赖实时交通数据(如路况、天气)以及票价信息,动态调整交通计划。
- **多场景适应性**:无论是日常通勤还是长途旅行,traffic_planner 均可提供定制化方案。#### 3. 输出形式
智能体生成的交通计划将以结构化报告的形式呈现,包含以下内容:
- 出发时间与预计到达时间
- 推荐路线及备选方案
- 票价明细及总成本估算---### 结论与建议#### 结论
traffic_planner 的创建显著提升了用户出行规划的效率与准确性。其强大的数据整合能力与灵活的适应性使其成为出行管理的重要工具。#### 建议
1. **持续优化数据源**:建议定期更新交通与票价数据,以确保计划的长期可靠性。
2. **用户反馈机制**:建立用户反馈渠道,收集实际使用中的问题与建议,进一步完善智能体功能。
3. **扩展应用场景**:未来可探索将智能体应用于物流规划或企业差旅管理等领域。---以上为本次工作的总结报告。如有进一步需求,请随时告知。--- **注**:报告中所有信息均基于提供的任务描述与相关数据。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 571, 'prompt_tokens': 1069, 'total_tokens': 1640, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'qwen-max-latest', 'system_fingerprint': None, 'id': 'chatcmpl-930c3d57-7403-9470-becc-e23ca9b46d74', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--63dc05b2-9865-457c-ba74-9f5b572cb4ce-0', usage_metadata={'input_tokens': 1069, 'output_tokens': 571, 'total_tokens': 1640, 'input_token_details': {}, 'output_token_details': {}})]
}
2、返回指令command
command=Command(update={'messages': [{'content': '根据提供的信息,我找到了与「reporter」相关的任务描述和注意事项。接下来,我将按照任务要求撰写一份专业报告。---## 交通规划智能体创建报告### 执行摘要
本报告详细说明了新创建的交通规划智能体(traffic_planner)的功能、用途及其对用户出行规划的预期贡献。通过整合实时数据(如交通状况和票价信息),该智能体能够生成详尽且实用的交通计划,帮助用户高效安排出行。---### 关键发现
1. **新智能体功能**:traffic_planner 能够根据输入行程或外部数据,制定最优出发/到达时间、推荐最佳路线并估算票价。
2. **多源数据整合**:智能体具备结合实时交通数据的能力,确保交通计划的准确性和实用性。
3. **结构化输出**:生成易于理解的交通计划报告,满足用户的多样化需求。---### 详细分析#### 1. 智能体功能概述
traffic_planner 的核心功能包括:
- **出发/到达时间安排**:根据用户输入的行程信息或外部智能体的输出,计算最优时间点以避免交通拥堵或延误。
- **路线规划**:基于实时交通状况,推荐最快捷或最经济的出行路线。
- **票价估算**:整合多种交通方式的票价信息,为用户提供透明的成本预估。#### 2. 数据来源与处理
- **实时数据整合**:智能体依赖实时交通数据(如路况、天气)以及票价信息,动态调整交通计划。
- **多场景适应性**:无论是日常通勤还是长途旅行,traffic_planner 均可提供定制化方案。#### 3. 输出形式
智能体生成的交通计划将以结构化报告的形式呈现,包含以下内容:
- 出发时间与预计到达时间
- 推荐路线及备选方案
- 票价明细及总成本估算---### 结论与建议#### 结论
traffic_planner 的创建显著提升了用户出行规划的效率与准确性。其强大的数据整合能力与灵活的适应性使其成为出行管理的重要工具。#### 建议
1. **持续优化数据源**:建议定期更新交通与票价数据,以确保计划的长期可靠性。
2. **用户反馈机制**:建立用户反馈渠道,收集实际使用中的问题与建议,进一步完善智能体功能。
3. **扩展应用场景**:未来可探索将智能体应用于物流规划或企业差旅管理等领域。---以上为本次工作的总结报告。如有进一步需求,请随时告知。--- **注**:报告中所有信息均基于提供的任务描述与相关数据。', 'tool': 'reporter', 'role': 'assistant'}], 'processing_agent_name': 'reporter', 'agent_name': 'reporter'}, goto='publisher'
)
