blog/content/posts/ai-suite.md

76 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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 不只是为了跑代码,它给整个系统提供了一个结构化的工作台。
有了 GiteaAI 的工作流有地方落:代码改动变成 commit 和 PR任务追踪用 issue讨论在 comment 里沉淀。这比在聊天框里说一句「帮我改一下那个文件」然后就消失在历史里强太多了。
noc 拿着 Gitea 的 admin token可以创建 repo、提交代码、管理 issue。Webhook 把事件推过来noc 决定要不要介入。这是一个闭环:聊天里说「开个 issue 跟踪一下」AI 立刻在 Gitea 上建好PR 提上来AI 自动 reviewCI 挂了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。需要跑 Pythonuv 管理环境。需要操作 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 reviewLife Loop 能跑定时任务和反思。接下来想做的是让界面之间的联动更自然——聊天里提到的事自动变成 issuePR merge 后自动通知,那种感觉。