# 部署文档

本文档覆盖 Local Agent 的全部部署方式：本地运行、Docker 协作引擎镜像、Tsecbench 托管模式镜像，以及完整的配置项说明与常见问题排障。

---

## 1. 架构概览

```
┌────────────────────────────────────────────────┐
│  控制层 agent（Go 二进制，本项目根目录）          │
│  - HTTP/WS 服务（Gin），serve web/static 前端    │
│  - 多轮工具调用循环（LLM 驱动）                  │
│  - run_coop 工具：调起协作容器异步执行子任务       │
└──────────────┬─────────────────────────────────┘
               │ docker run / 子进程
   ┌───────────┼─────────────┬───────────────┐
   ▼           ▼             ▼               ▼
 pi-coop    pigo-coop    claude-coop    supervisor.sh
（pi 引擎） （pigo 引擎） （Claude Code）  （本地子进程模式，
  默认                                   Tsecbench 托管用）
```

| 组件 | 目录 | 说明 |
| --- | --- | --- |
| 控制层 | `main.go` + `internal/` | Agent 核心、HTTP/WS 服务、工具实现 |
| 前端 | `web/static/` | 由控制层直接 serve，无需单独部署 |
| pi 引擎 | `pi-coop/` | **默认协作引擎**，基于 npm 包 `@earendil-works/pi-coding-agent` |
| pigo 引擎 | `pigo/` | Go 自研引擎，需交叉编译二进制后构建镜像 |
| claude 引擎 | `claude code/` | 包装 Claude Code CLI，仅支持 anthropic 协议 |
| 托管镜像 | `tencent/` | Tsecbench 平台一体化镜像（控制层 + worker 本地子进程模式） |

---

## 2. 环境要求

| 依赖 | 版本 | 用途 |
| --- | --- | --- |
| Go | ≥ 1.22（以 go.mod 为准） | 编译控制层 / pigo |
| Docker | 任意现代版本 | 构建协作镜像 / run_coop 工具 |
| Node | ≥ 22.19 | pi 引擎运行时（仅容器内需要，宿主机不用装） |
| WSL（Windows） | — | 在 Windows 上构建 Linux 镜像时使用 |
| Python 3 + paramiko | 可选 | 仅 `deploy_*.py` 远程部署脚本需要 |

---

## 3. 配置说明

### 3.1 配置优先级

```
环境变量  >  .env 文件  >  data/api-config.json  >  内置默认值
```

- `.env` 放在程序工作目录，启动时自动加载（已存在的环境变量优先）。
- `api-config.json` 由 Web 设置页写入，存于数据目录（`AGENT_DATA_DIR`）。
- 容器部署时通过 `docker run -e` 注入的环境变量具有最高优先级。

### 3.2 LLM 配置（协作引擎共用）

| 环境变量 | 必填 | 默认 | 说明 |
| --- | --- | --- | --- |
| `LLM_API_KEY` | ✅ | — | LLM API 密钥 |
| `LLM_BASE_URL` | ✅ | — | 接口地址。anthropic 协议会自动剥离 `/v1`、`/v1/messages`、`/messages` 后缀 |
| `LLM_MODEL` | ✅ | — | 模型名，需与供应商支持的格式完全一致（如 `deepseek-v4-pro` / `deepseek-v4-flash`） |
| `LLM_PROVIDER` | ✅ | `openai` | `openai` / `anthropic` |
| `LLM_ENGINE` | 否 | `pi` | 协作引擎：`pi` / `pigo` / `claude` |
| `COOP_MODE` | 否 | `local` | 协作模式（`local` 为本地子进程模式） |

DeepSeek Anthropic 端点示例：

```
LLM_BASE_URL=https://api.deepseek.com/anthropic
LLM_PROVIDER=anthropic
LLM_MODEL=deepseek-v4-flash
```

### 3.3 控制层运行配置

| 环境变量 | 内置默认 | 说明 |
| --- | --- | --- |
| `AGENT_PORT` | `8080` | Web 服务端口 |
| `AGENT_WORKSPACE` | 当前目录 | Agent 可读写的根目录 |
| `AGENT_DATA_DIR` | `<workspace>/data` | 会话与配置存储目录 |
| `AGENT_AUTH_CODE` | 空（关闭） | 访问授权码，云端部署强烈建议设置 |
| `AGENT_MAX_CONTEXT_TOKENS` | `1000000` | 超过该估算值触发历史压缩 |
| `AGENT_KEEP_RECENT_MESSAGES` | `50` | 压缩时保留的最近消息数 |
| `AGENT_MAX_TOOL_RESULT_CHARS` | `100000` | 单次工具结果最大字符数 |
| `AGENT_MAX_ITERATIONS` | `50` | 单轮最多工具调用次数 |
| `AGENT_TOOL_TIMEOUT_SECONDS` | `600` | 单次工具执行超时 |
| `AGENT_REQUEST_TIMEOUT_SECONDS` | `600` | 单次 LLM 请求超时 |
| `AGENT_STREAM_OUTPUT_TOKENS` | `65536` | 流式输出 max_tokens（防截断关键项） |
| `AGENT_COMPACTION_TOKENS` | `16384` | 压缩摘要最大输出 token |
| `AGENT_TEMPERATURE` | `0.3` | 采样温度 |
| `AGENT_DOCKER_SOCKET` | 平台默认 | Docker 连接地址（本地 unix socket / npipe / 远程） |

