@jeffreycao/copilot-api 1.14.2 → 1.14.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/dist/main.js +1 -1
- package/dist/{server-HvdtsRfY.js → server-erYoRK9y.js} +88 -57
- package/dist/server-erYoRK9y.js.map +1 -0
- package/dist/{start-BUCPPobx.js → start-CE0CJpAo.js} +2 -2
- package/dist/{start-BUCPPobx.js.map → start-CE0CJpAo.js.map} +1 -1
- package/package.json +1 -1
- package/dist/server-HvdtsRfY.js.map +0 -1
package/dist/main.js
CHANGED
|
@@ -25,7 +25,7 @@ bindElectronFetch();
|
|
|
25
25
|
const { auth } = await import("./auth-DvJ8r_tN.js");
|
|
26
26
|
const { debug } = await import("./debug-Bb5hamXX.js");
|
|
27
27
|
const { mcp } = await import("./mcp-BseuqgHR.js");
|
|
28
|
-
const { start } = await import("./start-
|
|
28
|
+
const { start } = await import("./start-CE0CJpAo.js");
|
|
29
29
|
await runMain(defineCommand({
|
|
30
30
|
meta: {
|
|
31
31
|
name: "copilot-api",
|
|
@@ -4623,6 +4623,64 @@ const stringifyToolSearchArguments = (argumentsValue) => {
|
|
|
4623
4623
|
return;
|
|
4624
4624
|
}
|
|
4625
4625
|
};
|
|
4626
|
+
//#endregion
|
|
4627
|
+
//#region src/routes/messages/responses-stream-collection.ts
|
|
4628
|
+
const collectResponsesStreamResult = async ({ errorMessagePrefix = "Responses stream", parseEvent = parseResponsesStreamEvent$1, upstreamResponse, logger }) => {
|
|
4629
|
+
const state = createResponsesStreamCollection();
|
|
4630
|
+
for await (const chunk of upstreamResponse) {
|
|
4631
|
+
const result = collectResponsesStreamChunk({
|
|
4632
|
+
chunk,
|
|
4633
|
+
errorMessagePrefix,
|
|
4634
|
+
logger,
|
|
4635
|
+
parseEvent,
|
|
4636
|
+
state
|
|
4637
|
+
});
|
|
4638
|
+
if (result) return result;
|
|
4639
|
+
}
|
|
4640
|
+
throw new Error(`${errorMessagePrefix} ended without a terminal event`);
|
|
4641
|
+
};
|
|
4642
|
+
const collectResponsesStreamChunk = ({ chunk, errorMessagePrefix, logger, parseEvent, state }) => {
|
|
4643
|
+
debugJson(logger, "Received responses stream chunk:", chunk);
|
|
4644
|
+
if (chunk.event === "ping" || !chunk.data || chunk.data === "[DONE]") return;
|
|
4645
|
+
const parsed = parseEvent(chunk.data);
|
|
4646
|
+
if (!parsed) return;
|
|
4647
|
+
if (parsed.type === "error") throw new Error(getStreamErrorMessage(parsed) ?? `${errorMessagePrefix} failed`);
|
|
4648
|
+
if (parsed.type === "response.failed") {
|
|
4649
|
+
const response = parsed.response;
|
|
4650
|
+
if (!response) throw new Error("Responses stream ended without a response");
|
|
4651
|
+
throw new Error(response.error?.message ?? `${errorMessagePrefix} failed`);
|
|
4652
|
+
}
|
|
4653
|
+
return collectResponsesStreamEvent(parsed, state);
|
|
4654
|
+
};
|
|
4655
|
+
const parseResponsesStreamEvent$1 = (data) => {
|
|
4656
|
+
try {
|
|
4657
|
+
return JSON.parse(data);
|
|
4658
|
+
} catch {
|
|
4659
|
+
return null;
|
|
4660
|
+
}
|
|
4661
|
+
};
|
|
4662
|
+
const createResponsesStreamCollection = () => ({ outputItemsByIndex: /* @__PURE__ */ new Map() });
|
|
4663
|
+
const collectResponsesStreamEvent = (event, state) => {
|
|
4664
|
+
switch (event.type) {
|
|
4665
|
+
case "response.completed":
|
|
4666
|
+
case "response.incomplete": {
|
|
4667
|
+
const response = event.response;
|
|
4668
|
+
if (!response) throw new Error("Responses stream ended without a response");
|
|
4669
|
+
response.copilot_usage ??= event.copilot_usage;
|
|
4670
|
+
const output = [...state.outputItemsByIndex.entries()].sort(([leftIndex], [rightIndex]) => leftIndex - rightIndex).map(([, item]) => item);
|
|
4671
|
+
return {
|
|
4672
|
+
...response,
|
|
4673
|
+
output: output.length > 0 ? output : response.output
|
|
4674
|
+
};
|
|
4675
|
+
}
|
|
4676
|
+
case "response.output_item.done":
|
|
4677
|
+
state.outputItemsByIndex.set(event.output_index, event.item);
|
|
4678
|
+
break;
|
|
4679
|
+
}
|
|
4680
|
+
};
|
|
4681
|
+
const getStreamErrorMessage = (event) => {
|
|
4682
|
+
return event.error?.message ?? event.message ?? void 0;
|
|
4683
|
+
};
|
|
4626
4684
|
const DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO = .85;
|
|
4627
4685
|
const responsesUtilsDependencies = {
|
|
4628
4686
|
getModelResponsesApiCompactThreshold: getModelResponsesApiCompactThreshold$1,
|
|
@@ -4971,53 +5029,9 @@ const reconstructWebSearchResponse = (payload, result, options) => {
|
|
|
4971
5029
|
}
|
|
4972
5030
|
};
|
|
4973
5031
|
};
|
|
4974
|
-
const collectWebSearchResponsesStreamResult = async ({ errorMessagePrefix = "Web search responses stream", parseEvent = parseResponsesStreamEvent$1, upstreamResponse, logger }) => {
|
|
4975
|
-
const state = createWebSearchResponsesStreamCollection();
|
|
4976
|
-
for await (const chunk of upstreamResponse) {
|
|
4977
|
-
debugJson(logger, "Received web search responses stream chunk:", chunk);
|
|
4978
|
-
if (chunk.event === "ping") continue;
|
|
4979
|
-
if (!chunk.data || chunk.data === "[DONE]") continue;
|
|
4980
|
-
const parsed = parseEvent(chunk.data);
|
|
4981
|
-
if (!parsed) continue;
|
|
4982
|
-
if (parsed.type === "error") throw new Error(getStreamErrorMessage(parsed) ?? `${errorMessagePrefix} failed`);
|
|
4983
|
-
const result = collectResponsesStreamEvent(parsed, state);
|
|
4984
|
-
if (result) return result;
|
|
4985
|
-
}
|
|
4986
|
-
throw new Error(`${errorMessagePrefix} ended without a terminal event`);
|
|
4987
|
-
};
|
|
4988
|
-
const parseResponsesStreamEvent$1 = (data) => {
|
|
4989
|
-
try {
|
|
4990
|
-
return JSON.parse(data);
|
|
4991
|
-
} catch {
|
|
4992
|
-
return null;
|
|
4993
|
-
}
|
|
4994
|
-
};
|
|
4995
5032
|
const isWebSearchResponsesStream = (value) => {
|
|
4996
5033
|
return Boolean(value) && typeof value[Symbol.asyncIterator] === "function";
|
|
4997
5034
|
};
|
|
4998
|
-
const createWebSearchResponsesStreamCollection = () => ({ outputItemsByIndex: /* @__PURE__ */ new Map() });
|
|
4999
|
-
const collectResponsesStreamEvent = (event, state) => {
|
|
5000
|
-
switch (event.type) {
|
|
5001
|
-
case "response.completed":
|
|
5002
|
-
case "response.failed":
|
|
5003
|
-
case "response.incomplete": {
|
|
5004
|
-
event.response.copilot_usage ??= event.copilot_usage;
|
|
5005
|
-
const response = event.response;
|
|
5006
|
-
if (!response) throw new Error("Web search responses stream ended without a response");
|
|
5007
|
-
const output = [...state.outputItemsByIndex.entries()].sort(([leftIndex], [rightIndex]) => leftIndex - rightIndex).map(([, item]) => item);
|
|
5008
|
-
return {
|
|
5009
|
-
...response,
|
|
5010
|
-
output: output.length > 0 ? output : response.output
|
|
5011
|
-
};
|
|
5012
|
-
}
|
|
5013
|
-
case "response.output_item.done":
|
|
5014
|
-
state.outputItemsByIndex.set(event.output_index, event.item);
|
|
5015
|
-
break;
|
|
5016
|
-
}
|
|
5017
|
-
};
|
|
5018
|
-
const getStreamErrorMessage = (event) => {
|
|
5019
|
-
return event.error?.message ?? event.message ?? void 0;
|
|
5020
|
-
};
|
|
5021
5035
|
const createUsageRecorder = (payload, sessionId, webSearchModel) => webSearchFlowDependencies.createUsageRecorder(payload, sessionId, webSearchModel);
|
|
5022
5036
|
/**
|
|
5023
5037
|
* Entry point for web-search detection and routing on /v1/messages.
|
|
@@ -5082,7 +5096,7 @@ const handleWebSearchViaResponses = async (c, payload, options) => {
|
|
|
5082
5096
|
sessionId: options.sessionId,
|
|
5083
5097
|
compactType: options.compactType
|
|
5084
5098
|
});
|
|
5085
|
-
const result = isWebSearchResponsesStream(upstreamResult) ? await
|
|
5099
|
+
const result = isWebSearchResponsesStream(upstreamResult) ? await collectResponsesStreamResult({
|
|
5086
5100
|
errorMessagePrefix: "Web search responses stream",
|
|
5087
5101
|
upstreamResponse: upstreamResult,
|
|
5088
5102
|
logger
|
|
@@ -5394,7 +5408,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
5394
5408
|
if (providerConfig.name === "codex") {
|
|
5395
5409
|
const upstreamResponse = await forwardCodexResponses(responsesPayload, c.req.raw.headers, providerConfig.baseUrl);
|
|
5396
5410
|
if (isResponsesStream$1(upstreamResponse)) return respondWebSearchProviderMessagesJson(c, {
|
|
5397
|
-
body: await
|
|
5411
|
+
body: await collectResponsesStreamResult({
|
|
5398
5412
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
5399
5413
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
5400
5414
|
upstreamResponse,
|
|
@@ -5422,7 +5436,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
5422
5436
|
throw new HTTPError("Failed to create provider web search responses", upstreamResponse);
|
|
5423
5437
|
}
|
|
5424
5438
|
if ((upstreamResponse.headers.get("content-type") ?? "").includes("text/event-stream")) return respondWebSearchProviderMessagesJson(c, {
|
|
5425
|
-
body: await
|
|
5439
|
+
body: await collectResponsesStreamResult({
|
|
5426
5440
|
errorMessagePrefix: `${provider} web search responses stream`,
|
|
5427
5441
|
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
5428
5442
|
upstreamResponse: events(upstreamResponse),
|
|
@@ -5444,7 +5458,9 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
|
|
|
5444
5458
|
const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
5445
5459
|
const { modelConfig, payload, provider, providerConfig } = options;
|
|
5446
5460
|
const selectedModel = providerConfig.name === "codex" ? getModels().data.find((model) => model.id === payload.model) : void 0;
|
|
5461
|
+
const wantsStream = payload.stream === true;
|
|
5447
5462
|
const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload);
|
|
5463
|
+
if (providerConfig.name === "codex" && !wantsStream) responsesPayload.stream = true;
|
|
5448
5464
|
if (applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens, { source: "messages" })) compactInputByLatestCompaction(responsesPayload);
|
|
5449
5465
|
debugJson(logger$6, "provider.messages.responses.request", {
|
|
5450
5466
|
payload: responsesPayload,
|
|
@@ -5452,15 +5468,30 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
|
|
|
5452
5468
|
});
|
|
5453
5469
|
if (providerConfig.name === "codex") {
|
|
5454
5470
|
const upstreamResponse = await forwardCodexResponses(responsesPayload, c.req.raw.headers, providerConfig.baseUrl);
|
|
5455
|
-
if (
|
|
5456
|
-
|
|
5457
|
-
|
|
5458
|
-
|
|
5459
|
-
|
|
5460
|
-
|
|
5461
|
-
|
|
5462
|
-
|
|
5463
|
-
|
|
5471
|
+
if (isResponsesStream$1(upstreamResponse)) {
|
|
5472
|
+
if (wantsStream) return streamResponsesProviderMessages({
|
|
5473
|
+
c,
|
|
5474
|
+
modelConfig,
|
|
5475
|
+
payload,
|
|
5476
|
+
pricingCurrency: providerConfig.pricingCurrency,
|
|
5477
|
+
provider,
|
|
5478
|
+
providerConfig,
|
|
5479
|
+
upstreamResponse
|
|
5480
|
+
});
|
|
5481
|
+
return respondResponsesProviderMessagesJson(c, {
|
|
5482
|
+
body: await collectResponsesStreamResult({
|
|
5483
|
+
errorMessagePrefix: `${provider} messages responses stream`,
|
|
5484
|
+
parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
|
|
5485
|
+
upstreamResponse,
|
|
5486
|
+
logger: logger$6
|
|
5487
|
+
}),
|
|
5488
|
+
modelConfig,
|
|
5489
|
+
payload,
|
|
5490
|
+
pricingCurrency: providerConfig.pricingCurrency,
|
|
5491
|
+
provider,
|
|
5492
|
+
providerConfig
|
|
5493
|
+
});
|
|
5494
|
+
}
|
|
5464
5495
|
return respondResponsesProviderMessagesJson(c, {
|
|
5465
5496
|
body: upstreamResponse,
|
|
5466
5497
|
modelConfig,
|
|
@@ -6851,4 +6882,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
|
|
|
6851
6882
|
//#endregion
|
|
6852
6883
|
export { server };
|
|
6853
6884
|
|
|
6854
|
-
//# sourceMappingURL=server-
|
|
6885
|
+
//# sourceMappingURL=server-erYoRK9y.js.map
|