YP

yzstory/pomeloclaw

Developer tools
60 stars 品質 55 トレンド 55

一个基于 DeepAgentsJS 的智能助手,参考了OpenClaw的设计理念。具有自主记忆和SKILLS编写/执行能力。

概要

基于 DeepAgentsJS + LangGraph 构建的智能助手,参考了 智能体 的设计理念。 具备自主记忆、SKILL 编写/执行、定时任务调度和多渠道接入能力。 - >= 20 - (推荐) - 可选:Docker、kubectl(用于容器化部署) 编辑 config.json,按需填写模型 API Key 及各模块配置,完整字段说明见下方 配置说明。 多渠道启动方式(当前已实现 dingtalk + ios + web + hooks): 提示: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 敏感配置推荐放在 ~/.srebot/.credentials/.env(可通过 SREBOT_CREDENTIALS_ENV_PATH 自定义路径),格式示例: 1. config.json 中已配置的值(优先) 2. 进程环境变量 / ~/.srebot/.credentials/.env 作为兜底

README

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

文档导航

项目结构

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"

读取优先级:

  1. config.json 中已配置的值(优先)
  2. 进程环境变量 / ~/.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;该工具固定写入 main scope。

常见组合:

// 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.md
  • workspace/TOOLS.md:工具使用约定
  • workspace/SOUL.md:角色与风格定义
  • workspace/HEARTBEAT.md:纠错与复盘经验
  • scope 级覆盖:workspace/memory/scopes//{TOOLS.md,SOUL.md,HEARTBEAT.md}(存在时优先)
  • MEMORY.md 会在首轮 Prompt Bootstrap 中按 scope 注入:优先 workspace/memory/scopes//MEMORY.mdmain 保留 root MEMORY.md 的兼容回退)

系统会在每个 thread_id 的首轮调用时注入引导文件;同一线程不会重复注入,修改文件后需进入新的 thread_id 才会重新生效。冲突处理优先级如下:

  1. 平台与运行时硬约束(审批、安全策略、工具白/黑名单)
  2. 系统提示词硬规则
  3. 用户当前任务目标与明确约束
  4. AGENTS.md
  5. TOOLS.md
  6. SOUL.md(scope 覆盖优先)
  7. 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 支持 stdiohttpsse 三种模式
  • 每个 mcp.servers. 都支持 env,并可在同一 server 的字符串字段里使用 ${VAR} 占位符
  • stdio server 可配置 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: / user: / connection:,无前缀时按 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://:。浏览器会走同端口 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/;同时兼容 `` / 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 /skills/skill-install /skill-remove /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: / user: / connection:

功能支持

  • 技能命令:支持 /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 /skills/skill-install /skill-remove /skill-reload/help/?
  • 技能热重载:安装/删除技能后立即重载;手工修改技能目录后会在下一轮请求前自动重载
  • MCP 运行时管理:支持查询当前已加载 MCP 工具,并通过 Web API 对单个 MCP server 做启停、增删改;变更会写回 config.json 并立即热重载
  • 语音命令提示/voice/voice on/voice off 会明确提示“Web 渠道暂不支持”

对外 API 要点

  • POST /api/web/sessions:申请/恢复 session_id
  • POST /api/web/uploads:上传图片/文件,返回 upload_id
  • GET /api/web/mcp:查看当前 MCP 运行态、已加载 server 与工具清单
  • POST /api/web/mcp:执行 MCP 管理动作(reloadset-global-enabledset-server-enabledupsert-serverremove-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

  • [x] Memory 混合检索架构:PGSQL + FTS(增量索引),可选 Vector/Hybrid
  • [x] 独立记忆模式:支持主会话 / 群聊的记忆隔离(direct 可选独立 scope)
  • [ ] Sandbox 机制:沙盒环境下的命令执行(优先基于 K8s 实现)

许可证

MIT

View this README on GitHub

推奨ツール

別のキーワードを試すか、フィルタを外してください。

インストール

npx skillfish add yzstory/pomeloclaw