@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 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-BUCPPobx.js");
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 collectWebSearchResponsesStreamResult({
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 collectWebSearchResponsesStreamResult({
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 collectWebSearchResponsesStreamResult({
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 (responsesPayload.stream && isResponsesStream$1(upstreamResponse)) return streamResponsesProviderMessages({
5456
- c,
5457
- modelConfig,
5458
- payload,
5459
- pricingCurrency: providerConfig.pricingCurrency,
5460
- provider,
5461
- providerConfig,
5462
- upstreamResponse
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-HvdtsRfY.js.map
6885
+ //# sourceMappingURL=server-erYoRK9y.js.map