<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Agent Harness on YennJ12 Engineering Blog</title><link>https://yennj12.js.org/yennj12_blog_V4/tags/agent-harness/</link><description>Recent content in Agent Harness on YennJ12 Engineering Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 07 Aug 2026 16:00:00 +0800</lastBuildDate><atom:link href="https://yennj12.js.org/yennj12_blog_V4/tags/agent-harness/feed.xml" rel="self" type="application/rss+xml"/><item><title>OpenWorker 深度解析（一）：架構全景 — 一個能交付成果的桌面 AI 同事</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/openworker-intro-part1-architecture-overview-zh/</link><pubDate>Fri, 07 Aug 2026 09:00:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/openworker-intro-part1-architecture-overview-zh/</guid><description>大多數人看到「又一個 AI Agent 專案」，會直接跳到 README 的安裝步驟。 少數人會打開 engine.py，想知道那個 while 迴圈長什麼樣子。 但真正值得學的東西，藏在「它拒絕做什麼」裡。 OpenWorker 最有價值的部分，是它對「什麼時候不該讓 Agent 自己決定」的答案。
本系列共五篇，逐層拆解 andrewyng/openworker 這個專案： 它是什麼、核心程式碼怎麼寫、Harness（安全外殼）怎麼設計、LLM 層怎麼抽象， 以及它的能力擴充體系（Tools / Skills / Personas / MCP / Connectors）長什麼樣。
本篇是第一篇：架構全景。我們先建立地圖，後面四篇才鑽進程式碼。
一、核心問題：為什麼「聊天」不夠 1.1 Chatbot 與 Coworker 的差別 絕大多數 LLM 產品的產出是一段文字。你問它「幫我整理這週 Jira 上的 release 狀態」， 它回你一段 Markdown，然後你複製、貼上、修正格式、再手動貼到 Slack。
OpenWorker 的定位寫在 README 第一行：
AI that gets your everyday tasks done — delivers finished work, not just chat.
差別在於「最後一哩路」由誰走：
┌──────────────────────────────────────────────────────────────────┐ │ Chatbot 模式 │ │ │ │ 你 ──問題──▶ LLM ──文字──▶ 你 ──手動──▶ 檔案 / Slack / 行事曆 │ │ ▲ │ │ └── 這段仍然是人在做 │ └──────────────────────────────────────────────────────────────────┘ ┌──────────────────────────────────────────────────────────────────┐ │ Coworker 模式 │ │ │ │ 你 ──目標──▶ Agent ──工具呼叫──▶ 檔案 / Slack / 行事曆 │ │ │ ▲ │ │ └──「要送出了，OK 嗎？」┘ │ │ │ │ │ ▼ │ │ 你只做「批准」這一個動作 │ └──────────────────────────────────────────────────────────────────┘ 這個轉換帶來的不是體驗優化，而是全新的工程問題：</description></item><item><title>QM 深度解析（三）：Harness 抽象 — 一套核心驅動四種 Agent 引擎</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/qm-multiplayer-agent-part3-harness-abstraction-zh/</link><pubDate>Fri, 07 Aug 2026 16:00:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/qm-multiplayer-agent-part3-harness-abstraction-zh/</guid><description>「支援多種 Agent 引擎」聽起來像是寫幾個 adapter。 但 Pi 跑在同進程裡、OpenCode 是一個 HTTP sidecar、 Codex 講 JSON-RPC、Claude Code 用 SDK 加 in-process MCP。 它們的工具怎麼註冊、怎麼中斷、能不能收圖片，四家四個答案。 抽象的難點不是「共同介面」，是「差異怎麼被誠實地表達出來」。
本篇是 QM 深度解析系列 的第三篇，主角是 src/harness/（10,022 行）與 src/core/orchestrator.ts（2,863 行）。
一、四個引擎，四種完全不同的接法 先看結論。defineHarness() 的第一個參數就是各引擎的自我宣告：
1// pi-harness.ts 2{ id: &amp;#34;pi&amp;#34;, controlTransport: &amp;#34;in-process&amp;#34;, toolTransport: &amp;#34;in-process&amp;#34;, 3 transcriptFormat: &amp;#34;pi&amp;#34;, 4 capabilities: new Set([&amp;#34;abort&amp;#34;,&amp;#34;steer&amp;#34;,&amp;#34;images&amp;#34;,&amp;#34;thinking-level&amp;#34;,&amp;#34;fast-mode&amp;#34;,&amp;#34;provider-sessions&amp;#34;]) } 5 6// claude-harness.ts 7{ id: &amp;#34;claude&amp;#34;, controlTransport: &amp;#34;sdk&amp;#34;, toolTransport: &amp;#34;in-process-mcp&amp;#34;, 8 transcriptFormat: &amp;#34;claude-agent-sdk&amp;#34;, 9 capabilities: new Set([&amp;#34;abort&amp;#34;,&amp;#34;steer&amp;#34;,&amp;#34;images&amp;#34;,&amp;#34;thinking-level&amp;#34;,&amp;#34;fast-mode&amp;#34;]) } 10 11// opencode-harness.</description></item><item><title>OpenWorker 深度解析（三）：Harness — 權限模型、Inbox 與人機協作</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/openworker-intro-part3-harness-permissions-inbox-zh/</link><pubDate>Fri, 07 Aug 2026 11:00:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/openworker-intro-part3-harness-permissions-inbox-zh/</guid><description>大多數 agent 專案的安全設計是：「危險工具加一個 confirm()」。 好一點的會做 allowlist。 但真正的問題不是「要不要問」，而是「沒人在的時候要問誰」、 「問完之後進程重開了怎麼辦」、以及「模型讀到的網頁叫它去打 169.254.169.254 怎麼辦」。
本篇是 OpenWorker 深度解析系列 的第三篇。前一篇把 agent 迴圈拆完了，這一篇處理迴圈外面的東西 —— 也就是 harness（外殼）。
一、Harness 是什麼，以及為什麼它比迴圈大 30 倍 「Agent harness」指的是包在 LLM 迴圈外面、決定它能做什麼、不能做什麼、 做之前要不要問人的那一整套機制。
┌─────────────────────────────────────────────────────────────────────────┐ │ Harness（本篇主題） │ │ │ │ ┌───────────────┐ ┌────────────────┐ ┌──────────────────────────┐ │ │ │ 風險分類 │ │ 權限決策 │ │ 人類決策路由 │ │ │ │ risk.py 58 行 │─▶│ permissions.py │─▶│ Inbox 368 + unattended │ │ │ └───────────────┘ │ 238 行 │ │ + durable resume │ │ │ └────────────────┘ └──────────────────────────┘ │ │ │ │ ┌───────────────┐ ┌────────────────┐ ┌──────────────────────────┐ │ │ │ 輸入防線 │ │ 輸出防線 │ │ 稽核 │ │ │ │ web/guard.</description></item></channel></rss>