389 lines
21 KiB
Markdown
389 lines
21 KiB
Markdown
# 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 与第三方 MCP;Grok/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 商标当作本项目商标。
|