【Nanobot】README09_LEVEL4 添加新聊天渠道源码地址https://github.com/HKUDS/nanobot 目标指导如何为 nanobot 添加新的聊天渠道如 Signal、Matrix、Line 等。 添加新 Channel 的步骤步骤 1创建 Channel 类文件nanobot/channels/signal.pyfromnanobot.channels.baseimportBaseChannelfromnanobot.bus.eventsimportInboundMessage,OutboundMessagefromnanobot.bus.queueimportMessageBusfromtypingimportAnyclassSignalChannel(BaseChannel): Signal 消息渠道实现。 特性 1. 接收 Signal 消息 2. 发送消息到 Signal 3. 支持流式输出可选 namesignaldisplay_nameSignaldef__init__(self,config:Any,bus:MessageBus):super().__init__(config,bus)# 初始化 Signal 客户端importsignalbot self.botsignalbot.Bot(config.phone_number)self._runningFalseasyncdefstart(self)-None:启动 Signal Bot。self._runningTrue# 注册消息处理器self.bot.handler()asyncdefon_message(message):awaitself._handle_message(sender_idstr(message.source),chat_idstr(message.chat_id),contentmessage.text,mediamessage.attachmentsor[],)# 启动 Botawaitself.bot.start()asyncdefstop(self)-None:停止 Signal Bot。self._runningFalseawaitself.bot.stop()asyncdefsend(self,msg:OutboundMessage)-None:发送消息到 Signal。awaitself.bot.send_message(chat_idmsg.chat_id,textmsg.content,quote_reply_tomsg.reply_to,)步骤 2实现流式输出可选如果 Channel 支持编辑消息如 Telegram可以实现流式输出asyncdefsend_delta(self,chat_id:str,delta:str,metadata:dict[str,Any]|NoneNone,)-None: 交付流式文本块。 实现 1. 提取 stream_id 2. 第一条消息 → 发送新消息 3. 后续消息 → 编辑已有消息 4. _stream_end → 清理缓冲区 stream_idmetadata.get(_stream_id)ifmetadataelseNoneifnotstream_id:returnifmetadata.get(_stream_delta):# 增量内容ifstream_idnotinself._edit_buffers:# 发送第一条消息sent_msgawaitself.bot.send_message(chat_idchat_id,textdelta,)self._edit_buffers[stream_id]sent_msgelse:# 编辑已有消息old_msgself._edit_buffers[stream_id]new_contentold_msg.textdeltaawaitold_msg.edit(textnew_content)elifmetadata.get(_stream_end):# 流式结束ifstream_idinself._edit_buffers:delself._edit_buffers[stream_id]步骤 3添加配置字段文件nanobot/config/schema.py在ChannelsConfig中添加字段classChannelsConfig(Base):telegram:TelegramConfig|NoneNonediscord:DiscordConfig|NoneNonesignal:SignalConfig|NoneNone# 新增classSignalConfig(Base):enabled:boolFalsephone_number:strallow_from:list[str][*]# 访问控制列表步骤 4配置新 Channel文件~/.nanobot/config.json{channels:{signal:{enabled:true,phoneNumber:1234567890,allowFrom:[*]}}}步骤 5测试新 Channel# 启动 gatewaynanobot gateway# 在 Signal 中发送消息给 Bot# 应该收到回复 高级插件化 Channel如果希望将 Channel 作为独立插件发布不修改核心代码可以使用entry_points。项目结构nanobot-signal/ ├── nanobot_signal/ │ └── __init__.py └── pyproject.tomlpyproject.toml[project] name nanobot-signal version 0.1.0 [project.entry-points.nanobot.channels] signal nanobot_signal:SignalChannel [project.dependencies] nanobot-ai 0.1.0 signalbot *nanobot_signal/__init__.pyfromnanobot.channels.baseimportBaseChannelfromnanobot.bus.queueimportMessageBusfromtypingimportAnyclassSignalChannel(BaseChannel):namesignaldisplay_nameSignaldef__init__(self,config:Any,bus:MessageBus):super().__init__(config,bus)# ... 实现代码 ...安装和使用# 安装插件pipinstallnanobot-signal# 配置不需要修改核心代码cat~/.nanobot/config.jsonEOF { channels: { signal: { enabled: true } } } EOF# 启动nanobot gateway 检查清单实现BaseChannel接口start()- 启动监听send()- 发送消息stop()- 停止监听处理消息接收消息并调用_handle_message()支持媒体文件图片、文档等支持音频转录可选实现流式输出可选send_delta()- 增量更新消息编辑缓冲区添加配置字段在schema.py中添加配置类在config.json中启用测试基本对话功能工具调用流式输出如果支持访问控制allow_from 完整示例添加 Email ChannelEmail Channel 已经内置参考实现文件nanobot/channels/email.pyclassEmailChannel(BaseChannel):电子邮件渠道。nameemaildisplay_nameEmailasyncdefstart(self):启动 IMAP 监听。importimaplib self.imapimaplib.IMAP4_SSL(self.config.imap_server)self.imap.login(self.config.email,self.config.password)self.imap.select(INBOX)whileself._running:# 轮询新邮件awaitself._check_new_emails()awaitasyncio.sleep(30)asyncdefsend(self,msg:OutboundMessage):发送邮件。importsmtplibfromemail.messageimportEmailMessage emailEmailMessage()email[From]self.config.email email[To]msg.chat_id email.set_content(msg.content)withsmtplib.SMTP_SSL(self.config.smtp_server)assmtp:smtp.login(self.config.email,self.config.password)smtp.send_message(email) 相关文件nanobot/channels/base.py- BaseChannel 抽象基类nanobot/channels/telegram.py- Telegram 实现示例nanobot/channels/discord.py- Discord 实现示例nanobot/config/schema.py- 配置模式 完成分析全部 9 个分析单元已完成生成的文档列表✅ README01_LEVEL1_项目架构与目录说明.md✅ README02_LEVEL2_Agent核心循环设计.md✅ README03_LEVEL2_工具系统架构.md✅ README04_LEVEL2_提供商系统设计.md✅ README05_LEVEL2_渠道系统设计.md✅ README06_LEVEL3_消息流转深度追踪.md✅ README07_LEVEL3_会话管理与记忆.md✅ README08_LEVEL4_添加新LLM提供商.md✅ README09_LEVEL4_添加新聊天渠道.md文档位置.aitalk/目录建议阅读顺序README01 → README02 → … → README09
【Nanobot】README09_LEVEL4 添加新聊天渠道
【Nanobot】README09_LEVEL4 添加新聊天渠道源码地址https://github.com/HKUDS/nanobot 目标指导如何为 nanobot 添加新的聊天渠道如 Signal、Matrix、Line 等。 添加新 Channel 的步骤步骤 1创建 Channel 类文件nanobot/channels/signal.pyfromnanobot.channels.baseimportBaseChannelfromnanobot.bus.eventsimportInboundMessage,OutboundMessagefromnanobot.bus.queueimportMessageBusfromtypingimportAnyclassSignalChannel(BaseChannel): Signal 消息渠道实现。 特性 1. 接收 Signal 消息 2. 发送消息到 Signal 3. 支持流式输出可选 namesignaldisplay_nameSignaldef__init__(self,config:Any,bus:MessageBus):super().__init__(config,bus)# 初始化 Signal 客户端importsignalbot self.botsignalbot.Bot(config.phone_number)self._runningFalseasyncdefstart(self)-None:启动 Signal Bot。self._runningTrue# 注册消息处理器self.bot.handler()asyncdefon_message(message):awaitself._handle_message(sender_idstr(message.source),chat_idstr(message.chat_id),contentmessage.text,mediamessage.attachmentsor[],)# 启动 Botawaitself.bot.start()asyncdefstop(self)-None:停止 Signal Bot。self._runningFalseawaitself.bot.stop()asyncdefsend(self,msg:OutboundMessage)-None:发送消息到 Signal。awaitself.bot.send_message(chat_idmsg.chat_id,textmsg.content,quote_reply_tomsg.reply_to,)步骤 2实现流式输出可选如果 Channel 支持编辑消息如 Telegram可以实现流式输出asyncdefsend_delta(self,chat_id:str,delta:str,metadata:dict[str,Any]|NoneNone,)-None: 交付流式文本块。 实现 1. 提取 stream_id 2. 第一条消息 → 发送新消息 3. 后续消息 → 编辑已有消息 4. _stream_end → 清理缓冲区 stream_idmetadata.get(_stream_id)ifmetadataelseNoneifnotstream_id:returnifmetadata.get(_stream_delta):# 增量内容ifstream_idnotinself._edit_buffers:# 发送第一条消息sent_msgawaitself.bot.send_message(chat_idchat_id,textdelta,)self._edit_buffers[stream_id]sent_msgelse:# 编辑已有消息old_msgself._edit_buffers[stream_id]new_contentold_msg.textdeltaawaitold_msg.edit(textnew_content)elifmetadata.get(_stream_end):# 流式结束ifstream_idinself._edit_buffers:delself._edit_buffers[stream_id]步骤 3添加配置字段文件nanobot/config/schema.py在ChannelsConfig中添加字段classChannelsConfig(Base):telegram:TelegramConfig|NoneNonediscord:DiscordConfig|NoneNonesignal:SignalConfig|NoneNone# 新增classSignalConfig(Base):enabled:boolFalsephone_number:strallow_from:list[str][*]# 访问控制列表步骤 4配置新 Channel文件~/.nanobot/config.json{channels:{signal:{enabled:true,phoneNumber:1234567890,allowFrom:[*]}}}步骤 5测试新 Channel# 启动 gatewaynanobot gateway# 在 Signal 中发送消息给 Bot# 应该收到回复 高级插件化 Channel如果希望将 Channel 作为独立插件发布不修改核心代码可以使用entry_points。项目结构nanobot-signal/ ├── nanobot_signal/ │ └── __init__.py └── pyproject.tomlpyproject.toml[project] name nanobot-signal version 0.1.0 [project.entry-points.nanobot.channels] signal nanobot_signal:SignalChannel [project.dependencies] nanobot-ai 0.1.0 signalbot *nanobot_signal/__init__.pyfromnanobot.channels.baseimportBaseChannelfromnanobot.bus.queueimportMessageBusfromtypingimportAnyclassSignalChannel(BaseChannel):namesignaldisplay_nameSignaldef__init__(self,config:Any,bus:MessageBus):super().__init__(config,bus)# ... 实现代码 ...安装和使用# 安装插件pipinstallnanobot-signal# 配置不需要修改核心代码cat~/.nanobot/config.jsonEOF { channels: { signal: { enabled: true } } } EOF# 启动nanobot gateway 检查清单实现BaseChannel接口start()- 启动监听send()- 发送消息stop()- 停止监听处理消息接收消息并调用_handle_message()支持媒体文件图片、文档等支持音频转录可选实现流式输出可选send_delta()- 增量更新消息编辑缓冲区添加配置字段在schema.py中添加配置类在config.json中启用测试基本对话功能工具调用流式输出如果支持访问控制allow_from 完整示例添加 Email ChannelEmail Channel 已经内置参考实现文件nanobot/channels/email.pyclassEmailChannel(BaseChannel):电子邮件渠道。nameemaildisplay_nameEmailasyncdefstart(self):启动 IMAP 监听。importimaplib self.imapimaplib.IMAP4_SSL(self.config.imap_server)self.imap.login(self.config.email,self.config.password)self.imap.select(INBOX)whileself._running:# 轮询新邮件awaitself._check_new_emails()awaitasyncio.sleep(30)asyncdefsend(self,msg:OutboundMessage):发送邮件。importsmtplibfromemail.messageimportEmailMessage emailEmailMessage()email[From]self.config.email email[To]msg.chat_id email.set_content(msg.content)withsmtplib.SMTP_SSL(self.config.smtp_server)assmtp:smtp.login(self.config.email,self.config.password)smtp.send_message(email) 相关文件nanobot/channels/base.py- BaseChannel 抽象基类nanobot/channels/telegram.py- Telegram 实现示例nanobot/channels/discord.py- Discord 实现示例nanobot/config/schema.py- 配置模式 完成分析全部 9 个分析单元已完成生成的文档列表✅ README01_LEVEL1_项目架构与目录说明.md✅ README02_LEVEL2_Agent核心循环设计.md✅ README03_LEVEL2_工具系统架构.md✅ README04_LEVEL2_提供商系统设计.md✅ README05_LEVEL2_渠道系统设计.md✅ README06_LEVEL3_消息流转深度追踪.md✅ README07_LEVEL3_会话管理与记忆.md✅ README08_LEVEL4_添加新LLM提供商.md✅ README09_LEVEL4_添加新聊天渠道.md文档位置.aitalk/目录建议阅读顺序README01 → README02 → … → README09