一个会话式的 GitLab 代码审查 Agent:每个 webhook 触发的审查都是一个可追问的会话,由真正的 agent loop 驱动(真 tool calls + 多 subagent),用 Vercel AI SDK v7 原生能力从零构建。
不是「单次调用大模型」——agent 会自己
list_changed_files → fetch_diff → read_file,按需委派安全/架构/性能 subagent,最后把结论回写 MR;你还能在会话里继续追问。
- 后端:Hono(web 标准 Request/Response,AI SDK 的
toUIMessageStreamResponse()直接 return) - 前端:Vite + React +
@ai-sdk/react的useChat - Agent:
aiv7(streamText+stopWhen+ToolLoopAgentsubagent 委派) - 数据:Prisma + PostgreSQL
- 鉴权:HMAC 签名 Cookie + 可选 IP 白名单,全局守卫所有
/api/*
server/ # Hono 后端
index.ts # app 装配 + 全局鉴权 + 生产托管前端
routes/ # auth / sessions / repositories / settings / chat / webhook / dashboard
agent/ # model · tools · subagents · review-agent · run-review
lib/ # gitlab · auth · prompts · prisma · chat-store · branch-match
web/ # Vite + React SPA(Chat / Settings / Repositories / Login)
shared/ # 前后端共享类型
prisma/schema.prisma
# 1. 起一个 Postgres(或用 docker compose up -d postgres)
# 2. 配置 .env(见 .env.example)
cp .env.example .env
npm install
npm run db:migrate # 建表
npm run dev # 同时起 Hono(:8787) 与 Vite(:5173)打开 http://localhost:5173,用 .env 里的 APP_AUTH_USERNAME/SECRET 登录。
- 设置 → 添加 GitLab 账号:实例地址 + 访问令牌(api 权限)+ Webhook 密钥。
- 设置 → Tools / Skills 管理:调整平台默认工具与审查方法;内置
brooks-lint风格 skill 可直接启用。 - 仓库配置 → 添加仓库:选账号 → 拉取并选项目 → 配模型(provider/modelId/apiKey)→ 监听分支 / 默认审查提示词 / 自动审查 / 仓库级 Tools 和 Skills 覆盖。
- 在 GitLab 项目里加 Webhook(Merge Request events),URL 指向
<部署地址>/api/webhook/gitlab,Secret Token 与账号的 Webhook 密钥一致。 - 数据看板:查看 14 天趋势、状态分布、仓库热度、人员维度、失败样本和最近活动;人员分析覆盖活跃占比、失败贡献、仓库覆盖和消息密度。
之后每次 MR 打开/更新都会自动生成一个审查会话,agent 审查并回写 MR,你可在左侧会话里继续追问。
GitLabAccount—— 接入凭证Repository—— 仓库 + 按仓库的模型/提示词配置AgentTool/AgentSkill—— 平台级工具与 skill 注册表RepositoryToolSetting/RepositorySkillSetting—— 仓库级能力覆盖Session—— 一次会话(kind=review|chat,审查会话带 MR 元信息)Message—— 线性UIMessage持久化
npm run typecheck # tsc 服务端 + 前端
npm test # vitest(工具执行 / provider 解析 / 分支匹配)
npm run build # prisma generate + vite build单镜像单容器(Hono 同进程托管前端静态产物 + /api):
cp .env.example .env # 至少填好 APP_AUTH_*
docker compose up -d --build
# 访问 http://localhost:8787容器启动时自动执行 prisma migrate deploy。