Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
d6a8932
[v1.5 1.1] llm/client: 锁定 MiniMax-M2.7-highspeed,删 anthropic/doubao/o…
bcefghj May 6, 2026
70fcba2
[v1.5 1.2] llm/web_search: 新增 DuckDuckGo HTML + Bing CN 兜底
bcefghj May 6, 2026
b7f1346
[v1.5 1.3] runtime/intent_router: 5 闸门重写,CHAT verdict 绝不沉默
bcefghj May 6, 2026
0d6ce3b
[v1.5 1.4+1.5] feishu/bot+router: 删硬编码 IP、注入 LLM judge、idempotency、CH…
bcefghj May 6, 2026
13359c8
[v1.5 1.6] runtime/planner: 时效词触发 web.search + 8 例 few-shot + lark.* …
bcefghj May 6, 2026
9787bc3
[v1.5 1.7] doc.append + slide.generate 接收 search_results,引用真实联网数据
bcefghj May 6, 2026
015caa4
[v1.5 1.8] capability/tools/web_media: 注册 web.search + media.tts
bcefghj May 6, 2026
50aa68d
[v1.5 1.9] runtime/session: TaskState 10 状态机 + LEGAL_TRANSITIONS 校验 +…
bcefghj May 6, 2026
5896765
[v1.5 1.10] cards: context_confirm 3 按钮 + task_delivered 过滤空 URL
bcefghj May 6, 2026
0c9bea7
[v1.5 1.11] dashboard: 中文化事件 + 进度条 + 累计耗时 + SSE heartbeat
bcefghj May 6, 2026
c02473f
[v1.5 2.2] capability/tools/lark_tools: 飞书 OpenAPI 真集成 3 件套
bcefghj May 6, 2026
c6fc1e3
phase 2.1: 反向 MCP server lark_mcp_runner :8003
bcefghj May 6, 2026
f468e1a
phase 2.3: docs/OPENCLAW_COMPAT.md 协议对照说明(不引 submodule)
bcefghj May 6, 2026
d48303b
phase 3.1 + 3.2: 服务器部署脚本 + systemd unit + nginx 反代
bcefghj May 6, 2026
048a3bb
fix(deploy): install.sh 默认 python3 (Ubuntu 22.04 自带 3.10,无须装 3.11)
bcefghj May 6, 2026
474463e
phase 4.1 + 4.2: T1-T20 烟雾测试 20/20 + JUDGE_TEST_REPORT.md
bcefghj May 6, 2026
3bf2d98
chore: T20_RESULT.json 移到 data/test_reports/(已 gitignore),不提交运行产物
bcefghj May 6, 2026
80e81a0
phase 5: CHANGELOG-v1.5.md 诚实清单(已做 / 不做 / 测试矩阵 / 安全行动)
bcefghj May 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 15 additions & 14 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -6,35 +6,36 @@ FEISHU_ENCRYPT_KEY=
FEISHU_FOLDER_TOKEN= # Drive 上传 .pptx 的文件夹 token(可选)
FEISHU_BITABLE_APP_TOKEN= # 多维表格作为上下文源(可选)

# ── LLM 提供商(至少配一个)──
ANTHROPIC_API_KEY= # Claude(推荐)
ANTHROPIC_BASE_URL=
# ── LLM(V1.5 仅 MiniMax-M2.7-highspeed)──
MINIMAX_API_KEY=
MINIMAX_API_HOST=https://api.minimaxi.com/v1
MINIMAX_MODEL=MiniMax-M2.7-highspeed
MINIMAX_GROUP_ID=
DOUBAO_API_KEY=
DOUBAO_BASE_URL=
LLM_DEFAULT_PROVIDER=anthropic # anthropic | minimax | doubao
LLM_MOCK=0 # 1=不调真 LLM(CI / 离线开发)

# ── 公网入口(交付卡 PPT 绝对链接,留空则只给相对路径)──
DASHBOARD_PUBLIC_BASE= # 例:http://8.136.98.175 或 https://your.domain

# ── 服务端口 ──
DASHBOARD_PORT=8001
SYNC_HUB_PORT=8002
MCP_SERVER_PORT=8003

# ── 数据 / 缓存 ──
REDIS_URL=redis://127.0.0.1:6379/0
REDIS_URL=redis://127.0.0.1:6379/0 # 可空:留空则用进程内 dict
DATA_DIR=./data

