76 lines
4.0 KiB
Markdown
76 lines
4.0 KiB
Markdown
---
|
||
title: "工程化 AI 助理:一个整合方案"
|
||
date: 2026-04-10T22:30:00+01:00
|
||
draft: false
|
||
summary: "把 AI 聊天、代码协作和后台任务整合到一个套件里,跑在一台 VPS 上。"
|
||
---
|
||
|
||
AI 助手的问题不是不够聪明,而是太碎片化。聊天用一个 bot,代码用 Copilot,自动化用另一套东西。它们之间没有共享状态,每个都是孤岛。
|
||
|
||
我想要的是一个整合的方案:同一个 AI 内核,接入不同的工作场景,共享上下文和记忆。于是造了这么个东西。
|
||
|
||
## 架构
|
||
|
||
一个 Rust binary,跑三个循环:
|
||
|
||
```
|
||
noc (Rust binary)
|
||
├── Telegram 消息循环 → 聊天
|
||
├── Axum HTTP server → Gitea webhook
|
||
└── Life loop → 定时任务、反思、自主行为
|
||
```
|
||
|
||
后端是 OpenAI 兼容的 LLM API(目前用 vLLM 跑 Gemma 4),状态存 SQLite。整个东西部署在一台 4C8G 的 VPS 上,加上 Docker 跑 Gitea、Caddy 做反代和 HTTPS。
|
||
|
||
## 三种界面,一个内核
|
||
|
||
**聊天**是最基础的。Telegram bot,流式输出,支持工具调用。AI 可以直接跑 shell 命令、执行 Python、调 Gitea API,或者 spawn 一个 Claude Code 子进程去处理复杂任务。
|
||
|
||
**Gitea Bot** 是把 AI 拉进代码流程。在 PR 或 issue 里 @bot,它会拿到 diff 或 issue 内容,跑一轮分析,把结果作为 comment 贴回去。这不是一个独立的 review 工具,而是同一个 AI 以另一种方式出现——它知道你们之前在聊天里讨论了什么。
|
||
|
||
**Life Loop** 是后台引擎。timer 驱动,跑定时巡检、异步任务,也负责 AI 的自我反思。每次对话结束后,它会回顾交互内容,更新内部状态——不是存对话日志,而是沉淀对当前情况的理解。
|
||
|
||
关键是这三个界面共享同一份 persona、memory 和 inner state。不管 AI 在哪个场景出现,它对你的理解是连续的。
|
||
|
||
## Gitea 带来的秩序
|
||
|
||
自建 Gitea 不只是为了跑代码,它给整个系统提供了一个结构化的工作台。
|
||
|
||
有了 Gitea,AI 的工作流有地方落:代码改动变成 commit 和 PR,任务追踪用 issue,讨论在 comment 里沉淀。这比在聊天框里说一句「帮我改一下那个文件」然后就消失在历史里强太多了。
|
||
|
||
noc 拿着 Gitea 的 admin token,可以创建 repo、提交代码、管理 issue。Webhook 把事件推过来,noc 决定要不要介入。这是一个闭环:聊天里说「开个 issue 跟踪一下」,AI 立刻在 Gitea 上建好;PR 提上来,AI 自动 review;CI 挂了,AI 主动分析原因贴 comment。
|
||
|
||
代码和讨论都有迹可循,不会散落在聊天记录里。
|
||
|
||
## 工具体系
|
||
|
||
noc 自带一组内置工具:
|
||
|
||
- `run_shell` — 执行任意 shell 命令
|
||
- `run_python` — uv run 执行 Python,支持声明依赖自动安装
|
||
- `call_gitea_api` — 直接调 Gitea REST API
|
||
- `spawn_agent` — 启动 Claude Code 子进程处理复杂任务
|
||
- `update_memory` / `update_inner_state` — AI 管理自己的记忆和状态
|
||
- `set_timer` — 设定定时任务
|
||
|
||
外部工具通过脚本扩展:在 `tools/` 目录放一个实现了 `--schema` 接口的可执行文件就行,noc 每次请求自动发现。
|
||
|
||
设计原则是 noc 只做调度和人格层,重活交给专业工具。需要写代码?spawn Claude Code。需要跑 Python?uv 管理环境。需要操作 git?调 Gitea API。不重复造轮子。
|
||
|
||
## 部署
|
||
|
||
整个 suite 跑在一台 VPS 上:
|
||
|
||
- **noc**: systemd user service
|
||
- **Gitea**: Docker,数据挂载到 `/data/noc/gitea/`
|
||
- **Caddy**: 系统级 service,自动 HTTPS,按子域名路由
|
||
|
||
`make deploy` 从本地编译 + scp 到 VPS + 重启服务,一把梭。
|
||
|
||
所有数据在 `/data/noc/` 下面,备份和迁移都简单。
|
||
|
||
## 现状
|
||
|
||
能用了,但还在早期。聊天和工具调用比较稳定,Gitea Bot 有基础的 @mention 响应和 PR review,Life Loop 能跑定时任务和反思。接下来想做的是让界面之间的联动更自然——聊天里提到的事自动变成 issue,PR merge 后自动通知,那种感觉。
|
||
|