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]