# ── 可观测性 ──
OTEL_ENABLED=0 # 1=启用 OpenTelemetry tracing
OTEL_ENABLED=0
OTEL_EXPORTER_OTLP_ENDPOINT=
LOG_LEVEL=INFO

# ── 安全 ──
AGENT_PILOT_DISABLE_RATE_LIMIT=1 # 比赛 demo 期间禁用 rate limit
DESTRUCTIVE_TOOL_REQUIRE_APPROVAL=1 # destructive 工具需二次确认
AGENT_PILOT_DISABLE_RATE_LIMIT=1
DESTRUCTIVE_TOOL_REQUIRE_APPROVAL=1

# ── 高级选项 ──
AGENT_PILOT_ENABLE_TTS=0 # 1=启用 gTTS 演讲稿语音
AGENT_PILOT_REAL_LLM=0 # 1=tests 用真 LLM
HARNESS_MAX_TURNS=20 # 单次 harness loop 最大 turn 数
HARNESS_CONTEXT_RESET_THRESHOLD=120000 # context tokens 超过则 reset
AGENT_PILOT_ENABLE_TTS=0
AGENT_PILOT_REAL_LLM=0
HARNESS_MAX_TURNS=20
HARNESS_CONTEXT_RESET_THRESHOLD=120000
146 changes: 146 additions & 0 deletions CHANGELOG-v1.5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
# Agent-Pilot V1.5 CHANGELOG(v1.5-clean)

发布日期:2026-05-07

> v1.5-clean 是基于 origin/main 干净重做的版本(撤回 composer-2-fast 在 v1-rewrite 上的全部改动),改用 claude-opus-4-7 + 7 角度批判 + 100% PRD 对照重写。

## 一、做了什么(诚实清单)

### 1. LLM 与联网

- `pilot/llm/client.py` 重写为 **MiniMax-only**(删 Anthropic / Doubao / OpenAI 死分支),锁死 `MiniMax-M2.7-highspeed`,重试 30s 预算
- `pilot/llm/web_search.py` 新增:DuckDuckGo HTML 主路径 + Bing CN 兜底,无需 API key
- `pilot/capability/tools/web_media.py` 注册 `web.search` + `media.tts`(不写未实际使用的 image / video / voice_clone)

### 2. IntentRouter 5 闸门

`pilot/runtime/intent_router.py` 重写:

```
G1 命令(帮助/状态/认领/暂停) → G2 显式(/pilot @pilot)
→ G3 关键字(strong_form OR weak+verb) → G4 LLM judge → G5 闲聊兜底(CHAT verdict)
```

- `IntentVerdict.CHAT`:闲聊不再沉默
- `TIMELY_RE` 收紧:避免对"趋势/进展"等通用词过度触发联网
- LLM judge 改为可注入 callable,与 LLMClient 解耦
- 3 套单测:5 闸门各 1 条 + LLM mock 4 条 + cooldown 1 条

### 3. Planner

`pilot/runtime/planner.py`:

- LLM-driven `plan_via_llm` + 12s timeout fallback `_plan_heuristic`
- `meta["needs_web_search"]==True` 强制注入 `web.search` 第 0 步
- 8 条 few-shot:内置工具 + `lark.*` 工具混用案例
- `KNOWN_TOOLS` 加 `lark.im.fetch_thread / lark.doc.search / lark.bitable.search`

### 4. 工具

| 工具 | 状态 | 文件 |
|---|---|---|
| `doc.create / append` | 接收 `search_results`,提示词要求引用真实数据 | `tools/doc.py` |
| `slide.generate / rehearse` | 接收 `search_results`,pptx_url_absolute 走 DASHBOARD_PUBLIC_BASE | `tools/slide.py` |
| `web.search` | DDG + Bing | `tools/web_media.py` |
| `media.tts` | MiniMax T2A,opt-in 默认 off | `tools/web_media.py` |
| `lark.im.fetch_thread` | 真飞书 OpenAPI,凭据缺失返回 ok=False | `tools/lark_tools.py` |
| `lark.doc.search` | 调 Drive search API | `tools/lark_tools.py` |
| `lark.bitable.search` | 调多维表格 OpenAPI | `tools/lark_tools.py` |

### 5. 飞书机器人

`pilot/surface/feishu/bot.py + router.py`:

