Skip to content

VonSdite/ReviewPage

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Review Page

一个面向 Merge Request 检视流程的轻量 Web 页面,负责把 GitLab MR、配置驱动的 Agent 命令和后台串行队列串起来,并提供检视中心与系统设置页,用于维护 Agent、平台、默认模型和默认平台/Agent。

当前能力

  • 检视中心
    • 提交 MR 检视任务
    • 为平台、Agent、模型设置显式默认值
    • 刷新选中 Agent 的模型列表
    • 查看队列、历史记录、执行日志、最终结果
    • 从历史详情一键重试并回填表单
  • 系统设置
    • 维护 Agent 列表和平台列表
    • 新增、编辑、重命名、删除 Agent / 平台
    • 为 Agent 设置默认模型
    • 为 Agent / 平台设置或清空显式默认
    • 在 Agent 编辑弹窗里拉取模型预览、筛选并应用到当前编辑内容
  • 后台执行
    • 单线程串行消费待执行任务
    • 启动时会把“pending + running”的遗留任务重置回队列
    • 克隆 MR 源分支代码后,在临时工作目录中执行 Agent 检视命令
  • 配置驱动
    • Agent、平台、默认项都持久化在 config.yaml
    • Review 记录和日志存储在 SQLite

运行流程

  1. 前端提交 mr_urlhub_idagent_idmodel_id
  2. 后端把任务写入 SQLite 队列,状态为 pending/queued
  3. 后台 worker 轮询队列,依次领取任务并标记为 pending/running
  4. Hub 解析 MR 地址,获取仓库地址、源分支、目标分支、标题、作者等信息。
  5. 服务端执行 git clone --depth 1 --branch <source_branch> 拉取代码。
  6. Agent 根据 review_command 生成实际命令,在仓库目录中执行检视。
  7. 结果和日志写回数据库,任务最终变为 completed/finishedfailed/finished

快速开始

依赖

  • Python
  • git
  • 可用的 Agent CLI
  • Python 包:flaskgeventrequestspyyaml

安装示例:

pip install flask gevent requests pyyaml

启动

项目要求提供配置文件;仓库根目录自带 config.yaml 示例。

python main.py --config config.yaml

当前仓库示例配置默认监听:

http://127.0.0.1:31944

如果配置里省略 server.host / server.port,代码默认使用 127.0.0.1:8091

页面说明

检视中心

  • 表单字段为 MR 地址平台名称Agent 名称模型
  • 前端会优先选中显式默认值;如果没有显式默认,只会临时预选第一个可用项,页面不会显示默认 tag 或星标。
  • “设为默认”只代表写入配置中的显式默认,不代表页面当前预选。
  • “更新模型”会刷新当前已存在 Agent 的模型列表,并把结果写回 config.yaml
  • 记录列表支持分页、自动刷新、详情弹窗和重试。

系统设置

  • Agent 列表会显示:
    • Agent 名称
    • 默认模型
    • 模型数
    • 拉模型命令
    • 检视命令
  • 平台列表会显示:
    • 平台名称
    • 类型
    • 网页地址
    • API 地址
  • 编辑弹窗支持重命名;保存成功后会直接关闭弹窗。
  • Agent 弹窗中的“拉取模型”只要求填写“拉模型命令”,不要求先填 Agent 名称。
  • Agent 弹窗里拉取到的模型先进入预览选择弹窗;选中后只会应用到当前编辑器,真正持久化要等点“保存/创建”。

配置说明

说明:

  • UI 文案里展示的是“Agent 名称 / 平台名称”,但配置键和 API 字段仍然使用 agent_id / hub_id
  • 所有相对路径都相对于项目根目录解析。

顶层配置

说明
server.host 监听地址,缺省为 127.0.0.1
server.port 监听端口,缺省为 8091
database.path SQLite 数据目录,不是 sqlite 文件路径;实际数据库文件固定为 <database.path>/review_page.sqlite3
logging.path 日志目录
logging.level 日志级别,缺省 INFO
workspace.temp_root 任务执行时的临时工作目录根路径
queue.poll_interval_seconds 队列轮询间隔,最小会按 0.5 秒处理
command_shell 全局 Agent 命令执行 shell,可写字符串或映射
hubs.default 显式默认平台,可为空
agents.default 显式默认 Agent,可为空

command_shell

command_shell 只支持全局配置,不支持在单个 Agent 下单独配置。

支持两种写法:

command_shell: bash
command_shell:
  executable: bash
  args:
  - -lc

行为说明:

  • 写成字符串时,等价于 executable=<该字符串> 且默认 args=["-lc"]
  • 写成映射但未提供 args 时,也会默认补成 ["-lc"]
  • 只有在你显式写了 args 时,才完全以你写的参数为准

因此:

command_shell: bash

最终效果接近:

bash -lc "<实际命令>"

Agent 配置

agents:
  opencode:
    list_models_command: opencode models
    review_command: opencode run --model "{model}" "/review {review_url}"
    models:
    - opencode/big-pickle
    default_model: opencode/big-pickle
    extra_env:
      HTTP_PROXY: http://127.0.0.1:7890
  default: opencode

字段说明:

必填 说明
list_models_command 拉取模型列表的命令
review_command 执行检视的命令模板
models 当前持久化的模型列表
default_model 当前 Agent 的显式默认模型;必须出现在 models
extra_env 执行 Agent 命令时追加的环境变量对象

