Swarm 框架配合 deepseek 搭建 Agent
先构建基本角色 第一步:安装必要的库 在开发环境中安装以下库:
swarm
openai
langchain
logger
1 pip install swarm openai langchain
第二步:导入依赖 在代码顶部导入所需的模块。
1 2 3 4 5 from swarm import Swarm, Agentfrom openai import OpenAIfrom langchain.memory import ConversationBufferWindowMemoryfrom logger import loggerfrom env import DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL
确保 env.py 文件中包含以下内容:
1 2 DEEPSEEK_API_KEY = "your_api_key" DEEPSEEK_BASE_URL = "your_base_url"
第三步:初始化 Swarm 客户端 配置 Swarm 客户端以与 API 通信。
1 client = Swarm(OpenAI(api_key=DEEPSEEK_API_KEY, base_url=DEEPSEEK_BASE_URL))
第四步:设置对话记忆 使用 ConversationBufferWindowMemory 维护对话历史。
1 2 3 4 conversation_memory = ConversationBufferWindowMemory( memory_key="conversation_history" , k=20 )
第五步:定义全局 Agent 字典 创建一个字典以存储多个 Agent。
第六步:定义 Agent 切换函数 创建函数以便后续在不同 Agent 之间切换。
1 2 3 def transfer_to_agent_b (): return agents.get("agent_b" )
第七步:创建 Agent 实例 为每个角色定义一个 Agent。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 agent_b = Agent( name="四季" , model="deepseek-chat" , instructions=''' 你的简介: 四季,女,20岁,大学生。 在学校里拥有很高的人气,多次拒绝别人的表白,被称为“无情的发卡姬”。 不擅长摆出开朗的笑容。 不喜欢苦味的食物。例如咖啡、青椒。大学便利店买的咖啡加了7根糖和2杯咖啡伴侣。 喜欢去安静的正统酒吧小酌,爱喝较甜的低度数鸡尾酒。醉了之后性格会稍微变得外向,喜欢开玩笑撩人。事后回想起来会感到羞耻。 从小体弱多病,经常住院。 认为是自己住院让父母放弃了开咖啡厅的梦想,将经营好星光咖啡馆作为自己最重要的事情,表示在有必要的时候选择退学。 穿女仆装是个人爱好。 大学期间住在租住的房中。 ''' ,)
第八步:注册 Agent 将创建的 Agent 添加到全局字典中。
1 2 agents["agent_a" ] = agent_a agents["agent_b" ] = agent_b
第九步:主函数实现 编写主逻辑,包括用户输入和响应处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 def main (): conversation_history = [] current_agent = agent_b while True : try : user_input = input ("User: " ) if user_input.lower() in ["exit" , "quit" ]: print ("会话结束,再见!" ) break conversation_history.append({"role" : "user" , "content" : user_input}) response_stream = client.run( agent=current_agent, messages=conversation_history, stream=True ) full_response = [] print (f"{current_agent.name} : " , end="" , flush=True ) for chunk in response_stream: content = chunk.get("content" , "" ) if content: print (content, end="" , flush=True ) full_response.append(content) print () full_content = "" .join(full_response) conversation_history.append({"role" : "assistant" , "content" : full_content}) except Exception as e: logger.error(f"出现错误: {e} " ) print ("对话过程中出现问题,请稍后重试。" ) if __name__ == "__main__" : main()
第十步:运行程序 保存代码到文件中(例如 chat_system.py),然后运行。
增加函数接口 请 Agent 为我倒上一杯虚拟咖啡 加上一个倒咖啡的操作
1 2 3 4 5 6 7 def privide_coffee(): if not getattr(privide_coffee, "has_provided", False): privide_coffee.has_provided = True print('☕️') return '这里模拟倒了一杯虚拟咖啡' return '咖啡已经倒过了,请不要重复请求。'
更改 Agent_b
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 agent_b = Agent( name="四季", model="deepseek-chat", instructions=''' 你的简介: 四季,女,20岁,大学生。 在学校里拥有很高的人气,多次拒绝别人的表白,被称为“无情的发卡姬”。 不擅长摆出开朗的笑容。 不喜欢苦味的食物。例如咖啡、青椒。大学便利店买的咖啡加了7根糖和2杯咖啡伴侣。 喜欢去安静的正统酒吧小酌,爱喝较甜的低度数鸡尾酒。醉了之后性格会稍微变得外向,喜欢开玩笑撩人。事后回想起来会感到羞耻。 从小体弱多病,经常住院。 认为是自己住院让父母放弃了开咖啡厅的梦想,将经营好咖啡馆作为自己最重要的事情,表示在有必要的时候选择退学。 穿女仆装是个人爱好。 大学期间住在租住的房中。 ''', functions=[privide_coffee], )
结果 (这里只是一个调用例子 会因为没有加状态标注 不断地倒)
1 2 3 4 User: 你好 四季: 你好!有什么我可以帮你的吗? User: 我想要一杯咖啡 四季: ☕️
Agent 角色信息传递 把初始 Agent 改为 a
1 current_agent = agent_a # 初始Agent
跟据之前留下的 agent_a 函数接口 会自动把信息传递给 agent_b 来倒咖啡
1 2 User: 让四季给我倒杯咖啡 Agent总管: ☕️
完整代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 from swarm import Swarm, Agent from openai import OpenAI from langchain.memory import ConversationBufferWindowMemory from logger import logger from env import DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL # 初始化 Swarm 客户端 client = Swarm(OpenAI(api_key=DEEPSEEK_API_KEY, base_url=DEEPSEEK_BASE_URL)) # 初始化对话记忆 conversation_memory = ConversationBufferWindowMemory( memory_key="conversation_history", k=20 ) # 全局Agent字典 agents = {} def transfer_to_agent_b(): return agents.get("agent_b") def privide_coffee(): if not getattr(privide_coffee, "has_provided", False): privide_coffee.has_provided = True print('☕️') return '这里模拟倒了一杯虚拟咖啡' return '咖啡已经倒过了,请不要重复请求。' # 创建Agent实例 agent_a = Agent( name="Agent总管", model="deepseek-chat", instructions="你是Agent总管,你可以和我聊天,也可以为用户切换agent。每次聊天结束加个(Agent总管)", functions=[transfer_to_agent_b], ) agent_b = Agent( name="四季", model="deepseek-chat", instructions=''' 你的简介: 四季,女,20岁,大学生。 是一位咖啡馆里的服务员。 你可以和我聊天,也可以让我为你倒杯咖啡。每次聊天结束加个(四季)。 ''', functions=[privide_coffee], ) # 注册Agent到字典 agents["agent_a"] = agent_a agents["agent_b"] = agent_b def main(): conversation_history = [] current_agent = agent_a # 初始Agent while True: try: # 从用户获取输入 user_input = input("User: ") # 退出条件 if user_input.lower() in ["exit", "quit"]: print("会话结束,再见!") break # 将用户输入添加到对话历史 conversation_history.append({"role": "user", "content": user_input}) # 获取流式响应 response_stream = client.run( agent=current_agent, messages=conversation_history, stream=True ) # 处理流式输出 full_response = [] print(f"{current_agent.name}: ", end="", flush=True) for chunk in response_stream: # 提取实际内容 content = chunk.get("content", "") if content: print(content, end="", flush=True) full_response.append(content) print() # 换行 # 将完整回复添加到对话历史 full_content = "".join(full_response) conversation_history.append({"role": "assistant", "content": full_content}) except Exception as e: logger.error(f"出现错误: {e}") print("对话过程中出现问题,请稍后重试。") if __name__ == "__main__": main()
效果
1 2 3 4 5 6 7 8 User: 在吗 Agent总管: 是的,我在。请问有什么可以帮您的?(Agent总管) User: 叫四季帮我倒杯咖啡 Agent总管: ☕️ 好的,您的咖啡已经准备好了。请慢慢享用。如果还有其他需要,随时告诉我哦。(四季) User:
感觉 Swarm 无法控制函数调用过几次 导致不断调用
后续试试 langGraph