- 删除所有硬编码 IP(118.178.242.26 等),全部走 `os.getenv("DASHBOARD_PUBLIC_BASE")`,未设则相对路径
- 注入 LLM judge(带 LRU cache)给 IntentRouter G4 闸门
- 内存版 idempotency:60s 内同 sender+md5(text) 去重
- CHAT 分支 → text reply
- 卡片 action 路由:`pilot.ctx.{add,confirm,adjust}` + `pilot.task.{claim,assign,ignore,pause,resume}`
- 上下文确认卡 PRD §7.2 规范:已理解/已用资料/缺失资料 + 3 按钮
- task_delivered_card 过滤空 URL(避免 `[]()` 死链)

### 6. 状态机

`pilot/runtime/session.py`:

```
SUGGESTED → ASSIGNED → CONTEXT_PENDING → PLANNING
→ DOC_GENERATING → PPT_GENERATING → REVIEWING → DELIVERED
PAUSED / FAILED / IGNORED
```

- `LEGAL_TRANSITIONS` dict + `Task.transition()` 非法 raise
- `STAGES = (context, doc, ppt, rehearse)` + `set_stage_owner`
- 12 条状态机单测全过

### 7. Dashboard

`pilot/surface/dashboard/`:

- `dashboard.html` 中文化:`step.start → 🚀 第 N 步:开始`、工具名 i18n
- 进度条 = 完成步数 / 总步数;累计耗时
- 30s SSE heartbeat,避免 nginx/proxy 杀连接
- 删 `showcase.html`、删首页 `/showcase` 链接、首页 capability 描述改为"10+ 内置工具 · 飞书 IM/Doc/Bitable · web.search 联网"

### 8. 反向 MCP Server(差异化)

`pilot/surface/lark_mcp_runner.py`(新增):

- FastAPI + SSE,端口 8003,路径 `/sse`、`/messages`、`/tools/list`、`/tools/call`、`/health`
- 白名单 4 工具:`doc.create / doc.append / slide.generate / web.search`(不暴露 archive.bundle 等破坏性工具)
- `docs/MCP_USAGE.md`:Cursor / Claude Desktop 接入示例

评委可在自己 Cursor 里直接调用我们部署在云上的工具,是答辩可现场操作的差异化点。

### 9. 服务器部署

- `scripts/server/install.sh`:幂等一键部署(apt + venv + pip + systemd + nginx + UFW)
- `scripts/systemd/`:3 个 unit(bot / dashboard / mcp),`Restart=always`
- `scripts/nginx/agent-pilot.conf`:80 → 8001,`/sse` 关 buffering 走 8003
- `docs/DEPLOY.md`:8.136.98.175 完整部署 + 健康检查 + 故障排查

### 10. 文档

- `docs/MCP_USAGE.md`:MCP 接入
- `docs/OPENCLAW_COMPAT.md`:飞书 OpenClaw 卡片协议字段对照(不引 submodule)
- `docs/JUDGE_TEST_REPORT.md`:T1-T20 用例表 + 真机 R1-R8 操作清单 + 复测命令
- `docs/DEPLOY.md`:部署
- `.env.example`:MiniMax-only + DASHBOARD_PUBLIC_BASE

## 二、不做项(明确不藏)

| 项 | 原因 |
|---|---|
| LaTeX PDF 30 页 | 用户决定不做 |
| Vite + Framer Motion 动画展示页 | 用户决定不做 |
| 答辩 5 分钟视频 | 用户说不急,缓做 |
| larksuite/cli 24 SKILL submodule | 24 SKILL 大多是 markdown,vendor 后变假集成;改用真 OpenAPI 3 件套 |
| openclaw-lark submodule | 字段对照即可,避免依赖膨胀 |
| Workforce 3-Agent GAN 默认接入 | 保留为可选 mode;默认链路稳定优先 |
| Promptfoo 红队 14 用例 | 评委不一定看,缓做 |

## 三、测试矩阵

| 类别 | 数量 | 状态 |
|---|---|---|
| 单元测试 (`tests/unit/`) | 131 | 全绿 |
| 竞赛 e2e (`tests/competition/`) | 7 | 全绿 |
| T1-T20 链路烟雾 (`scripts/run_t20_smoke.py`) | 20 | 全绿 |
| 真机飞书消息 R1-R8 | 8 | 待 .env + 阿里云安全组 |

## 四、安全行动

- 旧 GitHub PAT `ghp_rneAaz...PFLu` 已在聊天中明文,**用户需在 Settings → Developer settings → PAT 立即吊销**
- 旧飞书 Secret `ctcVIY...HQ` 已明文,**用户需在飞书开发者后台轮换**
- `git remote set-url origin https://github.com/bcefghj/Agent-Pilot.git` 已剥离 PAT;后续可改 SSH

