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 หรือ ตัวแปรสภาพแวดล้อม 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) ติดตั้งเฉพาะสำหรับเอเจนต์ที่เลือกใช้รันไทม์นี้:

bash
openclaw plugins install @openclaw/copilot

ตัวช่วยตั้งค่าจะติดตั้ง Plugin โดยอัตโนมัติเมื่อคุณเลือกโมเดล github-copilot/* เป็นครั้งแรก และ การกำหนดค่าของคุณกำหนดเส้นทางโมเดลนั้น (หรือ ผู้ให้บริการของโมเดล) ไปยังรันไทม์ Copilot ผ่าน agentRuntime: { id: "copilot" }; ดู เริ่มต้นใช้งานอย่างรวดเร็ว หากไม่เลือกใช้ OpenClaw จะใช้ ผู้ให้บริการ GitHub Copilot ในตัวและจะไม่ติดตั้ง Plugin นี้

รันไทม์แก้ไขตำแหน่ง SDK ตามลำดับนี้:

  1. import("@github/copilot-sdk") จากแพ็กเกจ @openclaw/copilot ที่ติดตั้งไว้
  2. ไดเรกทอรีสำรอง ~/.openclaw/npm-runtime/copilot/ (เป้าหมายการติดตั้ง ตามต้องการแบบเดิม)

หากไม่พบ SDK ระบบจะแสดงข้อผิดพลาดหนึ่งรายการพร้อมรหัส COPILOT_SDK_MISSING และ คำสั่งติดตั้งใหม่ด้านบน

เริ่มต้นใช้งานอย่างรวดเร็ว

ตรึงโมเดลหนึ่งรายการ (หรือผู้ให้บริการหนึ่งราย) เข้ากับชุดควบคุม:

json5
{  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-messages
  • azure-openai-responses
  • ollama (completions ที่เข้ากันได้กับ OpenAI)
  • openai-completions
  • openai-responses

รหัสผู้ให้บริการแบบเนทีฟ (openai, anthropic, google, ollama) ยังคงเป็นของ รันไทม์แบบเนทีฟของแต่ละราย หากต้องการกำหนดเส้นทางเอนด์พอยต์ผ่าน Copilot BYOK แทน ให้ใช้รหัสผู้ให้บริการแบบกำหนดเองที่แตกต่างกัน

เอนด์พอยต์ Copilot BYOK ต้องเป็น URL HTTPS สาธารณะ ชุดควบคุมจะมอบ พร็อกซีลูปแบ็กสำหรับแต่ละครั้งที่ลองให้แก่ Copilot SDK จากนั้นส่งต่อทราฟฟิกของผู้ให้บริการ ผ่านเส้นทาง fetch ที่มีการป้องกันของ OpenClaw เพื่อให้ OpenClaw ยังคงเป็นเจ้าของ นโยบายการตรึง DNS และ SSRF ใช้รันไทม์ OpenClaw แบบเนทีฟสำหรับ Ollama ภายในเครื่อง, LM Studio หรือเซิร์ฟเวอร์โมเดลบน LAN

BYOK

Copilot BYOK ใช้สัญญาผู้ให้บริการแบบกำหนดเองระดับเซสชันของ SDK โดย OpenClaw ส่งเอนด์พอยต์โมเดลที่แก้ไขแล้ว คีย์ API โหมด bearer token ส่วนหัว รหัสโมเดล และขีดจำกัดบริบท/เอาต์พุต ส่วนตรรกะการรับส่งข้อมูลของผู้ให้บริการยังคงอยู่ใน SDK ไม่ใช่ ส่วนหลัก

json5
{  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:

  1. useLoggedInUser: true ที่ระบุอย่างชัดเจน ในอินพุตของการลอง — ใช้ ผู้ใช้ที่เข้าสู่ระบบ Copilot CLI ภายใต้ copilotHome ของเอเจนต์

  2. gitHubToken ที่ระบุอย่างชัดเจน ในอินพุตของการลอง (ต้องใช้ profileId + profileVersion) สำหรับการเรียกใช้ CLI โดยตรงและการทดสอบที่ต้อง ข้ามการแก้ไขโปรไฟล์การยืนยันตัวตน

  3. resolvedApiKey + authProfileId ที่แก้ไขตามสัญญา — เส้นทางหลัก สำหรับการใช้งานจริง ส่วนหลักจะแก้ไขโปรไฟล์การยืนยันตัวตน github-copilot ที่กำหนดค่าไว้ของเอเจนต์ (src/infra/provider-usage.auth.ts:resolveProviderAuths) ก่อน เรียกใช้ชุดควบคุม ทำให้โปรไฟล์การยืนยันตัวตน github-copilot:<profile> ทำงานได้ ตั้งแต่ต้นจนจบสำหรับการตั้งค่าแบบไม่มีส่วนติดต่อ, Cron หรือหลายโปรไฟล์โดยไม่ต้องใช้ตัวแปรสภาพแวดล้อม

  4. การใช้ตัวแปรสภาพแวดล้อมสำรอง ตรวจสอบตามลำดับนี้ (ค่าที่ไม่ว่างค่าแรกเป็นผล โดยสตริงว่างถือว่าไม่มีค่า และสะท้อนลำดับความสำคัญของผู้ให้บริการ github-copilot ที่จัดส่งใน extensions/github-copilot/auth.ts):

    1. OPENCLAW_GITHUB_TOKEN — ค่าทดแทนเฉพาะชุดควบคุม ช่วยให้คุณตรึง โทเค็นสำหรับชุดควบคุม OpenClaw ได้โดยไม่รบกวน gh ทั่วทั้งระบบ / การกำหนดค่า Copilot CLI
    2. COPILOT_GITHUB_TOKEN — ตัวแปรสภาพแวดล้อมมาตรฐานของ Copilot SDK / CLI
    3. GH_TOKEN — ตัวแปรสภาพแวดล้อมมาตรฐานของ CLI gh
    4. GITHUB_TOKEN — โทเค็น GitHub สำรองทั่วไป

    รหัสโปรไฟล์พูลที่สังเคราะห์ขึ้นคือ env:&lt;NAME&gt;; เวอร์ชันโปรไฟล์เป็น ลายนิ้วมือ sha256 แบบย้อนกลับไม่ได้ของโทเค็น ดังนั้นการหมุนเวียนค่าสภาพแวดล้อม จะล้างพูลไคลเอนต์ได้อย่างสมบูรณ์

  5. 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({...})) ร่วมกับค่าเริ่มต้นจากตัวแปรสภาพแวดล้อมชุดเล็กภายใน 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, 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 จะ:

  1. ดำเนินเซสชัน SDK ที่ติดตามไว้ต่อโดยไม่ดำเนินงานที่ค้างอยู่ต่อ
  2. เรียก RPC สำหรับ Compaction ประวัติที่กำหนดขอบเขตตามเซสชันของ SDK
  3. ส่งคืนผลลัพธ์ Compaction ของ SDK โดยไม่เขียนไฟล์เครื่องหมายความเข้ากันได้ ภายใต้เวิร์กสเปซ

มิเรอร์ทรานสคริปต์ฝั่ง OpenClaw (ด้านล่าง) ยังคงรับข้อความหลัง Compaction เพื่อให้ประวัติแชตที่ผู้ใช้เห็นสอดคล้องกัน

การทำมิเรอร์ทรานสคริปต์

runCopilotAttempt เขียนข้อความที่ทำสำเนาได้ของแต่ละรอบพร้อมกันลงใน ทรานสคริปต์การตรวจสอบของ OpenClaw ผ่าน extensions/copilot/src/dual-write-transcripts.ts สำเนานี้มีขอบเขตแยกตาม เซสชัน (copilot:${sessionId}) และใช้คีย์แยกตามข้อความ (${role}:${sha256_16(role,content)}) ดังนั้นรายการจากรอบก่อนหน้าที่ถูกส่งออกมาอีกครั้ง จะชนกับคีย์บนดิสก์ที่มีอยู่แทนที่จะสร้างรายการซ้ำ

การจำกัดขอบเขตความล้มเหลวสองชั้นครอบการทำสำเนาไว้ เพื่อให้ความล้มเหลวในการเขียน ทรานสคริปต์ไม่ทำให้ความพยายามล้มเหลว ได้แก่ wrapper แบบพยายามให้ดีที่สุดภายใน และ .catch(...) แบบป้องกันหลายชั้นในระดับความพยายาม ระบบจะบันทึกความล้มเหลวลงในล็อก โดยไม่แสดงออกมา

คำถามเสริม (/btw)

/btw ไม่ใช่ ความสามารถเนทีฟบน harness นี้ createCopilotAgentHarness() จงใจปล่อยให้ harness.runSideQuestion เป็น undefined (ยืนยันใน extensions/copilot/harness.test.ts, describe("runSideQuestion")) ดังนั้น dispatcher /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, คีย์เซสชัน CLI copilot, คำนำหน้าโปรไฟล์การยืนยันตัวตน github-copilot:

ข้อจำกัด

  • Harness อ้างสิทธิ์ github-copilot รวมถึงรหัสผู้ให้บริการ BYOK แบบกำหนดเองที่ไม่มีเจ้าของ รหัสผู้ให้บริการเนทีฟที่มี manifest เป็นเจ้าของจะยังคงอยู่บนรันไทม์เจ้าของ แม้เมื่อ บังคับ agentRuntime.id เป็น copilot
  • ไม่มีพื้นผิว TUI โดย TUI ของ PI ยังคงเป็นทางเลือกสำรองสำหรับรันไทม์ที่ไม่มีพื้นผิว คู่กัน
  • สถานะเซสชัน PI จะไม่ย้ายเมื่อเอเจนต์สลับไปใช้ copilot การเลือกมีผลต่อความพยายามแต่ละครั้ง โดยเซสชัน PI ที่มีอยู่ยังคงใช้งานได้
  • ask_user ใช้รันไทม์คำถาม Gateway ที่ไม่ขึ้นกับผู้ให้บริการ Control UI แสดงการ์ดคำถามแบบเดียวกับคำถามอื่นของ OpenClaw ช่องทางที่รองรับ จะแสดงผลปุ่มตัวเลือก และข้อความข้อความธรรมดารายการถัดไปในคิว จะตอบระเบียน Gateway นั้นให้เสร็จก่อนที่คำขอ SDK จะส่งคืน

สิทธิ์และ ask_user

การบังคับใช้นโยบายสิทธิ์สำหรับเครื่องมือ OpenClaw ที่เชื่อมผ่านบริดจ์เกิดขึ้น ภายใน wrapper ของเครื่องมือ ไม่ใช่ผ่าน callback onPermissionRequest ของ SDK ระบบใช้ wrapToolWithBeforeToolCallHook เดียวกับที่ PI ใช้ (src/agents/agent-tools.before-tool-call.ts) ผ่าน createOpenClawCodingTools กับเครื่องมือเขียนโค้ดทุกตัว ทั้งการตรวจจับลูป นโยบาย Plugin ที่เชื่อถือได้ ฮุกก่อนเรียกเครื่องมือ และการอนุมัติ Plugin แบบสองระยะผ่าน Gateway (plugin.approval.request) ล้วนทำงานผ่านเส้นทางโค้ดเดียวกันทุกประการ กับความพยายามแบบเนทีฟของ PI

เครื่องมือ SDK แต่ละตัวที่บริดจ์เครื่องมือ Copilot ส่งคืนจะมีเครื่องหมายดังนี้:

  • overridesBuiltInTool: true — แทนที่เครื่องมือในตัวชื่อเดียวกันของ Copilot CLI (edit, read, write, bash, ...) เพื่อให้การเรียกเครื่องมือทุกครั้งย้อนกลับมา ที่ OpenClaw
  • skipPermission: true — แจ้ง SDK ไม่ให้เรียก onPermissionRequest({kind: "custom-tool"}) ก่อนเรียกใช้เครื่องมือ execute() ที่ครอบไว้อยู่แล้วดำเนินการตรวจสอบนโยบาย OpenClaw ที่สมบูรณ์กว่า พรอมต์ระดับ SDK จะเลี่ยงการบังคับใช้ของ OpenClaw (อนุญาตทั้งหมด) หรือบล็อกการเรียกเครื่องมือทุกครั้ง (ปฏิเสธทั้งหมด) ซึ่งไม่มีแบบใด สอดคล้องกับ PI

Harness 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 Harness จะส่งต่อบริบทเครื่องมือของความพยายาม 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 ระบุบริบทแซนด์บ็อกซ์ผ่าน seam ที่ใช้ร่วมกัน resolveSandboxContext ส่งไดเรกทอรีทำงานที่มีผลให้ SDK และส่งต่อ sandbox พร้อมพื้นที่ทำงานสำหรับสร้างเอเจนต์ย่อยเข้าสู่บริดจ์เครื่องมือ บริดจ์ยังส่งต่อการควบคุมการสร้างเครื่องมือแบบมีขอบเขตที่สามารถบังคับใช้ ณ ขอบเขต SDK ได้แก่ includeCoreTools, รายการอนุญาตเครื่องมือของรันไทม์ และ toolConstructionPlan

บริดจ์ยังใช้ตัวช่วยพื้นผิวเครื่องมือของ harness ที่ใช้ร่วมกันจาก openclaw/plugin-sdk/agent-harness-tool-runtime เพื่อให้สอดคล้องกับ PI เมื่อ เปิดใช้การค้นหาเครื่องมือ SDK จะเห็นเครื่องมือควบคุมแบบกะทัดรัดพร้อมตัวดำเนินการ แค็ตตาล็อกที่ซ่อนอยู่ แทนที่จะเห็นสคีมาเครื่องมือ OpenClaw ทั้งหมด เมื่อเปิดใช้โหมดโค้ด ตัวช่วยจะสร้างพื้นผิวควบคุมโหมดโค้ดและวงจรชีวิตแค็ตตาล็อกแบบเดียวกับที่ harness ของเอเจนต์อื่นใช้ ค่าเริ่มต้นแบบกระชับสำหรับโมเดลภายใน การกรองสคีมาที่เข้ากันได้กับรันไทม์ การเติมข้อมูลไดเรกทอรี และการล้าง แค็ตตาล็อก ล้วนอยู่ในตัวช่วยที่ใช้ร่วมกัน เพื่อให้ harness ที่เกี่ยวข้องกับ Copilot และ Codex ไม่คลาดเคลื่อนจากกัน

โทเค็น GitHub ระดับเซสชัน

สัญญา Copilot SDK แยกโทเค็น GitHub ระดับไคลเอนต์ (CopilotClientOptions.gitHubToken ซึ่งใช้ยืนยันตัวตนของกระบวนการ CLI) ออกจากโทเค็น ระดับเซสชัน (SessionConfig.gitHubToken ซึ่งกำหนด การยกเว้นเนื้อหา การกำหนดเส้นทางโมเดล และโควตาของเซสชันนั้น โดยมีผลกับทั้ง createSession และ resumeSession) Harness ระบุการยืนยันตัวตนหนึ่งครั้งผ่าน resolveCopilotAuth และตั้งค่าทั้งสองฟิลด์เมื่อโหมดการยืนยันตัวตนเป็น gitHubToken (auth.gitHubToken ที่ระบุอย่างชัดเจน หรือ resolvedApiKey ที่ระบุตามสัญญาจาก โปรไฟล์การยืนยันตัวตน github-copilot ที่กำหนดค่าไว้) เมื่อโหมดที่ระบุได้เป็น useLoggedInUser ระบบจะละเว้นฟิลด์ระดับเซสชัน เพื่อให้ SDK ยังคง อนุมานอัตลักษณ์จากอัตลักษณ์ที่เข้าสู่ระบบอยู่

ask_user ใช้ SessionConfig.onUserInputRequest บริดจ์จะลงทะเบียนตัวเลือกของ SDK หรือพรอมต์ข้อความอิสระที่ไม่มีตัวเลือกเป็นคำถามของ Gateway ยอมรับดัชนีตัวเลือก หรือป้ายกำกับสำหรับคำขอแบบตัวเลือกตายตัว และยอมรับคำตอบแบบอิสระ เมื่อคำขอ SDK อนุญาต การยกเลิกความพยายามของ OpenClaw จะยกเลิก ระเบียน Gateway และส่งคืนคำตอบ SDK ว่างเปล่า

ที่เกี่ยวข้อง

Was this useful?
On this page

On this page