From e5f8826d5917ff474e3cf6f9b495dcd797d87978 Mon Sep 17 00:00:00 2001 From: Annyfee <2287551746@qq.com> Date: Sat, 3 Jan 2026 17:32:55 +0800 Subject: [PATCH] refactor(ch12): align filenames and update corresponding README sections --- m12_agents_sdk_swarm/README.md | 12 +- m12_agents_sdk_swarm/agent.py | 105 --------------- .../{tools.py => s01_tools.py} | 0 m12_agents_sdk_swarm/s02_agent.py | 123 ++++++++++++++++++ m12_agents_sdk_swarm/{main.py => s03_main.py} | 4 +- 5 files changed, 131 insertions(+), 113 deletions(-) delete mode 100644 m12_agents_sdk_swarm/agent.py rename m12_agents_sdk_swarm/{tools.py => s01_tools.py} (100%) create mode 100644 m12_agents_sdk_swarm/s02_agent.py rename m12_agents_sdk_swarm/{main.py => s03_main.py} (96%) diff --git a/m12_agents_sdk_swarm/README.md b/m12_agents_sdk_swarm/README.md index 18bf666..efbae67 100644 --- a/m12_agents_sdk_swarm/README.md +++ b/m12_agents_sdk_swarm/README.md @@ -4,7 +4,7 @@ --- -### 1. 模块概述 +## 模块概述 本模块基于 Agents SDK Swarm 框架实现了一个航空公司智能客服系统,展示了多智能体协作、智能转接和工具调用的核心功能。 @@ -17,7 +17,7 @@ --- -### 2. `tools.py` (业务工具与上下文) +### 1. `s01_tools.py` (业务工具与上下文) 定义了系统使用的业务工具和全局上下文变量。 @@ -33,7 +33,7 @@ --- -### 3. `agent.py` (智能体定义与配置) +### 2. `s02_agent.py` (智能体定义与配置) 定义了系统中的所有智能体及其交互规则。 @@ -52,7 +52,7 @@ --- -### 4. `main.py` (系统运行入口) +### 3. `s03_main.py` (系统运行入口) 实现了智能客服系统的运行逻辑和用户交互界面。 @@ -84,7 +84,7 @@ 2. **运行方式**: ```bash - python -m m12_agents_sdk_swarm.main + python -m m12_agents_sdk_swarm.s03_main ``` 3. **使用示例**: @@ -115,4 +115,4 @@ - 确保已正确安装所有依赖(可通过项目根目录的 `requirements.txt` 安装) - 高德地图 API Key 是系统正常运行的必要条件 - 如遇到连接问题,检查网络设置和 API Key 的有效性 -- 系统默认关闭 Tracing 功能,如需启用请在 `main.py` 中取消注释相关代码并配置 API Key \ No newline at end of file +- 系统默认关闭 Tracing 功能,如需启用请在 `s03_main.py` 中取消注释相关代码并配置 API Key \ No newline at end of file diff --git a/m12_agents_sdk_swarm/agent.py b/m12_agents_sdk_swarm/agent.py deleted file mode 100644 index e5a68b5..0000000 --- a/m12_agents_sdk_swarm/agent.py +++ /dev/null @@ -1,105 +0,0 @@ -from agents.mcp import MCPServerStdio, MCPServerStdioParams -from openai import AsyncOpenAI -from agents.agent import Agent -from agents.models.openai_chatcompletions import OpenAIChatCompletionsModel -from m12_agents_sdk_swarm.tools import execute_refund, check_seat -from config import AMAP_MAPS_API_KEY,OPENAI_API_KEY - -client = AsyncOpenAI(api_key=OPENAI_API_KEY, base_url="https://api.deepseek.com") -model = OpenAIChatCompletionsModel(model="deepseek-chat", openai_client=client) - -# 创建 Server,传入 params -amap_server = [ - MCPServerStdio( - name="amap", - params=MCPServerStdioParams( - command="npx", - args=["-y", "@amap/amap-maps-mcp-server"], - env={"AMAP_MAPS_API_KEY": AMAP_MAPS_API_KEY} - ) - ) -] - -# === 1. 创建所有Agent === - -# 退票专员 -refund_agent = Agent( - name="RefundAgent", - instructions=lambda context, __: f"""你是退票专员。 - -【客户信息】 -- 姓名: {context.context.get('user_name')} -- 航班号: {context.context.get('flight_no')} - -【核心职责】 -1. 当用户表达退票意图时,立即调用 execute_refund 工具完成退票 -2. 不要问用户是否确认,直接执行 -3. 执行完工具后,告知用户退款状态 - -【转接规则】 -- 如果用户改变主意想改签,转接到 ChangeAgent -- 如果用户询问其他问题,转接到 TriageAgent -- 退票完成后,询问用户是否还需要其他帮助 - -【重要】你已经被转接过来,说明用户想退票,直接执行工具即可,不要犹豫! -""", - tools=[execute_refund], - model=model -) - -# 改签专员 -change_agent = Agent( - name="ChangeAgent", - instructions=lambda context, __: f"""你是改签专员。 - -【客户信息】 -- 姓名: {context.context.get('user_name')} -- 航班号: {context.context.get('flight_no')} - -【核心职责】 -1. 当用户表达改签意图时,立即调用 check_seat 工具查询座位 -2. 不要问用户是否确认,直接执行 -3. 执行完工具后,告知用户结果 - -【转接规则】 -- 如果用户改变主意想退票,转接到 RefundAgent -- 如果用户询问其他问题,转接到 TriageAgent -- 改签完成后,询问用户是否还需要其他帮助 - -【重要】你已经被转接过来,说明用户想改签,直接执行工具即可! -""", - tools=[check_seat], - model=model, -) - -# 前台分诊员(动态提示词) -triage_agent = Agent( - name="TriageAgent", - instructions=lambda context, __: f"""你是航空公司前台客服。 - -【客户信息】 -- 姓名: {context.context.get('user_name')} -- 航班号: {context.context.get('flight_no')} - -【转接规则】 -1. 用户说"退票"、"退款"、"取消航班" → 转接到 RefundAgent -2. 用户说"改签"、"换航班"、"改时间" → 转接到 ChangeAgent -3. 用户想查询某个附近地方的酒店、景点信息时 → 调用 amap_server -4. 其他问题由你自己回答 - -【重要】 -- 转接时要明确告知用户:"我帮您转接到XX专员" -- 不要重复询问用户意图,识别后立即转接 -""", - mcp_servers=amap_server, - model=model, -) - -# === 2. 建立 Handoff 网络 === - -# 前台可转给两位专员 -triage_agent.handoffs = [refund_agent, change_agent] - -# 专员之间也可互相转接,并能回退到前台 -refund_agent.handoffs = [change_agent, triage_agent] -change_agent.handoffs = [refund_agent, triage_agent] \ No newline at end of file diff --git a/m12_agents_sdk_swarm/tools.py b/m12_agents_sdk_swarm/s01_tools.py similarity index 100% rename from m12_agents_sdk_swarm/tools.py rename to m12_agents_sdk_swarm/s01_tools.py diff --git a/m12_agents_sdk_swarm/s02_agent.py b/m12_agents_sdk_swarm/s02_agent.py new file mode 100644 index 0000000..edf5954 --- /dev/null +++ b/m12_agents_sdk_swarm/s02_agent.py @@ -0,0 +1,123 @@ +from agents.mcp import MCPServerStdio, MCPServerStdioParams +from openai import AsyncOpenAI +from agents.agent import Agent +from agents.models.openai_chatcompletions import OpenAIChatCompletionsModel +from m12_agents_sdk_swarm.s01_tools import execute_refund, check_seat,context_variables +from config import AMAP_MAPS_API_KEY,OPENAI_API_KEY + +client = AsyncOpenAI(api_key=OPENAI_API_KEY, base_url="https://api.deepseek.com") +model = OpenAIChatCompletionsModel(model="deepseek-chat", openai_client=client) + +# 创建 Server,传入 params +amap_server = [ + MCPServerStdio( + name="amap", + params=MCPServerStdioParams( + command="npx", + args=["-y", "@amap/amap-maps-mcp-server"], + env={"AMAP_MAPS_API_KEY": AMAP_MAPS_API_KEY} + ) + ) +] + + + + +# === 1. 创建所有Agent === + +# 定义指令生成函数 +def refund_instructions(context_variables): + name = context_variables.get('user_name') + flight = context_variables.get('flight_no') + return f"""你是退票专员。 + 【客户信息】 + - 姓名: {context_variables.get('user_name')} + - 航班号: {context_variables.get('flight_no')} + + 【核心职责】 + 1. 当用户表达退票意图时,立即调用 execute_refund 工具完成退票 + 2. 不要问用户是否确认,直接执行 + 3. 执行完工具后,告知用户退款状态 + + 【转接规则】 + - 如果用户改变主意想改签,转接到 ChangeAgent + - 如果用户询问其他问题,转接到 TriageAgent + - 退票完成后,询问用户是否还需要其他帮助 + + 【重要】你已经被转接过来,说明用户想退票,直接执行工具即可,不要犹豫! + """ + +def change_instructions(context_variables): + name = context_variables.get('user_name') + flight = context_variables.get('flight_no') + return f"""你是改签专员。 + 【客户信息】 + - 姓名: {context_variables.get('user_name')} + - 航班号: {context_variables.get('flight_no')} + + 【核心职责】 + 1. 当用户表达改签意图时,立即调用 check_seat 工具查询座位 + 2. 不要问用户是否确认,直接执行 + 3. 执行完工具后,告知用户结果 + + 【转接规则】 + - 如果用户改变主意想退票,转接到 RefundAgent + - 如果用户询问其他问题,转接到 TriageAgent + - 改签完成后,询问用户是否还需要其他帮助 + + 【重要】你已经被转接过来,说明用户想改签,直接执行工具即可! + """ + +def triage_instructions(context_variables): + name = context_variables.get('user_name') + flight = context_variables.get('flight_no') + return f"""你是航空公司前台客服。 + + 【客户信息】 + - 姓名: {context_variables.get('user_name')} + - 航班号: {context_variables.get('flight_no')} + + 【转接规则】 + 1. 用户说"退票"、"退款"、"取消航班" → 刻转接到 RefundAgent + 2. 用户说"改签"、"换航班"、"改时间" → 转接到 ChangeAgent + 3. 用户想查询某个附近地方的酒店、景点、地理信息时 → 必须调用 amap_server + 4. 其他问题由你自己回答 + + 【重要】 + - 转接时要明确告知用户:"我帮您转接到XX专员" + - 不要重复询问用户意图,识别后立即转接 + """ + + +# 退票专员 +refund_agent = Agent( + name="RefundAgent", + instructions=refund_instructions(context_variables), + tools=[execute_refund], + model=model +) + +# 改签专员 +change_agent = Agent( + name="ChangeAgent", + instructions=change_instructions(context_variables), + tools=[check_seat], + model=model, +) + +# 前台分诊员 +triage_agent = Agent( + name="TriageAgent", + instructions=triage_instructions(context_variables), + mcp_servers=amap_server, + model=model, +) + +# === 2. 建立 Handoff 网络 === + +# 前台可转给两位专员 +triage_agent.handoffs = [refund_agent, change_agent] + +# 专员之间也可互相转接,并能回退到前台 +refund_agent.handoffs = [change_agent, triage_agent] +change_agent.handoffs = [refund_agent, triage_agent] \ No newline at end of file diff --git a/m12_agents_sdk_swarm/main.py b/m12_agents_sdk_swarm/s03_main.py similarity index 96% rename from m12_agents_sdk_swarm/main.py rename to m12_agents_sdk_swarm/s03_main.py index bb7ad31..2ed02da 100644 --- a/m12_agents_sdk_swarm/main.py +++ b/m12_agents_sdk_swarm/s03_main.py @@ -1,8 +1,8 @@ import asyncio from openai.types.responses import ResponseTextDeltaEvent from agents.run import Runner -from m12_agents_sdk_swarm.agent import triage_agent,amap_server -from m12_agents_sdk_swarm.tools import context_variables +from m12_agents_sdk_swarm.s02_agent import triage_agent,amap_server +from m12_agents_sdk_swarm.s01_tools import context_variables # 不启用Chatgpt官方提供的Tracing(无需配置api_key) from agents.tracing import set_tracing_disabled