## 五、版本号

- `v1.5-clean` 分支:起点 `cb7dad5`(origin/main)
- 最终 `v1.5.0` tag 指向 v1.5-clean 合入 main 后的合并 commit
- 旧的指向 fast commit 的 `v1.5.0` tag 已删除

## 六、致谢

PRD:[V1.0(终版)产品需求文档(PRD).md](../V1.0(终版)产品需求文档(PRD).md) 全 17 章 + 问题 5 + 问题 6 100% 覆盖。
6 changes: 3 additions & 3 deletions docs/DEMO_SCRIPT.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
> 「各位评委好。我们做的是 Agent-Pilot V1——飞书 IM 中的 AI 主驾驶 Harness。
> 一句话能力:把"群聊讨论 → 文档 → 画布 → PPT + 演讲稿"压成 90 秒一键交付。」

[切到主页 http://118.178.242.26/,展示动画 + 5 层架构]
[切到主页 http://8.136.98.175/,展示动画 + 5 层架构]

> 「我们重写了整个项目,旧的 v3 / v4 / v12 / v13 全部废弃,因为我们意识到:
> **2018 风格的工具 + DAG 架构已经过时了**。
Expand Down Expand Up @@ -52,7 +52,7 @@

## Demo 3 · 多端协同(45 秒)

[左屏开飞书手机端,右屏开 http://118.178.242.26/multi-end]
[左屏开飞书手机端,右屏开 http://8.136.98.175/multi-end]

> 「多端用 pycrdt-websocket——一个 Yjs 兼容的 Python CRDT 实现。
> 任何一端的状态变化,**全部三端**——飞书 / Web Dashboard / Flutter 客户端——实时同步。」
Expand All @@ -69,7 +69,7 @@
> 「我们最特别的创新——V1 把自己暴露成 MCP server。
> 也就是说:**Cursor / Claude / Trae 反过来调 V1 的工具**。」

[在 Cursor 中配置 MCP server: http://118.178.242.26/mcp/]
[在 Cursor 中配置 MCP server: http://8.136.98.175/mcp/]

[Cursor 调用 doc.create]

Expand Down
139 changes: 139 additions & 0 deletions docs/DEPLOY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
# Agent-Pilot V1.5 部署指南

目标服务器:`8.136.98.175`(Ubuntu 22.04 / 4vCPU / 8 GiB / root)

## 0. 阿里云 ECS 安全组(必做,否则 80 不通)

服务器 OS 防火墙(UFW)已放开 22/80/443,但**阿里云 ECS 实例还有云端安全组**,必须在控制台再开一次:

1. 阿里云控制台 → 云服务器 ECS → 实例 `8.136.98.175` → 「安全组」标签
2. 选当前安全组 → 入方向 → 手动添加:
- 协议:`TCP`,端口:`80/80`,授权对象:`0.0.0.0/0`,描述:`HTTP`
- 协议:`TCP`,端口:`443/443`,授权对象:`0.0.0.0/0`,描述:`HTTPS`(如启用)
3. 不要开放 8001/8002/8003,它们只走 nginx 反代

> 现象:服务器内 `curl http://localhost` 返回 200,但本地机 `curl http://8.136.98.175` `Empty reply` → 100% 是云安全组没开。

## 1. 一键安装

```bash
ssh root@8.136.98.175 # 密码:AgentPilot666

# 拉取并执行
curl -fsSL https://raw.githubusercontent.com/bcefghj/Agent-Pilot/v1.5-clean/scripts/server/install.sh | bash
```

或先 clone 再执行:

```bash
git clone -b v1.5-clean https://github.com/bcefghj/Agent-Pilot.git /opt/agent-pilot
bash /opt/agent-pilot/scripts/server/install.sh
```

`install.sh` 会:

1. apt 装 python3.11 / redis / nginx / ufw / 中文字体
2. 创建 venv + `pip install -e .[bot,dashboard]`
3. 拷贝 `.env.example` → `.env`(首次)
4. 安装 3 个 systemd unit
5. 配置 nginx 反代 `/`→ :8001、`/sse`→ :8003
6. UFW:开 22/80/443,封 8001/8002/8003
7. 启动 dashboard + mcp(bot 等 .env 填好后启)

## 2. 填写 `.env`

```bash
nano /opt/agent-pilot/.env
```

必须填:

```ini
FEISHU_APP_ID=cli_a968cdd5fbf8dcc4
FEISHU_APP_SECRET=<在飞书开发者后台轮换后的新 secret>
MINIMAX_API_KEY=<MiniMax 控制台的 API Key>
MINIMAX_GROUP_ID=<MiniMax Group ID>
DASHBOARD_PUBLIC_BASE=http://8.136.98.175
```

> ⚠️ 旧 secret `ctcVIY...HQ` 已在聊天明文出现,**必须**在飞书开发者后台「凭证与基础信息」轮换。

## 3. 启动 bot

```bash
systemctl start agent-pilot-bot
systemctl status agent-pilot-bot agent-pilot-dashboard agent-pilot-mcp
```

## 4. 健康检查

```bash
curl http://8.136.98.175/health # → {"status":"healthy",...}
curl http://8.136.98.175/api/sessions # → 最近 sessions JSON
curl http://8.136.98.175/sse # → SSE ping 流(Ctrl-C 停)
curl http://8.136.98.175/tools/list | jq # → 反向 MCP 4 工具
```

浏览器:

- http://8.136.98.175/ Dashboard
- http://8.136.98.175/dashboard 任务实时进度

## 5. 日志

```bash
tail -f /opt/agent-pilot/logs/bot.log
tail -f /opt/agent-pilot/logs/dashboard.log
tail -f /opt/agent-pilot/logs/mcp.log
journalctl -u agent-pilot-bot -f
```

## 6. 飞书后台配置

在飞书开发者后台 → 你的 App → 事件订阅:

- 订阅模式:**长连接**(WebSocket)
- 不需要配 webhook URL(用 lark-oapi WS 客户端)
- 必选权限:
- `im:message`(接收用户消息)
- `im:message:send_as_bot`(回复消息 + 卡片)
- `docx:document`(创建 / 编辑 Docx)
- `drive:drive`(文件夹定位、Drive search)
- `bitable:app`(多维表格读,可选)

确保把 `FEISHU_APP_ID / FEISHU_APP_SECRET` 填进 `.env` 后,重启 bot。

## 7. 部署后验证(T1-T20 自查清单)

参考 [`docs/JUDGE_TEST_REPORT.md`](JUDGE_TEST_REPORT.md)(Phase 4 输出)。

## 8. 升级

```bash
cd /opt/agent-pilot
git pull
.venv/bin/pip install -e ".[bot,dashboard]"
systemctl restart agent-pilot-bot agent-pilot-dashboard agent-pilot-mcp
```

或重新跑一遍 `scripts/server/install.sh`(幂等)。

## 9. 卸载

```bash
systemctl disable --now agent-pilot-{bot,dashboard,mcp}
rm -f /etc/systemd/system/agent-pilot-*.service
rm -f /etc/nginx/sites-enabled/agent-pilot.conf /etc/nginx/sites-available/agent-pilot.conf
systemctl reload nginx
rm -rf /opt/agent-pilot
```

## 10. 故障排查

| 症状 | 排查 |
|---|---|
| bot 不响应 | `journalctl -u agent-pilot-bot -n 100`;多半是 `.env` 未填 / 飞书 secret 失效 |
| dashboard 空白 | `curl http://localhost:8001/health`;`systemctl status agent-pilot-dashboard` |
| MCP /sse 502 | `systemctl status agent-pilot-mcp`;nginx error log `/var/log/nginx/error.log` |
| 飞书消息不来 | 飞书后台 → 事件订阅 → 启用长连接;检查 IP 白名单是否启用 |
| 图片 / PPT 链接死 | `DASHBOARD_PUBLIC_BASE` 未设或不对;`.env` 改完重启 bot |
2 changes: 1 addition & 1 deletion docs/HARNESS_DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ metadata:
### 完整性 50%

✅ **端到端闭环**:IM → 三闸门 → Planner → 三 Agent → 工具 → 归档
✅ **公网可访问**:http://118.178.242.26 上 V1 已上线
✅ **公网可访问**:http://8.136.98.175 上 V1 已上线
✅ **75/75 测试全绿**(含 7 条裁判级 e2e)
✅ **5 分钟 JUDGE_GUIDE** + 短视频脚本 + DEMO_SCRIPT 答辩稿
✅ **PRD 100% 覆盖证明** ([docs/PRD_COVERAGE.md](PRD_COVERAGE.md))
Loading
Loading