@jeffreycao/copilot-api 2.4.2 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -5
- package/README.zh-CN.md +11 -5
- package/dist/{auth-DvqwYkJr.js → auth-DmWqSrc5.js} +3 -3
- package/dist/{auth-DvqwYkJr.js.map → auth-DmWqSrc5.js.map} +1 -1
- package/dist/auth-DwBD3QBJ.js +2 -0
- package/dist/{config-DVWu2hKk.js → config-Cb0atQ6i.js} +2 -2
- package/dist/{config-DVWu2hKk.js.map → config-Cb0atQ6i.js.map} +1 -1
- package/dist/{debug-DwoWAiuC.js → debug-Clt-tTwv.js} +2 -2
- package/dist/{debug-DwoWAiuC.js.map → debug-Clt-tTwv.js.map} +1 -1
- package/dist/main.js +3 -3
- package/dist/{models-DKNAPa_j.js → models-DvNveb2V.js} +2 -2
- package/dist/{models-DKNAPa_j.js.map → models-DvNveb2V.js.map} +1 -1
- package/dist/{server-BvDQf9Nd.js → server-D5XuGc4z.js} +68 -53
- package/dist/{server-BvDQf9Nd.js.map → server-D5XuGc4z.js.map} +1 -1
- package/dist/{start-BGY-GA8y.js → start-Br5i1XfC.js} +77 -8
- package/dist/start-Br5i1XfC.js.map +1 -0
- package/dist/{token-D0GGk3E8.js → token-DYqRXNhu.js} +7 -13
- package/dist/{token-D0GGk3E8.js.map → token-DYqRXNhu.js.map} +1 -1
- package/package.json +8 -4
- package/dist/auth-BCZdnMmK.js +0 -2
- package/dist/start-BGY-GA8y.js.map +0 -1
package/dist/main.js
CHANGED
|
@@ -27,10 +27,10 @@ if (isMcpFastPath(process.argv)) {
|
|
|
27
27
|
if (process.platform === "win32" && process.stdout.isTTY && !process.env.WT_SESSION) process.env.WT_SESSION = "copilot-api";
|
|
28
28
|
const { bindElectronFetch } = await import("./electron-fetch-BRX-ug5E.js");
|
|
29
29
|
bindElectronFetch();
|
|
30
|
-
const { auth } = await import("./auth-
|
|
31
|
-
const { debug } = await import("./debug-
|
|
30
|
+
const { auth } = await import("./auth-DwBD3QBJ.js");
|
|
31
|
+
const { debug } = await import("./debug-Clt-tTwv.js");
|
|
32
32
|
const { mcp } = await import("./mcp-fpSlKZxK.js");
|
|
33
|
-
const { start } = await import("./start-
|
|
33
|
+
const { start } = await import("./start-Br5i1XfC.js");
|
|
34
34
|
await runMain(defineCommand({
|
|
35
35
|
meta: {
|
|
36
36
|
name: "copilot-api",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { K as state } from "./token-
|
|
1
|
+
import { K as state } from "./token-DYqRXNhu.js";
|
|
2
2
|
//#region src/lib/models.ts
|
|
3
3
|
/**
|
|
4
4
|
* Converts a Copilot upstream model ID to a client-friendly ID that Claude Code
|
|
@@ -87,4 +87,4 @@ const normalizeSdkModelId = (sdkModelId) => {
|
|
|
87
87
|
//#endregion
|
|
88
88
|
export { toClientModelId as i, getLatestModelForFamily as n, normalizeSdkModelId as r, findEndpointModel as t };
|
|
89
89
|
|
|
90
|
-
//# sourceMappingURL=models-
|
|
90
|
+
//# sourceMappingURL=models-DvNveb2V.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models-
|
|
1
|
+
{"version":3,"file":"models-DvNveb2V.js","names":[],"sources":["../src/lib/models.ts"],"sourcesContent":["import type { Model } from \"~/lib/types/models\"\n\nimport { state } from \"~/lib/state\"\n\n/**\n * Converts a Copilot upstream model ID to a client-friendly ID that Claude Code\n * and Claude Desktop recognize (dots in version replaced with hyphens).\n * e.g. \"claude-sonnet-4.6\" -> \"claude-sonnet-4-6\"\n * Non-Claude models are returned unchanged.\n */\nexport const toClientModelId = (modelId: string): string => {\n const normalized = normalizeSdkModelId(modelId)\n if (!normalized) return modelId\n const versionHyphenated = normalized.version.replaceAll(\".\", \"-\")\n return `claude-${normalized.family}-${versionHyphenated}`\n}\n\nexport interface NormalizedSdkModelId {\n family: string\n version: string\n}\n\nexport const findEndpointModel = (sdkModelId: string): Model | undefined => {\n const models = state.models?.data ?? []\n const exactMatch = models.find((m) => m.id === sdkModelId)\n if (exactMatch) {\n return exactMatch\n }\n\n const normalized = normalizeSdkModelId(sdkModelId)\n if (!normalized) {\n return undefined\n }\n\n const modelName = `claude-${normalized.family}-${normalized.version}`\n const model = models.find((m) => m.id === modelName)\n if (model) {\n return model\n }\n\n return undefined\n}\n\n/**\n * Finds the latest available model for a given Claude family (e.g. \"opus\",\n * \"sonnet\", \"haiku\") among the models currently cached in `state.models`.\n * \"Latest\" is determined by the highest semantic version parsed from the model\n * ID. Returns `undefined` when no model of that family is available.\n */\nexport const getLatestModelForFamily = (family: string): Model | undefined => {\n const models = state.models?.data ?? []\n\n let best: { model: Model; major: number; minor: number } | undefined\n\n for (const model of models) {\n const normalized = normalizeSdkModelId(model.id)\n if (!normalized || normalized.family !== family) {\n continue\n }\n\n const [majorPart, minorPart = \"0\"] = normalized.version.split(\".\")\n const major = Number.parseInt(majorPart, 10)\n const minor = Number.parseInt(minorPart, 10)\n if (Number.isNaN(major) || Number.isNaN(minor)) {\n continue\n }\n\n if (\n !best\n || major > best.major\n || (major === best.major && minor > best.minor)\n ) {\n best = { model, major, minor }\n }\n }\n\n return best?.model\n}\n\n/**\n * Normalizes an SDK model ID to extract the model family and version.\n * this method from github copilot extension\n * Examples:\n * - \"claude-opus-4-5-20251101\" -> { family: \"opus\", version: \"4.5\" }\n * - \"claude-3-5-sonnet-20241022\" -> { family: \"sonnet\", version: \"3.5\" }\n * - \"claude-sonnet-4-20250514\" -> { family: \"sonnet\", version: \"4\" }\n * - \"claude-haiku-3-5-20250514\" -> { family: \"haiku\", version: \"3.5\" }\n * - \"claude-haiku-4.5\" -> { family: \"haiku\", version: \"4.5\" }\n */\nexport const normalizeSdkModelId = (\n sdkModelId: string,\n): NormalizedSdkModelId | undefined => {\n const lower = sdkModelId.toLowerCase()\n\n // Strip date suffix (8 digits at the end)\n const withoutDate = lower.replace(/-\\d{8}$/, \"\")\n\n // Pattern 1: claude-{family}-{major}.{minor} (e.g., claude-haiku-4.5)\n const pattern1 = withoutDate.match(/^claude-(\\w+)-(\\d+)\\.(\\d+)$/)\n if (pattern1) {\n return { family: pattern1[1], version: `${pattern1[2]}.${pattern1[3]}` }\n }\n\n // Pattern 2: claude-{family}-{major}-{minor} (e.g., claude-opus-4-5, claude-haiku-3-5)\n const pattern2 = withoutDate.match(/^claude-(\\w+)-(\\d+)-(\\d+)$/)\n if (pattern2) {\n return { family: pattern2[1], version: `${pattern2[2]}.${pattern2[3]}` }\n }\n\n // Pattern 3: claude-{major}-{minor}-{family} (e.g., claude-3-5-sonnet)\n const pattern3 = withoutDate.match(/^claude-(\\d+)-(\\d+)-(\\w+)$/)\n if (pattern3) {\n return { family: pattern3[3], version: `${pattern3[1]}.${pattern3[2]}` }\n }\n\n // Pattern 4: claude-{family}-{major} (e.g., claude-sonnet-4)\n const pattern4 = withoutDate.match(/^claude-(\\w+)-(\\d+)$/)\n if (pattern4) {\n return { family: pattern4[1], version: pattern4[2] }\n }\n\n // Pattern 5: claude-{major}-{family} (e.g., claude-3-opus)\n const pattern5 = withoutDate.match(/^claude-(\\d+)-(\\w+)$/)\n if (pattern5) {\n return { family: pattern5[2], version: pattern5[1] }\n }\n\n return undefined\n}\n"],"mappings":";;;;;;;;AAUA,MAAa,mBAAmB,YAA4B;CAC1D,MAAM,aAAa,oBAAoB,QAAQ;CAC/C,IAAI,CAAC,YAAY,OAAO;CACxB,MAAM,oBAAoB,WAAW,QAAQ,WAAW,KAAK,IAAI;CACjE,OAAO,UAAU,WAAW,OAAO,GAAG;;AAQxC,MAAa,qBAAqB,eAA0C;CAC1E,MAAM,SAAS,MAAM,QAAQ,QAAQ,EAAE;CACvC,MAAM,aAAa,OAAO,MAAM,MAAM,EAAE,OAAO,WAAW;CAC1D,IAAI,YACF,OAAO;CAGT,MAAM,aAAa,oBAAoB,WAAW;CAClD,IAAI,CAAC,YACH;CAGF,MAAM,YAAY,UAAU,WAAW,OAAO,GAAG,WAAW;CAC5D,MAAM,QAAQ,OAAO,MAAM,MAAM,EAAE,OAAO,UAAU;CACpD,IAAI,OACF,OAAO;;;;;;;;AAYX,MAAa,2BAA2B,WAAsC;CAC5E,MAAM,SAAS,MAAM,QAAQ,QAAQ,EAAE;CAEvC,IAAI;CAEJ,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,aAAa,oBAAoB,MAAM,GAAG;EAChD,IAAI,CAAC,cAAc,WAAW,WAAW,QACvC;EAGF,MAAM,CAAC,WAAW,YAAY,OAAO,WAAW,QAAQ,MAAM,IAAI;EAClE,MAAM,QAAQ,OAAO,SAAS,WAAW,GAAG;EAC5C,MAAM,QAAQ,OAAO,SAAS,WAAW,GAAG;EAC5C,IAAI,OAAO,MAAM,MAAM,IAAI,OAAO,MAAM,MAAM,EAC5C;EAGF,IACE,CAAC,QACE,QAAQ,KAAK,SACZ,UAAU,KAAK,SAAS,QAAQ,KAAK,OAEzC,OAAO;GAAE;GAAO;GAAO;GAAO;;CAIlC,OAAO,MAAM;;;;;;;;;;;;AAaf,MAAa,uBACX,eACqC;CAIrC,MAAM,cAHQ,WAAW,aAGA,CAAC,QAAQ,WAAW,GAAG;CAGhD,MAAM,WAAW,YAAY,MAAM,8BAA8B;CACjE,IAAI,UACF,OAAO;EAAE,QAAQ,SAAS;EAAI,SAAS,GAAG,SAAS,GAAG,GAAG,SAAS;EAAM;CAI1E,MAAM,WAAW,YAAY,MAAM,6BAA6B;CAChE,IAAI,UACF,OAAO;EAAE,QAAQ,SAAS;EAAI,SAAS,GAAG,SAAS,GAAG,GAAG,SAAS;EAAM;CAI1E,MAAM,WAAW,YAAY,MAAM,6BAA6B;CAChE,IAAI,UACF,OAAO;EAAE,QAAQ,SAAS;EAAI,SAAS,GAAG,SAAS,GAAG,GAAG,SAAS;EAAM;CAI1E,MAAM,WAAW,YAAY,MAAM,uBAAuB;CAC1D,IAAI,UACF,OAAO;EAAE,QAAQ,SAAS;EAAI,SAAS,SAAS;EAAI;CAItD,MAAM,WAAW,YAAY,MAAM,uBAAuB;CAC1D,IAAI,UACF,OAAO;EAAE,QAAQ,SAAS;EAAI,SAAS,SAAS;EAAI"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { A as isResponsesApiWebSocketEnabled, C as getClaudeTokenMultiplier, D as isAlphaSearchCodexPriorityEnabled, E as getResponsesTransportConfig, N as PATHS, O as isMessagesApiEnabled, S as getClaudeAutoModel, T as getMessageApiWebSearchModel, _ as resolveMappedModel, b as getAlphaSearchModel, d as getModelResponsesApiCompactThreshold$1, f as getReasoningEffortForModel, g as isGpt56OrAbove, h as isContextManagementEnabledForResponses, i as listEnabledProviders, k as isResponsesApiWebSearchEnabled, l as getExtraPromptForModel, m as isContextManagementEnabledForMessages, n as getRawProviderConfig, o as resolveEffectiveProviderType, p as getSmallModel, s as resolveProviderAuthType, t as getProviderConfig, u as getModelMappings, v as setModelMappings, x as getAnthropicApiKey } from "./config-
|
|
2
|
-
import { B as fetchResponsesWithLifecycle, C as compactAutoContinuePromptStarts, D as compactTextOnlyGuard, E as compactSystemPromptStarts, F as forwardCodexResponses, G as createWebSocketUrl, H as encodePoolKeyPart, I as generateTraceId, J as forwardError, K as state, L as requestContext, N as CODEX_API_BASE_URL, O as createAuthMiddleware, P as buildCodexRequestHeaders, R as resolveTraceId$1, U as isTerminalResponsesStreamChunk, V as createResponsesSafeStream, W as createPooledWebSocketStream, b as prepareInteractionHeaders, c as getUUID, d as isResponsesStream, f as parseUserIdMetadata, g as copilotHeaders, h as copilotBaseUrl, k as getConfiguredAdminApiKeys, l as isAsyncIterable, o as generateRequestIdFromPayload, p as getCopilotUsage, q as HTTPError, r as setupCodexToken, s as getRootSessionId, u as isNullish, v as copilotWebSocketHeaders, w as compactMessageSections, x as prepareMessageProxyHeaders, y as prepareForCompact, z as createResponsesHttpEventStream } from "./token-
|
|
1
|
+
import { A as isResponsesApiWebSocketEnabled, C as getClaudeTokenMultiplier, D as isAlphaSearchCodexPriorityEnabled, E as getResponsesTransportConfig, N as PATHS, O as isMessagesApiEnabled, S as getClaudeAutoModel, T as getMessageApiWebSearchModel, _ as resolveMappedModel, b as getAlphaSearchModel, d as getModelResponsesApiCompactThreshold$1, f as getReasoningEffortForModel, g as isGpt56OrAbove, h as isContextManagementEnabledForResponses, i as listEnabledProviders, k as isResponsesApiWebSearchEnabled, l as getExtraPromptForModel, m as isContextManagementEnabledForMessages, n as getRawProviderConfig, o as resolveEffectiveProviderType, p as getSmallModel, s as resolveProviderAuthType, t as getProviderConfig, u as getModelMappings, v as setModelMappings, x as getAnthropicApiKey } from "./config-Cb0atQ6i.js";
|
|
2
|
+
import { B as fetchResponsesWithLifecycle, C as compactAutoContinuePromptStarts, D as compactTextOnlyGuard, E as compactSystemPromptStarts, F as forwardCodexResponses, G as createWebSocketUrl, H as encodePoolKeyPart, I as generateTraceId, J as forwardError, K as state, L as requestContext, N as CODEX_API_BASE_URL, O as createAuthMiddleware, P as buildCodexRequestHeaders, R as resolveTraceId$1, U as isTerminalResponsesStreamChunk, V as createResponsesSafeStream, W as createPooledWebSocketStream, b as prepareInteractionHeaders, c as getUUID, d as isResponsesStream, f as parseUserIdMetadata, g as copilotHeaders, h as copilotBaseUrl, k as getConfiguredAdminApiKeys, l as isAsyncIterable, o as generateRequestIdFromPayload, p as getCopilotUsage, q as HTTPError, r as setupCodexToken, s as getRootSessionId, u as isNullish, v as copilotWebSocketHeaders, w as compactMessageSections, x as prepareMessageProxyHeaders, y as prepareForCompact, z as createResponsesHttpEventStream } from "./token-DYqRXNhu.js";
|
|
3
3
|
import { a as isDeferredToolName, c as parseMcpToolSearchSentinel, d as shouldEnableResponsesToolSearch, i as isBridgeToolSearchName, l as resolveBridgeToolSearchName, o as listDeferredToolNames, r as formatToolSearchBridgeArguments, s as normalizeToolSearchBridgeArguments, t as BRIDGE_TOOL_SEARCH_NAME, u as selectDeferredToolsByNames } from "./tool-search-Ds1vbmGG.js";
|
|
4
|
-
import { i as toClientModelId, r as normalizeSdkModelId, t as findEndpointModel } from "./models-
|
|
4
|
+
import { i as toClientModelId, r as normalizeSdkModelId, t as findEndpointModel } from "./models-DvNveb2V.js";
|
|
5
5
|
import consola from "consola";
|
|
6
6
|
import { createHash } from "node:crypto";
|
|
7
7
|
import fs, { createWriteStream, readFileSync, rmSync } from "node:fs";
|
|
@@ -12377,55 +12377,70 @@ usageRoute.get("/", async (c) => {
|
|
|
12377
12377
|
});
|
|
12378
12378
|
//#endregion
|
|
12379
12379
|
//#region src/server.ts
|
|
12380
|
-
|
|
12381
|
-
|
|
12382
|
-
|
|
12383
|
-
|
|
12384
|
-
|
|
12385
|
-
|
|
12386
|
-
|
|
12387
|
-
|
|
12388
|
-
|
|
12389
|
-
|
|
12390
|
-
|
|
12391
|
-
|
|
12392
|
-
server.use(
|
|
12393
|
-
|
|
12394
|
-
|
|
12395
|
-
|
|
12396
|
-
|
|
12397
|
-
|
|
12398
|
-
|
|
12399
|
-
|
|
12400
|
-
|
|
12401
|
-
|
|
12402
|
-
|
|
12403
|
-
|
|
12404
|
-
server.
|
|
12405
|
-
|
|
12406
|
-
|
|
12407
|
-
|
|
12408
|
-
|
|
12409
|
-
server.
|
|
12410
|
-
server.
|
|
12411
|
-
|
|
12412
|
-
|
|
12413
|
-
|
|
12414
|
-
server.
|
|
12415
|
-
server.route("/
|
|
12416
|
-
server.route("/
|
|
12417
|
-
server.route("/
|
|
12418
|
-
server.route("/
|
|
12419
|
-
server.route("
|
|
12420
|
-
server.route("
|
|
12421
|
-
server.route("
|
|
12422
|
-
server.route("
|
|
12423
|
-
server.route("
|
|
12424
|
-
server.route("
|
|
12425
|
-
server.route("
|
|
12426
|
-
server.route("
|
|
12427
|
-
server.route("
|
|
12380
|
+
function resolveSameOriginCorsOrigin(origin, context) {
|
|
12381
|
+
if (!origin) return null;
|
|
12382
|
+
try {
|
|
12383
|
+
return origin === new URL(context.req.url).origin ? origin : null;
|
|
12384
|
+
} catch {
|
|
12385
|
+
return null;
|
|
12386
|
+
}
|
|
12387
|
+
}
|
|
12388
|
+
function createServer(options = {}) {
|
|
12389
|
+
const server = new Hono();
|
|
12390
|
+
const networkExposed = options.networkExposed ?? false;
|
|
12391
|
+
server.use(traceIdMiddleware);
|
|
12392
|
+
server.use(logger());
|
|
12393
|
+
server.use(networkExposed ? cors({ origin: resolveSameOriginCorsOrigin }) : cors());
|
|
12394
|
+
server.use("*", createAuthMiddleware({
|
|
12395
|
+
getApiKeys: options.getApiKeys,
|
|
12396
|
+
allowUnauthenticatedPaths: [
|
|
12397
|
+
"/",
|
|
12398
|
+
"/usage-viewer",
|
|
12399
|
+
"/usage-viewer/"
|
|
12400
|
+
],
|
|
12401
|
+
shouldSkipPath: (path) => path.startsWith("/admin/"),
|
|
12402
|
+
allowWhenNoApiKeys: !networkExposed
|
|
12403
|
+
}));
|
|
12404
|
+
server.use("/admin/*", createAuthMiddleware({
|
|
12405
|
+
getApiKeys: getConfiguredAdminApiKeys,
|
|
12406
|
+
allowUnauthenticatedPaths: [],
|
|
12407
|
+
allowWhenNoApiKeys: false
|
|
12408
|
+
}));
|
|
12409
|
+
server.get("/", (c) => c.text("Server running"));
|
|
12410
|
+
server.get("/usage-viewer", (c) => {
|
|
12411
|
+
const usageViewerFileUrl = new URL("../pages/index.html", import.meta.url);
|
|
12412
|
+
return c.html(readFileSync(usageViewerFileUrl, "utf8"));
|
|
12413
|
+
});
|
|
12414
|
+
server.get("/usage-viewer/", (c) => c.redirect("/usage-viewer", 301));
|
|
12415
|
+
server.route("/chat/completions", completionRoutes);
|
|
12416
|
+
server.route("/admin/config", configRoutes);
|
|
12417
|
+
server.route("/models", modelRoutes);
|
|
12418
|
+
server.route("/embeddings", embeddingRoutes);
|
|
12419
|
+
server.route("/usage", usageRoute);
|
|
12420
|
+
server.route("/token-usage", tokenUsageRoute);
|
|
12421
|
+
server.route("/responses", responsesRoutes);
|
|
12422
|
+
server.route("/alpha/search", alphaSearchRoutes);
|
|
12423
|
+
server.route("/images", imageRoutes);
|
|
12424
|
+
server.route("/v1/chat/completions", completionRoutes);
|
|
12425
|
+
server.route("/v1/models", modelRoutes);
|
|
12426
|
+
server.route("/v1/embeddings", embeddingRoutes);
|
|
12427
|
+
server.route("/v1/responses", responsesRoutes);
|
|
12428
|
+
server.route("/v1/alpha/search", alphaSearchRoutes);
|
|
12429
|
+
server.route("/v1/images", imageRoutes);
|
|
12430
|
+
server.route("/v1/messages", messageRoutes);
|
|
12431
|
+
server.route("/:provider/v1/messages", providerMessageRoutes);
|
|
12432
|
+
server.route("/:provider/v1/models", providerModelRoutes);
|
|
12433
|
+
server.route("/:provider/v1/responses", providerResponsesRoutes);
|
|
12434
|
+
server.route("/:provider/v1/alpha/search", providerAlphaSearchRoutes);
|
|
12435
|
+
server.route("/:provider/v1/images", providerImageRoutes);
|
|
12436
|
+
server.route("/:provider/models", providerModelRoutes);
|
|
12437
|
+
server.route("/:provider/responses", providerResponsesRoutes);
|
|
12438
|
+
server.route("/:provider/alpha/search", providerAlphaSearchRoutes);
|
|
12439
|
+
server.route("/:provider/images", providerImageRoutes);
|
|
12440
|
+
return server;
|
|
12441
|
+
}
|
|
12442
|
+
createServer();
|
|
12428
12443
|
//#endregion
|
|
12429
|
-
export {
|
|
12444
|
+
export { createServer };
|
|
12430
12445
|
|
|
12431
|
-
//# sourceMappingURL=server-
|
|
12446
|
+
//# sourceMappingURL=server-D5XuGc4z.js.map
|