
大家好,今天继续讲Harness技术平台能力。今天这篇文章结合开源项目Abu-Cowork源代码进行逆向工程后进行分析整理。但是大家注意,这些Harness的底层技术能力实际是我们构建任何通用智能体,或者去构建一个通用的Harness技术底座的必备能力。
Harness 是 AI Agent 平台的"底盘"——它不是大模型本身,也不是面向用户的 UI,而是连接模型与真实世界的执行骨架:管理记忆、调度工具、控制权限、编排任务。本文从一个通用 Agent 平台的工程视角出发,系统梳理构成 Harness 的各项关键技术底座。
在深入各项能力之前,先看 Harness 在 Agent 平台中的位置:

Harness 的核心职责:让 Agent 安全、可靠、有记忆地连接模型能力和真实世界。下面逐一展开。
通用 Agent 的记忆系统应设计为分层结构,每层有明确的职责边界和生命周期:

一个好的记忆系统不应要求用户手动编写,而应具备自动积累机制:
除了自动积累的记忆,还需要支持确定性规则——用户手动编写的项目级指令(如"始终使用 pnpm 不要用 npm""禁止引入超过 500KB 的依赖")。这些规则不会被自动修改,Agent 每次都严格遵守,且可作为项目代码的一部分随 git 提交。
一个通用 Agent 平台需要管理完整的会话生命周期:
[创建] → [活跃] → [暂停/归档] → [恢复] → [删除]
| |
| +→ [Checkpoint 快照]
| +→ [消息流式传输]
| +→ [工作区绑定]
+→ [标题自动生成]
核心状态包括:
多个组件(UI、Agent Loop、调度器)可能同时读取会话状态,需要保证一致性。推荐使用事件驱动的状态同步,而非共享可变状态——每个模块持有自己的状态视图,通过事件总线同步变更。
发送给 LLM 的上下文不是简单的"把所有历史消息串起来"。一个良好的上下文结构应分层组织:

对于每次对话都相同的静态内容(如 system prompt 中的工具定义、技能列表),应标记为"可缓存"——利用 LLM 提供商的 prompt caching 能力(如 Anthropic 的 cache_control),大幅降低延迟和成本。
Skill 是 Agent 能力的模块化扩展单元。一个完整的 Skills 系统需要覆盖:
+------------------------------------------------------------------+
| Skill 生命周期 |
| |
| [创建] ──→ [安装] ──→ [注册] ──→ [调用] ──→ [更新] ──→ [卸载] |
| | | | | | | |
| | 从市场安装 注入到 Agent按 用户/Agent 清理文件 |
| | 或本地导入 System 需调用 触发更新 和注册 |
| | Prompt |
+------------------------------------------------------------------+

每个 Skill 是一个包含以下文件的目录:
my-skill/
├── SKILL.md # 技能描述(给 LLM 看的 instructions)
├── scripts/ # 可执行脚本
├── templates/ # 模板文件
└── references/ # 参考文档
SKILL.md 是核心——它包含:
当 Agent 在对话中发现"这个操作模式经常重复出现",它应该有能力:
MCP(Model Context Protocol)是一个开放协议,定义了 AI 模型与外部工具/数据源之间的标准接口。Agent 平台作为 MCP Client,连接各种 MCP Server:
+-------------------+ stdio/HTTP/SSE +-----------------+
| | ◄──────────────────────────► | MCP Server A |
| Agent Platform | | (filesystem) |
| (MCP Client) | ◄──────────────────────────► +-----------------+
| |
| | ◄──────────────────────────► +-----------------+
| | transport | MCP Server B |
| | | (database) |
+-------------------+ +-----------------+
Agent 不应只在用户对话时工作——许多场景需要 Agent 自主定时执行:
+------------------------------------------------------------------+
| Task Scheduler |
| |
| +------------------+ +------------------+ +----------------+ |
| | Cron-based Tasks | | Event Triggers | | Webhook | |
| | "每天 9 点生成 | | "文件变化时 | | "GitHub PR | |
| | 日报" | | 运行检查" | | 创建时触发" | |
| +------------------+ +------------------+ +----------------+ |
+------------------------------------------------------------------+
每个自动任务包含:
自动任务需要在 headless 模式 下运行——不弹窗、不等待用户确认、不与 UI 交互。这个模式下的关键约束:
request_workspace)浏览器自动化需要两部分协作:
+------------------+ Chrome Extension Bridge +-----------------+
| Agent Platform | ◄──────────────────────────────► | Browser |
| | (Native Messaging / WebSocket) | (Chrome/Edge) |
| +--------------+ | | +-------------+ |
| | Bridge Client| | | | Extension | |
| +--------------+ | | +-------------+ |
+------------------+ +-----------------+
浏览器是高风险操作环境——Agent 可能误操作导致数据泄露或不可逆提交:
Computer Use 让 Agent 能够像人一样操作图形界面应用:

