From f5d22b31aa8492ff52163446d96381bfb51cc565 Mon Sep 17 00:00:00 2001 From: MandarSadye Date: Sun, 10 May 2026 16:57:15 +0530 Subject: [PATCH 1/2] Parallel exec --- bun.lock | 1 + claude-color.ico | Bin 0 -> 4286 bytes copilot-claude.bat | 40 +++++++++++++++++++++++ copilot-claude.cmd | 21 ++++++++++++ src/start.ts | 79 ++++++++++++++++++++++++++++++++++++++------- start-claude.bat | 20 ++++++++++++ 6 files changed, 149 insertions(+), 12 deletions(-) create mode 100644 claude-color.ico create mode 100644 copilot-claude.bat create mode 100644 copilot-claude.cmd create mode 100644 start-claude.bat diff --git a/bun.lock b/bun.lock index 20e895e7f..9ece87578 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "copilot-api", diff --git a/claude-color.ico b/claude-color.ico new file mode 100644 index 0000000000000000000000000000000000000000..bd5a275a8acdac0e9d5efc2b1d19a0bb2583f3b3 GIT binary patch literal 4286 zcmc&&SyxkM6ixp@pZe@ted$wwLw|zSsm@~^a9ECr6AGfDfC@!%M8yGAaA?tDRh&_5 zQN#ffLLg*>kU$bb5|VJb_ZM#(XkyWJtsd9q-rRe??@asbbFMnw7x*_}f{uT6RbT3K zU+HwZZ*bt2?mHa3uLRG&{x*KZZ|HRL84?V~q_WN>->+|z!)y!^w};bqs4fzKD3Rp4Xo$^s(k%pBy-E6N5Q8 zYI!gelMA<8N`F?dSHtp;)S{XIV8vB%mImR!V_HtacNMV!NlWp9lE zS+JvB7Vb34yN;p6{o%-n)IRpe-0kgZUH)mS$|GOsaSsdEF}CBC*ZM(OQ_v~Xv-EQE znp6CN_*%0gBv~b0GHsJyUbPJ-wrlGglGTXGl#P1H*kh8G_JBkIPkq;r!b(wvT^woR z;X&Mth@}&DhKJ*zA$ERyJ|K(W=iKcEx%0eVVlaW&I&{G;_x}r{Lcy*{9hQ(}9_mtYI9J=N{8_NG zU5-^dRGl&Aj8WbRi`rwxX1#3r$*g=x6Y`YikWa4GyA|%}-%RY8d(0vY$n)cuUimTC zC`)%4<;Z1+@@?7f4&^8FPW_8>jIdv?@J2imFUb;vG33lB{7om!C+oWWdXFrIKIW8q z%C0!oJ;rq*d}j?#g^kpmIPmWNGd9H;)Xli|0!uI6`laf&OZK5Ax0agKUg`8}_sMlF zh5+`n%KYqhnXNErQZ^;@CF!P}IpC`%;D-7x-0GDa;AI7HwFq$`KBpqD+(n&`Hy&W0 zM(jyWvN*%4W-Dr4vL5w8n-;=OZSP6zT4mx|95}P4$ftZ~)xHjyk;ZpTKi|znUn)WG zA*ZmeTY>RIg%8sMmN;i86c_N*#ZZ)6h0lU+{$@Ggj*08Vbq4I%enr%E2^N+w)8s{>e zLCh3`LowC6*ypT>dn)mwkFi&*KhO!Rp5x7em9qxRZp0Q{F0m4 zo3xnFhE2s?s-LFPq1iR|8E2^zSDmWYYB^&Lt1*jlc3>}I&*#B;;Kl>D;z7<~th1$g z9f>$_J^Qi8`_J=fI1*F!o_(bIuRMRiQ6qSam^|}yyazMCE6~edgBKfGe6l1j&NH^& zVe~?`;y5i1tmn$QJ{kTnPmJ|f`%R3Hv)FIw8+o#{%C0cLcgRb8PTjwrtI4C6KE>nYL1O)AwKKsF zoGIDMsOKpB)_N*+v1Yl3&v@oH1N&Jjq21)h5b~7VuQ?0uEw{vDgMF4F*U8@lete^_ z-?1LH!S*ovwkDi;ICoJud55!0mpygOX={?toblK{w4T7aFTG?>%%*&ovm|G8@+|S; z2A^s|pV)KAy{u8@kl$3}70%dPtMLjsg}rNR?Xt$`KWmSDCRrHEX3X&HA>41gLLKZk znr`N>5WUBj;#>3VFTHABoH?Gn@+M->dStDS^_{v{gDVmH49xBCOr!n( nH@5WkM=;kqWIp1~zRYjgRKi)2HZ { if (options.proxyEnv) { initProxyFromEnv() @@ -68,23 +71,56 @@ export async function runServer(options: RunServerOptions): Promise { if (options.claudeCode) { invariant(state.models, "Models should be loaded by now") + const availableModelIds = state.models.data.map((model) => model.id) - const selectedModel = await consola.prompt( - "Select a model to use with Claude Code", - { - type: "select", - options: state.models.data.map((model) => model.id), - }, + consola.info( + `[claude-code] CLI options received: claudeCodeModel=${JSON.stringify(options.claudeCodeModel)}, claudeCodeSmallModel=${JSON.stringify(options.claudeCodeSmallModel)}`, + ) + consola.info( + `[claude-code] Available model ids: ${JSON.stringify(availableModelIds)}`, ) - const selectedSmallModel = await consola.prompt( - "Select a small model to use with Claude Code", - { - type: "select", - options: state.models.data.map((model) => model.id), - }, + const validateModel = ( + value: string | undefined, + flag: string, + ): string | undefined => { + if (value === undefined) return undefined + if (!availableModelIds.includes(value)) { + consola.error( + `Model "${value}" provided via ${flag} is not available. Available models:\n${availableModelIds.map((id) => `- ${id}`).join("\n")}`, + ) + throw new Error(`Invalid model for ${flag}: ${value}`) + } + return value + } + + const preselectedModel = validateModel( + options.claudeCodeModel, + "--claude-code-model", + ) + const preselectedSmallModel = validateModel( + options.claudeCodeSmallModel, + "--claude-code-small-model", + ) + + consola.info( + `[claude-code] After validation: preselectedModel=${JSON.stringify(preselectedModel)}, preselectedSmallModel=${JSON.stringify(preselectedSmallModel)}`, ) + const selectedModel = + preselectedModel + ?? (await consola.prompt("Select a model to use with Claude Code", { + type: "select", + options: availableModelIds, + })) + + const selectedSmallModel = + preselectedSmallModel + ?? (await consola.prompt("Select a small model to use with Claude Code", { + type: "select", + options: availableModelIds, + })) + const command = generateEnvScript( { ANTHROPIC_BASE_URL: serverUrl, @@ -174,6 +210,16 @@ export const start = defineCommand({ description: "Generate a command to launch Claude Code with Copilot API config", }, + "claude-code-model": { + type: "string", + description: + "Model to use with Claude Code (skips interactive selection). Requires --claude-code", + }, + "claude-code-small-model": { + type: "string", + description: + "Small/fast model to use with Claude Code (skips interactive selection). Requires --claude-code", + }, "show-token": { type: "boolean", default: false, @@ -186,6 +232,13 @@ export const start = defineCommand({ }, }, run({ args }) { + consola.info( + `[start.run] Raw citty args: ${JSON.stringify({ + "claude-code": args["claude-code"], + "claude-code-model": args["claude-code-model"], + "claude-code-small-model": args["claude-code-small-model"], + })}`, + ) const rateLimitRaw = args["rate-limit"] const rateLimit = // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition @@ -202,6 +255,8 @@ export const start = defineCommand({ claudeCode: args["claude-code"], showToken: args["show-token"], proxyEnv: args["proxy-env"], + claudeCodeModel: args["claude-code-model"], + claudeCodeSmallModel: args["claude-code-small-model"], }) }, }) diff --git a/start-claude.bat b/start-claude.bat new file mode 100644 index 000000000..e1c26748e --- /dev/null +++ b/start-claude.bat @@ -0,0 +1,20 @@ +@echo off +echo ================================================ +echo GitHub Copilot API Server for Claude Code +echo ================================================ +echo. + +cd /d "G:\Applications\AgentsConfig\copilot-api" + +if not exist node_modules ( + echo Installing dependencies... + bun install + echo. +) + +echo Starting server... +echo. + +bun run ./src/main.ts start -c --claude-code-model claude-opus-4.7 --claude-code-small-model claude-opus-4.6 + +pause From 5fead2abeadf88fc2363cb5c9b60bca7b68a4733 Mon Sep 17 00:00:00 2001 From: MandarSadye Date: Sun, 10 May 2026 17:10:24 +0530 Subject: [PATCH 2/2] chore: ignore .claude/ directory --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 577a4f199..3e70a92c1 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,7 @@ node_modules/ .eslintcache # build output -dist/ \ No newline at end of file +dist/ + +# claude code +.claude/ \ No newline at end of file