补充说明:

  • review_command 支持占位符:{model}{review_url}{workspace_dir}
  • list_models_command 的输出按“每行一个模型 ID”解析
  • 空行会忽略
  • Available models 开头的标题行会忽略
  • 每行前缀的 -* 会被剥掉再入库

平台配置

当前内置且已注册的 Hub 类型只有 gitlab

hubs:
  gitlab_public:
    type: gitlab
    web_base_url: https://gitlab.example.com
    api_base_url: https://gitlab.example.com/api/v4
    private_token: null
    clone_url_preference: http
    verify_ssl: true
    timeout_seconds: 20
  default: gitlab_public

字段说明:

必填 说明
type 平台类型,当前仅支持 gitlab
web_base_url 用于限制平台可接受的 MR host;为空时不做 host 限制
api_base_url gitlab 时必填 GitLab API 基地址
private_token GitLab 私有 token
clone_url_preference httpssh,默认 http
verify_ssl 是否校验证书,GitLab Hub 读取时缺省按 true 处理
timeout_seconds API 请求超时;系统设置页面要求填写整数

默认值与预选逻辑

  • agents.defaulthubs.default 表示“显式默认”。
  • 没有显式默认时:
    • 页面不显示默认 tag
    • 下拉选项不显示默认星标
    • 页面为了便于操作,仍可能临时预选第一个可用项
  • 创建检视任务时,后端不会再自动 fallback 到第一个平台 / Agent / 模型;请求必须显式传入这三个值。
  • 删除当前默认 Agent / 平台时,会直接清空默认,不会自动切换到剩余第一个。

HTTP API

所有写接口失败时统一返回:

{"error": "具体错误信息"}

元数据与设置

方法 路径 说明
GET / 渲染页面
GET /api/meta 检视中心所需元数据:Agent、平台、显式默认值
GET /api/settings 系统设置页所需数据:Agent、平台、显式默认值、hub_types

Agent 相关

方法 路径 说明
POST /api/agents/<agent_id>/models/fetch 按当前编辑内容预览拉取模型,不直接写配置
POST /api/agents/<agent_id>/models/refresh 刷新已存在 Agent 的模型并写回配置
POST /api/agents/<agent_id>/default-model 设置 Agent 默认模型
POST /api/settings/agents/<agent_id> 新增或保存 Agent;支持重命名
DELETE /api/settings/agents/<agent_id> 删除 Agent
POST /api/settings/agents/<agent_id>/default 设置显式默认 Agent

常用请求体:

{
  "agent_id": "opencode",
  "list_models_command": "opencode models",
  "review_command": "opencode run --model \"{model}\" \"/review {review_url}\"",
  "models": ["opencode/big-pickle"],
  "default_model": "opencode/big-pickle",
  "extra_env": {
    "HTTP_PROXY": "http://127.0.0.1:7890"
  }
}

/api/agents/<agent_id>/models/fetch 预览拉取时,只要求 list_models_commandreview_command 可为空。

平台相关

方法 路径 说明
POST /api/settings/hubs/<hub_id> 新增或保存平台;支持重命名
DELETE /api/settings/hubs/<hub_id> 删除平台
POST /api/settings/hubs/<hub_id>/default 设置显式默认平台

常用请求体:

{
  "hub_id": "gitlab_public",
  "type": "gitlab",
  "web_base_url": "https://gitlab.example.com",
  "api_base_url": "https://gitlab.example.com/api/v4",
  "private_token": "",
  "clone_url_preference": "http",
  "verify_ssl": true,
  "timeout_seconds": 20
}

检视任务

方法 路径 说明
GET /api/reviews?page=1&page_size=50 分页获取检视记录,page_size 最大 200
POST /api/reviews 创建检视任务
GET /api/reviews/<review_id> 获取检视详情和完整日志

创建任务请求体:

{
  "mr_url": "https://gitlab.example.com/group/project/-/merge_requests/123",
  "hub_id": "gitlab_public",
  "agent_id": "opencode",
  "model_id": "opencode/big-pickle"
}

项目结构

.
├─ main.py
├─ config.yaml
├─ src
│  ├─ application
│  ├─ config
│  ├─ domain
│  ├─ integrations
│  │  ├─ agents
│  │  └─ hubs
│  ├─ presentation
│  │  ├─ static
│  │  └─ templates
│  ├─ repositories
│  ├─ services
│  └─ utils
└─ tests

目录职责:

  • src/application
    • 应用装配、日志初始化、worker 启停
  • src/config
    • config.yaml 读取、路径解析和持久化
  • src/integrations/agents
    • 配置驱动 Agent,负责模型拉取和命令构造
  • src/integrations/hubs
    • 平台实现;当前仅内置 GitLab Hub
  • src/presentation
    • Flask 路由、Jinja 模板、前端静态资源
  • src/repositories
    • SQLite 读写和 review/log 持久化
  • src/services
    • 检视编排、设置管理、后台队列 worker
  • tests
    • 覆盖配置、Agent、Hub、仓库、服务和进程相关行为

开发与测试

运行全部测试:

python -m pytest tests

本地开发建议至少关注:

  • tests/test_config_manager.py
  • tests/test_config_driven_agent.py
  • tests/test_gitlab_hub.py
  • tests/test_review_repository.py
  • tests/test_review_service.py

当前限制

  • 当前仅内置 gitlab Hub。
  • 队列执行为单线程串行模式。
  • 删除已被待执行或执行中任务引用的 Agent / 平台时,没有额外的前置保护;已有记录会保留原引用,后续任务可能失败。
  • command_shell 目前只支持全局配置,不支持按 Agent 单独覆盖。

About

MR检视轻量web

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors