doc: merge Worker+Self into Life Loop, sync suite.md with code

This commit is contained in:
Fam Zheng 2026-04-10 21:33:30 +01:00
parent f646391f14
commit 8a5b65f128

View File

@ -4,18 +4,18 @@
同一个 AI 内核,多种协作界面,覆盖人与 AI 互动的全部场景。 同一个 AI 内核,多种协作界面,覆盖人与 AI 互动的全部场景。
## 种界面 ## 种界面
``` ```
┌───────────────────────────────────────────────────── ┌─────────────────────────────────────────────┐
AI Core │ AI Core │
│ persona · inner_state · memory · tools · context │ persona · inner_state · memory · tools │
└──────┬──────────┬──────────┬──────────┬──────────────┘ └──────┬──────────┬──────────┬────────────────┘
│ │ │ │ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼─────┐
│ Chat │ │ Gitea │ │Worker │ │ Self │ Chat │ │ Gitea │ │ Life
│ │ │ Bot │ │ │ │ │ │ │ Bot │ │ Loop
└───────┘ └───────┘ └───────┘ └───────┘ └───────┘ └───────┘ └─────────┘
``` ```
### Chat — 对话 ### Chat — 对话
@ -25,7 +25,7 @@
- 触发:用户发消息 - 触发:用户发消息
- 输出:流式文字回复、文件、语音 - 输出:流式文字回复、文件、语音
- 前端Telegram、飞书、未来更多 - 前端Telegram、飞书、未来更多
- 已有:当前 suite 的主体 - 已有:Telegram 前端、Output trait 抽象(新前端只需实现 trait
### Gitea Bot — 代码协作 ### Gitea Bot — 代码协作
@ -39,47 +39,38 @@ AI 作为团队成员出现在代码流程中。
- issue 里 @bot 触发分析或执行 - issue 里 @bot 触发分析或执行
- CI 失败后主动分析原因并评论 - CI 失败后主动分析原因并评论
- 代码变更后自动更新相关 issue 状态 - 代码变更后自动更新相关 issue 状态
- 已有webhook server (axum)、GiteaClient API、GiteaOutput实现 Output trait、issue comment
### Worker — 后台任务 ### Life Loop — AI 的自主节奏
AI 在后台安静地干活,做完了才来找你 不依赖外部触发AI 按自己的节奏存在和工作。既是内在生命(反思、感知、主动关心),也是后台执行引擎(定时任务、异步委派)
- 触发定时cron、事件文件变化、监控告警、Chat/Gitea 中委派 - 触发timer定时/cron、内部驱动反思周期、Chat/Gitea 中委派
- 输出:执行结果推送到 Chat 或 Gitea - 输出:可能发消息、更新内心状态、执行结果推送到 Chat 或 Gitea
- 场景:
- 定时巡检服务健康状态
- 监控日志异常,发现问题主动通知
- 跑长任务(数据分析、批量操作),完成后汇报
- Chat 里说"帮我查一下 X",转为后台任务异步执行
- 已有SubAgent雏形
### Self — AI 自身
不被触发AI 按自己的节奏存在。
- 触发内部驱动life loop、反思周期
- 输出:可能发消息,也可能只是更新内心状态
- 场景: - 场景:
- 早上主动问好,晚上道晚安 - 早上主动问好,晚上道晚安
- 感知用户状态(很久没聊、最近很累),决定是否主动关心 - 感知用户状态(很久没聊、最近很累),决定是否主动关心
- 定期整理记忆、反思最近的互动 - 定期整理记忆、反思最近的互动
- 定时巡检服务健康状态、监控日志异常
- Chat 里说"帮我查一下 X",转为后台 timer 异步执行
- 主动沉默也是一种行为 - 主动沉默也是一种行为
- 已有life loop + reflect + inner_state - 已有life loop + reflect + inner_state + life_log + timer 系统
## 共享内核 ## 共享内核
种界面共享同一个 AI Core 三种界面共享同一个 AI Core
| 组件 | 说明 | | 组件 | 说明 |
|------|------| |------|------|
| Persona | 定义 AI 是谁 | | Persona | 定义 AI 是谁 |
| Inner State | AI 对当前情况的感知LLM 自更新 | | Inner State | AI 对当前情况的感知LLM 自更新 |
| Memory | 跨会话的持久记忆 | | Memory | 跨会话的持久记忆slot 0-99 |
| Context | 对话历史、summary、scratch | | Context | 对话历史、summary、scratch |
| Tools | 统一的工具注册表,各界面按需可见 | | Tools | 统一的工具注册表,各界面按需可见 |
| Output | 输出抽象层TelegramOutput、GiteaOutput、BufferOutput |
| SubAgent | Claude Code (`claude -p`) 作为可调度的执行引擎 | | SubAgent | Claude Code (`claude -p`) 作为可调度的执行引擎 |
所有界面的交互最终都流经同一个 LLM 调用路径,共享 persona 和 inner_state——无论 AI 是在回复聊天、review 代码还是自言自语,它都是同一个"人"。 所有界面的交互最终都流经同一个 LLM 调用路径`run_openai_with_tools`,共享 persona 和 inner_state——无论 AI 是在回复聊天、review 代码还是自言自语,它都是同一个"人"。
### SubAgent — Claude Code 作为执行引擎 ### SubAgent — Claude Code 作为执行引擎
@ -104,8 +95,8 @@ AI Core (决策层)
场景举例: 场景举例:
- Chat: "帮我写个脚本分析日志" → spawn claude -p完成后把结果发回聊天 - Chat: "帮我写个脚本分析日志" → spawn claude -p完成后把结果发回聊天
- Gitea Bot: PR 来了 → claude -p review 代码,结果写成 comment - Gitea Bot: PR 来了 → claude -p review 代码,结果写成 comment
- Worker: 定时任务要更新一个 dashboard → claude -p 生成代码,部署到 /data/www/ - Life Loop: 定时任务要更新 dashboard → claude -p 生成代码,部署到 /data/www/
- Self: 反思时发现某个 tool 有 bug → 自己 spawn claude -p 去修 - Life Loop: 反思时发现某个 tool 有 bug → 自己 spawn claude -p 去修
## 界面之间的联动 ## 界面之间的联动
@ -114,8 +105,8 @@ AI Core (决策层)
``` ```
Chat ──"帮我 review 那个 PR"──→ Gitea Bot Chat ──"帮我 review 那个 PR"──→ Gitea Bot
Gitea Bot ──"CI 挂了,要不要我看看"──→ Chat Gitea Bot ──"CI 挂了,要不要我看看"──→ Chat
Worker ──任务完成──→ Chat / Gitea Bot Life Loop ──任务完成──→ Chat / Gitea Bot
Self ──"Fam 今天还没动过代码"──→ Chat主动关心 Life Loop ──"Fam 今天还没动过代码"──→ Chat主动关心
``` ```
## 部署架构 ## 部署架构
@ -137,9 +128,8 @@ Suite 跑在一台专属 VPS / EC2 上——一台小机器2C4G 足够),
│ │ │ │
│ noc (Rust binary) │ │ noc (Rust binary) │
│ ├─ telegram loop (Chat) │ │ ├─ telegram loop (Chat) │
│ ├─ axum http server (Gitea webhook) │ │ ├─ axum http server (Gitea Bot) │
│ ├─ life loop (Self) │ │ └─ life loop (Life Loop) │
│ └─ worker loop (Worker) │
│ │ │ │
│ SQLite (共享状态) │ │ SQLite (共享状态) │
│ LLM backend (外部OpenAI-compatible) │ │ LLM backend (外部OpenAI-compatible) │
@ -152,7 +142,7 @@ Suite 跑在一台专属 VPS / EC2 上——一台小机器2C4G 足够),
- Caddy 要绑 80/443容器里搞端口映射反而多一层 - Caddy 要绑 80/443容器里搞端口映射反而多一层
- noc 需要 spawn 子进程、读写磁盘、跑工具脚本,容器限制多 - noc 需要 spawn 子进程、读写磁盘、跑工具脚本,容器限制多
- 一台机器就是给 suite 独占的,不需要隔离 - 一台机器就是给 suite 独占的,不需要隔离
- Worker 以后可能跑 CI、生成 web app直接操作文件系统最自然 - Life Loop 以后可能跑 CI、生成 web app直接操作文件系统最自然
Docker image 保留用于本地开发和测试。 Docker image 保留用于本地开发和测试。
@ -161,7 +151,7 @@ Docker image 保留用于本地开发和测试。
不只是反向代理——是 suite 的**统一入口** 不只是反向代理——是 suite 的**统一入口**
- 子域名路由:不同服务用不同子域名 - 子域名路由:不同服务用不同子域名
- 静态站点托管:Worker 生成的 web app 放到 `/data/www/<name>/`,加一条路由即可对外 - 静态站点托管:Life Loop 生成的 web app 放到 `/data/www/<name>/`,加一条路由即可对外
- 自动 HTTPSLet's Encrypt 证书自动申请和续期 - 自动 HTTPSLet's Encrypt 证书自动申请和续期
- 未来 noc 自己的 HTTP API 也从这里暴露 - 未来 noc 自己的 HTTP API 也从这里暴露
@ -182,8 +172,7 @@ noc 的"专属地盘"——admin token 意味着 noc 可以:
| 界面 | 现状 | 下一步 | | 界面 | 现状 | 下一步 |
|------|------|--------| |------|------|--------|
| Chat | ✅ Telegram, streaming, tools | 多前端抽象Telegram + 飞书) | | Chat | ✅ Telegram, streaming, tools, Output trait 已抽象 | 更多前端(飞书等)只需实现 Output |
| Gitea Bot | ❌ 不存在 | webhook 接收 + PR review | | Gitea Bot | 🟡 webhook server + API client + issue comment | PR review、CI 失败分析 |
| Worker | 🟡 SubAgent 雏形 | 独立任务队列 + 结果路由 | | Life Loop | 🟡 timer + reflect + inner_state + life_log | 更丰富的自主行为、异步任务委派 |
| Self | 🟡 life loop + reflect | 更丰富的自主行为 | | Infra | ✅ Docker all-in-one (Caddy + Gitea + noc) | VPS setup 脚本 + systemd |
| Infra | ✅ Docker all-in-one | VPS setup 脚本 + systemd |