> 注：`.env.example` 中的数值是保守示例。复杂任务（长思考、大输出）请参照上表默认值，尤其是 `AGENT_STREAM_OUTPUT_TOKENS`——过低会导致 LLM 思考阶段耗尽配额、工具调用被截断。

### 3.4 托管模式开关

| 环境变量 | 说明 |
| --- | --- |
| `BENCHMARK_TOKEN` | 非空时进入 Tsecbench 托管模式：启动即自动开跑评测，无需外部触发；为空则是普通本地/云部署 |

### 3.5 遗留变量

`SILICONFLOW_API_KEY` / `SILICONFLOW_BASE_URL` / `AGENT_MODEL` 为早期硅基流动专用配置，仍向后兼容；新部署统一使用 `LLM_*` 系列。

---

## 4. 部署方式一：本地直接运行

### 4.1 开发运行

```powershell
go run .
```

打开 http://localhost:8080 ，在 Web 设置页填入 API Key（写入 `data/api-config.json`），或提前配置 `.env`。

### 4.2 生产运行（Linux + systemd）

1. 交叉编译（Windows 上）：

```powershell
$env:GOOS="linux"; $env:GOARCH="amd64"; $env:CGO_ENABLED="0"
go build -trimpath -ldflags="-s -w" -o agent-linux-amd64 .
```

2. 上传 `agent-linux-amd64` 与 `web/static/` 到服务器 `/opt/agent/`：

```
/opt/agent/agent                # 二进制（chmod 755）
/opt/agent/web/static/          # 前端
/opt/agent/.env                 # 配置（可选，也可全部用环境变量）
```

3. systemd 单元 `/etc/systemd/system/agent-web.service`：

```ini
[Unit]
Description=Local Agent Web
After=network.target

[Service]
WorkingDirectory=/opt/agent
Environment=LLM_API_KEY=sk-xxxx
Environment=LLM_BASE_URL=https://api.deepseek.com/anthropic
Environment=LLM_MODEL=deepseek-v4-flash
Environment=LLM_PROVIDER=anthropic
ExecStart=/opt/agent/agent
Restart=always

[Install]
WantedBy=multi-user.target
```

```bash
systemctl daemon-reload && systemctl enable --now agent-web
curl -s http://localhost:8080/api/v1/health   # 验证
```

---

## 5. 部署方式二：Docker 协作引擎

控制层通过 `run_coop` 工具调起协作容器。**镜像名与容器名前缀是代码内置约定，不可更改**：

| 引擎 | 镜像名 | 容器名前缀 |
| --- | --- | --- |
| pi（默认） | `pi-coop` | `pi-coop-` |
| pigo | `pigo-coop` | `pigo-coop-` |
| claude | `claude-coop` | `claude-coop-` |

### 5.1 构建 pi-coop（默认引擎，推荐）

```bash
# 仓库根目录，构建上下文为 pi-coop/，无需预编译任何二进制
docker build -f pi-coop/Dockerfile -t pi-coop pi-coop/
```

镜像内含 node 22 + npm 全局安装的 pi coding agent + 系统/Python 工具。
运行参数（由 run_coop 自动注入，也可手动测试）：

```bash
docker run --rm \
  -e MODEL=deepseek-v4-flash \
  -e BASE_URL=https://api.deepseek.com/anthropic \
  -e API_KEY=<your-key> \
  -e PROTOCOL=anthropic \
  -e TASK="任务描述" \
  -e ROUND_MAX=6 \
  pi-coop
```

### 5.2 构建 pigo-coop

需先交叉编译 pigo 二进制（构建上下文为 `pigo/`）：

```bash
cd pigo
GOOS=linux CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" \
  -o coop/tmp/pigo-linux-amd64 ./cmd/pigo
docker build -f coop/Dockerfile -t pigo-coop .
```

### 5.3 构建 claude-coop

```bash
docker build -f "claude code/Dockerfile" -t claude-coop "claude code/"
```

仅支持 anthropic 协议；openai 协议请求会被拒绝，请切换引擎或更换端点。

### 5.4 切换引擎

