Get started
Copilot SDK हार्नेस
The external @openclaw/copilot Plugin OpenClaw को अंतर्निहित PI हार्नेस के बजाय GitHub Copilot CLI (@github/copilot-sdk) के माध्यम से एम्बेडेड subscription Copilot एजेंट टर्न चलाने देता है।
Copilot SDK हार्नेस का उपयोग तब करें जब आप चाहते हों कि Copilot CLI सत्र निम्न-स्तरीय एजेंट लूप का स्वामी हो: native tool execution, native Compaction (infiniteSessions), और copilotHome के अंतर्गत CLI-प्रबंधित thread state।
OpenClaw अब भी चैट channels, session files, model selection, OpenClaw dynamic tools (bridged), approvals, media delivery, visible transcript mirror, /btw side questions (in-tree PI fallback द्वारा संभाले गए — देखें Side questions (/btw)), और openclaw doctor का स्वामी रहता है।
व्यापक model/provider/runtime विभाजन के लिए, Agent runtimes से शुरू करें।
आवश्यकताएँ
- OpenClaw जिसमें
@openclaw/copilotPlugin स्थापित हो। - यदि आपका config
plugins.allowका उपयोग करता है, तोcopilotशामिल करें (Plugin द्वारा घोषित manifest id)। एक restrictive allowlist जो npm-style@openclaw/copilotpackage name का उपयोग करती है, Plugin को blocked छोड़ देगी और runtime load नहीं होगा, भले हीagentRuntime.id: "copilot"हो। - एक GitHub Copilot subscription जो Copilot CLI को drive कर सके (या headless / cron runs के लिए
gitHubTokenenv / auth-profile entry)। - writable
copilotHomedirectory। जब OpenClaw agent directory प्रदान करता है, तो हार्नेस default रूप से<agentDir>/copilotका उपयोग करता है, अन्यथा full per-agent isolation के लिए~/.openclaw/agents/<agentId>/copilotका।
openclaw doctor declarative session-state ownership और भविष्य की compatibility migrations के लिए Plugin doctor contract चलाता है। यह Copilot CLI environment probes नहीं चलाता।
Plugin स्थापना
Copilot runtime एक external Plugin है, इसलिए core openclaw package @github/copilot-sdk dependency या उसकी platform-specific @github/copilot-<platform>-<arch> CLI binary नहीं रखता। साथ में वे लगभग 260 MB जोड़ते हैं, इसलिए उन्हें केवल उन agents के लिए install करें जो इस runtime में opt in करते हैं:
openclaw plugins install @openclaw/copilotWizard Plugin को पहली बार तब install करता है जब आप कोई github-copilot/* model चुनते हैं और आपका config model (या उसके provider) को agentRuntime: { id: "copilot" } के माध्यम से Copilot agent runtime में opt करता है (नीचे Quickstart देखें)। Opt-in के बिना, openclaw अपने built-in GitHub Copilot provider का उपयोग करता है और runtime Plugin कभी install नहीं करता।
Runtime SDK को इस क्रम में resolve करता है:
- installed
@openclaw/copilotpackage सेimport("@github/copilot-sdk")। - well-known fallback dir
~/.openclaw/npm-runtime/copilot/(legacy on-demand install target)।
Missing SDK code COPILOT_SDK_MISSING और ऊपर दिए Plugin reinstall command के साथ एक single error surface करता है।
त्वरित प्रारंभ
एक model (या एक provider) को हार्नेस पर pin करें:
{ agents: { defaults: { model: "github-copilot/auto", models: { "github-copilot/auto": { agentRuntime: { id: "copilot" }, }, }, }, },}दोनों routes equivalent हैं। agentRuntime.id को single model entry पर तब उपयोग करें जब केवल वही model हार्नेस के माध्यम से route होना चाहिए; किसी provider पर agentRuntime.id तब set करें जब उस provider के अंतर्गत हर model इसका उपयोग करे।
github-copilot/auto portable starting point है। Named Copilot models account- और organization-policy-dependent होते हैं, इसलिए केवल तब pin करें जब यह पुष्टि हो जाए कि authenticated Copilot CLI उसे expose करता है।
समर्थित providers
हार्नेस canonical github-copilot provider (वही id जो extensions/github-copilot के स्वामित्व में है) के लिए support advertise करता है:
github-copilot
यह custom models.providers entries को भी support करता है जब selected model में non-empty baseUrl हो और इनमें से कोई API shape हो:
openai-responsesopenai-completionsollama(OpenAI-compatible completions)azure-openai-responsesanthropic-messages
Native provider ids जैसे openai, anthropic, google, और ollama अपने native runtimes के स्वामित्व में रहते हैं। Copilot BYOK के माध्यम से endpoint route करते समय अलग custom provider id का उपयोग करें।
Copilot BYOK endpoints public-network HTTPS URLs होने चाहिए। हार्नेस Copilot SDK को per-attempt loopback proxy URL देता है, फिर provider traffic को OpenClaw के guarded fetch path से forward करता है ताकि DNS pinning और SSRF policy OpenClaw के स्वामित्व में रहें। local Ollama, LM Studio, या LAN model servers के लिए native OpenClaw runtime का उपयोग करें।
BYOK
Copilot BYOK SDK के session-level custom provider contract का उपयोग करता है। OpenClaw resolved model endpoint, API key, bearer-token mode, headers, model id, और context/output limits को provider transport logic को core में ले जाए बिना pass करता है।
उदाहरण के लिए:
{ 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 sessions subscription sessions और अन्य endpoints या credential fingerprints से अलग keyed होते हैं। Key, headers, model, या endpoint rotate करने पर incompatible state resume करने के बजाय fresh Copilot SDK session बनता है।
प्रमाणीकरण
Per-agent precedence, runCopilotAttempt के दौरान लागू:
-
Attempt input पर Explicit
useLoggedInUser: true। Agent केcopilotHomeके अंतर्गत resolved Copilot CLI के logged-in user का उपयोग करता है। -
Attempt input पर Explicit
gitHubToken(profileId+profileVersionके साथ)। Direct CLI invocations और tests के लिए उपयोगी, जहाँ caller auth-profile resolution को bypass करना चाहता है। -
EmbeddedRunAttemptParamsshape से Contract-resolvedresolvedApiKey+authProfileId। यह production main path है: core, हार्नेस invoke करने से पहले agent के configuredgithub-copilotauth profile को (viasrc/infra/provider-usage.auth.ts:resolveProviderAuths) resolve करता है, और हार्नेस दोनों fields को सीधे consume करता है। इससेgithub-copilot:<profile>auth profile headless / cron / multi-profile setups के लिए env vars के बिना end-to-end काम करता है। -
Direct CLI / dogfood runs के लिए Env-var fallback जहाँ कोई auth profile configured नहीं है। Runtime निम्न vars को precedence order में check करता है, shipped
github-copilotprovider (extensions/github-copilot/auth.ts) और documented Copilot SDK setup को mirror करते हुए:OPENCLAW_GITHUB_TOKEN-- harness-specific override; इसे OpenClaw हार्नेस के लिए token pin करने हेतु set करें, बिना system-widegh/ Copilot CLI config को disturb किए।COPILOT_GITHUB_TOKEN-- standard Copilot SDK / CLI env var।GH_TOKEN-- standardghCLI env var (existinggithub-copilotprovider precedence से match करता है)।GITHUB_TOKEN-- generic GitHub token fallback।
पहला non-empty value जीतता है; empty strings को absent माना जाता है। Synthesised pool profile id
env:<NAME>है और profileVersion token का non-reversible sha256 fingerprint है, इसलिए env value rotate करने से client pool cleanly bust होता है। -
कोई token signal उपलब्ध न होने पर Default
useLoggedInUser।
हर agent को dedicated copilotHome मिलता है ताकि Copilot CLI tokens, sessions, और config एक ही machine पर agents के बीच leak न हों। Default <agentDir>/copilot है जब host हार्नेस को agent directory देता है (उसी directory में OpenClaw के models.json / auth-profiles.json से SDK state को isolate करते हुए), या अन्यथा ~/.openclaw/agents/<agentId>/copilot। Custom location की आवश्यकता होने पर attempt input पर copilotHome: <path> से override करें (उदाहरण के लिए, migration के लिए shared mount)।
Live harness tests direct token की आवश्यकता होने पर OPENCLAW_COPILOT_AGENT_LIVE_TOKEN का उपयोग करते हैं। Shared live-test setup isolated test home में real auth profiles stage करने के बाद जानबूझकर COPILOT_GITHUB_TOKEN, GH_TOKEN, और GITHUB_TOKEN scrub करता है, इसलिए dedicated live-test variable के माध्यम से gh auth token value pass करने से token को unrelated suites में expose किए बिना false skips avoid होते हैं।
कॉन्फ़िगरेशन सतह
हार्नेस अपना config per-attempt input (runCopilotAttempt({...})) और extensions/copilot/src/ के अंदर env defaults के छोटे set से पढ़ता है:
copilotHome— per-agent CLI state directory (defaults ऊपर documented हैं)।model— string या{ provider, id, api?, baseUrl?, headers?, authHeader? }। Omitted होने पर, OpenClaw agent के normal model selection का उपयोग करता है और हार्नेस verify करता है कि resolved provider supported है।reasoningEffort—"low" | "medium" | "high" | "xhigh"।auto-reply/thinking.tsमें OpenClaw केThinkLevel/ReasoningLevelresolution से map करता है।infiniteSessionConfig— SDKinfiniteSessionsblock के लिए optional override जोharness.compactद्वारा driven है। Defaults को as-is छोड़ना safe है।hooksConfig— tool/MCP, user-prompt, session, और error callbacks के लिए optional native Copilot SDKSessionHookscompatibility config। यह OpenClaw के portable lifecycle hooks से अलग है।permissionPolicy— SDK केonPermissionRequesthandler के लिए optional override जो built-in SDK tool kinds (shell,write,read,url,mcp,memory,hook) के लिए उपयोग होता है। Safety net के रूप में defaultrejectAllPolicyहै; व्यवहार में SDK उन kinds में से किसी को भी कभी invoke नहीं करता क्योंकि हर bridged OpenClaw tooloverridesBuiltInTool: trueऔरskipPermission: trueके साथ registered है, इसलिए 100% tool calls OpenClaw के wrappedexecute()से flow करते हैं। देखें Permissions and ask_user।enableSessionTelemetry— optional SDK session telemetry flag।
OpenClaw Plugin hooks को Copilot-specific attempt configuration की आवश्यकता नहीं होती। हार्नेस standard harness helpers के माध्यम से before_prompt_build (और legacy before_agent_start compatibility hook), llm_input, llm_output, और agent_end चलाता है। Successful SDK compactions before_compaction और after_compaction भी चलाते हैं। Bridged OpenClaw tools before_tool_call चलाते रहते हैं और after_tool_call report करते हैं; hooksConfig native SDK-only callbacks के लिए रहता है जिनका कोई portable equivalent नहीं है।
OpenClaw के बाकी हिस्से को इन fields के बारे में जानने की आवश्यकता नहीं है। Other plugins, channels, और core code केवल standard AgentHarnessAttemptParams / AgentHarnessAttemptResult shape देखते हैं।
Compaction
जब harness.compact चलता है, Copilot SDK हार्नेस:
- Pending work continue किए बिना tracked SDK session resume करता है।
- SDK का session-scoped history compaction RPC call करता है।
- Workspace के अंतर्गत compatibility marker files लिखे बिना SDK compaction outcome return करता है।
OpenClaw side transcript mirror (नीचे देखें) post-compaction messages receive करता रहता है, इसलिए user-facing chat history consistent रहती है।
ट्रांसक्रिप्ट मिररिंग
runCopilotAttempt हर turn के mirrorable messages को extensions/copilot/src/dual-write-transcripts.ts के माध्यम से OpenClaw audit transcript में dual-write करता है। Mirror per-session scoped (copilot:${sessionId}) है और per-message identity (${role}:${sha256_16(role,content)}) का उपयोग करता है, इसलिए prior-turn entries के re-emits existing on-disk keys से collide करते हैं और duplicate नहीं होते।
Mirror failure containment की दो layers में wrapped है ताकि transcript write failure attempt को fail न कर सके: internal best-effort wrapper और attempt level पर defense-in-depth .catch(...)। Failures logged होते हैं लेकिन surfaced नहीं होते।
पार्श्व प्रश्न (/btw)
/btw इस harness पर native नहीं है। createCopilotAgentHarness()
जानबूझकर harness.runSideQuestion को undefined छोड़ता है, इसलिए OpenClaw का /btw
dispatcher (src/agents/btw.ts) उसी in-tree PI fallback
path पर चला जाता है जिसे वह हर non-Codex runtime के लिए उपयोग करता है: configured model provider को
एक छोटे side-question prompt के साथ सीधे call किया जाता है और
streamSimple के ज़रिए stream करके वापस भेजा जाता है (कोई CLI session नहीं, कोई अतिरिक्त pool slot नहीं)।
इससे Copilot CLI sessions agent के मुख्य turn loop के लिए reserved रहते हैं, और
/btw behavior अन्य PI-backed runtimes जैसा ही रहता है। contract को
extensions/copilot/harness.test.ts
में describe("runSideQuestion") के अंतर्गत assert किया गया है।
Doctor
extensions/copilot/doctor-contract-api.ts को
src/plugins/doctor-contract-registry.ts द्वारा auto-loaded किया जाता है। यह योगदान देता है:
- एक empty
legacyConfigRules(MVP में कोई retired fields नहीं)। - एक no-op
normalizeCompatibilityConfig(ताकि future field retirements के लिए एक stable in-tree home रहे)। - एक
sessionRouteStateOwnersentry जो providergithub-copilot; runtimecopilot; CLI session keycopilot; auth profile prefixgithub-copilot:claim करती है।
सीमाएँ
- harness
github-copilotऔर unowned custom BYOK provider ids को claim करता है। Manifest-owned native provider ids अपने owning runtime पर ही रहते हैं, भले हीagentRuntime.idकोcopilotपर force किया गया हो। - harness TUI deliver नहीं करता; PI का TUI अप्रभावित है और उन runtimes के लिए fallback बना रहता है जिनके पास peer surface नहीं है।
- जब कोई agent
copilotपर switch करता है, तो PI session state migrate नहीं की जाती। चयन per attempt होता है; मौजूदा PI sessions valid रहते हैं। ask_userवही OpenClaw prompt-and-reply path उपयोग करता है जो Codex harness करता है। जब Copilot SDK user input मांगता है, OpenClaw active channel/TUI पर blocking prompt post करता है और अगला queued user message SDK request को resolve करता है।
अनुमतियाँ और ask_user
bridged OpenClaw tools के लिए permission enforcement tool wrapper के अंदर
होता है, SDK के onPermissionRequest callback के ज़रिए नहीं। वही
wrapToolWithBeforeToolCallHook जिसे PI उपयोग करता है
(src/agents/pi-tools.before-tool-call.ts), createOpenClawCodingTools द्वारा
हर coding tool पर लागू किया जाता है: loop detection,
trusted Plugin policies, before-tool-call hooks, और gateway
(plugin.approval.request) के ज़रिए two-phase Plugin approvals, सभी native PI attempts जैसे
ठीक उसी code path के साथ चलते हैं।
उस wrapper को decision own करने देने के लिए,
convertOpenClawToolToSdkTool द्वारा लौटाया गया SDK Tool इनसे marked होता है:
overridesBuiltInTool: true— समान नाम वाले Copilot CLI के built-in tool को replace करता है (edit, read, write, bash, …), ताकि हर tool invocation वापस OpenClaw पर route हो।skipPermission: true— SDK को बताता है कि tool invoke करने से पहलेonPermissionRequest({kind: "custom-tool"})fire न करे। wrappedexecute()internally अधिक समृद्ध OpenClaw policy check करता है; SDK-level prompt या तो OpenClaw के enforcement को short-circuit करेगा (अगर हम allow-all करें) या हर tool call block करेगा (अगर हम reject-all करें) — इनमें से कोई भी PI parity से मेल नहीं खाता।
in-tree codex harness वही split उपयोग करता है: bridged OpenClaw tools
wrapped होते हैं (extensions/codex/src/app-server/dynamic-tools.ts) और
codex-app-server के अपने native approval kinds
(item/commandExecution/requestApproval,
item/fileChange/requestApproval,
item/permissions/requestApproval) को
plugin.approval.request
(extensions/codex/src/app-server/approval-bridge.ts) के ज़रिए route किया जाता है। Copilot SDK
equivalent — किसी भी non-custom-tool
kind के लिए fail-closed rejectAllPolicy, जो कभी onPermissionRequest तक पहुंचे — वही safety net है,
और व्यवहार में यह fire नहीं करता क्योंकि overridesBuiltInTool: true
हर built-in को displace कर देता है।
wrapped-tool layer को PI के equivalent policy decisions लेने देने के लिए,
harness पूरा PI attempt-tool context
createOpenClawCodingTools को forward करता है — identity (senderIsOwner,
memberRoleIds, ownerOnlyToolAllowlist, …), channel/routing
(groupId, currentChannelId, replyToMode, message-tool toggles),
auth (authProfileStore), run identity
(sessionKey/runSessionKey derived from sandboxSessionKey,
runId), model context (modelApi, modelContextWindowTokens,
modelCompat, modelHasVision), और run hooks (onToolOutcome,
onYield)। उन fields के बिना, owner-only allowlists चुपचाप
deny-by-default जैसा behave करती हैं, Plugin-trust policies सही
scope तक resolve नहीं कर पातीं, और session_status: "current" stale
sandbox key पर resolve होता है। bridge builder
extensions/copilot/src/tool-bridge.ts में है और PI
authoritative call को mirror करता है:
src/agents/pi-embedded-runner/run/attempt.ts:1029-1117। runAttempt
पहले से shared resolveSandboxContext seam के ज़रिए sandbox context resolve करता है,
SDK को effective working directory pass करता है, और sandbox के साथ subagent-spawn workspace को
tool bridge में forward करता है। bridge bounded tool-construction
controls भी forward करता है जिन्हें वह SDK boundary पर enforce कर सकता है: includeCoreTools,
runtime tool allowlist, और toolConstructionPlan।
bridge PI parity के लिए
openclaw/plugin-sdk/agent-harness-tool-runtime से shared harness tool-surface helper भी उपयोग करता है। जब
tool-search enabled होता है, SDK हर OpenClaw tool schema के बजाय compact control tools और एक hidden
catalog executor देखता है। जब code mode enabled होता है,
helper वही code-mode control surface और catalog
lifecycle बनाता है जिसे दूसरे agent harnesses उपयोग करते हैं। Local-model lean defaults,
runtime-compatible schema filtering, directory hydration, और catalog
cleanup सभी shared helper में रहते हैं ताकि Copilot और Codex-adjacent
harnesses drift न करें।
Session-level GitHub token
Copilot SDK contract client-level GitHub
token (CopilotClientOptions.gitHubToken, जिसका उपयोग CLI process को authenticate करने के लिए होता है)
और session-level token
(SessionConfig.gitHubToken, जो उस session के लिए content exclusion,
model routing, और quota निर्धारित करता है और createSession तथा
resumeSession दोनों पर honored होता है) में अंतर करता है। harness auth को
resolveCopilotAuth के ज़रिए एक बार resolve करता है और जब auth mode
gitHubToken हो (explicit auth.gitHubToken या configured github-copilot auth profile से
contract-resolved resolvedApiKey), तब दोनों fields set करता है।
जब resolved mode useLoggedInUser होता है, session-level field
omit की जाती है ताकि SDK logged-in
identity से identity derive करता रहे।
ask_user SessionConfig.onUserInputRequest उपयोग करता है। bridge
fixed-choice requests के लिए choice indexes या labels accept करता है, SDK request द्वारा अनुमति होने पर
free-form answers accept करता है, और OpenClaw attempt aborted होने पर
pending request cancel करता है।