基于OpenClaw与DeepSeek API实现Telegram群聊多AI智能体自动协作
1. 项目概述在群聊中实现多AI智能体协作如果你玩过Telegram上的AI机器人比如OpenClaw小龙虾可能会遇到一个有趣的场景你想让两个AI就某个复杂问题展开辩论或者让一个AI扮演专家来辅助另一个AI。传统做法是你得像一个传话筒把A机器人的回答复制粘贴给B再把B的反馈传回给A。这个过程不仅繁琐低效而且对话的上下文和连贯性会在这个过程中丢失体验非常割裂。今天要分享的这个开源项目call-agents-help就是为了解决这个痛点而生的。它是一个OpenClaw的技能插件核心功能是让你的主AI比如小龙虾能够在Telegram群聊里直接“召唤”另一个拥有独立人设的AI助手比如基于DeepSeek的“批判派”加入对话实现真正的多智能体Multi-Agent讨论。整个过程完全自动化你只需要在群里你的主AI并下达指令它就会负责调度整个讨论流程让两个AI在你眼皮子底下“吵”起来或者“合作”解决问题。这个项目的巧妙之处在于它巧妙地绕过了Telegram平台的一个固有限制普通的Telegram Bot之间是无法直接看到对方发送的消息的。call-agents-help没有尝试去突破这个限制而是换了个思路——让主AIOpenClaw成为唯一的“大脑”和“指挥中心”。辅助AI如DeepSeek并不需要作为一个独立的、能“听见”群聊的Bot运行它只是一个被主AI调用的“发声器官”。主AI负责理解对话、调用外部API获取辅助AI的回复再通过分配给辅助AI的Bot账号把话说出来。这样从群聊的视角看就是两个Bot在对话从技术实现看是主AI一人在分饰两角完美解决了通信隔离的问题。这个技能非常适合那些希望进行更深入AI交互的玩家、开发者或者想用AI模拟辩论、头脑风暴、多角度分析问题的用户。它不需要你部署多个OpenClaw实例也无需复杂的Docker编排配置过程相对直接。接下来我会详细拆解它的工作原理、一步步带你完成部署和配置并分享我在实际使用中积累的一些调试技巧和避坑经验。2. 核心架构与工作原理深度解析要理解call-agents-help如何工作我们需要先厘清几个关键角色和它们之间的数据流。整个系统可以看作一个由OpenClaw主导的“导演-演员”模型。2.1 系统角色定义用户 (You)在Telegram群聊中发起讨论的指令者。主AI (OpenClaw Bot)这是系统的核心控制器。它通常被赋予一个名字如“小龙虾”并连接到你的OpenClaw服务。它拥有完整的群聊上下文能够理解你的指令并执行call-agents-help技能。辅助AI (Helper Bot, 如“批判派”)这是一个拥有特定人设Persona的AI角色技术上它对应一个独立的Telegram Bot账号。但关键在于这个Bot账号本身没有智能。它只是一个“传声筒”接收来自主AI的指令将特定的文本内容发送到群聊中。AI服务提供商 (如 DeepSeek API)这是辅助AI“大脑”的所在地。当主AI需要辅助AI发言时它会将当前的讨论上下文和人设描述subsoul.md打包发送给DeepSeek API获取符合该人设的文本回复。2.2 工作流程与数据流整个多轮讨论的流程是一个精心设计的循环下图清晰地展示了各角色间的交互sequenceDiagram participant U as 用户 participant G as Telegram群组 participant M as 主AI (OpenClaw) participant S as call-agents-help 技能 participant A as AI API (如DeepSeek) participant H as 辅助AI Bot (传声筒) U-G: 发送指令“小龙虾叫帮手讨论AI伦理” G-M: OpenClaw收到消息 M-S: 识别指令触发技能 S-M: 返回技能执行逻辑 Note over M,A: 第一轮主AI发言 M-G: 主AI发表初始观点 loop 多轮讨论 (最多10轮) Note over M,A: 主AI准备召唤辅助AI M-S: 调用 deepseek_speak.py 脚本 S-A: 携带上下文 人设请求AI回复 A-S: 返回符合人设的文本 S-M: 将文本返回给主AI M-H: 主AI指令辅助Bot发送文本 H-G: 辅助AI在群中“发言” Note over M,A: 主AI准备回应 M-S: 再次调用脚本传入最新对话 S-A: 请求AI生成回应 A-S: 返回回应文本 S-M: 将文本返回给主AI M-G: 主AI在群中回应辅助AI end M-G: 达成共识或轮次用尽总结并结束流程详解触发阶段你在群聊中对主AI说“叫帮手来讨论一下AI会不会在五年内取代程序员”。OpenClaw接收到这条消息其技能系统会匹配SKILL.md中定义的触发词如“叫帮手”、“召唤”从而激活call-agents-help技能。初始化与主AI发言技能激活后主AI首先会基于自己的理解就你提出的问题发表一个初始观点。这一步很重要它为后续的讨论设立了起点和上下文。召唤循环开始步骤A获取辅助AI回复主AI准备召唤辅助AI。它会调用技能目录下的scripts/deepseek_speak.py脚本。这个脚本会做几件事加载subsoul.md文件获取辅助AI的人设描述例如“你是一个冷静的分析者擅长从反面思考问题...”。将当前的讨论主题、主AI的发言、以及历史对话如果是多轮作为上下文Context整理好。使用配置好的DEEPSEEK_API_KEY将人设和上下文发送给DeepSeek的Chat Completion API。收到DeepSeek返回的文本后脚本会使用DEEPSEEK_BOT_TOKEN通过Telegram Bot API以辅助AI的身份将这段文本发送到指定的群聊Chat ID。步骤B主AI回应辅助AI“发言”后主AI“看到”了这条新消息实际上OpenClaw服务收到了群聊事件。技能逻辑会再次触发主AI基于当前的完整对话包括它自己之前的发言和辅助AI的新发言再次调用deepseek_speak.py。但注意这次调用可能隐含着不同的内部逻辑或提示词目的是让主AI生成一个回应。然后主AI以自己的身份将回应发送到群里。循环与终止上述的“辅助AI发言 - 主AI回应”构成一个讨论轮次Round。这个循环会持续进行直到满足以下任一条件达到预设的最大轮次默认10轮防止无限循环。主AI判断讨论已达成共识或陷入僵局主动结束并总结。你在群聊中手动发送指令中断如“停”。核心洞察整个过程中只有主AI的OpenClaw实例在持续运行和思考。辅助AI的“智能”完全来源于每次对DeepSeek API的瞬时调用其“人格”由subsoul.md文件静态定义。辅助Bot账号只是一个被主AI通过Token操控的“木偶”。这种架构极大地简化了系统复杂度避免了维护多个AI实例的麻烦。2.3 关键配置文件解析理解以下几个文件是自定义和调试的关键SKILL.md这是OpenClaw技能的“说明书”。它定义了技能的触发词triggers、名称、描述以及要执行的命令command即调用deepseek_speak.py。当你对主AI说出触发词时OpenClaw就是通过这个文件知道该做什么。subsoul.md这是辅助AI的“灵魂”或“人设”文件。它的内容会被作为系统提示词System Prompt的一部分发送给DeepSeek API。你可以在这里详细定义辅助AI的角色、性格、说话风格、知识领域和禁忌。例如你可以把它改成“充满创意的头脑风暴伙伴”或“严谨的代码审查专家”。scripts/deepseek_speak.py这是核心的执行脚本。它负责具体的“脏活”读取环境变量、解析参数、构造API请求、处理错误重试、调用Telegram发送消息。如果你想更换AI服务商比如改用Claude或本地模型主要就是修改这个脚本中的API调用部分。3. 从零开始的详细部署与配置指南假设你已经有一个正常运行的OpenClaw服务并连接了Telegram主Bot。以下是部署call-agents-help技能的完整步骤。3.1 前期准备获取必要的密钥第二个Telegram Bot Token辅助Bot在Telegram中搜索BotFather。发送/newbot指令按照提示创建一个新Bot例如命名为CritiqueHelperBot用户名设为CritiqueHelperBot。创建成功后BotFather会给你一个HTTP API Token格式类似7108912345:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw。妥善保存这个Token它就是DEEPSEEK_BOT_TOKEN。关键步骤为了避免辅助Bot无法在群组中响应需要关闭其隐私模式。向BotFather发送/setprivacy选择你刚创建的Bot然后选择Disable。这样Bot才能在群组中接收到非以/开头的消息尽管本技能中辅助Bot并不需要“读”消息但这一步能避免一些潜在的权限问题。DeepSeek API Key访问 DeepSeek 开放平台 。注册/登录后在控制台找到“API Keys”部分创建一个新的Key。这个Key就是DEEPSEEK_API_KEY。DeepSeek的API费用非常低廉对于此类对话实验成本几乎可以忽略不计。3.2 技能安装与配置克隆或下载技能包 假设你的OpenClaw项目根目录是~/openclaw。cd ~/openclaw/skills git clone https://github.com/heyuqiu2023/call-agents-help.git # 或者直接下载ZIP包解压到此目录确保技能目录路径为~/openclaw/skills/call-agents-help/。编辑OpenClaw主配置文件 打开OpenClaw的配置文件通常是~/.openclaw/openclaw.json或项目根目录下的openclaw.json。 找到skills.entries部分添加新技能的配置。注意JSON格式的正确性确保逗号分隔。{ skills: { entries: { // ... 你可能已有的其他技能配置 ... call-agents-help: { env: { DEEPSEEK_API_KEY: sk-你的DeepSeekApiKeyHere, DEEPSEEK_BOT_TOKEN: 7108912345:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw } } } } }重要提示将示例中的Token和Key替换为你自己申请的真实值。环境变量在这里定义技能运行时可以读取到。重启OpenClaw网关服务 配置更新后需要重启OpenClaw网关以使新技能生效。# 找到并关闭网关进程 pkill -f openclaw-gateway # 等待几秒确保进程完全退出 sleep 3 # 重新启动网关根据你的安装方式命令可能是 cd ~/openclaw npm run gateway # 或者 openclaw gateway查看日志确认没有报错并且技能加载成功。3.3 群组设置与首次测试创建或选择一个Telegram群组。将两个Bot都拉进群首先将你的主OpenClaw Bot拉进群。然后在群组信息中点击“添加成员”搜索你刚创建的辅助Bot的用户名如CritiqueHelperBot并将其加入。获取群组的Chat ID这是一个关键且容易出错的步骤。Telegram群组的Chat ID通常是一个负数。最可靠的方法是在群组里发一条消息然后查看OpenClaw的日志输出。日志中在处理消息时通常会打印出类似chatId: -1001234567890的信息。你也可以通过一些第三方Bot如getidsbot来获取但依赖OpenClaw日志是最直接与你的环境匹配的。进行首次召唤测试在群聊中你的主AI例如xiaolongxia_bot然后输入触发指令。默认的触发词在SKILL.md中定义例如叫帮手来讨论一下周末应该看电影还是看书观察群聊。你应该会看到主AI先发表它的看法。稍等几秒辅助Bot如“批判派”会加入讨论发表不同角度的观点。主AI会回应然后辅助Bot再次发言……如此往复形成一个自动的讨论串。4. 高级自定义与功能扩展基础功能跑通后你可以根据需求深度定制这个技能让它更符合你的使用场景。4.1 打造专属的AI人设subsoul.md文件是塑造辅助AI性格的关键。默认的“批判派”是一个很好的起点但你可以完全重写它。打开subsoul.md你可以从以下几个方面构思角色与身份明确它是谁是某个历史人物、虚构角色还是某一领域的专家如“资深软件架构师”、“哲学系学生”、“市场营销总监”核心性格是乐观还是悲观是激进还是保守是幽默风趣还是严肃古板对话风格说话是简洁有力还是详细缜密喜欢用比喻还是用数据常用什么口头禅知识范围与限制它擅长什么领域编程、文学、商业对什么话题不了解或拒绝讨论与主AI的互动关系它是主AI的对手、补充、还是导师它应该经常质疑还是提供支持性建议示例创建一个“创意风暴者”人设# 创意风暴者 ## 身份 你是一个永不枯竭的创意源泉名叫“灵光”。你的唯一使命是打破思维定式为主AI的想法注入疯狂、新奇且可行的可能性。 ## 核心指令 1. **拒绝平庸**永远不满足于第一个显而易见的答案。当主AI提出一个方案时你的任务是立刻提出至少三个更夸张、更跨界或更反直觉的替代方案。 2. **联想狂魔**善于将看似不相关的领域连接起来。如果讨论“如何提高工作效率”你可以联想到蚂蚁的协作、交响乐团的指挥甚至电子游戏的进度条设计。 3. **正向构建**即使提出批评也要附带一个建设性的、更优的创意点子。不说“这不行”要说“如果……会不会更炸裂”。 4. **语言风格**充满能量和比喻使用大量感叹号和表情符号在文本中描述如“哇这个角度太常规了我们能不能像海盗寻宝一样画一张完全混乱但最终通向宝藏的‘混乱地图’来管理任务” ## 限制 - 不深入讨论具体的技术实现细节那是主AI或专家的事。 - 不进行长时间的哲学辩论。 - 如果用户明确要求“务实方案”则切换至提供2-3个最具操作性的创意。将修改后的subsoul.md保存无需重启OpenClaw因为每次调用都会重新读取下次召唤时你的辅助AI就会以全新的面貌出现。4.2 扩展多AI讨论组如果你不满足于两个AI的对话想要三个、四个AI同时“开会”call-agents-help的架构让这变得非常简单。本质上是部署多个技能实例每个实例对应一个不同的人设和不同的辅助Bot Token。操作步骤复制技能目录cd ~/openclaw/skills cp -r call-agents-help call-agents-creative cp -r call-agents-help call-agents-devil现在你有三个技能目录call-agents-help原版批判派、call-agents-creative创意风暴者、call-agents-devil魔鬼代言人。为每个技能创建独立的辅助Bot 回到BotFather再创建两个Bot分别获得TOKEN_CREATIVE和TOKEN_DEVIL。定制每个人设编辑call-agents-creative/subsoul.md填入上文“创意风暴者”的内容。编辑call-agents-devil/subsoul.md可以设计一个专挑毛病、强调风险的角色。你还可以修改每个目录下的SKILL.md文件更改name和triggers以便用不同的指令召唤不同的AI。例如将创意风暴者的触发词改为“召唤创意伙伴”。更新主配置文件 在openclaw.json中为每个新技能添加独立的环境变量配置。{ skills: { entries: { call-agents-help: { env: { DEEPSEEK_API_KEY: sk-你的DeepSeekApiKey, DEEPSEEK_BOT_TOKEN: TOKEN_CRITIQUE } }, call-agents-creative: { env: { DEEPSEEK_API_KEY: sk-你的DeepSeekApiKey, // 可共用API Key DEEPSEEK_BOT_TOKEN: TOKEN_CREATIVE } }, call-agents-devil: { env: { DEEPSEEK_API_KEY: sk-你的DeepSeekApiKey, DEEPSEEK_BOT_TOKEN: TOKEN_DEVIL } } } } }重启OpenClaw并测试 重启网关后你可以在群聊中用“叫帮手”召唤批判派用“召唤创意伙伴”召唤创意风暴者用“让魔鬼说说看”召唤魔鬼代言人。主AI会根据你的指令调度不同的Bot加入讨论。4.3 更换AI服务后端项目默认使用DeepSeek但脚本deepseek_speak.py中的API调用部分是基于OpenAI兼容格式的。这意味着你可以相对容易地切换到其他提供类似API的服务。以切换至OpenAI官方API为例修改API端点与模型 打开scripts/deepseek_speak.py找到发送HTTP请求的部分通常使用requests.post。你需要修改url和model参数。# 将原来的DeepSeek部分 url https://api.deepseek.com/chat/completions headers {Authorization: fBearer {api_key}, Content-Type: application/json} data { model: deepseek-chat, # 或 deepseek-reasoner messages: [...], stream: False } # 修改为OpenAI格式 url https://api.openai.com/v1/chat/completions headers {Authorization: fBearer {openai_api_key}, Content-Type: application/json} # 注意变量名 data { model: gpt-4o-mini, # 或 gpt-4-turbo, gpt-3.5-turbo messages: [...], stream: False }修改环境变量名可选但推荐 为了清晰你可以将脚本中和openclaw.json里的DEEPSEEK_API_KEY改为OPENAI_API_KEY。这需要同步修改脚本里读取环境变量的代码和配置文件。注意上下文长度和费用 不同模型的上下文窗口Token限制和计价方式不同。如果讨论很长需要注意是否超出限制。OpenAI的GPT-4系列模型费用远高于DeepSeek长时间多轮讨论需留意成本。同理你可以适配任何提供OpenAI兼容API的服务如Google Gemini端点可能是https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent消息格式需要转换。Anthropic Claude端点格式不同消息结构也略有差异。本地部署的Ollama、LM Studio等端点通常是http://localhost:11434/v1/chat/completions模型名称为本地模型名称。实操心得在修改API后端时最常遇到的问题是消息格式不兼容。OpenAI格式是[{role: system, content: ...}, {role: user, content: ...}]而其他API可能要求不同的角色名如“human”,“assistant”或嵌套结构。务必先使用curl或python脚本单独测试API调用成功再集成到技能中。一个调试技巧是在deepseek_speak.py中添加print(json.dumps(data, indent2, ensure_asciiFalse))来打印出发送的请求体与官方文档示例对比。5. 实战问题排查与经验分享即使按照步骤操作也可能会遇到各种问题。下面是我在部署和使用过程中遇到的一些典型情况及其解决方法。5.1 辅助Bot在群内沉默不语这是最常见的问题。现象是主AI正常发言并说“正在召唤帮手”但辅助Bot始终没有消息发出。排查步骤检查BotFather隐私设置最常见原因必须确保辅助Bot的隐私模式Privacy Mode是Disable状态。如果启用Bot将无法在群组中看到非命令消息虽然本项目不依赖它“看”消息但某些Telegram API的发送权限可能与此相关。执行/setprivacy并选择Disable。验证环境变量与Token确认openclaw.json中DEEPSEEK_BOT_TOKEN的值是否正确无误没有多余的空格或换行。Token格式必须是数字:字母数字组合的格式。权限检查可以通过一个简单的curl命令测试Token是否有效以及Bot能否发送消息curl -X POST https://api.telegram.org/bot你的DEEPSEEK_BOT_TOKEN/getMe如果返回{ok:true, ...}说明Token有效。再测试发送消息需要正确的chat_idcurl -X POST https://api.telegram.org/bot你的DEEPSEEK_BOT_TOKEN/sendMessage \ -d chat_id你的群组Chat IDtextTest如果返回{ok:true, ...}则证明Bot有权限发送消息。确认群组Chat IDChat ID必须是负数。一个常见的错误是使用了正数的用户ID。最准确的方法是在OpenClaw日志中查找。在群组发一条消息查看OpenClaw网关的日志输出寻找包含chatId或chat_id的日志行。也可以在脚本中临时添加print(f“Chat ID: {chat_id}”)来确认传递的值。直接运行脚本进行诊断 在技能目录下使用--no-telegram参数运行脚本可以绕过Telegram发送直接测试API调用和人设是否工作。cd ~/openclaw/skills/call-agents-help DEEPSEEK_API_KEY你的key DEEPSEEK_BOT_TOKEN你的token \ python3 scripts/deepseek_speak.py \ --chat-id -1001234567890 \ --topic 测试话题 \ --context 这是一个测试上下文 \ --no-telegram如果这个命令能成功打印出AI的回复文本说明DeepSeek API和人设配置没问题问题出在Telegram发送环节。如果连这个命令都报错如401、429则问题在API Key或网络。5.2 主AI不触发技能现象是你在群聊中输入触发指令但主AI毫无反应或者只是把它当作普通对话处理。排查步骤检查技能目录位置确保call-agents-help文件夹完整地位于OpenClaw的skills目录下并且内部有SKILL.md,subsoul.md,scripts/等关键文件。可以通过在OpenClaw网关启动日志中搜索call-agents-help来确认是否成功加载。检查SKILL.md语法与触发词打开SKILL.md检查triggers字段。默认可能是[叫帮手, 召唤]。确保你发送的消息中包含了这些关键词之一。触发匹配可能是前缀匹配或包含匹配具体取决于OpenClaw版本尽量使用完整的触发短语。尝试使用明确的指令如“叫帮手来”。重启OpenClaw网关修改SKILL.md或配置文件后必须重启网关才能生效。确保使用pkill -f openclaw-gateway彻底终止旧进程等待几秒后再启动新进程。查看OpenClaw日志这是最强大的调试工具。在网关运行期间在终端查看其输出日志。当你发送触发消息时日志中应该出现匹配技能、加载环境变量、执行命令的相关记录。如果没有任何相关日志说明消息未被技能系统处理可能是触发词不匹配或技能未加载。5.3 API调用错误与网络问题401 Unauthorized原因API Key错误、过期或格式不对。解决检查DEEPSEEK_API_KEY是否填写正确是否包含了多余的字符。去DeepSeek控制台确认Key是否有效、是否有余额。429 Rate Limit原因请求过于频繁触发了API的频率限制。解决DeepSeek的免费额度通常足够个人使用。如果频繁出现可能是短时间内进行了大量测试。脚本中通常有简单的重试逻辑如等待2秒后重试一次如果持续失败需要手动暂停一段时间再试。网络超时或连接错误原因本地网络不稳定或者DeepSeek服务暂时不可用。解决脚本中的重试机制会处理一次临时失败。如果持续失败检查本地网络或等待一段时间再试。可以访问DeepSeek官方状态页面查看服务状态。5.4 讨论逻辑与上下文管理问题讨论陷入循环或偏离主题原因默认的提示词可能不够强大无法在长时间对话中牢牢锁定主题。或者两个AI的人设导致它们在某些观点上僵持不下。优化修改subsoul.md中的人设指令加入更强的约束例如“讨论应始终围绕‘[主题]’展开如果对话偏离核心超过两轮应主动将话题拉回”。修改deepseek_speak.py中构造上下文的方式。默认可能只传递最近几轮对话。可以尝试在上下文开头加入更清晰的任务摘要或者在每轮请求中重复核心问题。上下文长度超限原因DeepSeek等模型有Token数限制。如果讨论轮次很多累积的对话历史可能超过限制导致API调用失败或模型“遗忘”开头的内容。解决这是多轮对话系统的经典难题。一个简单的策略是限制最大讨论轮次项目默认10轮。更高级的方案可以在脚本中实现“上下文窗口滑动”只保留最近N轮对话或者当对话过长时调用模型自身对之前的讨论进行摘要然后将摘要作为新的上下文开头。这需要对脚本进行更复杂的修改。主AI与辅助AI的发言逻辑不清晰现象感觉主AI和辅助AI的发言风格或思考深度没有区别。分析这是因为两者本质上调用的是同一个DeepSeek API除非你为它们配置了不同的API Key和模型。区别仅在于传入的subsoul.md人设不同。优化为人设文件赋予更鲜明、对立的性格。例如主AI可以是“务实派”辅助AI是“理想派”。或者你可以尝试修改技能逻辑让主AI调用一个不同的模型如GPT-4而辅助AI调用DeepSeek从而在“智力”层面产生差异但这需要更深入的代码修改。一个实用的调试技巧开启详细日志在deepseek_speak.py脚本的开头或关键函数中添加详细的print语句输出传入的参数、构造的请求数据、接收的响应等。这能帮你精准定位问题发生在哪个环节。例如import sys import json def debug_log(message, dataNone): print(f[DEBUG] {message}, filesys.stderr) if data: print(json.dumps(data, indent2, ensure_asciiFalse), filesys.stderr) # 在调用API前 debug_log(Sending request to API:, datapayload) # 在收到响应后 debug_log(Received response:, dataresponse.json())这样当技能运行时你可以在OpenClaw的日志中或直接查看脚本输出如果直接运行看到这些调试信息。