refactor(ch12): align filenames and update corresponding README sections
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 1. 模块概述
|
## 模块概述
|
||||||
|
|
||||||
本模块基于 Agents SDK Swarm 框架实现了一个航空公司智能客服系统,展示了多智能体协作、智能转接和工具调用的核心功能。
|
本模块基于 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. **运行方式**:
|
2. **运行方式**:
|
||||||
```bash
|
```bash
|
||||||
python -m m12_agents_sdk_swarm.main
|
python -m m12_agents_sdk_swarm.s03_main
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **使用示例**:
|
3. **使用示例**:
|
||||||
@@ -115,4 +115,4 @@
|
|||||||
- 确保已正确安装所有依赖(可通过项目根目录的 `requirements.txt` 安装)
|
- 确保已正确安装所有依赖(可通过项目根目录的 `requirements.txt` 安装)
|
||||||
- 高德地图 API Key 是系统正常运行的必要条件
|
- 高德地图 API Key 是系统正常运行的必要条件
|
||||||
- 如遇到连接问题,检查网络设置和 API Key 的有效性
|
- 如遇到连接问题,检查网络设置和 API Key 的有效性
|
||||||
- 系统默认关闭 Tracing 功能,如需启用请在 `main.py` 中取消注释相关代码并配置 API Key
|
- 系统默认关闭 Tracing 功能,如需启用请在 `s03_main.py` 中取消注释相关代码并配置 API Key
|
||||||
@@ -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]
|
|
||||||
@@ -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]
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from openai.types.responses import ResponseTextDeltaEvent
|
from openai.types.responses import ResponseTextDeltaEvent
|
||||||
from agents.run import Runner
|
from agents.run import Runner
|
||||||
from m12_agents_sdk_swarm.agent import triage_agent,amap_server
|
from m12_agents_sdk_swarm.s02_agent import triage_agent,amap_server
|
||||||
from m12_agents_sdk_swarm.tools import context_variables
|
from m12_agents_sdk_swarm.s01_tools import context_variables
|
||||||
|
|
||||||
# 不启用Chatgpt官方提供的Tracing(无需配置api_key)
|
# 不启用Chatgpt官方提供的Tracing(无需配置api_key)
|
||||||
from agents.tracing import set_tracing_disabled
|
from agents.tracing import set_tracing_disabled
|
||||||
Reference in New Issue
Block a user