About Pomeloclaw
Pomeloclaw is an MCP server in the Other category: 一个基于 DeepAgentsJS 的智能助手,参考了OpenClaw的设计理念。具有自主记忆和SKILLS编写/执行能力。.
Install
git clone https://github.com/yuki-aigc/pomeloclawThis server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.
Ask AI
Ask AI about Pomeloclaw
Powered by Claude · Grounded in docs
Security checks
- ✓README presentThe repository ships documentation.
5 checks have not been run yet.
README
特性
| 能力 | 说明 |
|---|---|
| 🧠 记忆系统 | PGSQL 增量索引(可回退文件模式),支持 FTS / Vector / Hybrid 检索与会话隔离 |
| 🧩 冷启动记忆 | DingTalk / Web 会话首轮可注入“今天/昨天”Markdown 摘要(有注入限额,避免 token 膨胀) |
| ⚡ 会话向量召回 | session_events 向量异步回填 + PG 内 ANN 检索,失败自动回退 FTS / temporal |
| ♻️ 会话TTL治理 | session_events 支持按 TTL 自动清理,控制历史体量与检索成本 |
| 🧹 上下文压缩 | 自动 / 手动压缩对话历史,实时展示 Token 使用情况 |
| 🧭 Prompt Bootstrap | 支持 智能体 风格 AGENTS/TOOLS/SOUL/HEARTBEAT/MEMORY 多文件注入,含规则优先级与 scope 覆盖 |
| 🛠️ 技能系统 | 以 SKILL.md 定义技能,支持热重载、本地/远程安装,并通过子代理协作 |
| 🔌 MCP 集成 | 通过 @langchain/mcp-adapters 挂载 MCP 工具(stdio / http / sse) |
| 🤖 多模型支持 | OpenAI / Anthropic(多模型配置池,运行时 /model 热切换) |
| 🌉 渠道网关 | 引入 GatewayService + ChannelAdapter 抽象,已接入 DingTalk + iOS WebSocket + Web UI/WebSocket,支持后续扩展飞书 / 安卓等渠道 |
| 🪝 异步 Hooks | 提供独立 POST /hooks/agent 入口,支持幂等、异步执行、回调平台、基础并发控制与单独日志 |
| ⏰ 定时任务 | Cron 调度,支持持久化、JSONL 运行日志、群聊 / 私聊推送;启动时幂等确保 04:00 每日记忆归档任务 |
| 🧾 命令执行 | 白名单 / 黑名单策略 + 审批机制,超时与输出长度限制 |
| 📁 文件读写 | 基于 FilesystemBackend 的工作区文件系统,支撑记忆与技能存储 |
| 🔍 审计日志 | 命令执行全链路审计(策略判定、审批决策、执行结果) |
快速开始
环境要求
- Node.js >= 20
- pnpm(推荐)
- 可选:Docker、kubectl(用于容器化部署)
1. 安装依赖
pnpm install
2. 配置
cp config-example.json config.json
编辑 config.json,按需填写模型 API Key 及各模块配置,完整字段说明见下方 配置说明。
3. 运行
# CLI 交互模式
pnpm dev
# DingTalk 机器人模式
pnpm dingtalk
# iOS WebSocket 模式
pnpm ios
# Web UI + WebSocket 模式
pnpm web
# Hooks HTTP 模式
pnpm hooks
# 统一服务端(多渠道入口,按 config/CHANNELS 启动)
pnpm run server
多渠道启动方式(当前已实现 dingtalk + ios + web + hooks):
# 启动 config.json 中所有 enabled 渠道
pnpm run server
# 按环境变量显式指定渠道(逗号分隔)
CHANNELS=dingtalk pnpm run server
CHANNELS=ios pnpm run server
CHANNELS=web pnpm run server
CHANNELS=hooks pnpm run server
CHANNELS=dingtalk,ios,web,hooks pnpm run server
# 生产建议:先构建再运行统一入口
pnpm build
pnpm start:server
提示:
pnpm server是 pnpm 自带命令,项目脚本请使用pnpm run server(或别名pnpm channels)。
日志说明(统一服务端):
- 服务端日志:
logs/server-YYYY-MM-DD.log - 钉钉通道日志:
logs/dingtalk-server-YYYY-MM-DD.log - iOS 通道日志:
logs/ios-server-YYYY-MM-DD.log - Web 通道日志:
logs/web-server-YYYY-MM-DD.log - Hooks 日志:
logs/hooks/hooks-server-YYYY-MM-DD.log
文档导航
- 命令与运行方式
- 上下文文件与优先级
- Memory 机制说明
- Compaction 机制说明
- Memory + Compaction 流程图
- 多 Agent / 多 Session 设计
- 渠道网关设计
- Web 渠道 API
- Hooks API
- 容器与部署说明
项目结构
srebot/
├── src/
│ ├── index.ts # CLI 入口
│ ├── dingtalk.ts # DingTalk 入口
│ ├── ios.ts # iOS WebSocket 入口
│ ├── web.ts # Web UI + WebSocket 入口
│ ├── hooks.ts # Hooks HTTP 入口
│ ├── server.ts # 多渠道统一服务端入口
│ ├── agent.ts # 主代理创建与系统提示词
│ ├── conversation/
│ │ └── runtime.ts # 统一 Agent 生命周期与热重载
│ ├── prompt/
│ │ └── bootstrap.ts # AGENTS / TOOLS / SOUL / HEARTBEAT 注入
│ ├── skills/
│ │ ├── manager.ts # 技能安装 / 删除 / 列表
│ │ ├── monitor.ts # 技能目录监控与热重载触发
│ │ └── slash.ts # /skills /skill-install /skill-remove /skill-reload
│ ├── commands/
│ │ └── commands.ts # CLI 斜杠命令(/new /compact /status /model ...)
│ ├── channels/
│ │ ├── dingtalk/ # DingTalk 适配层、审批、文件回传、会话管理
│ │ ├── ios/ # iOS WebSocket 适配层
│ │ ├── web/ # Web HTTP/WS、上传、文件回传、内置 UI
│ │ └── gateway/ # 渠道网关抽象
│ ├── hooks/ # Hook task manager、请求归一化、回调投递
│ ├── middleware/ # Memory runtime、memory flush、scope 隔离
│ ├── compaction/ # 上下文压缩与摘要
│ ├── cron/ # 定时任务工具、调度、持久化
│ ├── tools/ # exec_command 等工具实现
│ ├── subagents/ # 子代理(skill-writer-agent)
│ ├── config/ # 配置 schema / defaults / loader
│ ├── security/ # 凭据读取与脱敏
│ ├── audit/ # 审计日志
│ ├── log/ # 运行时日志
│ ├── llm.ts # 多模型管理
│ └── mcp.ts # MCP 工具加载与连接管理
├── workspace/
│ ├── MEMORY.md # 长期记忆
│ ├── AGENTS.md # 项目级执行规范(Prompt Bootstrap)
│ ├── TOOLS.md # 工具使用约定(Prompt Bootstrap)
│ ├── SOUL.md # 角色与风格定义(Prompt Bootstrap)
│ ├── HEARTBEAT.md # 纠错与复盘经验(Prompt Bootstrap)
│ ├── memory/ # 每日记忆与 scope 隔离目录
│ ├── skills/ # 技能目录(每个技能含 SKILL.md)
│ ├── cron/ # 定时任务存储与运行日志
│ └── tmp/ # 渠道文件回传临时目录
├── template/
│ └── dingtalk-card/ # DingTalk 消息卡片模板(可直接导入)
├── deploy/
│ ├── Dockerfile # 容器镜像构建
│ ├── docker-compose.yaml # 本地 PG 依赖部署(可选)
│ ├── initdb/ # PG 初始化脚本
│ └── k8s/
│ ├── deploy-all.yaml # 应用部署清单(Deployment + PVC + Secret)
│ └── sts.yaml # PG StatefulSet 示例
├── docs/ # 文档与资源
├── config-example.json # 配置示例
├── exec-commands.json # 命令白名单 / 黑名单
├── tsconfig.json
└── package.json
配置说明
配置文件为项目根目录下的 config.json,以下为各模块的完整字段说明。
LLM 多模型配置
支持配置多个模型,运行时通过 /model <别名> 热切换。
{
"llm": {
"default_model": "default_model", // 默认激活的模型别名
"models": [
{
"alias": "default_model", // 模型别名(用于 /model 切换)
"provider": "openai", // 提供商:openai | anthropic
"base_url": "https://api.openai.com/v1",
"model": "gpt-4o",
"api_key": "sk-xxx",
"max_retries": 3
},
{
"alias": "claude35",
"provider": "anthropic",
"base_url": "https://api.anthropic.com",
"model": "claude-3-5-sonnet-latest",
"api_key": "sk-ant-xxx",
"headers": { // 可选,按模型透传自定义请求头
"anthropic-version": "2023-06-01"
},
"max_retries": 3
}
]
}
}
也可通过环境变量覆盖:
export LLM_MODEL_ALIAS="default_model" # 指定激活模型别名
export OPENAI_API_KEY="sk-xxx"
export OPENAI_MODEL="gpt-4o"
export OPENAI_BASE_URL="https://api.openai.com/v1"
敏感配置推荐放在 ~/.srebot/.credentials/.env(可通过 SREBOT_CREDENTIALS_ENV_PATH 自定义路径),格式示例:
OPENAI_API_KEY="sk-xxx"
ANTHROPIC_API_KEY="sk-ant-xxx"
MEMORY_PG_PASSWORD="xxx"
读取优先级:
config.json中已配置的值(优先)- 进程环境变量 /
~/.srebot/.credentials/.env作为兜底
说明:
- Skills / Tools 执行前会临时注入
credentials/.env变量,执行结束后自动恢复。 - 审计日志会对
api_key/token/password/secret等敏感字段自动脱敏。
Agent 核心配置
{
"agent": {
"workspace": "./workspace", // 工作区根目录
"skills_dir": "./workspace/skills", // 技能目录
"recursion_limit": 100, // LangGraph 递归上限(防止无限循环)
"compaction": {
"enabled": true, // 是否开启上下文压缩
"auto_compact_threshold": 80000, // 自动压缩阈值(tokens)
"context_window": 128000, // 模型上下文窗口大小
"reserve_tokens": 20000, // 压缩后保留的 token 数
"max_history_share": 0.5 // 历史保留比例
},
"memory": {
"backend": "pgsql", // filesystem | pgsql
"pgsql": {
"enabled": true,
"connection_string": "", // 推荐通过环境变量 MEMORY_PG_CONNECTION_STRING 注入
"host": "127.0.0.1",
"port": 5432,
"user": "srebot",
"password": "",
"database": "srebot",
"ssl": false,
"schema": "srebot_memory"
},
"retrieval": {
"mode": "hybrid", // keyword | fts | vector | hybrid
"max_results": 8,
"min_score": 0.1,
"sync_on_search": true,
"sync_min_interval_ms": 20000,
"hybrid_vector_weight": 0.6,
"hybrid_fts_weight": 0.4,
"hybrid_candidate_multiplier": 2,
"include_session_events": true, // 是否把 session_events 纳入统一检索
"session_events_max_results": 6, // 每次检索最多合并多少条 session events
"session_events_vector_async_enabled": true,
"session_events_vector_async_interval_ms": 5000,
"session_events_vector_async_batch_size": 16,
"session_events_ttl_days": 30,
"session_events_ttl_cleanup_interval_ms": 600000
},
"embedding": {
"enabled": true, // 关闭后自动退化为非向量检索
"cache_enabled": true,
"providers": [
{
"provider": "openai",
"base_url": "https://api.openai.com/v1",
"model": "text-embedding-3-small",
"api_key": ""
}
]
},
"session_isolation": {
"enabled": true,
"direct_scope": "direct", // main | direct (非 Web 渠道)
"web_direct_scope": "main", // main | direct (Web 直连默认共享团队记忆)
"group_scope_prefix": "group_",
"shared_main_scope_reads": true // 隔离 scope 是否额外可读 main 团队记忆
},
"transcript": {
"enabled": false
}
}
}
}
会话隔离策略说明:
direct_scope:控制非 Web 直连渠道的 direct scope,目前主要是 DingTalk / iOS。main表示共享团队记忆,direct表示按发送者隔离。web_direct_scope:控制 Web 直连渠道。main表示所有 Web 用户共享团队记忆,direct表示按user_id隔离。group_scope_prefix:控制群聊/共享会话的 scope 前缀;同一个conversationId/session_id仍然会按会话隔离。shared_main_scope_reads:开启后,group_*/direct_*等隔离 scope 在检索时会额外读取main的团队记忆(MEMORY.md、主 daily、主 HEARTBEAT),但写入仍保留在当前 scope。- 如需把当前群聊/私聊里沉淀出的经验正式晋升到团队共享记忆,调用
memory_save_team;该工具固定写入mainscope。
常见组合:
// 1) 团队共享 Agent:DingTalk + Web 都共享同一份记忆
"session_isolation": {
"enabled": true,
"direct_scope": "main",
"web_direct_scope": "main",
"group_scope_prefix": "group_",
"shared_main_scope_reads": true
}
// 2) 混合模式:DingTalk 私聊隔离,Web 共享
"session_isolation": {
"enabled": true,
"direct_scope": "direct",
"web_direct_scope": "main",
"group_scope_prefix": "group_",
"shared_main_scope_reads": true
}
// 3) 全隔离模式:DingTalk 和 Web 都按用户隔离
"session_isolation": {
"enabled": true,
"direct_scope": "direct",
"web_direct_scope": "direct",
"group_scope_prefix": "group_",
"shared_main_scope_reads": false
}
Prompt Bootstrap(AGENTS / TOOLS / SOUL / HEARTBEAT)
workspace/AGENTS.md:项目协作规范;缺失时回退workspace/AGENT.mdworkspace/TOOLS.md:工具使用约定workspace/SOUL.md:角色与风格定义workspace/HEARTBEAT.md:纠错与复盘经验- scope 级覆盖:
workspace/memory/scopes/<scope>/{TOOLS.md,SOUL.md,HEARTBEAT.md}(存在时优先) MEMORY.md会在首轮 Prompt Bootstrap 中按 scope 注入:优先workspace/memory/scopes/<scope>/MEMORY.md(main保留 rootMEMORY.md的兼容回退)
系统会在每个 thread_id 的首轮调用时注入引导文件;同一线程不会重复注入,修改文件后需进入新的 thread_id 才会重新生效。冲突处理优先级如下:
- 平台与运行时硬约束(审批、安全策略、工具白/黑名单)
- 系统提示词硬规则
- 用户当前任务目标与明确约束
AGENTS.mdTOOLS.mdSOUL.md(scope 覆盖优先)HEARTBEAT.md(scope 覆盖优先)
更细的职责划分、scope 覆盖细节和 MEMORY.md 的定位,见 上下文文件与优先级。
命令执行
{
"exec": {
"enabled": true,
"commandsFile": "./exec-commands.json", // 白名单 / 黑名单文件
"defaultTimeoutMs": 30000, // 默认超时(ms)
"maxOutputLength": 50000, // 输出最大长度
"approvals": {
"enabled": true // 是否开启执行审批
}
}
}
命令白名单文件 exec-commands.json:
{
"allowedCommands": ["ls", "cat", "grep", "kubectl", "docker", "git", "curl"],
"deniedCommands": ["rm", "mv", "chmod", "chown", "sudo", "su"]
}
MCP 工具
{
"mcp": {
"enabled": false,
"throwOnLoadError": true,
"prefixToolNameWithServerName": true,
"servers": {
"filesystem": { // stdio 模式
"transport": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "${MCP_FS_ROOT}"],
"stderr": "inherit", // inherit | pipe | ignore | overlapped
"env": { "MCP_FS_ROOT": "./workspace" }
},
"weather": { // SSE 模式
"transport": "sse",
"url": "https://example.com/mcp/sse",
"headers": { "Authorization": "Bearer ${WEATHER_API_TOKEN}" },
"env": { "WEATHER_API_TOKEN": "YOUR_TOKEN" },
"automaticSSEFallback": true
}
}
}
}
transport支持stdio、http、sse三种模式- 每个
mcp.servers.<name>都支持env,并可在同一 server 的字符串字段里使用${VAR}占位符stdioserver 可配置stderr:若手动Ctrl+C时出现三方 MCP 子进程 traceback,可设为ignore降噪- MCP 工具会自动注入主 Agent 工具列表,CLI / DingTalk / iOS 模式均可使用
定时任务
{
"cron": {
"enabled": true,
"store": "./workspace/cron/jobs.json", // 任务持久化文件
"timezone": "Asia/Shanghai",
"runLog": "./workspace/cron/runs.jsonl" // 运行日志(JSONL 格式)
}
}
DingTalk 机器人
{
"dingtalk": {
"enabled": false,
"clientId": "",
"clientSecret": "",
"robotCode": "",
"corpId": "",
"agentId": "",
"messageType": "card", // 消息类型:card | markdown
"cardTemplateId": "", // 消息卡片模板 ID
"showThinking": true, // 是否展示思考过程
"debug": false,
"streamLockWaitMs": 120000, // PG advisory lock 最长等待时间;K8s 重启时建议 >= terminationGracePeriodSeconds
"streamLockForceTerminateOnTimeout": false, // 超时后是否尝试 pg_terminate_backend() 抢回锁;单副本 K8s 可考虑开启
"streamLockForceTerminateWaitMs": 15000, // 强制终止旧 backend 后,最多再等待多久完成接管
"voice": {
"enabled": true, // 启用语音输入
"requireRecognition": true, // 要求钉钉识别文本,否则提示重试
"prependRecognitionHint": true // 传给模型前加"用户语音转写"前缀
},
"cron": {
"defaultTarget": "cidxxxx", // 定时任务默认推送群(openConversationId)
"useMarkdown": true,
"title": "srebot 定时任务",
"autoMemorySaveAt4": true // 启动时幂等确保 04:00 每日记忆归档任务
},
"execApprovals": {
"enabled": false, // 是否开启命令审批
"mode": "button", // 审批模式:text | button
"templateId": "", // 审批卡片模板 ID
"timeoutMs": 300000
}
}
}
iOS WebSocket
{
"ios": {
"enabled": false,
"host": "0.0.0.0",
"port": 18080,
"path": "/ws/ios",
"authToken": "", // 可选:用于 hello 认证
"debug": false,
"maxPayloadBytes": 1048576,
"pingIntervalMs": 30000,
"cron": {
"defaultTarget": "conversation:ios-default", // 默认推送目标
"useMarkdown": false,
"title": "iOS 定时任务",
"store": "./workspace/cron/ios-jobs.json",
"runLog": "./workspace/cron/ios-runs.jsonl"
}
}
}
iOS target 约定:
conversation:<id>/user:<id>/connection:<id>,无前缀时按 conversationId 解析。
Web UI + WebSocket
{
"web": {
"enabled": false,
"host": "0.0.0.0",
"port": 18081,
"path": "/ws/web",
"uiPath": "/web",
"title": "srebot Web",
"authToken": "", // 可选:浏览器 hello 认证
"debug": false,
"maxPayloadBytes": 1048576,
"pingIntervalMs": 30000
}
}
启动后直接打开
http://<host>:<port><uiPath>。浏览器会走同端口 WebSocket,并接收reply_start / reply_delta / reply_final流式事件。
斜杠命令
各渠道支持的斜杠命令并不完全一致,完整说明见 命令与运行方式。这里保留常用矩阵:
| 命令 | CLI | DingTalk | Web | iOS |
|---|---|---|---|---|
/new / /reset |
✅ | - | - | - |
/compact [说明] |
✅ | - | - | - |
/models / /model <别名> |
✅ | ✅ | ✅ | - |
/status |
✅ | ✅ | ✅ | - |
/skills |
✅ | ✅ | ✅ | ✅ |
/skill-install <来源> |
✅ | ✅ | ✅ | ✅ |
/skill-remove <名称> |
✅ | ✅ | ✅ | ✅ |
/skill-reload |
✅ | ✅ | ✅ | ✅ |
/voice / `/voice on |
off` | - | ✅ | ⚠️ 提示不支持 |
/help / /? |
✅ | ✅ | ✅ | - |
说明:
- iOS 当前只接入了技能管理命令。
- iOS 对非技能类
/xxx输入当前不会统一拦截,会继续按普通对话处理。 - Web 会对
/voice返回“不支持”提示,不会静默无响应。 /skill-install若目标目录同名,会先删除旧技能再覆盖安装。
使用示例
记忆 + 上下文压缩
你: 请记住我叫小S,是一名 SRE 工程师
助手: 已保存到长期记忆
你: /status
助手: 🤖 srebot v1.0.0
🧠 Model: openai/gpt-4o ...
🧮 Tokens: 1.2k in / 0.8k out ...
你: /compact 只保留关键决策
助手: 🧹 上下文压缩完成。压缩前: 12.5k → 压缩后: 3.2k,节省 9.3k tokens
定时任务(DingTalk)
你: 每天早上 9 点给群里推送昨晚告警摘要
助手: 已创建 cron 任务(ID: xxx,下一次执行: 明天 09:00)
你: 把这个任务改成工作日 10:30
助手: 已更新任务调度 → 0 30 10 * * 1-5
你: 列出所有定时任务
助手: [任务列表:ID、调度表达式、目标、下次执行时间]
技能编写
你: 帮我创建一个告警根因分析的技能
助手: 已调用 skill-writer-agent 创建 workspace/skills/alert-rca/SKILL.md
你: /skill-install 智能体/skills/prometheus-analyzer
助手: ✅ 技能已安装:`prometheus-analyzer`
- 状态:新安装
- 目录:`prometheus-analyzer`
✅ 技能索引已热重载。
命令执行(白名单 + 审批)
你: 帮我看下集群里的 Pod 状态
助手: [exec_command] kubectl get pods -A
● Exec 审批
命令: kubectl get pods -A
风险: low
允许执行? (y=允许, n=拒绝, e=编辑) y
✅ Command executed successfully
📤 Output: ...
模型切换
你: /models
助手: • default_model (openai) -> gpt-4o
claude35 (anthropic) -> claude-3-5-sonnet-latest
你: /model claude35
助手: ✅ 已切换模型: claude35 (claude-3-5-sonnet-latest)
DingTalk 机器人
pnpm dingtalk
功能支持
- 消息卡片:需在钉钉开发者后台开启消息卡片功能,
template/dingtalk-card/中提供了可直接导入的卡片模板 - 语音输入:使用钉钉上行消息的
recognition字段(语音转文字),可通过/voice on|off控制开关 - 多媒体处理:图片自动视觉理解;文件尝试文本抽取;视频抽帧摘要(需安装
ffmpeg) - 文件回传:优先通过
dingtalk_write_tmp_file/dingtalk_send_file工具触发(稳定),文件统一落到workspace/tmp/;同时兼容<dingtalk-file ...>/FILE_OUTPUT:文本标记(单文件 ≤ 10MB) - 定时推送:通过
cron_job_*工具管理定时任务,支持群聊 / 私聊推送 - 技能管理:支持
/skills、/skill-install、/skill-remove、/skill-reload,且安装/删除后立即热重载 - 首轮记忆注入:会话首轮自动注入今天/昨天 Markdown 摘要(受限额控制,不读取向量库)
- 自动归档任务:启动时幂等确保 04:00 的 daily memory_save 任务(可通过
dingtalk.cron.autoMemorySaveAt4=false关闭) - 斜杠命令:支持
/status、/models、/model <alias>、/skills、/skill-install <source>、/skill-remove <name>、/skill-reload、/voice、/voice on|off、/help、/?
所需权限
- ✅ Card.Instance.Write — 创建和投放卡片实例
- ✅ Card.Streaming.Write — 对卡片进行流式更新
注意:钉钉应用机器人需要配置可见人员并发布后才可使用。
iOS WebSocket 服务
pnpm ios
# 或统一入口
CHANNELS=ios pnpm run server
协议要点
- 客户端连接后先发
hello(可带authToken)完成会话初始化 - 用户消息使用
type=message,最少包含text,其余字段可由服务端自动补全 - 服务端回复
type=reply,主动推送为type=proactive - iOS 定时任务推送目标支持:
conversation:<id>/user:<id>/connection:<id>
功能支持
- 技能命令:支持
/skills、/skill-install、/skill-remove、/skill-reload - 技能热重载:监听
skills_dir目录变化,在下一轮请求前重建 Agent - 当前限制:尚未接入
/status、/models、/model、/help、/voice
Web UI 服务
pnpm web
# 或统一入口
CHANNELS=web pnpm run server
功能支持
- 内置 UI 页面:后端同端口直接托管页面,无需额外前端 dev server
- 流式打印:浏览器接收
reply_start / reply_delta / reply_final - Markdown 渲染:助手回复支持标题、列表、引用、代码块等基础 Markdown
- 代码高亮:对
ts/js/json/bash/sql/yaml等常见代码块做轻量高亮 - 图片/文件上传:内置 UI 和外部前端都可通过
POST /api/web/uploads上传图片或文件,再在message.attachments[].upload_id中引用 - 媒体理解:入站图片会走视觉理解;文本类文件会抽取前缀内容写入
[媒体上下文];非文本文件保留元信息供 Agent 参考 - 附件回传:Agent 可通过
web_write_tmp_file / web_send_file生成并回传workspace/tmp下文件 - 会话隔离:按
conversationId建立独立 thread,支持手动新开会话 - 工具状态提示:收到
tool_start / tool_end时页面会显示当前工具状态 - 斜杠命令:支持
/status、/models、/model <alias>、/skills、/skill-install <source>、/skill-remove <name>、/skill-reload、/help、/? - 技能热重载:安装/删除技能后立即重载;手工修改技能目录后会在下一轮请求前自动重载
- MCP 运行时管理:支持查询当前已加载 MCP 工具,并通过 Web API 对单个 MCP server 做启停、增删改;变更会写回
config.json并立即热重载 - 语音命令提示:
/voice、/voice on、/voice off会明确提示“Web 渠道暂不支持”
对外 API 要点
POST /api/web/sessions:申请/恢复session_idPOST /api/web/uploads:上传图片/文件,返回upload_idGET /api/web/mcp:查看当前 MCP 运行态、已加载 server 与工具清单POST /api/web/mcp:执行 MCP 管理动作(reload、set-global-enabled、set-server-enabled、upsert-server、remove-server)WebSocket message.attachments[].upload_id:把已上传附件挂到本轮消息- 详细协议见
docs/web-api.md
容器部署
构建镜像
# Mac 用户需指定 --platform linux/amd64
docker build --platform linux/amd64 -f deploy/Dockerfile -t your-registry/srebot:latest .
docker push your-registry/srebot:latest
K8s 部署
# 创建 Secret(存储 config.json)
kubectl create secret generic deepagents-srebot-config \
--from-file=config.json=./config.json
# 部署(需持久化 workspace 目录,包含记忆与技能数据)
kubectl apply -f deploy/k8s/deploy-all.yaml
部署清单包含 Deployment、PVC、Secret 等资源定义,详见
deploy/k8s/deploy-all.yaml。
Roadmap
- Memory 混合检索架构:PGSQL + FTS(增量索引),可选 Vector/Hybrid
- 独立记忆模式:支持主会话 / 群聊的记忆隔离(direct 可选独立 scope)
- Sandbox 机制:沙盒环境下的命令执行(优先基于 K8s 实现)
许可证
README copy captured when this server was indexed; it may lag the repository. The original is authoritative.