:Codex Harness 與 dsh 的兩種 Agent Runtime 取向)
寫(xiě)在前面2026 年 8 月兩個(gè)都叫「Harness」的東西前后腳出現(xiàn)在視野里。8 月 13 日 DeepSeek 放出了 dshDeepSeek Harness的開(kāi)發(fā)者預(yù)覽幾天后的 8 月 19 日OpenAI 發(fā)了一篇《Codex as a platform》把已經(jīng)在驅(qū)動(dòng) Codex App、CLI、IDE 的那套執(zhí)行系統(tǒng)正式講成一套可復(fù)用、可嵌入的開(kāi)源 Agent Harness。我這邊把兩邊的官方文檔和源碼都翻了一遍——Codex 那份是 clone 下來(lái)的openai/codex倉(cāng)庫(kù)dsh 是之前就在本地跑過(guò)的deepseek-ai/dsh。翻完最直接的感受是兩者都自稱 harness都在解決「模型之外那層執(zhí)行系統(tǒng)」的問(wèn)題但設(shè)計(jì)取向幾乎是相反的。一個(gè)像整車一個(gè)像底盤(pán)。這篇文章不想給兩者排優(yōu)劣也不預(yù)測(cè)誰(shuí)會(huì)贏。只想講清楚一件事同樣是「模型周圍的執(zhí)行系統(tǒng)」為什么會(huì)長(zhǎng)成兩個(gè)方向以及這兩個(gè)方向分別適合什么場(chǎng)景。先對(duì)齊一個(gè)概念Harness 到底指什么如果你還沒(méi)接觸過(guò)這個(gè)詞可以先記住一個(gè)等式Agent Model Harness。模型負(fù)責(zé)的事其實(shí)很窄——給它上下文它決定下一步做什么產(chǎn)出一段文字或者一次工具調(diào)用。但一個(gè)真實(shí)的任務(wù)遠(yuǎn)不止「決定下一步」。假設(shè)你讓 AI 改一個(gè)倉(cāng)庫(kù)它要先讀文件、再改代碼、然后跑測(cè)試中途可能要申請(qǐng)網(wǎng)絡(luò)權(quán)限進(jìn)程斷了還得能接著來(lái)。這里就冒出一串模型自己答不了的問(wèn)題誰(shuí)記住改到哪一步了誰(shuí)真正去執(zhí)行那條 shell 命令誰(shuí)在危險(xiǎn)操作前攔一下等你批準(zhǔn)失敗了誰(shuí)決定要不要重試這些「臟活累活」的集合就是 Harness。它做的遠(yuǎn)不止給模型套一層 Prompt——狀態(tài)、工具、執(zhí)行邊界、進(jìn)度、審批這一整套圍繞模型運(yùn)轉(zhuǎn)的系統(tǒng)都?xì)w它管。OpenAI 官方的說(shuō)法很直白「That surrounding execution system is the harness.」概念對(duì)齊之后兩種取向的分歧就好講了。Codex 的取向把執(zhí)行層做成一臺(tái)一體化引擎Codex Harness 給人的第一印象是「重」。它的核心實(shí)現(xiàn)是 Rust倉(cāng)庫(kù)里codex-rs目錄下有 104 個(gè) crate子模塊涵蓋 agent loop、協(xié)議、傳輸、沙箱、身份認(rèn)證一整套。這不是一個(gè)輕量腳本而是一臺(tái)編譯成原生二進(jìn)制的執(zhí)行引擎。它對(duì)外暴露能力的方式是三個(gè)層層遞進(jìn)的原語(yǔ)Thread一段可以持續(xù)、可以恢復(fù)的長(zhǎng)期工作回答「這段工作和歷史屬于誰(shuí)」TurnThread 里當(dāng)前這一輪目標(biāo)回答「這一輪怎么開(kāi)始、怎么引導(dǎo)、怎么結(jié)束」Item這一輪里產(chǎn)生的一條可持久化記錄比如一條用戶消息、一次推理、一條 shell 命令、一次文件改動(dòng)你的應(yīng)用通過(guò)一個(gè)叫app-server的進(jìn)程連上它走 JSON-RPC 協(xié)議創(chuàng)建 Thread、啟動(dòng) Turn、流式接收 Item 和事件、在模型要執(zhí)行危險(xiǎn)操作時(shí)把審批請(qǐng)求交回給你的界面。Codex 的 VS Code 插件、CLI本質(zhì)上都是這個(gè) app-server 的客戶端。安全邊界也是「內(nèi)建」的。源碼里按操作系統(tǒng)分了三套沙箱——Linux 走 landlock、macOS 走 seatbelt、Windows 單獨(dú)一套。也就是說(shuō)「在什么范圍內(nèi)能讀寫(xiě)文件、能不能聯(lián)網(wǎng)」這層約束是 harness 自己在 OS 級(jí)別兜住的不用應(yīng)用層自己去搭。這套設(shè)計(jì)的代價(jià)是它只跑 OpenAI 自己的模型。Codex 的 agent loop 深度依賴 OpenAI Responses API 的推理鏈條reasoning items傳遞和壓縮這套機(jī)制是 OpenAI 模型特有的。換句話說(shuō)你拿到的是一臺(tái)調(diào)校好的引擎但油箱只認(rèn)一種油。它的取向可以概括成一句話把執(zhí)行層做厚、做穩(wěn)、做成開(kāi)箱即用代價(jià)是綁定一家模型、內(nèi)核不可改。你能控制的是「給它什么工具、什么上下文、什么審批規(guī)則」但 agent loop 本身的重試策略、上下文壓縮策略你只能用 OpenAI 給的那套。dsh 的取向把一切拆成可替換的插件dsh 的第一印象正好相反——它很「薄」。它基于一個(gè)叫 Cordis 的運(yùn)行時(shí)核心理念只有一句everything is a plugin一切皆插件。薄到什么程度在 dsh 里界面上的按鈕比如文件附件是插件系統(tǒng)提示詞是插件工具調(diào)用是插件——連 agent loop 本身都是一個(gè)插件。你看到的整個(gè)產(chǎn)品是一堆插件在 Cordis 上組裝出來(lái)的結(jié)果。這帶來(lái)一個(gè) Codex 給不了的能力你可以把 loop 換掉。Codex 里 agent loop 的行為是 OpenAI 定死的dsh 里如果你覺(jué)得默認(rèn) loop 太啰嗦、愛(ài)跑偏可以寫(xiě)一個(gè)自己的 loop 插件替換進(jìn)去。dsh 還自帶一個(gè)類似 LangSmith 的 trajectory 視圖agent 每一步動(dòng)作都能點(diǎn)開(kāi)看是哪個(gè)插件產(chǎn)生的、為什么——這種顆粒度的可觀測(cè)性來(lái)自它「一切都是插件」的結(jié)構(gòu)。模型這塊 dsh 也不綁定。它默認(rèn)用 DeepSeek 自家模型但可以通過(guò) API Key 接任意 provider包括走 OpenRouter 接一大堆第三方模型。最能體現(xiàn)取向差異的一點(diǎn)dsh 可以把 Codex、Claude Code 當(dāng)成 sub-agent 來(lái)驅(qū)動(dòng)。它有專門(mén)的插件能在一個(gè) dsh 會(huì)話里把某個(gè)子任務(wù)委派給 Codex 去跑再收回結(jié)果。在 dsh 眼里Codex 不是競(jìng)品而是「一個(gè)特別擅長(zhǎng) OpenAI 模型的可調(diào)用執(zhí)行單元」。代價(jià)也很實(shí)在dsh 目前還是開(kāi)發(fā)者預(yù)覽官方自己都說(shuō)「迭代快到?jīng)]有一處是穩(wěn)定的」。而且它「開(kāi)箱即用」的能力比 Codex 弱——給你的是一個(gè)框架墻得你自己砌。它的取向也能概括成一句話把一切做成可插拔換來(lái)極致的靈活和可組合代價(jià)是穩(wěn)定性和開(kāi)箱體驗(yàn)要你自己補(bǔ)齊。同一個(gè)問(wèn)題的兩種答案三個(gè)分歧點(diǎn)把兩邊放到一起看分歧集中在三個(gè)地方。第一個(gè)分歧是模型綁定。Codex 為了在 OpenAI 模型上榨出最大性能深度適配了一家模型dsh 把模型當(dāng)成可替換的 provider。這更像「專精」與「通用」的經(jīng)典取舍談不上誰(shuí)更先進(jìn)——Codex 官方披露過(guò)一個(gè) ARC-AGI-3 的例子僅靠 harness 層做「保留推理 上下文壓縮」兩項(xiàng)調(diào)整GPT-5.6 Sol 的得分從 13.3% 提到 38.3%同時(shí)輸出 token 減少。這種收益恰恰來(lái)自它跟模型的深度耦合換模型未必能復(fù)現(xiàn)。第二個(gè)分歧是內(nèi)核可不可改。Codex 開(kāi)源的是執(zhí)行層和集成接口但 agent loop 的行為邏輯你只能用不能改dsh 把 loop 本身也做成插件行為邏輯對(duì)你是敞開(kāi)的。前者適合「我信任你的調(diào)校別讓我操心」后者適合「我知道我要什么別擋著我」。第三個(gè)分歧是怎么擴(kuò)展。Codex 的擴(kuò)展入口是 MCP——你把自己的數(shù)據(jù)和操作包成 MCP 服務(wù)接進(jìn)去harness 內(nèi)核不動(dòng)dsh 的擴(kuò)展入口是插件——從 UI 到 loop 到工具哪一層都能換。一個(gè)是「在穩(wěn)定內(nèi)核外圍接?xùn)|西」一個(gè)是「內(nèi)核本身就是可拆的」。有意思的是這兩條路在協(xié)議層反而在慢慢靠攏。dsh、OpenClaw 這類項(xiàng)目都能通過(guò)標(biāo)準(zhǔn)協(xié)議把 Codex 接進(jìn)來(lái)當(dāng)運(yùn)行時(shí)——設(shè)計(jì)取向不同不代表老死不相往來(lái)。那到底該用哪個(gè)先說(shuō)結(jié)論這不是一道二選一的題判斷依據(jù)是「你的系統(tǒng)需要控制到哪一層」。如果你要的是在 OpenAI 模型上快速拿到一套調(diào)校好、開(kāi)箱即用、還帶 OS 級(jí)沙箱的執(zhí)行能力并且能接受綁定一家模型那 Codex Harness 是省心的選擇。尤其當(dāng)你要把 agent 嵌進(jìn)已有產(chǎn)品運(yùn)營(yíng)看板、工單系統(tǒng)、IDEapp-server 那套 Thread/Turn/審批的協(xié)議是現(xiàn)成的。如果你要的是跨模型切換、深度定制 agent 行為、或者把多個(gè) harness 編排到一起那 dsh 的插件架構(gòu)更貼合。它的價(jià)值不在開(kāi)箱而在于你愿意花時(shí)間打磨之后能得到一個(gè)完全長(zhǎng)成你團(tuán)隊(duì)工作流樣子的 harness。還有一種常被忽略的情況你現(xiàn)在可能一個(gè)都不需要。如果你的場(chǎng)景是固定流程的 workflow已有的方案能穩(wěn)定處理狀態(tài)、工具和執(zhí)行邊界那沒(méi)必要為了「用上 harness」而引入 harness。它真正的用武之地是當(dāng)任務(wù)要跨多輪持續(xù)、要在受控環(huán)境里調(diào)工具、要處理審批和失敗恢復(fù)的時(shí)候。一句話收尾Codex 把復(fù)雜度收進(jìn)引擎里替你扛了dsh 把復(fù)雜度攤開(kāi)交給你自己搭。選哪個(gè)取決于你想省心還是想掌控。數(shù)據(jù)口徑本文基于 OpenAI《Codex as a platform》官方文章、openai/codex倉(cāng)庫(kù)Apache-2.0截至 2026-08-26 的快照與 dsh 公開(kāi)資料整理。文中不對(duì)兩者做優(yōu)劣判斷也不預(yù)測(cè)演進(jìn)關(guān)系。