Files
2026-07-28 09:46:53 +08:00

389 lines
21 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.
# Grok Build 集成说明
本项目通过“受管 sidecar 运行时”的方式接入
[`xai-org/grok-build`](https://github.com/xai-org/grok-build)。上游 Rust
运行时保持原样,Python/Qt 负责安装、后台模型同步、进程生命周期和图形入口。
这样可以保留 TUI、Headless、ACP、工具、会话、MCP、技能、插件、Hooks、记忆、
计划、子代理、工作树和后台任务,而不把约百万行 Rust 代码降级重写为 Python。
## 文件与数据位置
| 路径 | 说明 | 是否提交 Git |
|---|---|---|
| `grok_build_bridge.py` | 安装、配置转换、TUI/Headless/ACP 启动器 | 是 |
| `grok_build_settings.json` | 不含密钥的集成默认值 | 是 |
| `grok_customer_service_mcp.py` | Grok 专用的受限客服工具 Server | 是 |
| `ai_settings.json` | 不含密钥的 AI 配置模板 | 是 |
| `ai_settings.local.json` | 后台/GUI 写入的本机私密 AI 配置 | 否 |
| `wechat_gui_qt.py` 的“Grok Build”页 | 图形控制台 | 是 |
| `.grok-build/bin/grok.exe` | 官方签名运行时二进制缓存 | 否 |
| `.grok-build/install.json` | 版本、来源、签名发布者与 SHA-256 安装记录 | 否 |
| `%LOCALAPPDATA%\ZhenYangTang\WeChatRPA\GrokBuild\<项目名-哈希>\custom-agent-only-v1\config.toml` | 仅自有模型的 Grok 正式配置;带标记区块由后台维护 | 否 |
| 同一隔离目录下的 `sessions/` | 仅自有模型会话、工具记录、计划和回退点 | 否 |
| 同一状态目录下的插件、技能和市场数据 | 原版运行时扩展状态 | 否 |
| 同一状态目录下的 `integration_settings.json` | 当前电脑的工作目录、模型与集成选项 | 否 |
`GROK_HOME` 每次启动都固定到上述 LocalAppData 项目专属隔离目录,不会覆盖用户
全局 `%USERPROFILE%\.grok`,也不会把认证和会话写进源码工作区。旧版桥接器的
xAI 认证与旧会话不会迁入或加载;二进制、下载缓存和市场缓存仍留在项目的忽略
目录中。
## 图形界面
运行:
```powershell
python .\wechat_gui.py
```
进入左侧“AI 客服”:
- 页面完全由本项目 Qt/Tk 控件实现,不创建 iframe、WebEngine、Edge 或外部浏览器。
- Qt 页面提供类似 Codex 的本地原生多轮对话,首次消息创建独立 UUID 会话,后续
消息只恢复该精确会话;可新建对话或停止当前 Agent。
- 页面显示运行时、自有模型和专用隔离状态,并固定展示客服 MCP 的允许能力与
Shell、文件、Web、发送等禁止能力。
进入左侧“Grok Build”:
- “安装运行时”从上游官方版本化地址下载稳定版,校验 PE 文件与 Authenticode
签名发布者,计算并记录 SHA-256,再写入项目二进制缓存。后续启动会按安装记录
重新计算并比对 SHA-256;外部自定义二进制会重新执行 Authenticode 校验。
- “同步后台模型”把管理后台已下发的 Agent 自有模型映射到
LocalAppData 状态目录的 `config.toml` 自动配置区块。API Key 只在该受管模型
已成功同步,且启动可能使用该模型的 Grok 进程时通过环境变量注入;主题、市场
等其他 Grok 设置会被保留。
- 同步时会默认注册项目内置的 `wecom-rpa-customer-service` MCP。企业微信客服
由本机 Grok Build Agent 直接生成回复,Agent 只通过该 MCP 获取受控的本地客服
上下文和业务资料;不登录或探测外部 Chat 服务。该 Server 没有 Shell、文件、
Web 或企业微信发送能力,也不能读取模型密钥。
- “打开完整 TUI”启动原版全屏界面,是全部上游功能的主入口。
- “插件与技能”“MCP 管理”直接进入原版对应功能;会话续聊使用“AI 客服”页的
精确会话 ID,或在完整 TUI 中管理当前隔离目录内的自有模型会话。
- “图形化无头任务”使用 `streaming-json` 实时显示回答、思考、错误、轮数和会话
ID,支持取消、只读审查和最大轮数;每次创建安全新会话,不会继续未知历史会话。
- “运行时检查”执行 `grok inspect --json`
经典 Tk 界面只保留原 RPA 功能。完整 Grok Build 图形入口位于默认 PySide6
界面;无论使用哪种界面,都可以使用下面的命令行入口。
## 命令行入口
```powershell
# 查看状态
python .\grok_build_bridge.py status
# 安装最新 stable 官方运行时
python .\grok_build_bridge.py install
# 安装固定版本
python .\grok_build_bridge.py install --version 0.2.111
# 从后台已同步的 ai_settings.local.json 生成 Grok 模型配置
python .\grok_build_bridge.py sync
# 显式导入现有 MCP 配置;默认不导入,避免扩大业务数据权限
python .\grok_build_bridge.py sync --include-mcp
# 完整 TUI
python .\grok_build_bridge.py tui --cwd D:\web\age\wechat_rpa
# 只读无头审查
python .\grok_build_bridge.py run "审查启动流程并列出风险" --read-only
# 自动修改和运行命令;仅用于可信工作区
python .\grok_build_bridge.py run "修复测试并验证" --yolo
# 恢复指定会话
python .\grok_build_bridge.py run "继续修复" --resume <session-uuid>
# 启动 ACP JSON-RPC stdio 服务,供 IDE 或自定义客户端使用
python .\grok_build_bridge.py acp --cwd D:\web\age\wechat_rpa
# 原样访问上游全部 CLI 子命令
python .\grok_build_bridge.py exec -- models
python .\grok_build_bridge.py exec -- inspect --json
# 新版上游出现尚未识别的管理命令时:允许执行,但不注入受管密钥
python .\grok_build_bridge.py exec --allow-unknown -- future-command
# 只有确认未知命令需要模型能力时才显式注入;wrap 始终禁止注入
python .\grok_build_bridge.py exec --with-managed-secrets -- future-agent-command
```
`exec` 会先识别顶层命令:元数据/管理命令不带业务密钥,代理命令才带受管模型与
MCP 密钥,且代理命令会被强制指定为 `wecom-backend`;未知命令默认拒绝。Grok/xAI
`login``logout``setup` 被禁用。即使 `wrap` 前面混入 `-p`
`--prompt-file` 等代理
参数,它仍按任意子进程入口处理,绝不会获得受管密钥。`agent --plugin-dir`
`agent --agent-profile` 可直接加载本地扩展配置,也按无密钥入口处理且不能用
`--with-managed-secrets` 绕过。
## 本地客服 Agent
后台和 Qt 的“AI 人格与能力”页只配置本地调度参数:
| 字段 | 默认值 | 范围 |
|---|---:|---|
| `GROK_CUSTOMER_SERVICE_ENABLED` | `true` | 开关 |
| `GROK_CUSTOMER_SERVICE_TIMEOUT` | `180` | `30..600` 秒 |
| `GROK_CUSTOMER_SERVICE_MAX_TURNS` | `8` | `2..30` |
| `GROK_CUSTOMER_SERVICE_EFFORT` | `low` | `low` / `medium` / `high` |
这些字段不包含服务网址或认证信息。旧版 `CHAT_API_*` 字段会在读取时被忽略,
保存与后台同步响应也不会再包含它们。Qt 启动或保存后会在后台线程读取本机
Grok Build 安装状态,并向所选自有模型协议发送一条不含业务数据的最小流式预检;
不会探测旧客服 HTTP 地址,也不读取 xAI 登录状态。
## 后台 Agent 自有模型
管理后台有独立的“Grok Agent 自有模型”配置:
| 字段 | 用途 |
|---|---|
| `GROK_MODEL_ENABLED` | 启用 Agent 唯一允许使用的自有模型 |
| `GROK_API_BASE` | OpenAI/Anthropic 兼容 API 基址 |
| `GROK_API_KEY` | 自有模型密钥,不在网页回显 |
| `GROK_MODEL` | 发送给服务端的模型 ID |
| `GROK_API_BACKEND` | `chat_completions``responses``messages``dify` |
| `GROK_AUTH_SCHEME` | `auto``bearer``x_api_key` |
| `GROK_DIFY_INPUTS` | 可选 Dify 应用固定输入 JSON 对象;其他协议忽略 |
| `GROK_CONTEXT_WINDOW` | 模型真实上下文窗口 |
| `GROK_MAX_TOKENS` | 单轮最大输出 |
| `GROK_TEMPERATURE` | 自有模型温度 |
桌面端启动后先同步管理后台配置,再更新 Grok 自动配置区块。启用且兼容的后台
模型是 Grok Build Agent 唯一允许使用的模型。未配置或不兼容时 Agent 直接停止,
不会读取 `auth.json`,也不会回退到 Grok/xAI 模型。主对话、网页搜索、会话总结、
图片理解、提示建议、分叉模型、子代理、Goal、自动模式分类器和压缩摘要全部固定为
同一个 `wecom-backend`;两套提示建议的额外模型调用默认关闭。文件式
role/persona/agent 若显式指定其他模型,启动门禁会拒绝注入密钥。当前后台只配置
Chat Agent 模型,因此 xAI Imagine 图片/编辑/视频模型功能会被禁用;以后应增加
独立的自有多媒体接口,而不是把文本模型 ID 冒充图片模型。
例如后台模型地址若为:
```text
http://host/v1/chat-messages
```
它属于 Dify `chat-messages` 协议。后台把“接口协议”选为
`Dify Chat Messages(本地工具调用适配)` 后,桌面端会启动一个仅监听
`127.0.0.1` 随机空闲端口的适配器,把 Grok Build 的消息、动态工具定义和工具
结果封装给 Dify,再把 Dify 的结构化决策转换成标准 OpenAI `tool_calls` 流。
Grok Build 仍负责执行和审计工具,Dify 只负责选择下一步动作。
后台支持以下自有模型协议:
- OpenAI Chat Completions:基址或 `/v1/chat/completions`
- OpenAI Responses:基址或 `/v1/responses`
- Anthropic Messages:基址或 `/v1/messages`
- Dify Chat Messages:基址或 `/v1/chat-messages`
即使后台只填写到 `/v1`,启动预检也会请求 Grok Build 真正使用的操作路径。
若原生协议选错且服务实际暴露 `/v1/chat-messages`,界面会提示切换为 Dify
协议。Dify 启动预检会强制模型调用一个带随机挑战值的临时工具;只有返回合法
工具调用并准确带回挑战值,界面才显示“Agent 已就绪”。预检同时核验认证、
模型名、流式请求和工具协议;结果会短暂缓存,正式发送前仍会复核,且错误信息
绝不包含 API Key。
Dify API Key 只保留在桌面宿主进程内存中。Grok 配置实际写入的是 loopback
Chat Completions 地址,Grok 子进程只获得随机生成的本地 Bearer 令牌。适配器使用
端口 `0` 让操作系统原子分配空闲端口,因此固定端口被占用不会阻止启动。Dify
应用应关闭其自身具有副作用的工具;项目工具仍由 Grok Build 的 allow/disallow
规则和客服工具审计控制。
远程 Dify 应使用 HTTPS。为兼容现有内网部署,系统不会直接拒绝远程 HTTP,但
界面会显示风险警告:HTTP 会让 Dify API Key、会话内容和工具结果以明文传输。
每次 `tui``run``acp` 或需要模型能力的 `exec` 启动前都会重新同步当前进程
持有的动态端点并执行工具调用预检,不能依赖另一进程先前 `sync` 留下的端口。
配置热更新采用版本化适配端点:新任务获得新端口和新令牌,已经运行的任务继续
使用原版本,避免下一轮突然出现 401。Dify `message_end.metadata.usage` 会转换
为 Chat Completions usage,供 Grok 的上下文窗口与自动压缩逻辑使用;上游没有
返回 usage 时才使用保守估算。
Grok 工具结果中的 `data:image/...;base64,...` 图片会先通过 Dify
`/files/upload` 上传,再作为 `local_file` 视觉附件随 `/chat-messages` 请求发送;
远程图片 URL 不由适配器二次抓取,以避免把不可信 URL 变成服务器端请求。
本地客服不再配置单独的网址、认证账号或远端会话。它作为 Grok Build Agent 的
内置调度场景,通过 `wecom-rpa-customer-service` MCP 读取受控本地上下文;原生
工具协议或 Dify 本地适配协议均通过同一套 Agent 门禁,不能通过普通客服 HTTP
接口绕过。
宿主会为每轮 Agent 生成一次性工具审计标识。只有模型实际调用了当前会话的
`scoped_get_context``analyze_customer_message`,并使用
`validate_final_reply` 校验了与最终输出完全一致的文本,本轮回复才允许进入发送
流程;客户明确要求挂号时,还必须由模型成功调用
`record_registration_request`。审计只记录工具名、会话指纹和文本哈希,不记录
客户原文,并在本轮结束后删除。仅在提示词里要求模型调用工具而没有审计证明,
不会被视为成功调度。
`auto` 认证仅对 `api.anthropic.com` 的 Messages 接口使用 `x-api-key` 并附加
`anthropic-version: 2023-06-01`,其他兼容代理默认使用 Bearer;特殊代理可在
后台显式选择认证方式。自定义端点必须配置独立 API Key。Agent 启动时会清除
xAI/Grok 凭据环境变量,并把 `GROK_AUTH_PATH` 指向一个不存在的隔离文件;若后台
非密钥配置与已同步区块不完全一致,桥接器会 fail-closed 阻止启动,
要求先重新同步,避免上游把 xAI 会话凭据回退发送到旧第三方端点。为避免上游在
拼接操作路径时改变语义,模型地址不能包含 query、fragment 或 URL 内嵌账号密码。
凭据门禁解析完整 TOML 后按有效配置值精确比较,不使用容易被注释或多行字符串
伪造的文本匹配;受管环境变量若在目标模型/MCP 之外再次被引用,也会拒绝注入。
注入前还会用不带业务密钥的 `inspect --json` 核验 Grok 实际配置层。只允许当前
LocalAppData 状态目录的 `config.toml` 用户层;`requirements.toml`、系统策略、
MDM、项目配置或任何未知高优先级层出现时均 fail-closed,防止端点被覆盖。
一个可用的生成结果如下:
```toml
[models]
default = "wecom-backend"
allowed_models = ["wecom-backend"]
web_search = "wecom-backend"
session_summary = "wecom-backend"
image_description = "wecom-backend"
prompt_suggestion = "wecom-backend"
[ui]
prompt_suggestions = false
fork_secondary_model = "wecom-backend"
[suggestions]
enabled = false
ai_enabled = false
ai_model = "wecom-backend"
[subagents]
enabled = true
[subagents.models]
general-purpose = "wecom-backend"
explore = "wecom-backend"
plan = "wecom-backend"
[goal]
use_current_model_only = true
[auto_mode]
classifier_model = "wecom-backend"
[compaction.memory_flush]
flush_model = "wecom-backend"
[model.wecom-backend]
model = "qwen-coder"
base_url = "https://model.example.com/v1"
name = "后台模型 · qwen-coder"
env_key = "WECOM_GROK_API_KEY"
api_backend = "chat_completions"
auth_scheme = "bearer"
temperature = 0.3
max_completion_tokens = 8192
context_window = 128000
```
## 上游功能的访问方式
| 功能 | 本项目入口 |
|---|---|
| 文件读取、搜索、精确编辑、终端、Web | 完整 TUI 或无头任务 |
| 新建、恢复、继续、分叉、重命名、导出会话 | 完整 TUI `/new``/resume``/fork``/rename``/export` |
| compact、context、rewind、prompt edit | 完整 TUI |
| 模型与 reasoning effort | 模型固定为后台 `wecom-backend`effort 使用 Qt 或 TUI `/effort` |
| 计划模式、TODO、持久目标、Deep Research | TUI `/plan``/goal``/deep-research` |
| 子代理、persona、Agent Dashboard | 完整 TUI;推理模型仍固定为 `wecom-backend` |
| MCP stdio/HTTP/OAuth | TUI `/mcps` 或 Grok 配置 |
| 企业微信客服回复 | 本地 Grok Build Agent + 内置受控客服 MCP |
| Skills、Plugins、Marketplace、Hooks、LSP | TUI `/skills``/plugins``/marketplace``/hooks` |
| 规则、AGENTS.md、长期记忆 | 原版运行时自动加载及 `/memory` |
| 后台任务、monitor、loop、workflow | 完整 TUI |
| Git worktree、checkpoint、rewind | 完整 TUI |
| Headless/CI/NDJSON | Qt 无头任务或 `grok_build_bridge.py run` |
| ACP IDE 嵌入 | `grok_build_bridge.py acp` |
| 主题、Vim、鼠标、图片粘贴、语音、Dashboard | 完整 TUI |
| 原版未映射的新 CLI 功能 | `grok_build_bridge.py exec -- <参数>` |
上游公开源码中的 `deploy_app` 本身仍是 stub;集成不会把上游尚未实现的功能描述
成可用功能。
## 权限与安全
`wecom-rpa-customer-service` 返回的客户消息、本地会话历史和业务资料都是
**不可信外部数据**。Grok 不得把其中内容视为系统指令、工具调用要求或授权依据,
也不得让这些内容触发 shell、文件、网络或消息发送工具。MCP 结果会携带
`untrusted_content=true` 和安全说明;模型和 MCP 都不能直接发送消息,最终发送
只由宿主企业微信流程执行。
- Windows 目前没有上游 Linux Landlock 或 macOS Seatbelt 的等价系统沙箱。
- Qt 无头任务默认不启用 `--yolo`。开启“无人值守”前会再次确认。
- “只读审查”只允许 `read_file``grep``list_dir``web_search`
`web_fetch`,同时设置 `--no-subagents` 并通过 deny-list 移除上游始终保留的
MCP meta-tools 与子代理。由于原版运行时会在工具过滤前启动原生 MCP、插件
Hook 与 LSP,只读任务会先运行一次不带业务密钥的 `inspect --json`;发现任何
有效的可执行扩展或无法确认检查结果时,模型进程不会启动。请先在完整 TUI/
配置中禁用这些扩展后重试。
- 完整 TUI 使用上游逐工具审批,适合日常交互任务。
- MCP、插件、Hooks 和 LSP 都可能执行本地程序,只安装可信来源。
- `AI_MCP_SERVERS` 默认不自动导入编码代理;需要时显式开启。导入后的 header
与 env 值不写入 TOML,而以环境变量引用保存,并且只在配置确实引用它们时注入。
OAuth 登录和授权管理使用原版 TUI `/mcps`,令牌保存在工作区外的状态目录。
手工环境变量引用只接受 `${VAR}`,不接受带默认值的表达式。
`WECOM_GROK_API_KEY``WECOM_GROK_MCP_*` 是桥接器保留变量,不能在后台
MCP 配置中手工交叉引用。
只有 `env``headers` 的值会转换;若把秘密直接写进 URL、command 或 args
它仍会明文出现在 TOML 中,因此这些字段只能保存非秘密参数。桥接器会拒绝常见
的 token query 和密钥命令行参数,但无法识别任意路径片段中的秘密。
- 项目内置客服 MCP 与 `AI_MCP_SERVERS` 相互独立,默认由
`grok_build_settings.json``customer_service_tools=true` 自动注册。MCP
只负责读取受控的本地客服上下文和业务资料,不再调用第二个回复模型,从而避免
Agent 递归;它也没有企业微信发送、Shell、文件或 Web 能力。
- 后台模型 Key 与 MCP 的 env/header 值不写入 Grok TOML,但在使用对应受管配置
的 Grok 进程期间会存在于进程环境中,本地工具或终端子进程可能读取它们。只在
可信任务中启用终端、插件、Hooks、LSP 与第三方 MCPGrok/xAI 登录入口已禁用,
版本检测、Qt/CLI `inspect``doctor` 元数据命令不会携带这些业务密钥。
- 管理后台同步下来的 `ai_settings.local.json` 是明文本地配置,已加入
`.gitignore`;已跟踪的 `ai_settings.json` 现在只是不含密钥的模板。应限制本地
文件 ACL,并只向可信桌面账号发放后台读取权限。旧版本源码或 Git 历史中曾保存
的密钥必须在服务端轮换,清空当前文件并不能撤销历史泄漏。
- 当前项目包含客服会话、挂号数据和模型密钥。不要要求编码代理读取或上传这些
运行数据;发布前应把运行数据迁出源码目录并轮换已经进入 Git 历史的密钥。
- 公网模型地址应使用 HTTPS。HTTP 会明文传输 Bearer API Key 和提示内容。
- rewind、工作树应用和自动编辑可能改变未提交文件,执行前先检查 Git 状态。
## 更新与回滚
桥接器禁用上游进程内自动更新,避免绕过本项目的下载与签名校验。图形页
“安装 / 更新”或命令行 `install` 会显式覆盖项目内 `grok.exe`。安装记录包含
版本、平台、时间、SHA-256 和签名发布者,保存在
`.grok-build/install.json`。固定版本可用:
```powershell
python .\grok_build_bridge.py install --version 0.2.111
```
项目运行时不会写入用户 PATH,也不会修改用户全局 Grok 配置。
启动时的哈希复核用于发现二进制意外变化;它不防御一个已经拥有项目写权限、能
同时替换 Python 集成代码、二进制和安装记录的本地恶意进程。
## 测试
```powershell
python -B -m unittest discover -v
python -B -c "import ast,pathlib; [ast.parse(pathlib.Path(p).read_text(encoding='utf-8'), filename=p) for p in ('grok_build_bridge.py','grok_customer_agent.py','grok_customer_service_mcp.py','wechat_gui_qt.py','admin_backend.py','ai_config.py')]"
```
测试使用临时目录和 mock,不需要 xAI 账号,也不会下载真实运行时。
## 许可证与来源
上游 `xai-org/grok-build` 首方代码采用 Apache License 2.0,并包含大量第三方
依赖声明。当前仓库不提交或再分发 `grok.exe`,而是在用户明确安装时直接从 xAI
官方地址下载。若制作包含二进制的离线安装包,必须同时携带对应版本的:
- `LICENSE`
- `THIRD-PARTY-NOTICES`
- `crates/codegen/xai-grok-tools/THIRD_PARTY_NOTICES.md`
- `third_party/NOTICE`
不得暗示本项目是 xAI 官方产品,也不得把 Grok/xAI 商标当作本项目商标。