Files
memind/docs/memindadm-goose-gateway-design.md
john 9b4a25799f Add smart ACK provider for WeChat MP replies
Replace fixed ackText with a rule-based AckProvider that picks
response templates by message type and intent (translate, summary,
rewrite, poster, ppt, mindmap, code, search, schedule). Pure sync,
zero I/O, auto-falls back to config.ackText on any error.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 15:19:03 +08:00

647 lines
14 KiB
Markdown

# memindadm 内 Goose 网关策略中心设计
> **定位:** `memindadm` 后台内的一个功能模块,不是独立治理平台,也不是 Plaza 审核后台的一部分。
>
> **目标:** 做一个可配置、可审计、可扩展的 Goose 网关策略中心。
>
> **原则:** 不做大而全的中台,不引入复杂流程编排,先把策略控制、路由分发、审计留痕做扎实。
>
> **边界:** 该模块只做旁路审计和策略决策,不改变现有 Goose 服务的核心行为,不把 Goose 变成被动依赖,也不在第一阶段强制改造现有 Goose 服务链路。它归属 `memindadm` 的用户管理后台,不归属 Plaza 审核后台。
>
> **统一要求:** `Goose / Aider / OpenHands` 的 LLM 配置必须收敛到 `memindadm`,后台只保留一套统一模型配置与执行器绑定,不允许给 Goose 单独再开一套独立 LLM 设置。
## 1. 背景
现有 `memindadm` 后台已经承担了平台管理、能力配置、审计查看等职责。基于这套后台能力,可以新增一个面向 Goose 调用链路的策略模块,用来统一管理:
- 输入内容过滤
- 敏感词与敏感表达屏蔽
- 输出话术约束
- 执行器分配策略
- 高风险操作拦截与人工确认
- 调用审计与复盘
这里的核心不是“再做一个后台”,而是把 Goose 的调用前、调用中、调用后策略,纳入 `memindadm` 统一管理。
### 1.1 非侵入式要求
这一版必须满足两个硬约束:
1. 现有 Goose 服务仍然可以按原方式独立运行。
2. `memindadm` 只在调用入口、审计链路、策略配置层提供旁路能力,不要求 Goose 原服务先完成深度改造。
换句话说:
- 先接策略,不先改服务。
- 先留审计,不先改执行。
- 先做可观察性,不先做强制接管。
如果后续要把 `memindadm` 的策略真正注入到 Goose 执行链路里,再单独做一个可控的接入阶段。
### 1.2 统一模型配置要求
模型配置必须只有一个控制平面:
- `memindadm` 维护 Provider、API Key、Base URL、模型列表、默认模型。
- `Goose``Aider``OpenHands` 只从 `memindadm` 读取模型绑定。
- 后台不再出现“Goose 单独配置 LLM”的入口。
- 某个执行器如果暂时不用,可以禁用绑定,但不能绕开 `memindadm` 单独配。
迁移期间如果需要,可以先停掉原来的独立 Goose 服务配置,让它完全切到 `memindadm` 的统一配置上。
## 2. 设计目标
这个模块要解决的事情很明确:
1. 当前任务是否允许执行。
2. 输入内容是否包含敏感信息。
3. 输出话术是否符合产品约束。
4. 当前任务应该由 Goose 自处理、Aider 执行,还是 OpenHands 执行。
5. 是否需要人工确认。
6. 执行结果是否需要记录、复核或回滚。
7. `Goose / Aider / OpenHands` 是否使用同一 Provider 下的不同模型绑定。
最终效果是:
- `memindadm` = 策略配置与审计后台
- `memindadm` = 统一模型与策略控制台
- Goose Gateway = 策略执行入口
- Aider / OpenHands = 具体执行器
- Audit Log = 全链路留痕
## 3. 总体架构
```mermaid
flowchart TD
U["用户 / 前端 / 管理员"] --> A["memindadm 后台"]
A --> P["Goose 网关策略中心"]
P --> G["Goose Gateway"]
G --> E["策略判断引擎"]
E --> F["内容过滤规则"]
E --> S["话术约束规则"]
E --> R["执行器分配规则"]
E --> H["高风险操作规则"]
E --> M["人工确认规则"]
E --> X["执行器路由"]
X --> G1["Goose 自处理"]
X --> G2["Aider 执行"]
X --> G3["OpenHands 执行"]
G1 --> L["结果 / Diff / 审计日志"]
G2 --> L
G3 --> L
L --> A
```
### 架构解读
- `memindadm` 负责配置和查看,不直接承担执行。
- Goose Gateway 是统一入口,所有 Goose 相关调用都从这里经过。
- 策略判断引擎先做规则匹配,再决定是否执行、交给谁执行、是否要人工确认。
- 执行结果回流到 `memindadm` 审计中心。
## 4. 菜单结构
建议在 `memindadm` 下新增一个一级菜单:
- `Goose 网关`
下面放 5 个子菜单即可,保持克制:
1. 内容过滤
2. 敏感词
3. 话术约束
4. 执行策略
5. 调用日志
同时建议保留或升级原有 `LLM 配置` 页面为 `统一模型中心`,专门管理:
- Provider
- API Key
- Base URL
- 模型列表
- 默认模型
- 执行器绑定
这个页面要同时服务 `Goose / Aider / OpenHands`,不是只给 Goose 用。
如果后续确实需要,再补:
- 风险规则
- 人工确认
- 策略测试
第一版不建议拆太多页,避免后台变复杂。
## 5. 核心模块
### 5.1 内容过滤规则
内容过滤用于处理三类文本:
- `input`:用户输入
- `prompt`:发给 Goose / Aider / OpenHands 的任务内容
- `output`:最终返回给用户的内容
推荐支持的匹配方式:
- 关键词匹配
- 正则表达式匹配
- 敏感字段检测
- 文件路径检测
- 高危命令检测
- 代码操作风险检测
推荐动作:
- `pass`:允许通过
- `mask`:脱敏替换
- `block`:阻断执行
- `confirm`:需要人工确认
- `log_only`:只记录不拦截
示例:
```yaml
rule_id: filter_001
name: 禁止输出密钥
target: output
type: regex
pattern: "(sk-[a-zA-Z0-9]{20,}|AKIA[0-9A-Z]{16})"
action: mask
replacement: "[已屏蔽密钥]"
level: high
enabled: true
```
### 5.2 敏感词管理
敏感词不建议只做单一词库,最好分层:
- 基础敏感词:明确禁止出现的词
- 业务敏感词:项目、客户、合同、价格、内部系统等
- 技术敏感词:密钥、Token、数据库连接串、服务器地址、生产账号等
对于技术类内容,不建议一律 `block`。更合理的策略是:
- 普通讨论:允许
- 包含真实值:脱敏
- 涉及生产操作:人工确认
- 要求输出密钥:阻断
### 5.3 话术约束
话术约束主要用于控制 Goose 的表达方式,避免输出不符合产品定位的内容。
建议分三类:
1. 固定禁止话术
2. 固定推荐话术
3. 场景化话术模板
示例模板:
```yaml
scene: coding_task_result
name: 编码任务完成话术
template:
- 执行器:{executor}
- 修改范围:{changed_files}
- 测试结果:{test_result}
- 风险提示:{risk_summary}
- 下一步建议:{next_action}
```
### 5.4 执行器分配策略
执行器建议分成 5 类:
- `goose`:分析、设计、轻量编排
- `aider`:小范围代码修改、补丁式修复
- `openhands`:复杂开发任务、多文件改造、仓库探索、命令执行
- `manual`:需要人工确认
- `reject`:拒绝执行
建议第一阶段使用规则引擎,不做复杂模型决策。
示例策略:
```yaml
policy_id: route_001
name: 小范围代码修改走 Aider
conditions:
task_type: code_change
max_files: 3
requires_browser: false
requires_long_running_env: false
risk_level: low
executor: aider
priority: 100
enabled: true
---
policy_id: route_002
name: 复杂仓库任务走 OpenHands
conditions:
task_type:
- feature_dev
- bug_fix_complex
- repo_refactor
min_files: 4
requires_command_execution: true
executor: openhands
priority: 90
enabled: true
---
policy_id: route_003
name: 只分析不改代码走 Goose
conditions:
task_type:
- architecture_design
- code_review
- requirement_analysis
write_permission_required: false
executor: goose
priority: 80
enabled: true
---
policy_id: route_004
name: 高风险操作需要人工确认
conditions:
risk_keywords:
- 删除数据库
- 生产环境
- 支付接口
- 权限系统
- 用户数据
risk_level: high
executor: manual
priority: 200
enabled: true
```
优先级原则:
- 高风险规则优先
- 阻断规则优先
- 人工确认优先
- 明确执行器规则优先
- 默认 Goose 自处理
### 5.5 任务识别器
Goose Gateway 在执行前需要先把用户任务识别成结构化结果。
示例:
```json
{
"task_type": "feature_dev",
"risk_level": "medium",
"requires_code_change": true,
"requires_command_execution": true,
"estimated_files": 5,
"requires_browser": false,
"target_repo": "memind-h5",
"suggested_executor": "openhands"
}
```
推荐流程:
1. 用户输入
2. LLM 初步识别任务类型
3. 规则引擎二次校验
4. 匹配执行器策略
5. 生成执行计划
### 5.6 高风险操作控制
高风险类型建议内置:
- 生产数据库操作
- 删除文件或目录
- 批量修改用户数据
- 支付、充值、订单相关逻辑
- 权限、登录、Token、密钥相关逻辑
- 服务器部署、重启、停止服务
- 对外发送消息、邮件、公众号发布
这些动作统一进入人工确认:
```text
confirm_required = true
```
确认内容应包含:
- 任务说明
- 执行器
- 目标仓库
- 计划修改文件
- 预计执行命令
- 风险点
- 回滚建议
## 6. 调用流程
### 6.1 普通任务
```text
用户提交任务
Goose Gateway 接收
内容过滤
任务识别
执行器策略匹配
调用 Aider / OpenHands / Goose
结果过滤
话术约束
返回用户
写入审计日志
```
### 6.2 高风险任务
```text
用户提交任务
内容过滤
命中高风险规则
生成执行计划
进入人工确认
管理员确认
执行器执行
结果审计
返回用户
```
## 7. 审计日志
每一次调用都必须记录。
建议字段:
- `request_id`
- `user_id`
- 原始输入
- 过滤结果
- 命中规则
- 任务类型
- 风险等级
- 选择的执行器
- 执行参数
- 执行日志
- 修改文件
- diff 摘要
- 测试结果
- 最终输出
- 创建时间
- 完成时间
- 执行状态
审计日志第一阶段可以先不做复杂可视化,但数据库结构要先预留。
## 8. 表结构建议
### `goose_policy_rule`
- `id`
- `rule_name`
- `rule_type`
- `target`
- `match_type`
- `pattern`
- `action`
- `risk_level`
- `priority`
- `enabled`
- `created_at`
- `updated_at`
### `goose_sensitive_word`
- `id`
- `group_name`
- `word`
- `scope`
- `action`
- `enabled`
- `created_at`
- `updated_at`
### `goose_route_policy`
- `id`
- `policy_name`
- `task_type`
- `conditions_json`
- `executor`
- `priority`
- `enabled`
- `created_at`
- `updated_at`
### `goose_execution_log`
- `id`
- `request_id`
- `user_id`
- `task_type`
- `risk_level`
- `executor`
- `input_text`
- `filtered_input`
- `matched_rules_json`
- `execution_status`
- `execution_summary`
- `diff_summary`
- `test_result`
- `llm_provider`
- `llm_model`
- `created_at`
- `finished_at`
### `goose_manual_confirm`
- `id`
- `request_id`
- `confirm_type`
- `risk_summary`
- `planned_action`
- `status`
- `operator_id`
- `confirmed_at`
- `created_at`
## 9. `memindadm` 后台页面建议
### 9.1 内容过滤规则页
字段:
- 规则名称
- 检测对象
- 匹配方式
- 关键词 / 正则
- 处理动作
- 风险等级
- 是否启用
- 优先级
### 9.2 敏感词管理页
字段:
- 词库分组
- 敏感词
- 作用范围
- 处理动作
- 是否启用
### 9.3 话术约束页
字段:
- 场景
- 禁止话术
- 推荐话术
- 输出模板
- 是否启用
### 9.4 执行器分配策略页
字段:
- 策略名称
- 任务类型
- 条件配置
- 目标执行器
- 风险等级
- 优先级
- 是否启用
### 9.5 调用日志页
字段:
- 请求时间
- 用户
- 任务类型
- 命中规则
- 执行器
- 风险等级
- 执行状态
- 详情查看
## 10. MVP 范围
第一阶段只做小而精,不做复杂流程引擎。
### 必须做
1. 内容过滤规则配置
2. 敏感词配置
3. 执行器分配策略配置
4. Goose 调用前策略判断
5. Aider / OpenHands 路由选择
6. 调用审计日志
7. 统一模型中心
### 可以暂缓
1. 多级审批
2. 复杂权限矩阵
3. 策略版本管理
4. 复杂可视化编排
5. 自动回滚
6. 多租户策略隔离
## 11. 推荐落地顺序
### 第一步:先做表和日志
先把规则、敏感词、执行器策略、日志表建起来。
### 第二步:做 Goose Gateway 策略判断
在 Goose 调用前增加统一入口:
```text
before_execute(task)
```
负责:
- 过滤输入
- 识别任务
- 判断风险
- 选择执行器
- 生成执行计划
### 第三步:接入 Aider
先支持小范围代码任务走 Aider,因为调用简单、成本低、见效快。
### 第四步:接入 OpenHands
再把复杂任务转给 OpenHands,让它负责仓库探索、多文件开发和命令执行。
### 第五步:把 Goose 也切到统一模型中心
Goose 不再使用单独的模型配置页面,而是直接读取 `memindadm` 的统一模型中心。必要时可以先停掉原来独立的 Goose LLM 配置,保证入口只有一个。
### 第六步:做 `memindadm` 后台页面
先做简单 CRUD,不追求复杂交互。
## 12. 预期效果
完成后,`memindadm` 会具备一套轻量级 Goose 网关治理能力:
- 可配置内容过滤
- 可配置敏感词屏蔽
- 可配置话术约束
- 可配置执行器路由
- 可拦截高风险操作
- 可审计每次调用过程
这样 Goose 不再只是单一 Agent,而是变成一个可以统一调度 Aider、OpenHands、Claude Code 等工具的策略入口。
## 13. 最终定位
- `memindadm` = 用户与策略后台
- `Goose Gateway` = Agent 编排入口
- `Aider` = 小型代码修改执行器
- `OpenHands` = 复杂代码任务执行器
- `Goose` = 策略与分析执行器,模型同样来自统一模型中心
- `Policy Center` = 安全与路由规则中心
- `Audit Log` = 行为留痕与复盘中心
第一版建议在产品命名上保持克制,后台菜单直接叫:
- `Goose 网关`
只放这 5 个子菜单:
1. 内容过滤
2. 敏感词
3. 话术约束
4. 执行策略
5. 调用日志
这样产品上小,架构上完整,后续可以自然扩展。