点点工程机械
116.25M · 2026-04-01
2026 年 3 月,AI 工程化正在经历一场静默的革命。
人们谈论模型、谈论 Agent、谈论应用场景,但很少人谈论Harness Engineering——那个让 AI 从 demo 变成产品的"脏活累活"。
本文从 OpenClaw 的架构出发,聊聊 Harness Engineering 到底是什么,以及为什么它可能是 AI 工程化的下一站。
Harness,字面意思是"马具"、"控制装置"。
在软件工程里,Harness Engineering 指的是:为 AI 系统搭建运行、管理、坚控所需的基础设施。
它不是模型训练,不是 Prompt 工程,而是让模型能在生产环境稳定运行的那层"中间件"。
OpenClaw 是一个典型的 Harness Engineering 案例。它的核心不是模型(用的是第三方 API),而是如何把模型变成可用的个人助理。
flowchart TB
subgraph UserLayer["用户交互层"]
direction TB
WA[WhatsApp]
TG[T@elegrimm]
DC[Discord]
SL[Slack]
WC[WebChat]
end
subgraph HarnessLayer["Harness 层(OpenClaw Gateway)"]
direction TB
SM[Session 管理]
CR[Channel 路由]
TO[Tool 编排]
EV[Cron/Event 调度]
end
subgraph ModelLayer["模型层"]
direction TB
GPT[OpenAI]
CL[Anthropic]
GL[Google]
BL[Bailian]
LC[本地模型]
end
UserLayer --> HarnessLayer
HarnessLayer --> ModelLayer
style UserLayer fill:#f0f4ff,stroke:#667eea,stroke-width:2px
style HarnessLayer fill:#fff7ed,stroke:#f97316,stroke-width:2px
style ModelLayer fill:#f3f4f6,stroke:#6b7280,stroke-width:2px
Harness 层做的事:
这些都不是"AI 能力",但缺了任何一块,AI 都无法真正用起来。
OpenClaw 支持 20+ 消息渠道:WhatsApp、T@elegrimm、Discord、Slack、Signal、iMessage、微信、飞书……
每个渠道的消息格式都不一样:
Harness 层的任务:
// 伪代码示例
interface UnifiedMessage {
id: string;
channelId: string;
senderId: string;
content: string;
attachments?: Attachment[];
replyTo?: string;
metadata: Record<string, any>;
}
// Discord 适配器
function discordToUnified(discordMsg: DiscordMessage): UnifiedMessage {
return {
id: discordMsg.id,
channelId: `discord:${discordMsg.channelId}`,
senderId: `discord:${discordMsg.author.id}`,
content: discordMsg.content,
attachments: discordMsg.attachments.map(a => ({
type: a.type === 'image' ? 'image' : 'file',
url: a.url,
filename: a.filename
})),
replyTo: discordMsg.reference?.messageId,
metadata: {
discord: {
guildId: discordMsg.guildId,
reactions: discordMsg.reactions,
components: discordMsg.components
}
}
};
}
// 微信适配器
function wech@tToUnified(wech@tMsg: Wech@tMessage): UnifiedMessage {
return {
id: wech@tMsg.MsgId,
channelId: `wech@t:${wech@tMsg.FromUserName}`,
senderId: `wech@t:${wech@tMsg.FromUserName}`,
content: wech@tMsg.Content,
attachments: wech@tMsg.Attachments?.map(a => ({
type: a.type,
url: a.url
})),
metadata: {
wech@t: {
msgType: wech@tMsg.MsgType,
event: wech@tMsg.Event
}
}
};
}
难点:
AI 助理是有状态的。
用户说"把刚才那个链接发我",AI 需要知道:
OpenClaw 的 Session 管理包含:
interface Session {
sessionKey: string;
channelId: string;
userId: string;
model: string;
thinking: 'low' | 'medium' | 'high';
messages: Message[];
context: Record<string, any>;
createdAt: number;
lastActiveAt: number;
}
// Session 路由示例
function routeMessage(msg: UnifiedMessage): Session {
// DM 消息:每个用户一个 Session
if (msg.channelType === 'dm') {
return getOrCreateSession({
sessionKey: `dm:${msg.senderId}`,
channelId: msg.channelId,
userId: msg.senderId
});
}
// 群组消息:每个群组一个 Session(或每个用户 + 群组组合)
if (msg.channelType === 'group') {
return getOrCreateSession({
sessionKey: `group:${msg.channelId}:${msg.senderId}`,
channelId: msg.channelId,
userId: msg.senderId,
context: { groupId: msg.channelId }
});
}
}
难点:
AI 助理的价值在于能做事,不只是聊天。
OpenClaw 的 Tool 包括:
browser:浏览器控制(打开网页、截图、点击、输入)canvas:Canvas 渲染(在 macOS 上显示 UI)nodes:设备控制(拍照、录屏、通知)cron:定时任务sessions:子 Agent 管理filesystem:文件读写Tool 编排的复杂性:
// 用户说:"帮我坚控竞品价格,每天下午 5 点发我"
// AI 需要:
// 1. 创建一个 cron 任务
// 2. 任务内容是打开竞品网页、抓取价格、生成对比图
// 3. 把结果发到用户的指定渠道
async function setupPriceMonitor(userRequest: UserRequest) {
// 1. 解析需求
const { competitorUrls, targetTime, notifyChannel } = parseRequest(userRequest);
// 2. 创建 cron 任务
const cronJob = await cron.add({
schedule: {
kind: 'cron',
expr: `0 ${targetTime} * * *`, // 每天指定时间
tz: 'Asia/Shanghai'
},
payload: {
kind: 'agentTurn',
message: `检查以下竞品价格:${competitorUrls.join(', ')}`
},
sessionTarget: 'isolated' // 在独立 Session 运行
});
// 3. 创建子 Agent 处理抓取任务
const scraperAgent = await sessions.spawn({
task: '抓取竞品价格并生成对比报告',
runtime: 'subagent',
mode: 'run',
attachments: competitorUrls.map(url => ({
name: 'url.txt',
content: url
}))
});
// 4. 设置通知回调
scraperAgent.onComplete((result) => {
message.send({
to: notifyChannel,
message: `今日竞品价格报告:n${result.summary}`
});
});
}
难点:
AI 助理能访问用户的消息、文件、设备,安全是生命线。
OpenClaw 的安全设计:
// DM Pairing 逻辑
async function handleInboundDM(msg: UnifiedMessage) {
const sender = msg.senderId;
const channel = msg.channelId;
// 检查是否在白名单
const isAllowed = await allowlist.check(sender, channel);
if (!isAllowed) {
// 生成配对码
const pairingCode = generatePairingCode();
await pairingStore.set(channel, pairingCode, sender);
// 发送配对提示
await message.send({
to: channel,
message: `收到来自 ${sender} 的消息。nn请在终端运行以下命令完成配对:n```nopenclaw pairing approve ${channel} ${pairingCode}````
});
// 丢弃原始消息
return;
}
// 白名单用户,正常处理
await processMessage(msg);
}
难点:
基于 OpenClaw 的实践,Harness Engineering 的技术栈可以总结为:
所有消息、事件、命令都通过统一的事件总线流转。
// 事件类型
type GatewayEvent =
| { type: 'message:inbound'; payload: UnifiedMessage }
| { type: 'message:outbound'; payload: OutboundMessage }
| { type: 'session:created'; payload: Session }
| { type: 'tool:call'; payload: ToolCall }
| { type: 'cron:trigger'; payload: CronJob };
// 事件处理器
gateway.on('message:inbound', async (msg) => {
const session = routeMessage(msg);
const response = await agent.process(msg, session);
await sendResponse(response);
});
每个消息渠道、每个 Tool 都是一个适配器。
interface ChannelAdapter {
connect(): Promise<void>;
disconnect(): Promise<void>;
send(msg: OutboundMessage): Promise<void>;
onMessage(handler: (msg: any) => void): void;
}
class DiscordAdapter implements ChannelAdapter {
private client: Discord.Client;
async connect() {
this.client = new Discord.Client({ intents: [...] });
await this.client.login(token);
}
onMessage(handler) {
this.client.on('messageCreate', (msg) => {
handler(discordToUnified(msg));
});
}
}
class T@elegrimmAdapter implements ChannelAdapter {
// ...
}
Session 状态、Tool 调用、子 Agent 都是状态机。
type SessionState = 'idle' | 'processing' | 'waiting_tool' | 'error';
interface SessionMachine {
state: SessionState;
transitions: {
from: SessionState;
trigger: string;
to: SessionState;
action?: () => void;
}[];
}
const sessionMachine: SessionMachine = {
state: 'idle',
transitions: [
{ from: 'idle', trigger: 'message:received', to: 'processing' },
{ from: 'processing', trigger: 'tool:call', to: 'waiting_tool' },
{ from: 'waiting_tool', trigger: 'tool:result', to: 'processing' },
{ from: 'processing', trigger: 'response:sent', to: 'idle' },
{ from: '*', trigger: 'error', to: 'error' }
]
};
日志、指标、追踪是 Harness 的"眼睛"。
// 结构化日志
logger.info('message:processed', {
sessionId: session.sessionKey,
channelId: msg.channelId,
model: session.model,
latency: Date.now() - startTime,
tokens: { prompt: 1200, completion: 300 }
});
// 指标收集
metrics.increment('message.inbound');
metrics.histogram('tool.latency', latency);
metrics.gauge('session.active', activeSessions.length);
// 分布式追踪
const span = tracer.startSpan('agent.process');
span.setTag('model', session.model);
span.setTag('thinking', session.thinking);
await agent.process(msg, session);
span.finish();
GPT-5 会出来,Claude-5 会出来,模型能力会越来越强、价格会越来越低。
但你的 Harness——你的消息适配器、你的 Session 管理、你的 Tool 编排——是你独有的,不会贬值。
用户不在乎你用的是什么模型,只在乎:
这些都是 Harness Engineering 的范畴。
模型可以换(OpenClaw 支持 10+ 模型供应商),但 Harness 一旦建成,迁移成本极高。
用户在你的 Harness 里沉淀了:
换模型容易,换 Harness 难。
基于 OpenClaw 的实践,预测几个趋势:
现在每个 AI 项目都要自己写 Harness(消息适配、Session 管理、Tool 编排)。
未来会出现Harness 即服务,像 Vercel 之于 Web 应用。
消息渠道的适配器会标准化,就像 USB-C。
OpenClaw 已经在做这件事:统一的消息格式、统一的 Tool 接口、统一的 Session 管理。
隐私意识觉醒,用户不希望所有消息都经过第三方服务器。
OpenClaw 的"本地 Gateway + 本地模型"模式会成为主流。
单个 Agent 能力有限,未来是多 Agent 协作的时代。
Harness 需要管理:
OpenClaw 的 sessions_spawn + subagents 已经在往这个方向走。
Harness Engineering 不性感。
它没有"AGI 即将到来"那么激动人心,没有"Prompt 工程"那么神秘。
但它是 AI 工程化的必经之路。
当 AI 从"能聊天"变成"能做事",Harness Engineering 的价值会被重新认识。
参考资料:
免责声明: 本文基于 OpenClaw 开源项目实践总结,部分观点为作者个人见解。技术细节请以官方文档为准。