DeepSeek Harness: เฟรมเวิร์คเอเจนต์โอเพ่นซอร์ส ที่ทุกอย่างเป็นปลั๊กอินจริงๆ
สแตคเอเจนต์ครบชุด วางลงบน GitHub แล้ว
DeepSeek วางตัวอย่างสำหรับนักพัฒนาของ DeepSeek Harness (dsh) เมื่อวันที่ 13 สิงหาคม 2026 ที่เก็บโค้ดอยู่ที่ deepseek-ai/deepseek-harness ถึงปลายวันมีดาว 1.6k ดาว, คอมมิต 12,293 ครั้ง และผู้ร่วมพัฒนา 19 คน — ตัวเลขพวกนี้บอกได้ชัดว่านี่ไม่ใช่โปรเจกต์สบายวันหยุด โค้ดเบส 97.1% เป็น TypeScript, 1.6% CSS และ 0.7% Python เวอร์ชันแพ็คเกจตอนเผยแพร่: 0.1.0-rc.5
หน้าแผงขายอยู่ที่ deepseek.com/harness และเอกสารสำหรับนักพัฒนาอยู่ที่ deepseek-harness.github.io/deepseek-harness
ใบอนุญาต MIT
ประโยคเดียวที่บอกทุกอย่าง
จาก README: “เอเจนต์ = โมเดล + Harness”
โมเดลคือจิตวิญญาณ Harness ช่วยให้เอเจนต์ เข้าใจสภาพแวดล้อม, ใช้เครื่องมือ และทำงานต่อเนื่องในสภาพแวดล้อมจริง ทัศนคติของ DeepSeek: ทุกความสามารถ — โมเดล, เครื่องมือ, ทักษะ, เซสชัน, ซานด์บ็อกซ์, สโตรเรจ, ลูป, ตารางเวลา และ UI — ล้วนเป็นปลั๊กอินที่สลับใช้ได้
นี่ไม่ใช่แค่สโลแกน มันถูกบังคับโดยสถาปัตยกรรม
Cordis: เคอร์เนลที่อยู่ใต้ทุกอย่าง
DeepSeek Harness สร้างขึ้นบน Cordis, เฟรมเวิร์คปลั๊กอินที่นำมาฝัง การออกแบบของ Cordis อธิบายไว้ในบทความชื่อ A Programming Paradigm for Spatiotemporal Composability
ทั้งเฟรมเวิร์คลดรูปเหลือ 5 แนวคิด:
- ปลั๊กอินคืออ็อบเจกต์ที่อิมพลีเมนต์ Service มันสามารถเป็นฟังก์ชันที่มี
injectและapply(ctx)ได้ หรือซับคลาสService - คอนเท็กซ์คือที่เก็บบริการ ปลั๊กอินจะอ้างสิทธิ์คีย์ที่คงที่ เช่น
ctx.tools,ctx.llmหรือctx.sessionsปลั๊กอินอื่นจะค้นหาบริการด้วยคีย์ แทนที่จะอิมพอร์ตอิมพลีเมนต์เฉพาะเจาะจง - ประกาศการพึ่งพาบริการผ่าน
injectปลั๊กอินที่ระบุบริการที่ต้องการจะรอจนกว่าบริการเหล่านั้นจะมีอยู่ ไม่ต้องจัดลำดับการเริ่มระบบด้วยตัวเอง - Typed Events สำหรับการสื่อสาร โหมดส่ง 4 แบบ:
emit(ส่งแล้วไม่รอ),waterfall(สไตล์มิดเดิลแวร์กับnext()),parallel(ทุกตัวฟังทำงานพร้อมกัน) และserial(ตัวฟังทำงานตามลำดับพร้อมค่าที่คืนกลับ) - การลงทะเบียนคือเอฟเฟกต์ที่ย้อนกลับได้ ส่วนของพร้อมป์ต์, สคีมาของเครื่องมือ, อะแดปเตอร์, ตัวฟัง — ทุกอย่างติดตั้งผ่าน
ctx.effect()ดังนั้นการโหลดใหม่และการถอดจะคลี่คลายพวกมันได้อย่างคาดเดาได้
โมเดล waterfall ของ Cordis เป็นมิดเดิลแวร์แบบรอบๆ ตัวฟังจะรับ (...args, next) เรียก next() เพื่อส่งต่อไปยังบริการถัดไป; คืนกลับโดยไม่เรียก next() เพื่อขัดจังหวะ สำหรับอีเวนต์การตัดสินใจเดียว การขัดจังหวะคือดีไซน์ — ตัวฟังนโยบายสามารถเป็นเจ้าของการตัดสินใจได้โดยตรง
ทุกอย่างเป็นปลั๊กอิน (จริงๆ)
รายการปลั๊กอินบน deepseek.com/harness บอกขอบเขตความสามารถทั้งหมด:
- Models — แบ็กเอนด์ LLM (DeepSeek, OpenAI, Anthropic, Bedrock, Vertex, Azure, Codex รวมถึงเอนด์พอยต์ที่เข้ากันได้กับ OpenAI ใดๆ)
- Tools — สิ่งที่โมเดลเรียกใช้ได้
- Skills — ชุดพร้อมป์ต์และเครื่องมือที่นำกลับใช้ซ้ำได้
- Sessions — การจัดการสถานะการสนทนา
- Sandboxes — ที่ที่โค้ดรัน (PTY bash, แบ็กเอนด์โลคอล
danger-full-access, ซานด์บ็อกซ์เนทีฟบน landlock) - Storage — การคงอยู่ของเซสชัน
- Loops — ตรรกะการหมุนรอบของเอเจนต์
- Scheduling — การกระจายงานให้ซับเอเจนต์และงาน
- UI — Web UI ที่ให้บริการที่พอร์ต 3080 โดยค่าเริ่มต้น
นักพัฒนาสามารถเลือก สลับ หรือขยายสิ่งเหล่านี้ผ่านการกำหนดค่า — ไม่ต้องแก้ไขซอร์สโค้ดของ DeepSeek Harness เอง Plugin Config Catalog ถูกสร้างอัตโนมัติจากซอร์ส (scripts/gen-config-catalog.ts) และถูกตรวจสอบใหม่โดย CI ดังนั้นทุกฟิลด์ในบล็อก config: ของ cordis.yml จะตรงกับประเภทคอนฟิกที่ปลั๊กอินประกาศไว้อย่างตรงไปตรงมา
โหมดรันไทม์ 4 แบบ
เอกสารมาพร้อมพรีเซ็ต 4 ชุด แต่ละชุดจัดการเคสการใช้งานที่แตกต่างกัน
Standard Mode — เอเจนต์เขียนโค้ดครบถ้วน: แก้ไขไฟล์, เชลล์, ค้นหาไฟล์และเว็บ, ทักษะ, วางแผน, เป้าหมาย, ซับเอเจนต์และเวิร์กโฟลว์ นี่คือประสบการณ์ Web UI ค่าเริ่มต้น
Code Mode — ทุกอย่างใน Standard แต่เครื่องมือถูกเปิดเผยผ่าน Code Mode SDK ดังนั้นโมเดลสามารถรวมการทำงานหลายขั้นเป็นโปรแกรม TypeScript เดียวได้ โปรแกรมที่โมเดลสร้างขึ้นมาแทนการเรียกเครื่องมือหลายรอบ
Minimal Mode — แค่เครื่องมือสองอย่าง: เชลล์ bash ถาวรและ str_replace_editor นี่สำหรับการเปรียบเทียบโมเดลในสภาพแวดล้อมที่ตัดเทา ไม่มีทักษะ ไม่มีวางแผน ไม่มีซับเอเจนต์ — ความสามารถดิบๆ ของโมเดลกับโค้ดเบสจริง
Creator Mode — สร้างมาสำหรับเขียนพรีเซ็ตเอเจนต์แบบกำหนดเอง รวมทุกความสามารถของ Standard mode บวกกับการตรวจสอบรันไทม์, ทดลองปลั๊กอิน Cordis ในหน่วยความจำ และคำแนะนำการสร้างพรีเซ็ต นี่คือวิธีที่คุณสร้างโหมดที่หก หก เจ็ด
ทุกรันติดตามได้
นี่คือจุดที่ Harness โดดเด่นจากเครื่องมือเอเจนต์ส่วนใหญ่ ทุกสิ่งที่โมเดลเห็นถูกบันทึกในบันทึกเซสชันแบบต่อเนื่อง:
- พร้อมป์ต์ระบบ
- เอาต์พุตการให้เหตุผล
- การเรียกเครื่องมือและผลลัพธ์
- การตัดสินใจตารางเวลาของซับเอเจนต์
- ทุกการฉีดคอนเท็กซ์
Web UI มีมุมมอง Trajectory ที่คุณตรวจสอบบันทึกเหล่านี้กรองตามแหล่งที่มา กลับไปต่อ, แยกสาขา, ค้นหา และเล่นซ้ำ — ทั้งสี่อย่างทำงานกับสตรีมอีเวนต์เดียวกัน ไม่มีฐานข้อมูลเทรซแยก ไม่มีขั้นตอนส่งออก เซสชัน JSONL คือ แหล่งข้อมูลที่แท้จริง
สำหรับ Python SDK ไดเรกทอรีเซสชันเก็บ JSONL ที่ไม่บีบอัดซึ่งมีคำขอโมเดลที่ประกอบขึ้นและการเรียกเครื่องมือ ตัวอย่างที่ examples/jsonrpc-agent/minimal.py แสดงสิ่งนี้ตั้งแต่ต้นจนจบ
การกำหนดค่าโมเดล: DeepSeek + อะไรก็ได้
หน้าการกำหนดค่าโมเดล (Configure models) มี 3 ชั้น
DeepSeek Official เปิดการตั้งค่า → Models วางคีย์ API DeepSeek แล้วบันทึก คีย์เป็นแบบเขียนเท่านั้น หลังบันทึก UI จะได้รับตัวอธิบายที่ปกปิด ไม่ใช่ข้อความธรรมดา คีย์อยู่ใน \$DSH_HOME/.credentials.yaml; หน้าการตั้งค่าเก็บแค่การอ้างอิงข้อมูลรับรองเท่านั้น
Catalog providers คลิก “Add provider” เลือก Anthropic หรือ OpenAI วางคีย์ ผู้ให้บริการที่ใช้การตรวจสอบสิทธิ์เนทีฟ (Bedrock ผ่าน AWS creds + region, Vertex ผ่าน ADC project, Azure ผ่าน api-version, Codex ผ่าน OAuth) จะไม่ทำงานกับแค่ฟิลด์คีย์ API — แต่ละตัวต้องการเส้นทางการตรวจสอบสิทธิ์ของตัวเอง
Custom providers สำหรับเกตเวย์บริษัท, เซิร์ฟเวอร์โฮสต์เอง หรือผู้ให้บริการใดๆ ที่ไม่อยู่ในแคตตาล็อก ตั้ง Provider ID ตัวพิมพ์เล็ก (ถาวร — คำขอ เซสชันที่บันทึก ค่าเริ่มต้นโมเดล และการอ้างอิงข้อมูลรับรองทั้งหมดใช้มัน) URL ฐาน โปรโตคอล API ข้อมูลรับรอง และโมเดลอย่างน้อย 1 ตัว
โมเดลภาพต้องการขั้นตอนเพิ่มเติม เนื่องจากเอนด์พอยต์กำหนดเองไม่มีวิธีโฆษณาโหมดที่รองรับ ฟอร์มจึงไม่สามารถตรวจพบการรองรับวิชันอัตโนมัติได้ คุณเพิ่ม input: [text, image] ให้กับโมเดลใน \$DSH_HOME/settings.yaml ถ้าโมเดลกำหนดเองทั้งหมดของคุณรับภาพได้ ตั้งค่า defaultInput: [text, image] ครั้งเดียวที่ระดับผู้ให้บริการ แทนที่จะทำต่อโมเดล ฟิลด์ input เป็นการยืนยัน ไม่ใช่การตรวจสอบ — ถ้าคุณอ้างว่าโมเดลทำวิชันได้ แต่เอนด์พอยต์จริงๆ ไม่ได้ ผู้ให้บริการจะปฏิเสธคำขอ แทนที่จะเป็น Harness
การแก้ไขปัญหาอธิบายไว้โดยตรงในเอกสาร:
MISSING_CREDENTIAL→ เก็บคีย์ผู้ให้บริการผ่านหน้า Models หรือส่งออกตัวแปรสภาพแวดล้อมที่อ้างอิงUNKNOWN_MODEL→ เลือกโมเดลที่กำหนดค่าไว้ หรือเพิ่มโมเดลที่ขาดหายไปให้กับผู้ให้บริการกำหนดเอง- “Get available models returns 401” → ตรวจสอบคีย์ การค้นพบโมเดลเรียกเอนด์พอยต์
GET /modelsที่เข้ากันได้กับ OpenAI ถ้าบริการของคุณไม่เปิดเผยมัน ให้ป้อนโมเดลด้วยตัวเอง - “Image rejected before send” → โมเดลไม่ได้ประกาศโหมด
imageเพิ่มinput: [text, image] - “Provider rejects a request with an image” → โมเดลอ้างว่ามีความสามารถวิชัน แต่เอนด์พอยต์จริงๆ ไม่มี ลบ
imageออกจากรายการแล้วเริ่มเซสชันใหม่ (ภาพเก่าจะยังคงอยู่ในบันทึกเซสชันและจะส่งคำขอเดิมซ้ำไปเรื่อย)
เริ่มต้นใช้งาน: 3 เส้นทาง
เส้นทาง 1: npx @deepseek-ai/dsh web
ติดตั้ง Node.js รันคำสั่งเดียว Web UI เริ่มทำงานที่ http://127.0.0.1:3080 แค่นั้น ไม่ต้องโคลน ไม่ต้องบิลด์ ไม่ต้อง pnpm
npx @deepseek-ai/dsh webจากนั้น: การตั้งค่า → Models → วางคีย์ API DeepSeek เลือกเวิร์กสเปซ (ไดเรกทอรีที่เรียก dsh ใช้งานได้เลย) เริ่มเซสชัน:
สรุปรีโปนี้แล้วระบุแพ็คเกจหลักๆ
เอเจนต์จะอ่านและแก้ไขไฟล์เวิร์กสเปซ รันคำสั่ง มอบหมายงาน และดูแลแผน การทำงานใดๆ ที่ต้องได้รับการอนุมัติตามนโยบายสิทธิ์ที่ใช้งานจะโปปอัปไดอะล็อกใน Web UI ก่อนจะดำเนินการ
เส้นทาง 2: โคลนและบิลด์จากซอร์ส
git clone https://github.com/deepseek-ai/deepseek-harness.gitcd deepseek-harnesspnpm installpnpm run buildpnpm dsh webเส้นทาง 3: Python SDK
ข้อกำหนด: Python 3.10+, Linux x64 / Linux arm64 / macOS 14+ บน arm64, เอนด์พอยต์ที่เข้ากันได้กับ DeepSeek
git clone https://github.com/deepseek-ai/deepseek-harness.gitcd deepseek-harnesspython -m venv .venv. .venv/bin/activatepython -m pip install deepseek-harness-sdkตั้งค่าข้อมูลรับรอง:
export DEEPSEEK_API_KEY=sk-your-key-here# Optional:# export DSH_MODEL=deepseek-v4-flash# export DSH_SYSTEM_PROMPT='You are a helpful software engineer assistant.'รันงานกับเวิร์กสเปซที่แยกออกมา:
python examples/jsonrpc-agent/minimal.py \ --workspace /absolute/path/to/workspace \ --session-root /absolute/path/to/sessions \ --session-id example-001 \ "ตรวจสอบรีโปแล้วแก้ไขเทสต์ที่ล้มเหลว"สำหรับโค้ดของคุณเอง เอนทรีพอยต์ของ SDK คือ DeepSeekHarness ในฐานะคอนเท็กซ์แมเนเจอร์:
from pathlib import Pathfrom deepseek_harness import DeepSeekHarness
config = Path("examples/jsonrpc-agent/minimal.cordis.yml").resolve()workspace = Path("/absolute/path/to/workspace").resolve()sessions = Path("/absolute/path/to/sessions").resolve()
with DeepSeekHarness( provider="deepseek-official", model="deepseek-v4-flash", max_tokens=49_152, cwd=str(workspace), session_root=str(sessions), cordis=str(config),) as harness: result = harness.run( "ตรวจสอบรีโปแล้วแก้ไขเทสต์ที่ล้มเหลว", session_id="example-001", ) print(result.final_response)DeepSeekHarness จะเริ่มรันไทม์ที่รวมมาอย่างขี้เกียจและนำกลับใช้ซ้ำจนกว่าบล็อก with จะจบลง ใช้ ID เซสชันเดิมเพื่อรักษากระบวนการ Bash (ไดเรกทอรีทำงาน ตัวแปรสภาพแวดล้อม ฟังก์ชันเชลล์) ใช้ ID เซสชันใหม่สำหรับงานที่อิสระ
องค์ประกอบ minimal ของ jsonrpc-agent ถูกออกแบบให้เบาเจาะจง: มีแค่ bash ถาวรและ str_replace_editor เป็นเครื่องมือที่เผชิญหน้ากับโมเดล Bash timeout 300 วินาที ขีดจำกัดเอาต์พุตของเอดิเตอร์ 16,000 ตัวอักษร การบีบอัดคอนเท็กซ์ถูกปิดใช้งาน ระบบไฟล์ใช้แบ็กเอนด์โลคอลดิบ — พาธของเอดิเตอร์สามารถเข้าถึงทุกสิ่งที่กระบวนการรันไทม์เห็นได้ เอกสารเตือนอย่างชัดเจน: “รันมันเฉพาะในเช็คเอาต์หรือคอนเทนเนอร์ที่ใช้แล้วทิ้งเท่านั้น” แบ็กเอนด์ PTY ถาวรยังต้องใช้พื้นฐานเทอร์มินัล POSIX ด้วย — ไม่มีการรองรับ Windows สำหรับองค์ประกอบนี้
เขียนปลั๊กอินแรกของคุณ
บทเรียน: ปลั๊กอินแรกของคุณ ปลั๊กอินคือโมดูล TypeScript ที่เอ็กซ์พอร์ตฟังก์ชัน apply:
import type { Context } from '@deepseek-ai/cordis'
export const name = 'hello-plugin'
export function apply(ctx: Context) { console.log('[hello-plugin] plugin loaded!')}ลงทะเบียนมันในแพตช์ cordis.yml:
- insert: - id: hello name: '/absolute/path/to/deepseek-harness/scratch-plugin/src/my-plugin.ts'บูตด้วยโอเวอร์เลย์:
pnpm dsh web --patch ./scratch-plugin/cordis.ymlการล้างข้อมูลอัตโนมัติคือฟีเจอร์เด็ด ทุกสิ่งที่ลงทะเบียนผ่าน ctx — ตัวฟังอีเวนต์ เครื่องมือ ไทเมอร์ — จะถูกล้างเมื่อปลั๊กอินถูกยกเลิกการโหลด ไม่ต้อง removeListener หรือ clearInterval ด้วยตัวเอง สำหรับการล้างข้อมูลอย่างชัดเจน (การเชื่อมต่อเครือข่าย) ให้คืนค่า disposer จาก ctx.effect()
การพึ่งพาถูกประกาศด้วย inject:
export const name = 'my-tool-plugin'export const inject = ['tools']
export function apply(ctx: Context) { // ctx.tools is ready here}Cordis จะรอบริการที่ต้องการทุกตัวก่อนจะโหลดปลั๊กอิน
มีรูปแบบปลั๊กอิน 3 แบบ: ฟังก์ชัน (ข้างต้น), อ็อบเจกต์ที่มี apply และคลาสที่สืบทอดจาก Service ใช้รูปแบบคลาสเมื่อปลั๊กอินตัวเองให้บริการแก่ปลั๊กอินอื่นที่จะใช้บริโภค
เขียนเครื่องมือแรกของคุณ
บทเรียน: สร้างเครื่องมือ ใช้ defineTool จาก @deepseek-ai/dsh-tools:
import type { Context } from '@deepseek-ai/cordis'import { defineTool } from '@deepseek-ai/dsh-tools'
export const name = 'greet-tool'export const inject = ['tools']
export function apply(ctx: Context) { ctx.tools.register(defineTool({ name: 'greet', description: 'Greet someone by name.', parameters: { name: { type: 'string', required: true, description: 'The name to greet', }, }, output: { schema: { type: 'string' }, render: (_args, value) => [{ type: 'text', text: value }], }, async execute(args) { return `Hello, ${args.name}!` }, }))}defineTool จะอนุมานและตรวจสอบ args จาก parameters execute คืนค่าแคนนนิคอลที่ประกาศโดย output.schema output.render แปลงค่าแคนนนิคอลนั้นเป็นเนื้อหาที่เผชิญหน้ากับโมเดล หลังจากรีสตาร์ทด้วยแพตช์แล้ว ถาม Web UI: “ใช้เครื่องมือ greet ทักทาย Ada” โมเดลจะเรียก greet และได้รับ Hello, Ada!
ขั้นตอนต่อไปจากบทเรียนคือ การกำหนดค่าปลั๊กอิน, เอกสารอ้างอิงการสร้างเครื่องมือ (สคีมาที่ซ้อนกัน, ค่าแคนนนิคอล, งานเบื้องหลัง, ฮุคนโยบาย, Code Mode, การ์ด UI) และ การเลเยอร์ความสามารถ (การแบ่งแพ็กเกจ Service Definition → Service Provider → Consumer)
โหมดเอนทรี CLI
คำสั่ง @deepseek-ai/dsh คือตัวเปิดใช้งานผลิตภัณฑ์ มีเอนทรีพอยต์ 4 แบบ:
| คำสั่ง | วัตถุประสงค์ |
|---|---|
dsh --profile <name> |
บูตโปรไฟล์ที่ระบุชื่อภายใต้ \$DSH_HOME/profiles/<name> |
dsh --profile headless "job" |
รันเซสชันที่คงอยู่ใหม่ครั้งเดียว พิมพ์คำตอบสุดท้าย แล้วจบ |
dsh web |
นามแฝงของ --profile web |
dsh plugin --profile <name> <pnpm args> |
จัดการปลั๊กอินของโปรไฟล์โดยส่งต่อไปยัง pnpm |
ไดเรกทอรีที่เรียกใช้คือรากเวิร์กสเปซค่าเริ่มต้น โปรไฟล์ web และ headless จะเริ่มต้นอัตโนมัติจากเทมเพลต์ที่มาพร้อมบนการใช้งานครั้งแรก โปรไฟล์อื่นๆ ทุกตัวต้องถูกสร้างผ่าน dsh plugin
ฟล็กตัวเปิดใช้งานมาที่อันดับแรก โทเค็นแรกที่ตัวเปิดใช้งานไม่รู้จักจะกลายเป็นอาร์กิวเมนต์ของแอป ตัวอย่าง: dsh --profile web --port 8080 จะส่ง --port 8080 ไปยังเว็บแอป ไม่ใช่ตัวเปิดใช้งาน
ไดเรกทอรีโปรไฟล์เก็บ package.json (การพึ่งพาปลั๊กอินนอกต้นไม้ บวกกับแมนิเฟสต์โปรไฟล์ dsh.profile ที่มีรายการ bundles ที่เรียงลำดับ) และ cordis.patch.yml (เลเยอร์แพตช์ของผู้ใช้เอง) ลำดับการประกอบบนรากที่ว่างคือ: แพตช์ของแต่ละบันเดิลตามลำดับ dsh.profile.bundles → cordis.patch.yml ของโปรไฟล์ → \$DSH_HOME/cordis.patch.yml ระดับโฮม → โอเวอร์เลย์ --patch ใช้ --dump-default-config และ --dump-config เพื่อตรวจสอบต้นไม้ที่ประกอบขึ้นโดยไม่ต้องบูตมัน
ปลั๊กอินชุมชนและนิเวศวิทยา
ติดแท็กรีโปปลั๊กอินของคุณด้วย dsh-plugin บน GitHub เพื่อให้คนค้นพบได้ ไซต์ทางการลิงก์ไปยังหน้าแท็ปนั้นโดยตรง มันยังมี ชุมชน Discord DeepSeek Harness สำหรับการสนทนา
โปรเจกต์ใช้ GitHub Discussions สำหรับความคิดเห็นและรายงานบั๊ก เอกสารลิงก์ไปยัง CONTRIBUTING.md สำหรับเวิร์กโฟลว์การพัฒนา, architecture.md สำหรับการออกแบบระบบ และ AGENTS.md สำหรับข้อกำหนดการเขียนโค้ดเฉพาะเอเจนต์
Developer Preview — ใช่ มันจะพังแน่
README ใส่คำนี้ไว้ตัวพิมพ์ใหญ่ทั้งหมด: “จะมีการเปลี่ยนแปลงที่ทำลายความเข้ากันได้แน่นอน”
ปลั๊กอินหลักและ API ยังพัฒนาอยู่หน้าแผงขายบอกโดยตรง: “DeepSeek Harness ยังคงอยู่ใน developer preview และยังคงถูกทดสอบโดยนักพัฒนาที่สร้างฮาร์เนสเอเจนต์”
ถ้าคุณกำลังสร้างบนมัน ให้ปักหมุดคอมมิตฮาช ให้ปลั๊กอินของคุณบางเทียบกับแคตตาล็อกคอนฟิก และคาดหวังว่าจะต้องทดสอบใหม่ทุกครั้งที่ rc bump การล้างข้อมูลอัตโนมัติและการฉีดการพึ่งพาของปลั๊กอินทำให้การทดสอบใหม่ไม่เจ็บปวดเท่าเฟรมเวิร์คแบบโมโนลิธิก แต่ “developer preview” หมายถึงสิ่งที่มันพูดอย่างตรงไปตรงมา
อะไรที่ทำให้มันแตกต่าง
เฟรมเวิร์คเอเจนต์ส่วนใหญ่ทุกวันนี้เริ่มต้นด้วยลูปหมุนรอบ แล้วค่อยติดความสามารถในการขยายทีหลัง Harness กลับกัน: ความสามารถในการขยาย คือ เฟรมเวิร์ค และลูปหมุนรอบแค่ปลั๊กอินอีกตัวหนึ่ง ผลลัพธ์ที่สังเกตเห็นได้คือสามสิ่งที่คุณมักไม่ได้รับในแพ็คเกจเดียว:
- สลับอะไรก็ได้โดยไม่ต้อง fork ไม่ชอบระบบเครื่องมือในตัว? เปลี่ยนมันได้ ต้องการเลเยอร์การกำหนดเส้นทาง LLM อื่น? สลับผู้ให้บริการได้ ทุกอย่างแก้ไขผ่านคีย์บริการของ Cordis
- ความสามารถติดตามตามค่าเริ่มต้น บันทึกแบบต่อเนื่องไม่ใช่แอดออนสังเกตการณ์ มัน คือ วิธีที่เซสชันทำงาน การกลับไปต่อ แยกสาขา ค้นหา และเล่นซ้ำทั้งหมดใช้สตรีมเดียวกัน
- พรีเซ็ตที่ประกอบได้ ไม่ใช่ฟีเจอร์แฟล็ก โหมด 4 แบบ (Standard / Code / Minimal / Creator) แค่ชั้นแพตช์ชุดบันเดิลปลั๊กอินที่เรียงลำดับ คุณสามารถวางชั้นพรีเซ็ตของคุณเองบนได้ด้วย YAML แทนที่จะเป็นโค้ด
ว่าแนวทางนี้จะชนะเหนือ SDK แบบโมโนลิธิกหรือไม่ ขึ้นอยู่กับว่านิเวศปลั๊กอินจะสร้างเครื่องมือและผู้ให้บริการจากบุคคลที่สามมากพอที่จะทำให้เรื่องสลับ/ประกอบใหม่เป็นจริงได้หรือไม่ ด้วยดาว 1.6k และคอมมิต 12k ในวันแรก โมเมนตัมชัดเจนว่ามีอยู่
เอกสารอ้างอิง
- หน้าแผงขาย DeepSeek Harness
- deepseek-ai/deepseek-harness บน GitHub
- คู่มือเริ่มต้นเอกสารนักพัฒนา
- คู่มือการกำหนดค่าโมเดล
- คู่มือ Python SDK
- บทเรียนปลั๊กอินแรกของคุณ
- บทเรียนสร้างเครื่องมือ
- Cordis Primer
- Plugin Config Catalog
- CLI README
- Cordis บน GitHub
- บทความ Cordis: A Programming Paradigm for Spatiotemporal Composability
- แท็ปชุมชน dsh-plugin บน GitHub
- Discord DeepSeek Harness