Pomeloclaw
一个基于 DeepAgentsJS 的智能助手,参考了OpenClaw的设计理念。具有自主记忆和SKILLS编写/执行能力。
Ask AI about Pomeloclaw
Powered by Claude · Grounded in docs
I know everything about Pomeloclaw. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
SRE BOT
基于 DeepAgentsJS + LangGraph 构建的智能助手,参考了 智能体 的设计理念。
具备自主记忆、SKILL 编写/执行、定时任务调度和多渠道接入能力。
特性
| 能力 | 说明 |
|---|---|
| 🧠 记忆系统 | 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 实现)
