代码插件 扫描中
Local IM Connector — 插件工具
v3.1.0The package and runtime instructions match the stated purpose: a Local IM channel that listens or connects via WebSocket and forwards messages to OpenClaw; it does not request unrelated credentials or perform unexplained operations.
0· 0·0 当前
by @getname1997
安全扫描
OpenClaw
扫描中
high confidenceThe package and runtime instructions match the stated purpose: a Local IM channel that listens or connects via WebSocket and forwards messages to OpenClaw; it does not request unrelated credentials or perform unexplained operations.
安全有层次,运行前请审查代码。
版本
latestv3.1.02026/4/3
● Pending
安装命令 点击复制
官方npx clawhub@latest install @local-im/nc-local-im-connector
镜像加速npx clawhub@latest install @local-im/nc-local-im-connector --registry https://cn.clawhub-mirror.com
插件文档
nc-local-im-connector
本地 IM 连接器插件,支持多账号 Client 长连接模式,用于连接外部 IM 服务。
功能特性
- 多账号支持:支持配置多个 IM 账号,每个账号独立连接
- WebSocket Client 模式:作为客户端连接到外部 WebSocket 服务
- AI 回复流式输出:支持 AI 回复内容流式推送到外部 IM
- 消息去重:5 分钟 TTL 的消息去重缓存,防止重复处理
- 指数退避重连:连接断开后自动重连,指数退避策略
架构设计
nc-local-im-connector/
├── index.ts # 插件入口,注册 channel
├── src/
│ ├── channel.ts # Channel 插件定义
│ ├── runtime.ts # PluginRuntime 存储
│ ├── config/
│ │ ├── schema.ts # 配置 Schema 定义
│ │ └── accounts.ts # 账号配置解析
│ ├── core/
│ │ ├── connection.ts # WebSocket 连接管理、消息处理
│ │ └── provider.ts # 账号启动/停止逻辑
│ ├── types/
│ │ └── index.ts # 类型定义
│ └── utils/
│ └── logger.ts # 日志工具
└── README.md配置说明
基础配置
{
"channels": {
"nc-local-im-connector": {
"enabled": true,
"serverUrl": "ws://192.168.100.168:8080",
"defaultAccount": "u00267",
"name": "刘XXXX"
}
}
}配置项说明
| 配置项 | 类型 | 必填 | 说明 |
|---|---|---|---|
serverUrl | string | 是 | WebSocket 服务端地址 |
defaultAccount | string | 否 | 默认账号 ID |
accounts | object | 是 | 账号配置映射 |
accounts.<id>.enabled | boolean | 否 | 是否启用该账号 |
accounts.<id>.name | string | 否 | 账号显示名称 |
消息协议
客户端 → 服务端(发送)
连接时通过 URL 参数传递账号 ID:
ws://192.168.100.168:8080/?accountId=u00267服务端 → 客户端(接收)
文本消息
{
"type": "message",
"messageId": "uuid-timestamp-random",
"conversationId": "会话ID",
"userId": "用户ID",
"sessionId": "会话标识 (可选,用于隔离会话)",
"content": "消息内容"
}- userId: 标识 OpenClaw 实例或服务器。
- sessionId: 标识具体的会话/Agent。如果提供,插件将使用它来构建会话 Key。更换
sessionId会导致插件开启一个全新的会话上下文,从而防止单一会话过长或混淆。
客户端 → 服务端(推送)
思考过程 (Thought)
{
"type": "thought",
"conversationId": "会话ID",
"sessionId": "会话ID (由服务端返回)",
"content": "当前累积的思考内容",
"delta": "本次增量的思考内容"
}流式更新
{
"type": "stream",
"conversationId": "会话ID",
"sessionId": "会话ID (由服务端返回)",
"content": "当前累积的回复内容"
}回复完成
{
"type": "done",
"conversationId": "会话ID",
"sessionId": "会话ID (由服务端返回)",
"content": "完整的回复内容",
"thought": "完整的思考内容"
}错误通知
{
"type": "error",
"conversationId": "会话ID",
"sessionId": "会话ID (由服务端返回)",
"error": "错误信息"
}会话 Key 格式
AI 回复的会话 Key 格式:
agent:{agentId}:nc-local-im-connector:{peerKind}:{sessionPeerId}示例:
agent:default:nc-local-im-connector:user:u00267
agent:default:nc-local-im-connector:conversation:f6cf52ac-9f9d-4abd-890e-95e55439b939AI 回复流程
1. 收到 WebSocket 消息
2. 消息去重检查(5 分钟 TTL)
3. 构建会话上下文(sessionKey)
4. 调用 createReplyPrefixOptions 生成 prefixOptions
5. 调用 createReplyDispatcherWithTyping 创建 dispatcher
6. 调用 withReplyDispatcher + dispatchReplyFromConfig 触发 AI
7. deliver 回调收到 AI 回复
8. 通过 WebSocket 推送到外部 IM关键依赖
openclaw/plugin-sdk- OpenClaw 插件 SDKopenclaw/plugin-sdk/channel-runtime- 提供createReplyPrefixOptionsopenclaw/plugin-sdk/reply-runtime- 提供createReplyDispatcherWithTyping
日志标签
日志前缀格式:[LocalIM][{accountId}]
示例:
[LocalIM][u00267] 正在连接服务端: ws://192.168.100.168:8080/?accountId=u00267
[LocalIM][u00267] ✅ 成功连接至服务端
[LocalIM][u00267] 🚀 开始处理消息...
[LocalIM][u00267] AI 开始回复
[LocalIM][u00267] deliver: kind=final, textLength=506, thoughtLength=0
[LocalIM][u00267] 📥 AI 处理完成
[LocalIM][u00267] 回复空闲
[LocalIM][u00267] ✅ 消息处理完成 (1/1)开发说明
构建
npm run build调试
启用详细日志:
{
"channels": {
"nc-local-im-connector": {
"debug": true
}
}
}常见问题
- 消息被忽略:检查
isProcessing状态,可能上一条消息未处理完成 - AI 不回复:检查
createReplyPrefixOptions导入是否正确 - 无限循环:确保
markDispatchIdle()不在onIdle回调中调用
数据来源:ClawHub ↗ · 中文优化:龙虾技能库
OpenClaw 技能定制 / 插件定制 / 私有工作流定制
免费技能或插件可能存在安全风险,如需更匹配、更安全的方案,建议联系付费定制