@jeffreycao/copilot-api 1.5.3-beta.3 → 1.5.3
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 +1 -1
- package/dist/{auth-DqeBalDi.js → auth-B7io-Eju.js} +3 -3
- package/dist/{auth-DqeBalDi.js.map → auth-B7io-Eju.js.map} +1 -1
- package/dist/{check-usage-BCT4zrbb.js → check-usage-DLE8UgqB.js} +3 -3
- package/dist/{check-usage-BCT4zrbb.js.map → check-usage-DLE8UgqB.js.map} +1 -1
- package/dist/main.js +3 -3
- package/dist/{server-DLaz3q72.js → server-CFiXEbAJ.js} +32 -6
- package/dist/server-CFiXEbAJ.js.map +1 -0
- package/dist/{start-CrNDSGP_.js → start-CuRcvtuH.js} +6 -5
- package/dist/start-CuRcvtuH.js.map +1 -0
- package/dist/{token-CEABFmH9.js → token-CQKghKXN.js} +3 -6
- package/dist/token-CQKghKXN.js.map +1 -0
- package/dist/{utils-DDQKGVRQ.js → utils-CKrfAAVw.js} +90 -12
- package/dist/utils-CKrfAAVw.js.map +1 -0
- package/package.json +1 -1
- package/dist/server-DLaz3q72.js.map +0 -1
- package/dist/start-CrNDSGP_.js.map +0 -1
- package/dist/token-CEABFmH9.js.map +0 -1
- package/dist/utils-DDQKGVRQ.js.map +0 -1
package/README.md
CHANGED
|
@@ -614,7 +614,7 @@ Here is an example `.claude/settings.json` file:
|
|
|
614
614
|
- Setting CLAUDE_CODE_ATTRIBUTION_HEADER to 0 can prevent Claude code from adding billing and version information in system prompts, thereby avoiding prompt cache invalidation.
|
|
615
615
|
- Turning off CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION can prevent quota from being consumed unnecessarily.
|
|
616
616
|
- Permissions deny WebSearch because the GitHub Copilot API does not support natie websearch (some gpt models support websearch, but the current project has not adapted websearch); it is recommended to install the mcp mcp_server_fetch tool or other search tools as alternatives..
|
|
617
|
-
-
|
|
617
|
+
- If using a non-Claude model, do not enable ENABLE_TOOL_SEARCH. If using the Claude model, can enable ENABLE_TOOL_SEARCH. The current Claude Code uses the client tool search mode. In this mode, loading defer tools requires an additional request each time, and cache hit rates are affected, so it does not necessarily save tokens,but it can save context. Only server tool search mode can save tokens.
|
|
618
618
|
|
|
619
619
|
You can find more options here: [Claude Code settings](https://docs.anthropic.com/en/docs/claude-code/settings#environment-variables)
|
|
620
620
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PATHS, ensurePaths } from "./paths-Cla6y5eD.js";
|
|
2
|
-
import { state } from "./utils-
|
|
3
|
-
import { setupGitHubToken } from "./token-
|
|
2
|
+
import { state } from "./utils-CKrfAAVw.js";
|
|
3
|
+
import { setupGitHubToken } from "./token-CQKghKXN.js";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
import consola from "consola";
|
|
6
6
|
|
|
@@ -43,4 +43,4 @@ const auth = defineCommand({
|
|
|
43
43
|
|
|
44
44
|
//#endregion
|
|
45
45
|
export { auth };
|
|
46
|
-
//# sourceMappingURL=auth-
|
|
46
|
+
//# sourceMappingURL=auth-B7io-Eju.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-
|
|
1
|
+
{"version":3,"file":"auth-B7io-Eju.js","names":[],"sources":["../src/auth.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport { PATHS, ensurePaths } from \"./lib/paths\"\nimport { state } from \"./lib/state\"\nimport { setupGitHubToken } from \"./lib/token\"\n\ninterface RunAuthOptions {\n verbose: boolean\n showToken: boolean\n}\n\nexport async function runAuth(options: RunAuthOptions): Promise<void> {\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.showToken = options.showToken\n\n await ensurePaths()\n await setupGitHubToken({ force: true })\n consola.success(\"GitHub token written to\", PATHS.GITHUB_TOKEN_PATH)\n}\n\nexport const auth = defineCommand({\n meta: {\n name: \"auth\",\n description: \"Run GitHub auth flow without running the server\",\n },\n args: {\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show GitHub token on auth\",\n },\n },\n run({ args }) {\n return runAuth({\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n"],"mappings":";;;;;;;AAcA,eAAsB,QAAQ,SAAwC;AACpE,KAAI,QAAQ,SAAS;AACnB,UAAQ,QAAQ;AAChB,UAAQ,KAAK,0BAA0B;;AAGzC,OAAM,YAAY,QAAQ;AAE1B,OAAM,aAAa;AACnB,OAAM,iBAAiB,EAAE,OAAO,MAAM,CAAC;AACvC,SAAQ,QAAQ,2BAA2B,MAAM,kBAAkB;;AAGrE,MAAa,OAAO,cAAc;CAChC,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM;EACJ,SAAS;GACP,OAAO;GACP,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACD,cAAc;GACZ,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACF;CACD,IAAI,EAAE,QAAQ;AACZ,SAAO,QAAQ;GACb,SAAS,KAAK;GACd,WAAW,KAAK;GACjB,CAAC;;CAEL,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ensurePaths } from "./paths-Cla6y5eD.js";
|
|
2
|
-
import { getCopilotUsage } from "./utils-
|
|
3
|
-
import { setupGitHubToken } from "./token-
|
|
2
|
+
import { getCopilotUsage } from "./utils-CKrfAAVw.js";
|
|
3
|
+
import { setupGitHubToken } from "./token-CQKghKXN.js";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
import consola from "consola";
|
|
6
6
|
|
|
@@ -41,4 +41,4 @@ const checkUsage = defineCommand({
|
|
|
41
41
|
|
|
42
42
|
//#endregion
|
|
43
43
|
export { checkUsage };
|
|
44
|
-
//# sourceMappingURL=check-usage-
|
|
44
|
+
//# sourceMappingURL=check-usage-DLE8UgqB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-usage-
|
|
1
|
+
{"version":3,"file":"check-usage-DLE8UgqB.js","names":[],"sources":["../src/check-usage.ts"],"sourcesContent":["import { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport { ensurePaths } from \"./lib/paths\"\nimport { setupGitHubToken } from \"./lib/token\"\nimport {\n getCopilotUsage,\n type QuotaDetail,\n} from \"./services/github/get-copilot-usage\"\n\nexport const checkUsage = defineCommand({\n meta: {\n name: \"check-usage\",\n description: \"Show current GitHub Copilot usage/quota information\",\n },\n async run() {\n await ensurePaths()\n await setupGitHubToken()\n try {\n const usage = await getCopilotUsage()\n const premium = usage.quota_snapshots.premium_interactions\n const premiumTotal = premium.entitlement\n const premiumUsed = premiumTotal - premium.remaining\n const premiumPercentUsed =\n premiumTotal > 0 ? (premiumUsed / premiumTotal) * 100 : 0\n const premiumPercentRemaining = premium.percent_remaining\n\n // Helper to summarize a quota snapshot\n function summarizeQuota(name: string, snap: QuotaDetail | undefined) {\n if (!snap) return `${name}: N/A`\n const total = snap.entitlement\n const used = total - snap.remaining\n const percentUsed = total > 0 ? (used / total) * 100 : 0\n const percentRemaining = snap.percent_remaining\n return `${name}: ${used}/${total} used (${percentUsed.toFixed(1)}% used, ${percentRemaining.toFixed(1)}% remaining)`\n }\n\n const premiumLine = `Premium: ${premiumUsed}/${premiumTotal} used (${premiumPercentUsed.toFixed(1)}% used, ${premiumPercentRemaining.toFixed(1)}% remaining)`\n const chatLine = summarizeQuota(\"Chat\", usage.quota_snapshots.chat)\n const completionsLine = summarizeQuota(\n \"Completions\",\n usage.quota_snapshots.completions,\n )\n\n consola.box(\n `Copilot Usage (plan: ${usage.copilot_plan})\\n`\n + `Quota resets: ${usage.quota_reset_date}\\n`\n + `\\nQuotas:\\n`\n + ` ${premiumLine}\\n`\n + ` ${chatLine}\\n`\n + ` ${completionsLine}`,\n )\n } catch (err) {\n consola.error(\"Failed to fetch Copilot usage:\", err)\n process.exit(1)\n }\n },\n})\n"],"mappings":";;;;;;;AAUA,MAAa,aAAa,cAAc;CACtC,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM,MAAM;AACV,QAAM,aAAa;AACnB,QAAM,kBAAkB;AACxB,MAAI;GACF,MAAM,QAAQ,MAAM,iBAAiB;GACrC,MAAM,UAAU,MAAM,gBAAgB;GACtC,MAAM,eAAe,QAAQ;GAC7B,MAAM,cAAc,eAAe,QAAQ;GAC3C,MAAM,qBACJ,eAAe,IAAK,cAAc,eAAgB,MAAM;GAC1D,MAAM,0BAA0B,QAAQ;GAGxC,SAAS,eAAe,MAAc,MAA+B;AACnE,QAAI,CAAC,KAAM,QAAO,GAAG,KAAK;IAC1B,MAAM,QAAQ,KAAK;IACnB,MAAM,OAAO,QAAQ,KAAK;IAC1B,MAAM,cAAc,QAAQ,IAAK,OAAO,QAAS,MAAM;IACvD,MAAM,mBAAmB,KAAK;AAC9B,WAAO,GAAG,KAAK,IAAI,KAAK,GAAG,MAAM,SAAS,YAAY,QAAQ,EAAE,CAAC,UAAU,iBAAiB,QAAQ,EAAE,CAAC;;GAGzG,MAAM,cAAc,YAAY,YAAY,GAAG,aAAa,SAAS,mBAAmB,QAAQ,EAAE,CAAC,UAAU,wBAAwB,QAAQ,EAAE,CAAC;GAChJ,MAAM,WAAW,eAAe,QAAQ,MAAM,gBAAgB,KAAK;GACnE,MAAM,kBAAkB,eACtB,eACA,MAAM,gBAAgB,YACvB;AAED,WAAQ,IACN,wBAAwB,MAAM,aAAa,mBACtB,MAAM,iBAAiB,iBAEnC,YAAY,MACZ,SAAS,MACT,kBACV;WACM,KAAK;AACZ,WAAQ,MAAM,kCAAkC,IAAI;AACpD,WAAQ,KAAK,EAAE;;;CAGpB,CAAC"}
|
package/dist/main.js
CHANGED
|
@@ -20,10 +20,10 @@ const args = parseArgs(process.argv, cliArgs);
|
|
|
20
20
|
if (typeof args["api-home"] === "string") process.env.COPILOT_API_HOME = args["api-home"];
|
|
21
21
|
if (typeof args["oauth-app"] === "string") process.env.COPILOT_API_OAUTH_APP = args["oauth-app"];
|
|
22
22
|
if (typeof args["enterprise-url"] === "string") process.env.COPILOT_API_ENTERPRISE_URL = args["enterprise-url"];
|
|
23
|
-
const { auth } = await import("./auth-
|
|
24
|
-
const { checkUsage } = await import("./check-usage-
|
|
23
|
+
const { auth } = await import("./auth-B7io-Eju.js");
|
|
24
|
+
const { checkUsage } = await import("./check-usage-DLE8UgqB.js");
|
|
25
25
|
const { debug } = await import("./debug-DcC7ZPH0.js");
|
|
26
|
-
const { start } = await import("./start-
|
|
26
|
+
const { start } = await import("./start-CuRcvtuH.js");
|
|
27
27
|
const main = defineCommand({
|
|
28
28
|
meta: {
|
|
29
29
|
name: "copilot-api",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PATHS } from "./paths-Cla6y5eD.js";
|
|
2
|
-
import { HTTPError, cacheModels, copilotBaseUrl, copilotHeaders, forwardError, generateRequestIdFromPayload, getCopilotUsage, getRootSessionId, getUUID, isNullish, parseUserIdMetadata, prepareForCompact, prepareInteractionHeaders, prepareMessageProxyHeaders, requestContext, resolveTraceId, sleep, state } from "./utils-
|
|
2
|
+
import { HTTPError, cacheModels, copilotBaseUrl, copilotHeaders, forwardError, generateRequestIdFromPayload, getCopilotUsage, getRootSessionId, getUUID, isNullish, parseUserIdMetadata, prepareForCompact, prepareInteractionHeaders, prepareMessageProxyHeaders, requestContext, resolveTraceId, sleep, state } from "./utils-CKrfAAVw.js";
|
|
3
3
|
import { getAnthropicApiKey, getClaudeTokenMultiplier, getConfig, getExtraPromptForModel, getProviderConfig, getReasoningEffortForModel, getSmallModel, isMessagesApiEnabled, isResponsesApiContextManagementModel, isResponsesApiWebSearchEnabled } from "./config-EvlyFBSs.js";
|
|
4
4
|
import consola from "consola";
|
|
5
5
|
import path from "node:path";
|
|
@@ -64,7 +64,9 @@ const traceIdMiddleware = async (c, next) => {
|
|
|
64
64
|
const context = {
|
|
65
65
|
traceId,
|
|
66
66
|
startTime: Date.now(),
|
|
67
|
-
userAgent: c.req.header("user-agent") || ""
|
|
67
|
+
userAgent: c.req.header("user-agent") || "",
|
|
68
|
+
sessionAffinity: c.req.header("x-session-affinity"),
|
|
69
|
+
parentSessionId: c.req.header("x-parent-session-id")
|
|
68
70
|
};
|
|
69
71
|
await requestContext.run(context, async () => {
|
|
70
72
|
await next();
|
|
@@ -744,7 +746,6 @@ function handleAssistantMessage(message, modelId) {
|
|
|
744
746
|
function mapContent(content) {
|
|
745
747
|
if (typeof content === "string") return content;
|
|
746
748
|
if (!Array.isArray(content)) return null;
|
|
747
|
-
if (!content.some((block) => block.type === "image")) return content.filter((block) => block.type === "text").map((block) => block.text).join("\n\n");
|
|
748
749
|
const contentParts = [];
|
|
749
750
|
for (const block of content) switch (block.type) {
|
|
750
751
|
case "text":
|
|
@@ -759,6 +760,12 @@ function mapContent(content) {
|
|
|
759
760
|
image_url: { url: `data:${block.source.media_type};base64,${block.source.data}` }
|
|
760
761
|
});
|
|
761
762
|
break;
|
|
763
|
+
case "tool_reference":
|
|
764
|
+
contentParts.push({
|
|
765
|
+
type: "text",
|
|
766
|
+
text: `Tool ${block.tool_name} loaded`
|
|
767
|
+
});
|
|
768
|
+
break;
|
|
762
769
|
}
|
|
763
770
|
return contentParts;
|
|
764
771
|
}
|
|
@@ -1370,6 +1377,9 @@ const convertToolResultContent = (content) => {
|
|
|
1370
1377
|
case "image":
|
|
1371
1378
|
result.push(createImageContent(block));
|
|
1372
1379
|
break;
|
|
1380
|
+
case "tool_reference":
|
|
1381
|
+
result.push(createTextContent(`Tool ${block.tool_name} loaded`));
|
|
1382
|
+
break;
|
|
1373
1383
|
default: break;
|
|
1374
1384
|
}
|
|
1375
1385
|
return result;
|
|
@@ -1924,6 +1934,7 @@ const compactSystemPromptStart = "You are a helpful AI assistant tasked with sum
|
|
|
1924
1934
|
const compactTextOnlyGuard = "CRITICAL: Respond with TEXT ONLY. Do NOT call any tools.";
|
|
1925
1935
|
const compactSummaryPromptStart = "Your task is to create a detailed summary of the conversation so far";
|
|
1926
1936
|
const compactMessageSections = ["Pending Tasks:", "Current Work:"];
|
|
1937
|
+
const TOOL_REFERENCE_TURN_BOUNDARY = "Tool loaded.";
|
|
1927
1938
|
const getAnthropicEffortForModel = (model) => {
|
|
1928
1939
|
const reasoningEffort = getReasoningEffortForModel(model);
|
|
1929
1940
|
if (reasoningEffort === "xhigh") return "max";
|
|
@@ -1953,6 +1964,7 @@ const mergeContentWithText = (tr, textBlock) => {
|
|
|
1953
1964
|
...tr,
|
|
1954
1965
|
content: `${tr.content}\n\n${textBlock.text}`
|
|
1955
1966
|
};
|
|
1967
|
+
if (hasToolRef(tr)) return tr;
|
|
1956
1968
|
return {
|
|
1957
1969
|
...tr,
|
|
1958
1970
|
content: [...tr.content, textBlock]
|
|
@@ -1966,6 +1978,7 @@ const mergeContentWithTexts = (tr, textBlocks) => {
|
|
|
1966
1978
|
content: `${tr.content}\n\n${appendedTexts}`
|
|
1967
1979
|
};
|
|
1968
1980
|
}
|
|
1981
|
+
if (hasToolRef(tr)) return tr;
|
|
1969
1982
|
return {
|
|
1970
1983
|
...tr,
|
|
1971
1984
|
content: [...tr.content, ...textBlocks]
|
|
@@ -1976,6 +1989,13 @@ const mergeToolResult = (toolResults, textBlocks) => {
|
|
|
1976
1989
|
const lastIndex = toolResults.length - 1;
|
|
1977
1990
|
return toolResults.map((tr, i) => i === lastIndex ? mergeContentWithTexts(tr, textBlocks) : tr);
|
|
1978
1991
|
};
|
|
1992
|
+
const stripToolReferenceTurnBoundary = (anthropicPayload) => {
|
|
1993
|
+
for (const msg of anthropicPayload.messages) {
|
|
1994
|
+
if (msg.role !== "user" || !Array.isArray(msg.content)) continue;
|
|
1995
|
+
if (!msg.content.some((block) => block.type === "tool_result" && hasToolRef(block))) continue;
|
|
1996
|
+
msg.content = msg.content.filter((block) => block.type !== "text" || block.text.trim() !== TOOL_REFERENCE_TURN_BOUNDARY);
|
|
1997
|
+
}
|
|
1998
|
+
};
|
|
1979
1999
|
const mergeToolResultForClaude = (anthropicPayload) => {
|
|
1980
2000
|
for (const msg of anthropicPayload.messages) {
|
|
1981
2001
|
if (msg.role !== "user" || !Array.isArray(msg.content)) continue;
|
|
@@ -1992,6 +2012,9 @@ const mergeToolResultForClaude = (anthropicPayload) => {
|
|
|
1992
2012
|
msg.content = mergeToolResult(toolResults, textBlocks);
|
|
1993
2013
|
}
|
|
1994
2014
|
};
|
|
2015
|
+
const hasToolRef = (block) => {
|
|
2016
|
+
return Array.isArray(block.content) && block.content.some((c) => c.type === "tool_reference");
|
|
2017
|
+
};
|
|
1995
2018
|
const stripCacheControl = (payload) => {
|
|
1996
2019
|
if (Array.isArray(payload.system)) for (const block of payload.system) {
|
|
1997
2020
|
const systemBlock = block;
|
|
@@ -2412,7 +2435,7 @@ const isAsyncIterable$1 = (value) => Boolean(value) && typeof value[Symbol.async
|
|
|
2412
2435
|
//#region src/routes/messages/subagent-marker.ts
|
|
2413
2436
|
const subagentMarkerPrefix = "__SUBAGENT_MARKER__";
|
|
2414
2437
|
const parseSubagentMarkerFromFirstUser = (payload) => {
|
|
2415
|
-
const firstUserMessage = payload.messages.find((msg) => msg.role === "user");
|
|
2438
|
+
const firstUserMessage = payload.messages.find((msg) => msg.role === "user" && Array.isArray(msg.content));
|
|
2416
2439
|
if (!firstUserMessage || !Array.isArray(firstUserMessage.content)) return null;
|
|
2417
2440
|
for (const block of firstUserMessage.content) {
|
|
2418
2441
|
if (block.type !== "text") continue;
|
|
@@ -2470,7 +2493,10 @@ async function handleCompletion(c) {
|
|
|
2470
2493
|
const noTools = !anthropicPayload.tools || anthropicPayload.tools.length === 0;
|
|
2471
2494
|
if (anthropicBeta && noTools && !isCompact) anthropicPayload.model = getSmallModel();
|
|
2472
2495
|
if (isCompact) logger$5.debug("Is compact request:", isCompact);
|
|
2473
|
-
else
|
|
2496
|
+
else {
|
|
2497
|
+
stripToolReferenceTurnBoundary(anthropicPayload);
|
|
2498
|
+
mergeToolResultForClaude(anthropicPayload);
|
|
2499
|
+
}
|
|
2474
2500
|
const requestId = generateRequestIdFromPayload(anthropicPayload, sessionId);
|
|
2475
2501
|
logger$5.debug("Generated request ID:", requestId);
|
|
2476
2502
|
if (state.manualApprove) await awaitApproval();
|
|
@@ -2979,4 +3005,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
|
|
|
2979
3005
|
|
|
2980
3006
|
//#endregion
|
|
2981
3007
|
export { server };
|
|
2982
|
-
//# sourceMappingURL=server-
|
|
3008
|
+
//# sourceMappingURL=server-CFiXEbAJ.js.map
|