Web 设置页修改协作引擎，或设置 `LLM_ENGINE=pigo` / `LLM_ENGINE=claude`。切换前确保对应镜像已构建。

---

## 6. 部署方式三：Tsecbench 托管模式（tencent/）

一体化镜像 = 控制层 agent + pi worker（本地子进程模式）+ 安全工具集，适合上传到 Tsecbench 评测平台。

### 6.1 前置准备

镜像构建依赖以下文件，**均不在 git 仓库内，需自行准备**：

| 文件 | 说明 |
| --- | --- |
| `tencent/agent-linux-amd64` | 控制层交叉编译产物（见 4.2 步骤 1） |
| `tencent/tools/nuclei` | 漏洞扫描器静态二进制 |
| `tencent/tools/observer_ward` | 指纹识别静态二进制 |
| `tencent/tools/chisel` | 内网隧道静态二进制 |
| `tencent/tools/nuclei-templates/` | Nuclei 模板库 |
| `tencent/tools/FingerprintHub-defaultv4/plugins/` | observer_ward 指纹规则库 |

### 6.2 构建与导出

在 **WSL** 中执行（脚本内 PROJECT_ROOT 按实际路径调整）：

```bash
bash tencent/build.sh
# 或自定义镜像名：IMAGE_NAME=myagent bash tencent/build.sh
```

脚本流程：检查二进制 → `docker build`（上下文为项目根，`.dockerignore` 排除无关文件）→ `docker save | gzip` 导出。

产物：`tencent/agent.tar.gz`（约 350MB），直接上传 Tsecbench 平台即可。

### 6.3 本地验证镜像

```bash
docker run --rm -p 8081:8080 \
  -e LLM_API_KEY=sk-xxxx \
  -e LLM_BASE_URL=https://api.deepseek.com/anthropic \
  -e LLM_MODEL=deepseek-v4-flash \
  -e LLM_PROVIDER=anthropic \
  tsecbench-agent:latest
```

- 打开 http://localhost:8081 验证 Web 界面。
- 平台托管时由运行时注入 `BENCHMARK_TOKEN`，agent 检测到后自动启动评测流程。
- 镜像内不含 `data/` 目录与任何预置配置，全部由环境变量注入。

---

## 7. 验证与排障

### 7.1 健康检查

```bash
curl http://localhost:8080/api/v1/health      # 服务存活（始终放行，不受授权码保护）
curl http://localhost:8080/api/v1/llm/config  # 查看生效的 LLM 配置（需授权码）
```

### 7.2 常见问题

| 现象 | 原因与解决 |
| --- | --- |
| 侧栏显示「模型未配置」 | 未设置 `LLM_API_KEY`，也未在 Web 设置页填写。配置后重启或刷新 |
| LLM 请求 404 | Base URL 拼接问题。anthropic 协议不要手动加 `/v1`，程序会自动处理后缀；openai 协议填到根地址即可 |
| 工具调用 JSON 被截断、任务失败 | `AGENT_STREAM_OUTPUT_TOKENS` 过低，LLM 思考阶段耗尽 max_tokens。保持默认 65536 |
| run_coop 报找不到镜像 | 对应引擎镜像未构建（见第 5 节），或镜像名不符合约定（必须是 `pi-coop` / `pigo-coop` / `claude-coop`） |
| run_coop 容器秒退 | 检查 `MODEL` / `BASE_URL` / `API_KEY` 是否有效；`docker logs <容器名>` 看具体报错 |
| 长命令超时 | `AGENT_TOOL_TIMEOUT_SECONDS` / `AGENT_REQUEST_TIMEOUT_SECONDS` 调大（默认 600s） |
| Web 界面 401 | 设置了 `AGENT_AUTH_CODE`，先在弹窗输入授权码 |
| 历史压缩后丢上下文 | 调大 `AGENT_KEEP_RECENT_MESSAGES`（默认 50）与 `AGENT_COMPACTION_TOKENS`（默认 16384） |

### 7.3 安全检查清单

- [ ] `.env` 与 API Key 未提交到 git（`.gitignore` 已包含 `.env`）
- [ ] 云端公开部署已设置 `AGENT_AUTH_CODE`
- [ ] API Key 泄露后立即在供应商侧吊销并轮换
- [ ] Docker Socket 未暴露给不受信任的网络
- [ ] `AGENT_WORKSPACE` 限定在专用目录，避免指向系统根目录

---

## 8. 端口与产物速查

| 场景 | 端口 | 产物 |
| --- | --- | --- |
| 本地运行 | 8080（`AGENT_PORT`） | — |
| pi/pigo/claude 协作镜像 | — | `pi-coop` / `pigo-coop` / `claude-coop` 镜像 |
| Tsecbench 托管 | 8080（容器内） | `tencent/agent.tar.gz` |
