Get started
ชุดควบคุม Copilot SDK
Plugin ภายนอก @openclaw/copilot เรียกใช้รอบการทำงานของเอเจนต์ Copilot แบบฝังตัวภายใต้การสมัครใช้งานผ่าน GitHub Copilot CLI (@github/copilot-sdk) แทนชุดควบคุมในตัวของ OpenClaw เซสชัน Copilot CLI เป็นผู้ควบคุมลูปเอเจนต์ระดับล่าง ได้แก่ การเรียกใช้เครื่องมือแบบเนทีฟ, Compaction แบบเนทีฟ (infiniteSessions) และสถานะเธรดที่ CLI จัดการภายใต้ copilotHome ส่วน OpenClaw ยังคงควบคุมช่องทางแชต ไฟล์เซสชัน การเลือกโมเดล เครื่องมือแบบไดนามิก (ผ่านบริดจ์) การอนุมัติ การส่งสื่อ สำเนาทรานสคริปต์ที่มองเห็นได้ คำถามแทรกระหว่างงานผ่าน /btw (ดู คำถามแทรก (/btw)) และ openclaw doctor
สำหรับภาพรวมการแบ่งหน้าที่ระหว่างโมเดล/ผู้ให้บริการ/รันไทม์ ให้เริ่มจาก รันไทม์ของเอเจนต์
ข้อกำหนด
- OpenClaw ที่ติดตั้ง Plugin
@openclaw/copilotแล้ว - หากการกำหนดค่าของคุณใช้
plugins.allowให้รวมcopilot(รหัสแมนิเฟสต์ที่ Plugin ประกาศ) รายการในบัญชีอนุญาตที่ใช้ชื่อแพ็กเกจ npm@openclaw/copilotจะไม่ตรงกันและทำให้ Plugin ยังคงถูกบล็อก แม้จะตั้งค่าagentRuntime.id: "copilot"แล้วก็ตาม - การสมัครใช้งาน GitHub Copilot ที่สามารถใช้งาน Copilot CLI ได้ หรือ env var
gitHubToken/ รายการโปรไฟล์การยืนยันตัวตนสำหรับการทำงานแบบไม่มีส่วนติดต่อหรือ Cron - ไดเรกทอรี
copilotHomeที่เขียนได้ ค่าเริ่มต้นคือ<agentDir>/copilotเมื่อ OpenClaw ระบุไดเรกทอรีเอเจนต์ มิฉะนั้นจะเป็น~/.openclaw/agents/<agentId>/copilot
openclaw doctor เรียกใช้สัญญา doctor ของ Plugin สำหรับการเป็นเจ้าของสถานะเซสชันและการย้ายการกำหนดค่าในอนาคต แต่จะไม่ตรวจสอบสภาพแวดล้อม Copilot CLI
การติดตั้ง
รันไทม์ Copilot จัดส่งเป็น Plugin ภายนอก เพื่อไม่ให้แพ็กเกจหลัก openclaw ต้องรวม @github/copilot-sdk หรือไบนารี CLI @github/copilot-<platform>-<arch> เฉพาะแพลตฟอร์ม (รวมกันประมาณ 260 MB) ให้ติดตั้งเฉพาะสำหรับเอเจนต์ที่เลือกใช้รันไทม์นี้:
openclaw plugins install @openclaw/copilotตัวช่วยตั้งค่าจะติดตั้ง Plugin โดยอัตโนมัติในครั้งแรกที่คุณเลือกโมเดล github-copilot/* และ การกำหนดค่าของคุณกำหนดเส้นทางโมเดลนั้น (หรือผู้ให้บริการของโมเดล) ไปยังรันไทม์ Copilot ผ่าน agentRuntime: { id: "copilot" }; ดูเริ่มต้นอย่างรวดเร็ว หากไม่ได้เลือกใช้ดังกล่าว OpenClaw จะใช้ผู้ให้บริการ GitHub Copilot ในตัวและจะไม่ติดตั้ง Plugin นี้
รันไทม์ค้นหา SDK ตามลำดับต่อไปนี้:
import("@github/copilot-sdk")จากแพ็กเกจ@openclaw/copilotที่ติดตั้งไว้- ไดเรกทอรีสำรอง
~/.openclaw/npm-runtime/copilot/(ตำแหน่งเป้าหมายแบบเดิมสำหรับการติดตั้งตามต้องการ)
หากไม่พบ SDK ระบบจะแสดงข้อผิดพลาดหนึ่งรายการพร้อมรหัส COPILOT_SDK_MISSING และคำสั่งติดตั้งใหม่ข้างต้น
เริ่มต้นอย่างรวดเร็ว
ตรึงโมเดลหนึ่งรายการ (หรือผู้ให้บริการหนึ่งราย) เข้ากับชุดควบคุม:
{ agents: { defaults: { model: "github-copilot/auto", models: { "github-copilot/auto": { agentRuntime: { id: "copilot" }, }, }, }, },}ตั้งค่า agentRuntime.id ในรายการโมเดลเดียวเพื่อกำหนดเส้นทางเฉพาะโมเดลนั้นผ่านชุดควบคุม หรือตั้งค่าในผู้ให้บริการเพื่อกำหนดเส้นทางทุกโมเดลภายใต้ผู้ให้บริการนั้น
github-copilot/auto เป็นจุดเริ่มต้นที่ใช้งานได้ในหลายสภาพแวดล้อม โมเดล Copilot ที่ระบุชื่อขึ้นอยู่กับนโยบายของบัญชีและองค์กร ให้ตรวจสอบว่า Copilot CLI ที่ยืนยันตัวตนแล้วของคุณแสดงโมเดลดังกล่าวจริงก่อนตรึงโมเดล
ผู้ให้บริการที่รองรับ
ชุดควบคุมรองรับผู้ให้บริการมาตรฐาน github-copilot (เป็นของ extensions/github-copilot) รวมถึงรายการ models.providers แบบกำหนดเอง เมื่อโมเดลมี baseUrl ที่ไม่ว่างและใช้รูปแบบ api อย่างใดอย่างหนึ่งต่อไปนี้:
anthropic-messagesazure-openai-responsesollama(การเติมข้อความที่เข้ากันได้กับ OpenAI)openai-completionsopenai-responses
รหัสผู้ให้บริการแบบเนทีฟ (openai, anthropic, google, ollama) ยังคงอยู่ภายใต้การควบคุมของรันไทม์เนทีฟแต่ละตัว ให้ใช้รหัสผู้ให้บริการแบบกำหนดเองที่แตกต่างกัน หากต้องการกำหนดเส้นทางปลายทางผ่าน Copilot BYOK แทน
ปลายทาง Copilot BYOK ต้องเป็น URL HTTPS สาธารณะ ชุดควบคุมจะมอบพร็อกซี local loopback แยกตามแต่ละครั้งที่พยายามทำงานให้ Copilot SDK จากนั้นส่งต่อทราฟฟิกของผู้ให้บริการผ่านเส้นทาง fetch ที่ OpenClaw ป้องกันไว้ เพื่อให้การตรึง DNS และนโยบาย SSRF ยังคงอยู่ภายใต้การควบคุมของ OpenClaw ให้ใช้รันไทม์ OpenClaw แบบเนทีฟสำหรับ Ollama ภายในเครื่อง, LM Studio หรือเซิร์ฟเวอร์โมเดลบน LAN
BYOK
Copilot BYOK ใช้สัญญาผู้ให้บริการแบบกำหนดเองระดับเซสชันของ SDK โดย OpenClaw จะส่งปลายทางโมเดลที่แก้ไขแล้ว คีย์ API โหมด bearer token ส่วนหัว รหัสโมเดล และขีดจำกัดบริบท/เอาต์พุต ส่วนตรรกะการรับส่งข้อมูลของผู้ให้บริการยังคงอยู่ใน SDK ไม่ใช่ในส่วนหลัก
{ agents: { defaults: { model: "custom-proxy/llama-3.1-8b", models: { "custom-proxy/llama-3.1-8b": { agentRuntime: { id: "copilot" }, }, }, }, }, models: { mode: "merge", providers: { "custom-proxy": { baseUrl: "https://api.example.com/v1", apiKey: "${CUSTOM_PROXY_API_KEY}", api: "openai-responses", authHeader: true, models: [{ id: "llama-3.1-8b", name: "Llama 3.1 8B" }], }, }, },}เซสชัน BYOK จะใช้คีย์แยกจากเซสชันการสมัครใช้งาน และแยกจากปลายทางหรือข้อมูลประจำตัว BYOK อื่น ๆ การหมุนเวียนคีย์ ส่วนหัว โมเดล หรือปลายทางจะเริ่มเซสชัน Copilot SDK ใหม่ แทนการกลับมาใช้สถานะที่ไม่เข้ากันต่อ
การยืนยันตัวตน
ลำดับความสำคัญที่ใช้แยกตามเอเจนต์ระหว่าง runCopilotAttempt:
-
ระบุ
useLoggedInUser: trueโดยชัดแจ้ง ในอินพุตของความพยายาม — ใช้ผู้ใช้ที่เข้าสู่ระบบของ Copilot CLI ภายใต้copilotHomeของเอเจนต์ -
ระบุ
gitHubTokenโดยชัดแจ้ง ในอินพุตของความพยายาม (ต้องมีprofileId+profileVersion) สำหรับการเรียกใช้ CLI โดยตรงและการทดสอบที่ต้องข้ามการแก้ไขโปรไฟล์การยืนยันตัวตน -
resolvedApiKey+authProfileIdที่แก้ไขตามสัญญาแล้ว — เส้นทางหลักสำหรับการใช้งานจริง ส่วนหลักจะแก้ไขโปรไฟล์การยืนยันตัวตนgithub-copilotที่กำหนดค่าไว้ของเอเจนต์ (src/infra/provider-usage.auth.ts:resolveProviderAuths) ก่อนเรียกใช้ชุดควบคุม ดังนั้นโปรไฟล์การยืนยันตัวตนgithub-copilot:<profile>จึงทำงานได้ตั้งแต่ต้นจนจบสำหรับการตั้งค่าแบบไม่มีส่วนติดต่อ, Cron หรือหลายโปรไฟล์โดยไม่ต้องใช้ env var -
การใช้ env var สำรอง โดยตรวจสอบตามลำดับนี้ (ค่าที่ไม่ว่างค่าแรกจะถูกใช้ สตริงว่างถือว่าไม่มีค่า และสอดคล้องกับลำดับความสำคัญของผู้ให้บริการ
github-copilotที่จัดส่งในextensions/github-copilot/auth.ts):OPENCLAW_GITHUB_TOKEN— ค่าแทนที่เฉพาะชุดควบคุม ช่วยให้คุณตรึงโทเค็นสำหรับชุดควบคุม OpenClaw โดยไม่รบกวนการกำหนดค่าgh/ Copilot CLI ทั่วทั้งระบบCOPILOT_GITHUB_TOKEN— env var มาตรฐานของ Copilot SDK / CLIGH_TOKEN— env var มาตรฐานของghCLIGITHUB_TOKEN— โทเค็น GitHub สำรองแบบทั่วไป
รหัสโปรไฟล์พูลที่สังเคราะห์ขึ้นคือ
env:<NAME>ส่วนเวอร์ชันโปรไฟล์เป็นลายนิ้วมือ sha256 ของโทเค็นที่ย้อนกลับไม่ได้ ดังนั้นการหมุนเวียนค่า env จะล้างพูลไคลเอนต์ได้อย่างสมบูรณ์ -
ค่าเริ่มต้น
useLoggedInUserเมื่อไม่มีสัญญาณโทเค็น
เอเจนต์แต่ละตัวจะมี copilotHome ของตนเอง เพื่อไม่ให้โทเค็น เซสชัน และการกำหนดค่าของ Copilot CLI รั่วไหลระหว่างเอเจนต์บนเครื่องเดียวกัน ค่าเริ่มต้นคือ <agentDir>/copilot (เก็บสถานะ SDK แยกจากไดเรกทอรีเดียวกับ models.json / auth-profiles.json ของ OpenClaw) หรือ ~/.openclaw/agents/<agentId>/copilot เมื่อไม่ได้ระบุไดเรกทอรีเอเจนต์ สามารถแทนที่ด้วย copilotHome: <path> ในอินพุตของความพยายามเพื่อใช้ตำแหน่งแบบกำหนดเอง (ตัวอย่างเช่น เมานต์ที่ใช้ร่วมกันสำหรับการย้ายข้อมูล)
การทดสอบชุดควบคุมแบบสดใช้ OPENCLAW_COPILOT_AGENT_LIVE_TOKEN สำหรับโทเค็นโดยตรง การตั้งค่าการทดสอบแบบสดที่ใช้ร่วมกันจะล้าง COPILOT_GITHUB_TOKEN, GH_TOKEN และ GITHUB_TOKEN หลังจากจัดเตรียมโปรไฟล์การยืนยันตัวตนจริงไว้ในโฮมทดสอบแบบแยก ดังนั้นค่า gh auth token ที่ส่งผ่านตัวแปรเฉพาะจะช่วยหลีกเลี่ยงการข้ามการทดสอบโดยผิดพลาด โดยไม่รั่วไหลไปยังชุดทดสอบอื่นที่ไม่เกี่ยวข้อง
พื้นผิวการกำหนดค่า
ชุดควบคุมอ่านการกำหนดค่าจากอินพุตแยกตามความพยายาม (runCopilotAttempt({...})) รวมกับค่าเริ่มต้นจาก env จำนวนเล็กน้อยภายใน extensions/copilot/src/:
| ฟิลด์ | วัตถุประสงค์ |
|---|---|
copilotHome |
ไดเรกทอรีสถานะ CLI แยกตามเอเจนต์ (ใช้ค่าเริ่มต้นข้างต้น) |
model |
สตริงหรือ { provider, id, api?, baseUrl?, headers?, authHeader? } ไม่ต้องระบุเพื่อใช้การเลือกโมเดลตามปกติของเอเจนต์ ชุดควบคุมจะตรวจสอบว่ารองรับผู้ให้บริการที่แก้ไขแล้ว |
reasoningEffort |
"low" | "medium" | "high" | "xhigh" แมปจากการแก้ไข ThinkLevel / ReasoningLevel ของ OpenClaw ใน auto-reply/thinking.ts |
infiniteSessionConfig |
ค่าแทนที่เพิ่มเติมสำหรับบล็อก infiniteSessions ของ SDK ซึ่งขับเคลื่อนโดย harness.compact ปล่อยไว้ตามเดิมได้อย่างปลอดภัย |
hooksConfig |
การกำหนดค่า SessionHooks แบบเนทีฟของ Copilot SDK ที่ไม่บังคับ สำหรับคอลแบ็กเครื่องมือ/MCP พรอมต์ผู้ใช้ เซสชัน และข้อผิดพลาด โดยแยกจากฮุกวงจรชีวิตแบบพกพาของ OpenClaw |
permissionPolicy |
ค่าแทนที่เพิ่มเติมสำหรับตัวจัดการ onPermissionRequest ของ SDK สำหรับชนิดเครื่องมือ SDK ในตัว (shell, write, read, url, mcp, memory, hook) ค่าเริ่มต้นคือ rejectAllPolicy เพื่อเป็นกลไกความปลอดภัยสำรอง ดูสิทธิ์และ ask_user เพื่อดูเหตุผลว่าทำไมจึงไม่มีการเรียกใช้จริง |
enableSessionTelemetry |
แฟล็กเทเลเมทรีเซสชัน SDK ที่ไม่บังคับ |
ฮุก Plugin ของ OpenClaw ไม่ต้องใช้การกำหนดค่าความพยายามเฉพาะ Copilot ชุดควบคุมเรียกใช้ before_prompt_build (และฮุกความเข้ากันได้แบบเดิม before_agent_start), llm_input, llm_output และ agent_end ผ่านตัวช่วยมาตรฐานของชุดควบคุม Compaction ของ SDK ที่สำเร็จจะเรียกใช้ before_compaction และ after_compaction ด้วย เครื่องมือ OpenClaw ที่เชื่อมผ่านบริดจ์จะเรียกใช้ before_tool_call และรายงาน after_tool_call ส่วน hooksConfig ยังคงมีไว้สำหรับคอลแบ็กเฉพาะ SDK แบบเนทีฟที่ไม่มีรูปแบบเทียบเท่าแบบพกพา
ส่วนอื่นของ OpenClaw ไม่จำเป็นต้องรับรู้เกี่ยวกับฟิลด์เหล่านี้ Plugin ช่องทาง และโค้ดส่วนหลักอื่น ๆ จะเห็นเฉพาะรูปแบบมาตรฐาน AgentHarnessAttemptParams / AgentHarnessAttemptResult
Compaction
เมื่อ harness.compact ทำงาน ชุดควบคุม Copilot SDK จะ:
- กลับมาใช้เซสชัน SDK ที่ติดตามไว้โดยไม่ดำเนินงานที่ค้างอยู่ต่อ
- เรียก RPC สำหรับ Compaction ประวัติระดับเซสชันของ SDK
- ส่งคืนผลลัพธ์ Compaction ของ SDK โดยไม่เขียนไฟล์เครื่องหมายความเข้ากันได้ภายใต้เวิร์กสเปซ
สำเนาทรานสคริปต์ฝั่ง OpenClaw (ด้านล่าง) จะยังคงรับข้อความหลัง Compaction เพื่อให้ประวัติแชตที่ผู้ใช้เห็นมีความสอดคล้อง
การทำสำเนาทรานสคริปต์
runCopilotAttempt เขียนข้อความที่สามารถทำสำเนาได้ของแต่ละรอบพร้อมกันลงในทรานสคริปต์การตรวจสอบของ OpenClaw ผ่าน extensions/copilot/src/dual-write-transcripts.ts สำเนาจะมีขอบเขตแยกตามเซสชัน (copilot:${sessionId}) และใช้คีย์แยกตามข้อความ (${role}:${sha256_16(role,content)}) ดังนั้นรายการจากรอบก่อนหน้าที่ถูกส่งออกซ้ำจะชนกับคีย์บนดิสก์ที่มีอยู่ แทนที่จะสร้างรายการซ้ำ
มิเรอร์ถูกห่อหุ้มด้วยการจำกัดความเสียหายจากความล้มเหลวสองชั้น เพื่อให้ความล้มเหลวในการเขียนบทถอดความไม่ทำให้ความพยายามล้มเหลว ได้แก่ ตัวห่อหุ้มภายในแบบพยายามให้ดีที่สุด และ .catch(...) แบบการป้องกันเชิงลึกที่ระดับความพยายาม ความล้มเหลวจะถูกบันทึกลงล็อก ไม่ถูกแสดงออกมา
คำถามแทรก (/btw)
/btw ไม่ใช่ความสามารถเนทีฟบนฮาร์เนสนี้ createCopilotAgentHarness() จงใจปล่อยให้ harness.runSideQuestion เป็น undefined (ยืนยันไว้ใน extensions/copilot/harness.test.ts, describe("runSideQuestion")) ดังนั้นตัวกระจายงาน /btw ของ OpenClaw (src/agents/btw.ts) จะไหลต่อไปยังเส้นทางเดียวกับที่ใช้กับรันไทม์ที่ไม่ใช่ Codex ทั้งหมด กล่าวคือ เรียกผู้ให้บริการโมเดลที่กำหนดค่าไว้โดยตรงด้วยพรอมต์คำถามแทรกแบบสั้น และสตรีมผลลัพธ์กลับผ่าน streamSimple (ไม่มีเซสชัน CLI และไม่ใช้สล็อตพูลเพิ่มเติม)
วิธีนี้สงวนเซสชัน Copilot CLI ไว้สำหรับลูปเทิร์นหลักของเอเจนต์ และทำให้พฤติกรรมของ /btw เหมือนกับรันไทม์อื่นที่ไม่ใช่ Codex
Doctor
extensions/copilot/doctor-contract-api.ts ถูกโหลดโดยอัตโนมัติผ่าน src/plugins/doctor-contract-registry.ts โดยเพิ่มรายการต่อไปนี้:
legacyConfigRulesว่างเปล่า (ยังไม่มีฟิลด์ที่เลิกใช้งาน)normalizeCompatibilityConfigที่ไม่ดำเนินการใด ๆ (เก็บไว้เพื่อให้การเลิกใช้ฟิลด์ในอนาคตมีตำแหน่งที่เสถียรภายในซอร์สทรี)- รายการ
sessionRouteStateOwnersหนึ่งรายการ: ผู้ให้บริการgithub-copilot, รันไทม์copilot, คีย์เซสชัน CLIcopilot, คำนำหน้าโปรไฟล์การยืนยันตัวตนgithub-copilot:
ข้อจำกัด
- ฮาร์เนสอ้างสิทธิ์
github-copilotรวมถึงรหัสผู้ให้บริการ BYOK แบบกำหนดเองที่ไม่มีเจ้าของ รหัสผู้ให้บริการเนทีฟที่มีแมนิเฟสต์เป็นเจ้าของจะยังคงอยู่กับรันไทม์เจ้าของ แม้บังคับagentRuntime.idเป็นcopilot - ไม่มีพื้นผิว TUI โดย TUI ของ PI ยังคงเป็นตัวสำรองสำหรับรันไทม์ที่ไม่มีพื้นผิวคู่กัน
- สถานะเซสชัน PI จะไม่ถูกย้ายเมื่อเอเจนต์เปลี่ยนไปใช้
copilotการเลือกจะทำต่อความพยายาม ส่วนเซสชัน PI ที่มีอยู่ยังคงใช้งานได้ ask_userใช้เส้นทางพรอมต์และการตอบกลับของ OpenClaw แบบเดียวกับฮาร์เนส Codex: เมื่อ Copilot SDK ขอข้อมูลจากผู้ใช้ OpenClaw จะโพสต์พรอมต์แบบบล็อกไปยังช่องทาง/TUI ที่ใช้งานอยู่ และข้อความผู้ใช้ลำดับถัดไปในคิวจะทำให้คำขอของ SDK เสร็จสมบูรณ์
สิทธิ์และ ask_user
การบังคับใช้นโยบายสิทธิ์สำหรับเครื่องมือ OpenClaw ที่เชื่อมต่อผ่านบริดจ์เกิดขึ้น ภายในตัวห่อหุ้มเครื่องมือ ไม่ใช่ผ่านคอลแบ็ก onPermissionRequest ของ SDK โดย wrapToolWithBeforeToolCallHook เดียวกับที่ PI ใช้ (src/agents/agent-tools.before-tool-call.ts) จะถูก createOpenClawCodingTools นำไปใช้กับเครื่องมือเขียนโค้ดทุกตัว การตรวจจับลูป นโยบาย Plugin ที่เชื่อถือได้ ฮุกก่อนเรียกเครื่องมือ และการอนุมัติ Plugin แบบสองระยะผ่าน Gateway (plugin.approval.request) ล้วนทำงานผ่านเส้นทางโค้ดเดียวกันทุกประการกับความพยายามแบบเนทีฟของ PI
เครื่องมือ SDK ที่ convertOpenClawToolToSdkTool ส่งคืนถูกทำเครื่องหมายด้วย:
overridesBuiltInTool: true— แทนที่เครื่องมือในตัวของ Copilot CLI ที่มีชื่อเดียวกัน (edit, read, write, bash, ...) เพื่อให้การเรียกเครื่องมือทุกครั้งถูกส่งกลับไปยัง OpenClawskipPermission: true— สั่ง SDK ไม่ให้เรียกonPermissionRequest({kind: "custom-tool"})ก่อนเรียกใช้เครื่องมือexecute()ที่ถูกห่อหุ้มทำการตรวจสอบนโยบาย OpenClaw ที่ละเอียดกว่าอยู่แล้ว พรอมต์ระดับ SDK จะทำได้เพียงข้ามการบังคับใช้ของ OpenClaw (อนุญาตทั้งหมด) หรือบล็อกการเรียกเครื่องมือทั้งหมด (ปฏิเสธทั้งหมด) ซึ่งทั้งสองแบบไม่สอดคล้องกับความเท่าเทียมกับ PI
ฮาร์เนส Codex ภายในซอร์สทรีใช้การแบ่งหน้าที่แบบเดียวกัน กล่าวคือ เครื่องมือ OpenClaw ที่เชื่อมต่อผ่านบริดจ์จะถูกห่อหุ้ม (extensions/codex/src/app-server/dynamic-tools.ts) และชนิดการอนุมัติแบบเนทีฟของ codex-app-server (item/commandExecution/requestApproval, item/fileChange/requestApproval, item/permissions/requestApproval) จะถูกส่งผ่าน plugin.approval.request (extensions/codex/src/app-server/approval-bridge.ts) ส่วนกลไกที่เทียบเท่าใน Copilot SDK คือ rejectAllPolicy แบบปิดเมื่อเกิดความล้มเหลว สำหรับชนิดใด ๆ ที่ไม่ใช่ custom-tool ซึ่งอาจไปถึง onPermissionRequest โดยทำหน้าที่เป็นตาข่ายนิรภัยเดียวกัน และในทางปฏิบัติจะไม่ถูกเรียกเลย เพราะ overridesBuiltInTool: true แทนที่เครื่องมือในตัวทั้งหมด
เพื่อให้ชั้นเครื่องมือที่ถูกห่อหุ้มตัดสินใจด้านนโยบายได้เทียบเท่ากับ PI ฮาร์เนสจะส่งต่อบริบทเครื่องมือของความพยายาม PI แบบครบถ้วนไปยัง createOpenClawCodingTools ได้แก่ อัตลักษณ์ (senderIsOwner, memberRoleIds, ownerOnlyToolAllowlist, ...), ช่องทาง/การกำหนดเส้นทาง (groupId, currentChannelId, replyToMode, ตัวสลับเครื่องมือข้อความ), การยืนยันตัวตน (authProfileStore), อัตลักษณ์การรัน (sessionKey / runSessionKey ที่ได้มาจาก sandboxSessionKey, runId), บริบทโมเดล (modelApi, modelContextWindowTokens, modelCompat, modelHasVision) และฮุกการรัน (onToolOutcome, onYield) หากไม่มีฟิลด์เหล่านี้ รายการอนุญาตเฉพาะเจ้าของจะปฏิเสธโดยปริยายอย่างเงียบ ๆ นโยบายความเชื่อถือ Plugin จะไม่สามารถระบุขอบเขตที่ถูกต้อง และ session_status: "current" จะอ้างอิงไปยังคีย์แซนด์บ็อกซ์ที่ล้าสมัย ตัวสร้างบริดจ์อยู่ที่ extensions/copilot/src/tool-bridge.ts โดยสะท้อนการเรียก PI ที่เป็นแหล่งอ้างอิงหลัก ณ src/agents/embedded-agent-runner/run/attempt.ts:1262 runAttempt จะระบุบริบทแซนด์บ็อกซ์ผ่านจุดเชื่อมร่วม resolveSandboxContext ส่งไดเรกทอรีทำงานที่มีผลจริงให้ SDK และส่งต่อ sandbox พร้อมเวิร์กสเปซสำหรับสร้างเอเจนต์ย่อยไปยังบริดจ์เครื่องมือ นอกจากนี้ บริดจ์ยังส่งต่อตัวควบคุมการสร้างเครื่องมือแบบมีขอบเขตที่สามารถบังคับใช้ได้ ณ ขอบเขต SDK ได้แก่ includeCoreTools, รายการอนุญาตเครื่องมือของรันไทม์ และ toolConstructionPlan
บริดจ์ยังใช้ตัวช่วยพื้นผิวเครื่องมือของฮาร์เนสร่วมจาก openclaw/plugin-sdk/agent-harness-tool-runtime เพื่อให้เทียบเท่ากับ PI เมื่อเปิดใช้การค้นหาเครื่องมือ SDK จะเห็นเครื่องมือควบคุมแบบกะทัดรัดพร้อมตัวดำเนินการแค็ตตาล็อกที่ซ่อนอยู่ แทนที่จะเห็นสคีมาเครื่องมือ OpenClaw ทั้งหมด เมื่อเปิดใช้โหมดโค้ด ตัวช่วยจะสร้างพื้นผิวควบคุมโหมดโค้ดและวงจรชีวิตแค็ตตาล็อกแบบเดียวกับที่ฮาร์เนสเอเจนต์อื่นใช้ ค่าเริ่มต้นแบบกระชับสำหรับโมเดลภายใน การกรองสคีมาที่เข้ากันได้กับรันไทม์ การเติมข้อมูลไดเรกทอรี และการล้างแค็ตตาล็อก ล้วนอยู่ในตัวช่วยร่วม เพื่อไม่ให้ฮาร์เนส Copilot และฮาร์เนสที่เกี่ยวข้องกับ Codex มีพฤติกรรมคลาดเคลื่อนจากกัน
โทเค็น GitHub ระดับเซสชัน
สัญญาของ Copilot SDK แยกโทเค็น GitHub ระดับไคลเอนต์ (CopilotClientOptions.gitHubToken ซึ่งใช้ยืนยันตัวตนของกระบวนการ CLI เอง) ออกจากโทเค็น ระดับเซสชัน (SessionConfig.gitHubToken ซึ่งกำหนดการยกเว้นเนื้อหา การกำหนดเส้นทางโมเดล และโควตาสำหรับเซสชันนั้น โดยมีผลทั้งกับ createSession และ resumeSession) ฮาร์เนสจะแก้ไขข้อมูลการยืนยันตัวตนครั้งเดียวผ่าน resolveCopilotAuth และกำหนดค่าทั้งสองฟิลด์เมื่อโหมดการยืนยันตัวตนเป็น gitHubToken (auth.gitHubToken ที่ระบุอย่างชัดเจน หรือ resolvedApiKey ที่ได้จากการแก้ไขตามสัญญาจากโปรไฟล์การยืนยันตัวตน github-copilot ที่กำหนดค่าไว้) เมื่อโหมดที่ได้เป็น useLoggedInUser ฟิลด์ระดับเซสชันจะถูกละไว้ เพื่อให้ SDK ยังคงอนุมานอัตลักษณ์จากอัตลักษณ์ที่เข้าสู่ระบบอยู่
ask_user ใช้ SessionConfig.onUserInputRequest บริดจ์ยอมรับดัชนีหรือตัวเลือกแบบป้ายกำกับสำหรับคำขอแบบตัวเลือกคงที่ ยอมรับคำตอบแบบข้อความอิสระเมื่อคำขอของ SDK อนุญาต และยกเลิกคำขอที่รอดำเนินการเมื่อความพยายามของ OpenClaw ถูกยุติ