+------------------------------------------------------------------+
| Computer Use Capabilities |
| |
| +------------+ +------------+ +------------+ +------------+ |
| | Screenshot | | Mouse | | Keyboard | | Window | |
| | Capture | | Click/Move | | Type/Short | | Management | |
| | (截屏) | | (鼠标操控) | | cut (键盘) | | (窗口管理) | |
| +------------+ +------------+ +------------+ +------------+ |
+------------------------------------------------------------------+
单 Agent 处理复杂任务时容易"迷路"——上下文过长、职责不清。多 Agent 编排通过任务分解和并行执行来解决:

+------------------+
| Orchestrator |
| (主协调 Agent) |
+--------+---------+
|
+------------------+------------------+
| | |
+--------v--------+ +------v------+ +--------v--------+
| 子 Agent A | | 子 Agent B | | 子 Agent C |
| "代码审查" | | "安全检查" | | "文档生成" |
| 只读代码分析 | | 漏洞检测 | | 格式化输出 |
+-----------------+ +-------------+ +-----------------+

+------------------------------------------------------------------+
| Permission Levels |
| |
| Level 0 — 安全操作 (自动批准) |
| 只读文件访问、列出目录、获取当前时间、搜索网页 |
| |
| Level 1 — 低风险操作 (会话内批准一次) |
| 在工作区内写入文件、执行只读 Shell 命令 |
| |
| Level 2 — 中风险操作 (每次确认) |
| 在工作区外写入文件、执行修改性 Shell 命令 |
| |
| Level 3 — 高风险操作 (用户必须显式批准 + 二次确认) |
| 删除文件、访问敏感路径(.ssh, .aws)、发送 HTTP 请求到外部服务 |
| |
| Level 4 — 禁止操作 (永不批准) |
| 修改系统配置、访问密钥文件、执行可能破坏系统的命令 |
+------------------------------------------------------------------+
/etc、/System、C:\Windows)、密钥目录(~/.ssh、~/.aws)、Git 内部目录(.git)永久禁止访问。~/.memory/)有独立的读写权限控制,防止 Agent 在工具调用中意外修改自己的记忆。rm -rf、sudo、curl | bash、> /dev/sda 等。.exe 伪装为 .txt)。每次 Agent 执行都应记录为一条完整的 Trace:
+------------------------------------------------------------------+
| Trace: conversation-abc123 |
| |
| +-- Span: agent-loop (总耗时 45.2s) |
| +-- Span: llm-call-1 (耗时 3.2s, tokens: 输入 4500) |
| +-- Span: tool-list-dir (耗时 0.1s, path: /workspace) |
| +-- Span: llm-call-2 (耗时 5.1s, tokens: 输入 6200) |
| +-- Span: tool-run-cmd (耗时 2.3s, cmd: npm install) |
| +-- Span: compaction (耗时 0.5s, 压缩 45 条消息 → 摘要) |
| +-- Span: llm-call-3 (耗时 8.2s, tokens: 输入 3800) |
+------------------------------------------------------------------+
观测数据属于敏感的遥测信息,需遵循:
回顾上述十二项能力,一个优秀的 Agent Harness 应遵循以下设计原则:
Permission denied,而是"Agent 想访问你的桌面文件夹,允许吗?")——这些看似"前端"的事,其实是从 Harness 层就开始设计的执行约束。Harness 的本质:不是让模型更聪明,而是让模型更可靠——给它记忆、给它工具、给它规则、给它边界。在这个框架内,模型才能放心地把能力发挥到极致。