开发者指南 · 06

Service & Consumer 双层

6.1 Admin 层

  • 通过 Web UI 登录,拥有完整权限
  • 管理文件系统(docs/scripts/generated/soul
  • 配置 System Prompt + 用户画像
  • 管理 Subagent + 能力提示词
  • 发布 Service + 管理 API Key
  • 配置定时任务 + 微信接入

6.2 Consumer 层

  • 通过 sk-svc-... API Key 认证(或 /s/{sid}?key=... 自助链接)
  • 权限受限:仅访问 Service 配置的能力 + allowed_docs/scripts
  • 文件系统隔离users/{admin}/services/{svc}/conversations/{conv}/
  • 生成文件隔离:每个对话独立的 generated/
  • 不能访问 Admin 的文件系统

6.3 Service 配置

每个 Service 是一个 published 配置:

text
users/{admin_id}/services/{service_id}/
├── config.json          # 模型 + system_prompt + capabilities + allowed_docs/scripts + welcome_message + quick_questions + wechat_channel
├── keys.json            # API Key(hashed)
├── wechat_sessions.json # WeChat 会话状态
├── conversations/       # Consumer 对话目录
└── tasks/               # Service 定时任务

详细 schema 见 docs/filesystem-architecture.md §4。

6.4 Service 自助化(v2.x)

6.4.1 专属链接附 Key

  • URL 格式:/s/{service_id}?key=sk-svc-xxx
  • 后端:consumer_ui.py 注入模板变量,前端启动时 URLSearchParamskey → 写 localStoragehistory.replaceState 立即清掉 query
  • 前端 admin:Key Modal 生成成功后额外展示带 key 的完整链接 + 警告(等同分享 Key

6.4.2 欢迎语 + 快速问题

  • 字段:welcome_message: str + quick_questions: List[str]
  • 后端模板注入:_safe_json_for_inline_script 防 script breakout
  • 前端 chat 页:ChatGPT 风格首屏(大欢迎语 + 渐变 chips),发送第一条消息后自动隐藏

6.4.3 文件/脚本图形选择器

  • FileTreePicker.tsx:antd Tree checkable + loadData 懒加载 + 「全部 (*)」 Switch
  • 文件夹勾选 = 整个目录递归(key 以 / 结尾)
  • 根目录限定:allowed_docs 只展示 /docsallowed_scripts 只展示 /scripts
  • allowed_docs 自动回落 ["*"],空 allowed_scripts 保持空数组(语义=禁止脚本)

6.5 Consumer Agent channel-aware

python
create_consumer_agent(..., channel: str = "web")
  • channel="web"注入 send_message,即便 humanchat capability 启用。原因:web 上 agent 输出已直接流给浏览器,再调 send_message 既无投递目标又会让消费者看到不该看的工具事件
  • channel="wechat":注入 send_message,工具结果由 delivery 层反向投递
  • channel="scheduler":同 wechat
  • cache_key 中加入 ::ch={channel}(仅当非默认 web 时)