<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Abstraction on YennJ12 Engineering Blog</title><link>https://yennj12.js.org/yennj12_blog_V4/tags/abstraction/</link><description>Recent content in Abstraction 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/abstraction/feed.xml" rel="self" type="application/rss+xml"/><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></channel></rss>