xiaodcs-copilot-api 2.3.9-public.1 → 2.3.9-public.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.
@@ -1,13 +1,13 @@
1
1
  import { A as isResponsesApiWebSearchEnabled, C as getClaudeTokenMultiplier, D as isAlphaSearchCodexPriorityEnabled, E as getResponsesTransportConfig, O as isMessagesApiEnabled, P as PATHS, 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, j as isResponsesApiWebSocketEnabled, k as isResponsesApiCompactionRecoveryEnabled, 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-SytZjLq8.js";
2
- import { A as requestContext, B as createResponsesHttpEventStream, D as buildCodexRequestHeaders, E as CODEX_API_BASE_URL, F as getUUID, G as createPooledWebSocketStream, H as createResponsesSafeStream, I as isAsyncIterable, J as HTTPError, K as createWebSocketUrl, L as isNullish, M as withModelTrafficControl, N as generateRequestIdFromPayload, O as forwardCodexResponses, P as getRootSessionId, R as isResponsesStream$1, S as getConfiguredAdminApiKeys, U as encodePoolKeyPart, V as fetchResponsesWithLifecycle, W as isTerminalResponsesStreamChunk, Y as forwardError, _ as compactMessageSections, b as compactTextOnlyGuard, c as copilotBaseUrl, d as copilotWebSocketHeaders, f as prepareForCompact, g as compactAutoContinuePromptStarts, j as resolveTraceId$1, k as generateTraceId, l as copilotHeaders, m as prepareMessageProxyHeaders, o as getCopilotUsage, p as prepareInteractionHeaders, q as state, r as setupCodexToken, x as createAuthMiddleware, y as compactSystemPromptStarts, z as parseUserIdMetadata } from "./token-rjUSsykd.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$1, 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-D9svRIYW.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-CoULksS5.js";
4
+ import { i as toClientModelId, r as normalizeSdkModelId, t as findEndpointModel } from "./models-YMUf33c-.js";
5
5
  import consola from "consola";
6
6
  import { createHash, randomUUID } from "node:crypto";
7
7
  import fs, { readFileSync } from "node:fs";
8
8
  import path from "node:path";
9
9
  import fs$1 from "node:fs/promises";
10
- import "undici";
10
+ import { fetch as fetch$1, getGlobalDispatcher } from "undici";
11
11
  import { events } from "fetch-event-stream";
12
12
  import { z } from "zod";
13
13
  import { Hono } from "hono";
@@ -2630,12 +2630,12 @@ var ResponsesCompactionRecovery = class {
2630
2630
  if (this.shutdownController.signal.aborted) abortRequest();
2631
2631
  let response;
2632
2632
  try {
2633
- response = await withModelTrafficControl(() => this.fetcher(`${copilotBaseUrl(state)}/responses`, {
2633
+ response = await this.fetcher(`${copilotBaseUrl(state)}/responses`, {
2634
2634
  body: prepared.body,
2635
2635
  headers,
2636
2636
  method: "POST",
2637
2637
  signal: requestController.signal
2638
- }), requestController.signal);
2638
+ });
2639
2639
  } finally {
2640
2640
  clearTimeout(timeout);
2641
2641
  this.shutdownController.signal.removeEventListener("abort", abortRequest);
@@ -2986,12 +2986,11 @@ const createResponses = async (payload, { vision, initiator, subagentMarker, req
2986
2986
  consola.log(`<-- model: ${payload.model}`);
2987
2987
  const effectiveTransport = effectiveCompactType === 1 ? "http" : transport;
2988
2988
  if (payload.stream === true && effectiveTransport === "websocket") {
2989
- const websocketRequest = prepareResponsesWebSocketRequest(payload, headers, {
2989
+ const stream = createPooledResponsesWebSocketStream(prepareResponsesWebSocketRequest(payload, headers, {
2990
2990
  requestId,
2991
2991
  signal,
2992
2992
  subagentMarker
2993
- });
2994
- const stream = await withModelTrafficControl(() => createPooledResponsesWebSocketStream(websocketRequest), signal);
2993
+ }));
2995
2994
  return compactionRecoveryEnabled ? createResponsesDependencies.recovery.observeStream(stream, {
2996
2995
  payload,
2997
2996
  sessionId,
@@ -3046,7 +3045,7 @@ const observeCompactionRecoveryResponse = (response, context) => {
3046
3045
  return response;
3047
3046
  };
3048
3047
  const isResponsesStream = (response) => typeof response[Symbol.asyncIterator] === "function";
3049
- const createHttpResponses = async (payload, headers, body, signal) => await withModelTrafficControl(async () => {
3048
+ const createHttpResponses = async (payload, headers, body, signal) => {
3050
3049
  const transportConfig = getResponsesTransportConfig();
3051
3050
  const response = await fetchResponsesWithLifecycle(`${copilotBaseUrl(state)}/responses`, {
3052
3051
  method: "POST",
@@ -3064,7 +3063,7 @@ const createHttpResponses = async (payload, headers, body, signal) => await with
3064
3063
  }
3065
3064
  if (payload.stream) return createResponsesSafeStream(createResponsesHttpEventStream(response, signal), { signal });
3066
3065
  return await response.json();
3067
- }, signal);
3066
+ };
3068
3067
  const prepareResponsesWebSocketRequest = (payload, preparedHeaders, options) => {
3069
3068
  const initiator = getResponsesWebSocketInitiator(preparedHeaders);
3070
3069
  return {
@@ -3145,6 +3144,20 @@ const createResponsesWebSocketStreamChunk = (data) => {
3145
3144
  }
3146
3145
  };
3147
3146
  //#endregion
3147
+ //#region src/lib/timeout-dispatcher.ts
3148
+ /**
3149
+ * Node's global fetch keeps Undici's shorter default headers/body timeouts.
3150
+ * Wrap the global dispatcher so long-running requests (e.g. image
3151
+ * generation) get an explicit cap.
3152
+ */
3153
+ const createTimeoutDispatcher = (timeoutMs) => ({ dispatch(options, handler) {
3154
+ return getGlobalDispatcher().dispatch({
3155
+ ...options,
3156
+ bodyTimeout: timeoutMs,
3157
+ headersTimeout: timeoutMs
3158
+ }, handler);
3159
+ } });
3160
+ //#endregion
3148
3161
  //#region src/services/providers/provider-proxy.ts
3149
3162
  const SHARED_FORWARDABLE_HEADERS = ["accept", "user-agent"];
3150
3163
  const ANTHROPIC_FORWARDABLE_HEADERS = ["anthropic-version", "anthropic-beta"];
@@ -3189,28 +3202,26 @@ function createProviderProxyResponse(upstreamResponse, body) {
3189
3202
  statusText: upstreamResponse.statusText
3190
3203
  });
3191
3204
  }
3192
- async function forwardProviderMessages(providerConfig, payload, requestHeaders, options = {}) {
3205
+ async function forwardProviderMessages(providerConfig, payload, requestHeaders) {
3193
3206
  consola.log(`<-- model: ${payload.model}`);
3194
- return await withModelTrafficControl(() => fetch(`${providerConfig.baseUrl}/v1/messages`, {
3207
+ return await fetch(`${providerConfig.baseUrl}/v1/messages`, {
3195
3208
  method: "POST",
3196
3209
  headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
3197
- body: JSON.stringify(payload),
3198
- signal: options.signal
3199
- }), options.signal);
3210
+ body: JSON.stringify(payload)
3211
+ });
3200
3212
  }
3201
- async function forwardProviderChatCompletions(providerConfig, payload, requestHeaders, options = {}) {
3213
+ async function forwardProviderChatCompletions(providerConfig, payload, requestHeaders) {
3202
3214
  consola.log(`<-- model: ${payload.model}`);
3203
- return await withModelTrafficControl(() => fetch(`${providerConfig.baseUrl}/v1/chat/completions`, {
3215
+ return await fetch(`${providerConfig.baseUrl}/v1/chat/completions`, {
3204
3216
  method: "POST",
3205
3217
  headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
3206
- body: JSON.stringify(payload),
3207
- signal: options.signal
3208
- }), options.signal);
3218
+ body: JSON.stringify(payload)
3219
+ });
3209
3220
  }
3210
3221
  async function forwardProviderResponses(providerConfig, payload, requestHeaders, options = {}) {
3211
3222
  consola.log(`<-- model: ${payload.model}`);
3212
3223
  const transportConfig = getResponsesTransportConfig();
3213
- return await withModelTrafficControl(() => fetchResponsesWithLifecycle(`${providerConfig.baseUrl}/v1/responses`, {
3224
+ return await fetchResponsesWithLifecycle(`${providerConfig.baseUrl}/v1/responses`, {
3214
3225
  method: "POST",
3215
3226
  headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),
3216
3227
  body: JSON.stringify(payload)
@@ -3218,7 +3229,7 @@ async function forwardProviderResponses(providerConfig, payload, requestHeaders,
3218
3229
  headersTimeoutMs: transportConfig.headersTimeoutMs,
3219
3230
  signal: options.signal,
3220
3231
  streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
3221
- }), options.signal);
3232
+ });
3222
3233
  }
3223
3234
  const PROVIDER_MODELS_TIMEOUT_MS = 15e3;
3224
3235
  async function forwardProviderModels(providerConfig, requestHeaders) {
@@ -3228,6 +3239,9 @@ async function forwardProviderModels(providerConfig, requestHeaders) {
3228
3239
  signal: AbortSignal.timeout(PROVIDER_MODELS_TIMEOUT_MS)
3229
3240
  });
3230
3241
  }
3242
+ /** Align with Codex images: long-running generation/edits need a generous cap. */
3243
+ const PROVIDER_IMAGES_TIMEOUT_MS = 900 * 1e3;
3244
+ const providerImagesDispatcher = createTimeoutDispatcher(PROVIDER_IMAGES_TIMEOUT_MS);
3231
3245
  function resolveProviderRequestUrl(providerConfig, requestUrl, path) {
3232
3246
  const upstreamUrl = new URL(`${providerConfig.baseUrl}${path}`);
3233
3247
  upstreamUrl.search = new URL(requestUrl, "http://localhost").search;
@@ -3236,16 +3250,34 @@ function resolveProviderRequestUrl(providerConfig, requestUrl, path) {
3236
3250
  async function forwardProviderAlphaSearch(providerConfig, request) {
3237
3251
  const headers = buildProviderUpstreamHeaders(providerConfig, request.headers);
3238
3252
  const body = await request.arrayBuffer();
3239
- return await withModelTrafficControl(() => fetch(resolveProviderRequestUrl(providerConfig, request.url, "/v1/alpha/search"), {
3253
+ return await fetch(resolveProviderRequestUrl(providerConfig, request.url, "/v1/alpha/search"), {
3240
3254
  method: "POST",
3241
3255
  headers,
3242
- body,
3243
- signal: request.signal
3244
- }), request.signal);
3256
+ body
3257
+ });
3258
+ }
3259
+ async function forwardProviderImages(providerConfig, request, operation) {
3260
+ const headers = buildProviderUpstreamHeaders(providerConfig, request.headers);
3261
+ const contentType = request.headers.get("content-type");
3262
+ if (contentType) headers["content-type"] = contentType;
3263
+ else if (operation === "edits") delete headers["content-type"];
3264
+ const init = {
3265
+ method: "POST",
3266
+ headers,
3267
+ body: request.body,
3268
+ duplex: "half",
3269
+ signal: AbortSignal.timeout(PROVIDER_IMAGES_TIMEOUT_MS)
3270
+ };
3271
+ const upstreamUrl = resolveProviderRequestUrl(providerConfig, request.url, `/v1/images/${operation}`);
3272
+ if (typeof Bun !== "undefined") return await fetch(upstreamUrl, init);
3273
+ return await fetch$1(upstreamUrl, {
3274
+ ...init,
3275
+ dispatcher: providerImagesDispatcher
3276
+ });
3245
3277
  }
3246
3278
  //#endregion
3247
3279
  //#region src/routes/alpha-search/alpha-search-responses.ts
3248
- const logger$14 = createHandlerLogger("alpha-search-responses-handler");
3280
+ const logger$16 = createHandlerLogger("alpha-search-responses-handler");
3249
3281
  const SESSION_TTL_MS = 3600 * 1e3;
3250
3282
  const MAX_SESSIONS = 128;
3251
3283
  const MAX_URL_REFERENCES = 256;
@@ -3603,14 +3635,14 @@ function createRemoteResponsesPayload(request, model, instruction) {
3603
3635
  };
3604
3636
  }
3605
3637
  async function requestProviderSearch(c, providerConfig, payload, model, sessionId) {
3606
- debugJson(logger$14, "Alpha search provider Responses request:", {
3638
+ debugJson(logger$16, "Alpha search provider Responses request:", {
3607
3639
  payload,
3608
3640
  provider: providerConfig.name
3609
3641
  });
3610
3642
  const upstreamResponse = await forwardProviderResponses(providerConfig, payload, c.req.raw.headers, { signal: c.req.raw.signal });
3611
3643
  if (!upstreamResponse.ok) throw new HTTPError(`Failed to create ${providerConfig.name} responses for alpha search`, upstreamResponse);
3612
3644
  const result = await upstreamResponse.json();
3613
- debugJson(logger$14, "Alpha search provider Responses result:", {
3645
+ debugJson(logger$16, "Alpha search provider Responses result:", {
3614
3646
  provider: providerConfig.name,
3615
3647
  result
3616
3648
  });
@@ -3626,7 +3658,7 @@ async function requestProviderSearch(c, providerConfig, payload, model, sessionI
3626
3658
  return result;
3627
3659
  }
3628
3660
  async function requestCopilotSearch(payload, model, requestId, sessionId, signal) {
3629
- debugJson(logger$14, "Alpha search Copilot Responses request:", payload);
3661
+ debugJson(logger$16, "Alpha search Copilot Responses request:", payload);
3630
3662
  const result = await alphaSearchResponsesDependencies.createResponses(payload, {
3631
3663
  vision: false,
3632
3664
  initiator: "agent",
@@ -3635,7 +3667,7 @@ async function requestCopilotSearch(payload, model, requestId, sessionId, signal
3635
3667
  sessionId,
3636
3668
  signal
3637
3669
  });
3638
- debugJson(logger$14, "Alpha search Copilot Responses result:", result);
3670
+ debugJson(logger$16, "Alpha search Copilot Responses result:", result);
3639
3671
  alphaSearchResponsesDependencies.createUsageRecorder(model, sessionId)({
3640
3672
  ...normalizeResponsesUsage(result.usage),
3641
3673
  total_nano_aiu: normalizeOptionalToken(result.copilot_usage?.total_nano_aiu)
@@ -3742,16 +3774,15 @@ async function forwardCodexAlphaSearch(request) {
3742
3774
  if (!headers.has("accept")) headers.set("accept", "application/json");
3743
3775
  const body = await request.arrayBuffer();
3744
3776
  if (!headers.has("content-type")) headers.set("content-type", "application/json");
3745
- return await withModelTrafficControl(() => fetch(resolveCodexAlphaSearchUrl(request.url), {
3777
+ return await fetch(resolveCodexAlphaSearchUrl(request.url), {
3746
3778
  method: "POST",
3747
3779
  headers,
3748
- body,
3749
- signal: request.signal
3750
- }), request.signal);
3780
+ body
3781
+ });
3751
3782
  }
3752
3783
  //#endregion
3753
3784
  //#region src/routes/alpha-search/route.ts
3754
- const logger$13 = createHandlerLogger("alpha-search-handler");
3785
+ const logger$15 = createHandlerLogger("alpha-search-handler");
3755
3786
  const alphaSearchRoutes = new Hono();
3756
3787
  const alphaSearchRouteDependencies = {
3757
3788
  findEndpointModel,
@@ -3771,9 +3802,9 @@ function parseDebugBody(body) {
3771
3802
  }
3772
3803
  }
3773
3804
  async function forwardCodexAlphaSearchRequest(request) {
3774
- await debugJsonAsync(logger$13, "alpha_search.codex.request", async () => ({ body: parseDebugBody(await request.clone().text()) }));
3805
+ await debugJsonAsync(logger$15, "alpha_search.codex.request", async () => ({ body: parseDebugBody(await request.clone().text()) }));
3775
3806
  const upstreamResponse = await alphaSearchRouteDependencies.forwardCodexAlphaSearch(request);
3776
- await debugJsonAsync(logger$13, "alpha_search.codex.response", async () => ({
3807
+ await debugJsonAsync(logger$15, "alpha_search.codex.response", async () => ({
3777
3808
  body: parseDebugBody(await upstreamResponse.clone().text()),
3778
3809
  statusCode: upstreamResponse.status
3779
3810
  }));
@@ -3884,7 +3915,7 @@ alphaSearchRoutes.post("/", async (c) => {
3884
3915
  try {
3885
3916
  return await handleAlphaSearchRequest(c);
3886
3917
  } catch (error) {
3887
- logger$13.error("alpha_search.error", { error });
3918
+ logger$15.error("alpha_search.error", { error });
3888
3919
  return await forwardError(c, error);
3889
3920
  }
3890
3921
  });
@@ -4012,7 +4043,7 @@ const normalizeProviderResponsesReasoningEffort = (payload, providerConfig) => {
4012
4043
  };
4013
4044
  //#endregion
4014
4045
  //#region src/routes/provider/chat-completions/handler.ts
4015
- const logger$12 = createHandlerLogger("provider-chat-completions-handler");
4046
+ const logger$14 = createHandlerLogger("provider-chat-completions-handler");
4016
4047
  async function handleProviderChatCompletionsForProvider(c, options) {
4017
4048
  const { payload, provider } = options;
4018
4049
  const providerConfig = await resolveProviderConfig(provider);
@@ -4026,13 +4057,13 @@ async function handleProviderChatCompletionsForProvider(c, options) {
4026
4057
  applyProviderStreamOptions(payload);
4027
4058
  applyDashScopePreserveThinkingDefault(payload, providerConfig);
4028
4059
  applyProviderContextCache(payload, modelConfig, providerConfig);
4029
- debugJson(logger$12, "provider.chat_completions.request", {
4060
+ debugJson(logger$14, "provider.chat_completions.request", {
4030
4061
  payload,
4031
4062
  provider
4032
4063
  });
4033
- const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers, { signal: c.req.raw.signal });
4064
+ const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers);
4034
4065
  if (!upstreamResponse.ok) {
4035
- logger$12.error("Failed to create provider chat completions", {
4066
+ logger$14.error("Failed to create provider chat completions", {
4036
4067
  provider,
4037
4068
  statusCode: upstreamResponse.status
4038
4069
  });
@@ -4046,7 +4077,7 @@ async function handleProviderChatCompletionsForProvider(c, options) {
4046
4077
  });
4047
4078
  const responseBody = await upstreamResponse.clone().json();
4048
4079
  recordUsage(normalizeOpenAIUsage(responseBody.usage));
4049
- debugJson(logger$12, "provider.chat_completions.response", responseBody);
4080
+ debugJson(logger$14, "provider.chat_completions.response", responseBody);
4050
4081
  return createProviderProxyResponse(upstreamResponse);
4051
4082
  }
4052
4083
  const applyProviderStreamOptions = (payload) => {
@@ -4068,12 +4099,12 @@ const createProviderChatCompletionsUsageRecorder = (payload, provider, modelConf
4068
4099
  providerName: provider
4069
4100
  });
4070
4101
  const streamProviderChatCompletions = (c, upstreamResponse, options) => {
4071
- logger$12.debug("provider.chat_completions.streaming", { provider: options.provider });
4102
+ logger$14.debug("provider.chat_completions.streaming", { provider: options.provider });
4072
4103
  return streamSSE(c, async (stream) => {
4073
4104
  let usage = {};
4074
4105
  try {
4075
4106
  for await (const chunk of events(upstreamResponse)) {
4076
- debugJson(logger$12, "provider.chat_completions.stream_chunk", chunk);
4107
+ debugJson(logger$14, "provider.chat_completions.stream_chunk", chunk);
4077
4108
  if (chunk.data && chunk.data !== "[DONE]") {
4078
4109
  const parsedChunk = parseChatCompletionChunkData(chunk.data);
4079
4110
  if (parsedChunk?.usage) usage = normalizeOpenAIUsage(parsedChunk.usage);
@@ -4097,8 +4128,7 @@ const parseChatCompletionChunkData = (data) => {
4097
4128
  };
4098
4129
  //#endregion
4099
4130
  //#region src/services/copilot/create-chat-completions.ts
4100
- const createChatCompletions = async (payload, options) => await withModelTrafficControl(async () => await createChatCompletionsUpstream(payload, options), options.signal);
4101
- const createChatCompletionsUpstream = async (payload, options) => {
4131
+ const createChatCompletions = async (payload, options) => {
4102
4132
  if (!state.copilotToken) throw new Error("Copilot token not found");
4103
4133
  const enableVision = payload.messages.some((x) => typeof x.content !== "string" && x.content?.some((x) => x.type === "image_url"));
4104
4134
  let isAgentCall = false;
@@ -4116,8 +4146,7 @@ const createChatCompletionsUpstream = async (payload, options) => {
4116
4146
  const response = await fetch(`${copilotBaseUrl(state)}/chat/completions`, {
4117
4147
  method: "POST",
4118
4148
  headers,
4119
- body: JSON.stringify(payload),
4120
- signal: options.signal
4149
+ body: JSON.stringify(payload)
4121
4150
  });
4122
4151
  logCopilotRateLimits(response.headers);
4123
4152
  if (!response.ok) {
@@ -4129,7 +4158,7 @@ const createChatCompletionsUpstream = async (payload, options) => {
4129
4158
  };
4130
4159
  //#endregion
4131
4160
  //#region src/routes/chat-completions/handler.ts
4132
- const logger$11 = createHandlerLogger("chat-completions-handler");
4161
+ const logger$13 = createHandlerLogger("chat-completions-handler");
4133
4162
  async function handleCompletion$1(c) {
4134
4163
  let payload = await c.req.json();
4135
4164
  const requestedModel = payload.model;
@@ -4143,7 +4172,7 @@ async function handleCompletion$1(c) {
4143
4172
  provider: providerModelAlias.provider
4144
4173
  });
4145
4174
  }
4146
- debugJson(logger$11, "Request payload:", payload);
4175
+ debugJson(logger$13, "Request payload:", payload);
4147
4176
  const selectedModel = findEndpointModel(payload.model);
4148
4177
  payload.model = selectedModel?.id ?? payload.model;
4149
4178
  if (isNullish(payload.max_tokens) && isNullish(payload.max_completion_tokens)) {
@@ -4151,16 +4180,16 @@ async function handleCompletion$1(c) {
4151
4180
  ...payload,
4152
4181
  max_tokens: selectedModel?.capabilities.limits.max_output_tokens
4153
4182
  };
4154
- debugJson(logger$11, "Set max_tokens to:", payload.max_tokens);
4183
+ debugJson(logger$13, "Set max_tokens to:", payload.max_tokens);
4155
4184
  }
4156
4185
  if (payload.model.includes("gpt")) {
4157
4186
  if (isNullish(payload.max_completion_tokens)) payload.max_completion_tokens = payload.max_tokens;
4158
4187
  delete payload.max_tokens;
4159
4188
  }
4160
4189
  const requestId = generateRequestIdFromPayload(payload);
4161
- logger$11.debug("Generated request ID:", requestId);
4190
+ logger$13.debug("Generated request ID:", requestId);
4162
4191
  const sessionId = getUUID(requestId);
4163
- logger$11.debug("Extracted session ID:", sessionId);
4192
+ logger$13.debug("Extracted session ID:", sessionId);
4164
4193
  const recordUsage = createCopilotTokenUsageRecorder({
4165
4194
  endpoint: "chat_completions",
4166
4195
  fallbackSessionId: sessionId,
@@ -4168,22 +4197,21 @@ async function handleCompletion$1(c) {
4168
4197
  });
4169
4198
  const response = await createChatCompletions(payload, {
4170
4199
  requestId,
4171
- sessionId,
4172
- signal: c.req.raw.signal
4200
+ sessionId
4173
4201
  });
4174
4202
  if (isNonStreaming$1(response)) {
4175
- debugJson(logger$11, "Non-streaming response:", response);
4203
+ debugJson(logger$13, "Non-streaming response:", response);
4176
4204
  recordUsage({
4177
4205
  ...normalizeOpenAIUsage(response.usage),
4178
4206
  total_nano_aiu: normalizeOptionalToken(response.copilot_usage?.total_nano_aiu)
4179
4207
  });
4180
4208
  return c.json(response);
4181
4209
  }
4182
- logger$11.debug("Streaming response");
4210
+ logger$13.debug("Streaming response");
4183
4211
  return streamSSE(c, async (stream) => {
4184
4212
  let usage = {};
4185
4213
  for await (const chunk of response) {
4186
- debugJson(logger$11, "Streaming chunk:", chunk);
4214
+ debugJson(logger$13, "Streaming chunk:", chunk);
4187
4215
  const parsedChunk = parseChatCompletionChunk(chunk);
4188
4216
  if (parsedChunk?.usage || parsedChunk?.copilot_usage) usage = {
4189
4217
  ...normalizeOpenAIUsage(parsedChunk.usage),
@@ -4242,14 +4270,12 @@ configRoutes.post("/model-mappings", async (c) => {
4242
4270
  });
4243
4271
  //#endregion
4244
4272
  //#region src/services/copilot/create-embeddings.ts
4245
- const createEmbeddings = async (payload, signal) => await withModelTrafficControl(async () => await createEmbeddingsUpstream(payload, signal), signal);
4246
- const createEmbeddingsUpstream = async (payload, signal) => {
4273
+ const createEmbeddings = async (payload) => {
4247
4274
  if (!state.copilotToken) throw new Error("Copilot token not found");
4248
4275
  const response = await fetch(`${copilotBaseUrl(state)}/embeddings`, {
4249
4276
  method: "POST",
4250
4277
  headers: copilotHeaders(state),
4251
- body: JSON.stringify(payload),
4252
- signal
4278
+ body: JSON.stringify(payload)
4253
4279
  });
4254
4280
  if (!response.ok) throw new HTTPError("Failed to create embeddings", response);
4255
4281
  return await response.json();
@@ -4260,7 +4286,7 @@ const embeddingRoutes = new Hono();
4260
4286
  embeddingRoutes.post("/", async (c) => {
4261
4287
  try {
4262
4288
  const paylod = await c.req.json();
4263
- const response = await createEmbeddings(paylod, c.req.raw.signal);
4289
+ const response = await createEmbeddings(paylod);
4264
4290
  createCopilotTokenUsageRecorder({
4265
4291
  endpoint: "embeddings",
4266
4292
  model: paylod.model
@@ -4274,6 +4300,69 @@ embeddingRoutes.post("/", async (c) => {
4274
4300
  }
4275
4301
  });
4276
4302
  //#endregion
4303
+ //#region src/services/codex/images.ts
4304
+ const CODEX_IMAGES_TIMEOUT_MS = 900 * 1e3;
4305
+ const codexImagesDispatcher = createTimeoutDispatcher(CODEX_IMAGES_TIMEOUT_MS);
4306
+ function resolveCodexImagesUrl(requestUrl, operation) {
4307
+ const upstreamUrl = new URL(`${CODEX_API_BASE_URL}/codex/images/${operation}`);
4308
+ upstreamUrl.search = new URL(requestUrl, "http://localhost").search;
4309
+ return upstreamUrl.toString();
4310
+ }
4311
+ async function forwardCodexImages(request, operation) {
4312
+ const headers = buildCodexRequestHeaders(request.headers);
4313
+ if (!headers.has("accept")) headers.set("accept", "application/json");
4314
+ if (operation === "generations" && !headers.has("content-type")) headers.set("content-type", "application/json");
4315
+ const init = {
4316
+ method: "POST",
4317
+ headers,
4318
+ body: request.body,
4319
+ duplex: "half",
4320
+ signal: AbortSignal.timeout(CODEX_IMAGES_TIMEOUT_MS)
4321
+ };
4322
+ const upstreamUrl = resolveCodexImagesUrl(request.url, operation);
4323
+ if (typeof Bun !== "undefined") return await fetch(upstreamUrl, init);
4324
+ return await fetch$1(upstreamUrl, {
4325
+ ...init,
4326
+ dispatcher: codexImagesDispatcher
4327
+ });
4328
+ }
4329
+ //#endregion
4330
+ //#region src/routes/images/route.ts
4331
+ const logger$12 = createHandlerLogger("images-handler");
4332
+ const imageRoutes = new Hono();
4333
+ const imageRouteDependencies = { debugJsonAsync };
4334
+ function getContentMetadata$1(headers) {
4335
+ return {
4336
+ contentType: headers.get("content-type"),
4337
+ contentLength: headers.get("content-length")
4338
+ };
4339
+ }
4340
+ /**
4341
+ * Handles Codex images proxying. Pass `resolvedProviderConfig` when the
4342
+ * caller already resolved the codex provider to avoid a second resolve.
4343
+ */
4344
+ async function handleCodexImages(c, operation, resolvedProviderConfig) {
4345
+ try {
4346
+ if (!(resolvedProviderConfig ?? await resolveProviderConfig("codex"))) return c.json({ error: {
4347
+ message: "Provider 'codex' not found or disabled",
4348
+ type: "invalid_request_error"
4349
+ } }, 404);
4350
+ if (operation === "generations") await imageRouteDependencies.debugJsonAsync(logger$12, "images.generations.codex.request", async () => ({ body: await c.req.raw.clone().text() }));
4351
+ else debugJson(logger$12, "images.edits.codex.request", getContentMetadata$1(c.req.raw.headers));
4352
+ const upstreamResponse = await forwardCodexImages(c.req.raw, operation);
4353
+ debugJson(logger$12, `images.${operation}.codex.response`, {
4354
+ ...getContentMetadata$1(upstreamResponse.headers),
4355
+ statusCode: upstreamResponse.status
4356
+ });
4357
+ return createProviderProxyResponse(upstreamResponse);
4358
+ } catch (error) {
4359
+ logger$12.error(`images.${operation}.codex.error`, { error });
4360
+ return await forwardError(c, error);
4361
+ }
4362
+ }
4363
+ imageRoutes.post("/generations", (c) => handleCodexImages(c, "generations"));
4364
+ imageRoutes.post("/edits", (c) => handleCodexImages(c, "edits"));
4365
+ //#endregion
4277
4366
  //#region src/lib/tokenizer.ts
4278
4367
  const ENCODING_MAP = {
4279
4368
  o200k_base: () => import("gpt-tokenizer/encoding/o200k_base"),
@@ -5282,7 +5371,7 @@ const prepareMessagesApiPayload = (payload, selectedModel) => {
5282
5371
  };
5283
5372
  //#endregion
5284
5373
  //#region src/routes/provider/messages/count-tokens-handler.ts
5285
- const logger$10 = createHandlerLogger("provider-count-tokens-handler");
5374
+ const logger$11 = createHandlerLogger("provider-count-tokens-handler");
5286
5375
  async function handleProviderCountTokens(c) {
5287
5376
  const provider = c.req.param("provider");
5288
5377
  return await handleProviderCountTokensForProvider(c, {
@@ -5305,7 +5394,7 @@ async function handleProviderCountTokensForProvider(c, options) {
5305
5394
  toolContentSupportType: modelConfig?.toolContentSupportType ?? []
5306
5395
  } : void 0), createFallbackModel(modelId));
5307
5396
  const finalTokenCount = tokenCount.input + tokenCount.output;
5308
- logger$10.debug("provider.count_tokens.success", {
5397
+ logger$11.debug("provider.count_tokens.success", {
5309
5398
  provider,
5310
5399
  model: anthropicPayload.model,
5311
5400
  input_tokens: finalTokenCount
@@ -7506,7 +7595,7 @@ function getModels() {
7506
7595
  }
7507
7596
  //#endregion
7508
7597
  //#region src/routes/provider/messages/handler.ts
7509
- const logger$9 = createHandlerLogger("provider-messages-handler");
7598
+ const logger$10 = createHandlerLogger("provider-messages-handler");
7510
7599
  const providerMessagesHandlerDependencies = { resolveProviderConfig };
7511
7600
  async function handleProviderMessages(c) {
7512
7601
  const provider = c.req.param("provider");
@@ -7531,7 +7620,7 @@ async function handleProviderMessagesForProvider(c, options) {
7531
7620
  try {
7532
7621
  const modelConfig = providerConfig.models?.[payload.model];
7533
7622
  const effectiveType = resolveEffectiveProviderType(providerConfig, payload.model);
7534
- debugJson(logger$9, "provider.messages.request", {
7623
+ debugJson(logger$10, "provider.messages.request", {
7535
7624
  payload,
7536
7625
  provider
7537
7626
  });
@@ -7567,7 +7656,7 @@ async function handleProviderMessagesForProvider(c, options) {
7567
7656
  });
7568
7657
  }
7569
7658
  applyMissingExtraBody(payload, { extraBody: modelConfig?.extraBody });
7570
- debugJson(logger$9, "Translated provider.messages.request", {
7659
+ debugJson(logger$10, "Translated provider.messages.request", {
7571
7660
  payload,
7572
7661
  provider
7573
7662
  });
@@ -7575,9 +7664,9 @@ async function handleProviderMessagesForProvider(c, options) {
7575
7664
  ...providerConfig,
7576
7665
  type: effectiveType,
7577
7666
  authType: resolveProviderAuthType(providerConfig.name, void 0, effectiveType)
7578
- }, payload, c.req.raw.headers, { signal: c.req.raw.signal });
7667
+ }, payload, c.req.raw.headers);
7579
7668
  if (!upstreamResponse.ok) {
7580
- logger$9.error("Failed to create responses", upstreamResponse);
7669
+ logger$10.error("Failed to create responses", upstreamResponse);
7581
7670
  throw new HTTPError("Failed to create responses", upstreamResponse);
7582
7671
  }
7583
7672
  const contentType = upstreamResponse.headers.get("content-type") ?? "";
@@ -7599,7 +7688,7 @@ async function handleProviderMessagesForProvider(c, options) {
7599
7688
  usageEndpoint
7600
7689
  });
7601
7690
  } catch (error) {
7602
- logger$9.error("provider.messages.error", {
7691
+ logger$10.error("provider.messages.error", {
7603
7692
  provider,
7604
7693
  error
7605
7694
  });
@@ -7610,8 +7699,8 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
7610
7699
  const { modelConfig, payload, provider, providerConfig, usageEndpoint } = options;
7611
7700
  const responsesPayload = prepareWebSearchResponsesPayload(payload);
7612
7701
  const normalizedReasoningEffort = normalizeProviderResponsesReasoningEffort(responsesPayload, providerConfig);
7613
- if (normalizedReasoningEffort) logger$9.debug(`Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the provider model configuration`);
7614
- debugJson(logger$9, "provider.messages.responses.web_search.request", {
7702
+ if (normalizedReasoningEffort) logger$10.debug(`Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the provider model configuration`);
7703
+ debugJson(logger$10, "provider.messages.responses.web_search.request", {
7615
7704
  payload: responsesPayload,
7616
7705
  provider
7617
7706
  });
@@ -7622,7 +7711,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
7622
7711
  errorMessagePrefix: `${provider} web search responses stream`,
7623
7712
  parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
7624
7713
  upstreamResponse,
7625
- logger: logger$9
7714
+ logger: logger$10
7626
7715
  }),
7627
7716
  modelConfig,
7628
7717
  payload,
@@ -7641,7 +7730,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
7641
7730
  }
7642
7731
  const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { signal: c.req.raw.signal });
7643
7732
  if (!upstreamResponse.ok) {
7644
- logger$9.error("Failed to create provider web search responses", {
7733
+ logger$10.error("Failed to create provider web search responses", {
7645
7734
  provider,
7646
7735
  upstreamResponse
7647
7736
  });
@@ -7652,7 +7741,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
7652
7741
  errorMessagePrefix: `${provider} web search responses stream`,
7653
7742
  parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
7654
7743
  upstreamResponse: createResponsesHttpEventStream(upstreamResponse, c.req.raw.signal),
7655
- logger: logger$9
7744
+ logger: logger$10
7656
7745
  }),
7657
7746
  modelConfig,
7658
7747
  payload,
@@ -7675,10 +7764,10 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
7675
7764
  const wantsStream = payload.stream === true;
7676
7765
  const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload);
7677
7766
  const normalizedMessagesReasoningEffort = normalizeProviderResponsesReasoningEffort(responsesPayload, providerConfig);
7678
- if (normalizedMessagesReasoningEffort) logger$9.debug(`Normalized reasoning effort from ${normalizedMessagesReasoningEffort.from} to ${normalizedMessagesReasoningEffort.to} based on the provider model configuration`);
7767
+ if (normalizedMessagesReasoningEffort) logger$10.debug(`Normalized reasoning effort from ${normalizedMessagesReasoningEffort.from} to ${normalizedMessagesReasoningEffort.to} based on the provider model configuration`);
7679
7768
  if (providerConfig.name === "codex" && !wantsStream) responsesPayload.stream = true;
7680
7769
  if (applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens, { source: "messages" })) compactInputByLatestCompaction(responsesPayload);
7681
- debugJson(logger$9, "provider.messages.responses.request", {
7770
+ debugJson(logger$10, "provider.messages.responses.request", {
7682
7771
  payload: responsesPayload,
7683
7772
  provider
7684
7773
  });
@@ -7700,7 +7789,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
7700
7789
  errorMessagePrefix: `${provider} messages responses stream`,
7701
7790
  parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
7702
7791
  upstreamResponse,
7703
- logger: logger$9
7792
+ logger: logger$10
7704
7793
  }),
7705
7794
  modelConfig,
7706
7795
  payload,
@@ -7722,7 +7811,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
7722
7811
  }
7723
7812
  const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { signal: c.req.raw.signal });
7724
7813
  if (!upstreamResponse.ok) {
7725
- logger$9.error("Failed to create provider responses", upstreamResponse);
7814
+ logger$10.error("Failed to create provider responses", upstreamResponse);
7726
7815
  throw new HTTPError("Failed to create provider responses", upstreamResponse);
7727
7816
  }
7728
7817
  if (responsesPayload.stream) return streamResponsesProviderMessages({
@@ -7767,13 +7856,13 @@ const applyOpenAICompatibleExtraBodyThinkingBudget = (payload, options) => {
7767
7856
  const handleOpenAICompatibleProviderMessages = async (c, options) => {
7768
7857
  const { modelConfig, payload, provider, providerConfig, usageEndpoint } = options;
7769
7858
  const openAIPayload = createOpenAICompatiblePayload(payload, modelConfig, providerConfig);
7770
- debugJson(logger$9, "provider.messages.openai_compatible.request", {
7859
+ debugJson(logger$10, "provider.messages.openai_compatible.request", {
7771
7860
  payload: openAIPayload,
7772
7861
  provider
7773
7862
  });
7774
- const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers, { signal: c.req.raw.signal });
7863
+ const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers);
7775
7864
  if (!upstreamResponse.ok) {
7776
- logger$9.error("Failed to create openai-compatible responses", upstreamResponse);
7865
+ logger$10.error("Failed to create openai-compatible responses", upstreamResponse);
7777
7866
  throw new HTTPError("Failed to create openai-compatible responses", upstreamResponse);
7778
7867
  }
7779
7868
  const contentType = upstreamResponse.headers.get("content-type") ?? "";
@@ -7830,7 +7919,7 @@ const applyOpenAICompatibleRequestOverrides = (payload, options) => {
7830
7919
  for (const key of allowedKeys) if (Object.hasOwn(options.source, key)) payload[key] = options.source[key];
7831
7920
  };
7832
7921
  const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse, usageEndpoint }) => {
7833
- logger$9.debug("provider.messages.streaming");
7922
+ logger$10.debug("provider.messages.streaming");
7834
7923
  const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint);
7835
7924
  return streamSSE(c, async (stream) => {
7836
7925
  let usage = {};
@@ -7842,7 +7931,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
7842
7931
  };
7843
7932
  try {
7844
7933
  for await (const chunk of events(upstreamResponse)) {
7845
- logger$9.debug("provider.messages.raw_stream_event:", chunk.data);
7934
+ logger$10.debug("provider.messages.raw_stream_event:", chunk.data);
7846
7935
  const eventName = chunk.event;
7847
7936
  if (eventName === "ping") {
7848
7937
  await stream.writeSSE({
@@ -7871,13 +7960,13 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
7871
7960
  });
7872
7961
  }
7873
7962
  } catch (error) {
7874
- logger$9.warn("provider.messages.stream_interrupted:", {
7963
+ logger$10.warn("provider.messages.stream_interrupted:", {
7875
7964
  error,
7876
7965
  provider
7877
7966
  });
7878
7967
  }
7879
7968
  if (!messageStopSeen && !errorSeen) {
7880
- logger$9.warn("provider.messages.stream_incomplete:", { provider });
7969
+ logger$10.warn("provider.messages.stream_incomplete:", { provider });
7881
7970
  const errorEvent = translateErrorToAnthropicErrorEvent();
7882
7971
  await stream.writeSSE({
7883
7972
  event: errorEvent.type,
@@ -7888,7 +7977,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
7888
7977
  });
7889
7978
  };
7890
7979
  const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, upstreamResponse, usageEndpoint }) => {
7891
- logger$9.debug("provider.messages.openai_compatible.streaming");
7980
+ logger$10.debug("provider.messages.openai_compatible.streaming");
7892
7981
  const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint);
7893
7982
  return streamSSE(c, async (stream) => {
7894
7983
  let usage = {};
@@ -7902,7 +7991,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
7902
7991
  };
7903
7992
  try {
7904
7993
  for await (const chunk of events(upstreamResponse)) {
7905
- logger$9.debug("provider.messages.openai_compatible.raw_stream_event:", chunk.data);
7994
+ logger$10.debug("provider.messages.openai_compatible.raw_stream_event:", chunk.data);
7906
7995
  if (chunk.event === "ping") {
7907
7996
  await stream.writeSSE({
7908
7997
  event: "ping",
@@ -7920,7 +8009,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
7920
8009
  const events = translateChunkToAnthropicEvents(parsed, streamState);
7921
8010
  for (const event of events) {
7922
8011
  const eventData = JSON.stringify(event);
7923
- debugLazy(logger$9, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
8012
+ debugLazy(logger$10, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
7924
8013
  await stream.writeSSE({
7925
8014
  event: event.type,
7926
8015
  data: eventData
@@ -7928,21 +8017,21 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
7928
8017
  }
7929
8018
  }
7930
8019
  } catch (error) {
7931
- logger$9.warn("provider.messages.openai_compatible.stream_interrupted:", {
8020
+ logger$10.warn("provider.messages.openai_compatible.stream_interrupted:", {
7932
8021
  error,
7933
8022
  provider
7934
8023
  });
7935
8024
  }
7936
8025
  for (const event of flushPendingAnthropicStreamEvents(streamState)) {
7937
8026
  const eventData = JSON.stringify(event);
7938
- debugLazy(logger$9, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
8027
+ debugLazy(logger$10, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
7939
8028
  await stream.writeSSE({
7940
8029
  event: event.type,
7941
8030
  data: eventData
7942
8031
  });
7943
8032
  }
7944
8033
  if (!streamState.messageCompleted) {
7945
- logger$9.warn("provider.messages.openai_compatible.stream_incomplete:", { provider });
8034
+ logger$10.warn("provider.messages.openai_compatible.stream_incomplete:", { provider });
7946
8035
  const errorEvent = translateErrorToAnthropicErrorEvent();
7947
8036
  await stream.writeSSE({
7948
8037
  event: errorEvent.type,
@@ -7953,13 +8042,13 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
7953
8042
  });
7954
8043
  };
7955
8044
  const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurrency, provider, providerConfig, upstreamResponse, usageEndpoint }) => {
7956
- logger$9.debug("provider.messages.responses.streaming", { provider });
8045
+ logger$10.debug("provider.messages.responses.streaming", { provider });
7957
8046
  const recordUsage = createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint);
7958
8047
  return streamSSE(c, async (stream) => {
7959
8048
  let usage = {};
7960
8049
  const streamState = createResponsesStreamState({ toolSearchName: resolveBridgeToolSearchName(payload.tools) });
7961
8050
  for await (const chunk of upstreamResponse) {
7962
- logger$9.debug("provider.messages.responses.raw_stream_event:", chunk.data);
8051
+ logger$10.debug("provider.messages.responses.raw_stream_event:", chunk.data);
7963
8052
  if (chunk.event === "ping") {
7964
8053
  await stream.writeSSE({
7965
8054
  event: "ping",
@@ -7977,7 +8066,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
7977
8066
  const events = translateResponsesStreamEvent(parsed, streamState);
7978
8067
  for (const event of events) {
7979
8068
  const eventData = JSON.stringify(event);
7980
- debugLazy(logger$9, () => ["provider.messages.responses.translated_event:", eventData]);
8069
+ debugLazy(logger$10, () => ["provider.messages.responses.translated_event:", eventData]);
7981
8070
  await stream.writeSSE({
7982
8071
  event: event.type,
7983
8072
  data: eventData
@@ -7998,7 +8087,7 @@ const parseOpenAICompatibleStreamChunk = (data) => {
7998
8087
  try {
7999
8088
  return JSON.parse(data);
8000
8089
  } catch (error) {
8001
- logger$9.error("provider.messages.openai_compatible.parse_chunk_error", {
8090
+ logger$10.error("provider.messages.openai_compatible.parse_chunk_error", {
8002
8091
  data,
8003
8092
  error
8004
8093
  });
@@ -8011,7 +8100,7 @@ const parseResponsesProviderStreamChunk = (data, providerConfig) => {
8011
8100
  if (providerConfig.name === "codex") logCodexRateLimitsEvent(parsed);
8012
8101
  return parsed;
8013
8102
  } catch (error) {
8014
- logger$9.error("provider.messages.responses.parse_chunk_error", {
8103
+ logger$10.error("provider.messages.responses.parse_chunk_error", {
8015
8104
  provider: providerConfig.name,
8016
8105
  data,
8017
8106
  error
@@ -8039,7 +8128,7 @@ const parseProviderStreamEvent = (data) => {
8039
8128
  usage: {}
8040
8129
  };
8041
8130
  } catch (error) {
8042
- logger$9.error("provider.messages.streaming.adjust_tokens_error", {
8131
+ logger$10.error("provider.messages.streaming.adjust_tokens_error", {
8043
8132
  error,
8044
8133
  originalData: data
8045
8134
  });
@@ -8101,34 +8190,34 @@ const respondProviderMessagesJson = (c, options) => {
8101
8190
  const { body, modelConfig, payload, pricingCurrency, provider, usageEndpoint } = options;
8102
8191
  createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeAnthropicUsage(body.usage));
8103
8192
  if (provider === "openrouter") normalizeOpenRouterThinkingSignatures(body);
8104
- debugJson(logger$9, "provider.messages.no_stream result:", body);
8193
+ debugJson(logger$10, "provider.messages.no_stream result:", body);
8105
8194
  return c.json(body);
8106
8195
  };
8107
8196
  const respondOpenAICompatibleProviderMessagesJson = (c, options) => {
8108
8197
  const { body, modelConfig, payload, pricingCurrency, provider, usageEndpoint } = options;
8109
8198
  createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeOpenAIUsage(body.usage));
8110
8199
  const anthropicResponse = translateToAnthropic(body);
8111
- debugJson(logger$9, "provider.messages.openai_compatible.no_stream result:", anthropicResponse);
8200
+ debugJson(logger$10, "provider.messages.openai_compatible.no_stream result:", anthropicResponse);
8112
8201
  return c.json(anthropicResponse);
8113
8202
  };
8114
8203
  const respondResponsesProviderMessagesJson = (c, options) => {
8115
8204
  const { body, modelConfig, payload, pricingCurrency, provider, providerConfig, usageEndpoint } = options;
8116
8205
  createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeResponsesUsage(body.usage));
8117
8206
  const anthropicResponse = translateResponsesResultToAnthropic(body, { toolSearchName: resolveBridgeToolSearchName(payload.tools) });
8118
- debugJson(logger$9, "provider.messages.responses.no_stream result:", anthropicResponse);
8119
- if (providerConfig.name === "codex") logger$9.debug("provider.messages.codex.no_stream.result");
8207
+ debugJson(logger$10, "provider.messages.responses.no_stream result:", anthropicResponse);
8208
+ if (providerConfig.name === "codex") logger$10.debug("provider.messages.codex.no_stream.result");
8120
8209
  return c.json(anthropicResponse);
8121
8210
  };
8122
8211
  const respondWebSearchProviderMessagesJson = (c, options) => {
8123
8212
  const { body, modelConfig, payload, pricingCurrency, provider, usageEndpoint } = options;
8124
8213
  createProviderMessagesUsageRecorder(payload, provider, modelConfig, pricingCurrency, usageEndpoint)(normalizeResponsesUsage(body.usage));
8125
8214
  const { extract, response } = reconstructWebSearchResponse(payload, body, { requestId: body.id || `${provider}:${payload.model}` });
8126
- debugJson(logger$9, `Web search via responses: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`, body);
8215
+ debugJson(logger$10, `Web search via responses: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`, body);
8127
8216
  if (!payload.stream) return c.json(response);
8128
8217
  return streamSSE(c, async (stream) => {
8129
8218
  for (const event of buildSyntheticStreamEvents(response)) {
8130
8219
  const data = JSON.stringify(event);
8131
- logger$9.debug(`Web search stream event`, data);
8220
+ logger$10.debug(`Web search stream event`, data);
8132
8221
  await stream.writeSSE({
8133
8222
  event: event.type,
8134
8223
  data
@@ -8161,8 +8250,7 @@ const buildAnthropicBetaHeader = (anthropicBetaHeader, thinking, _model) => {
8161
8250
  }
8162
8251
  if (thinking?.budget_tokens && !isAdaptiveThinking) return INTERLEAVED_THINKING_BETA;
8163
8252
  };
8164
- const createMessages = async (payload, anthropicBetaHeader, options) => await withModelTrafficControl(async () => await createMessagesUpstream(payload, anthropicBetaHeader, options), options.signal);
8165
- const createMessagesUpstream = async (payload, anthropicBetaHeader, options) => {
8253
+ const createMessages = async (payload, anthropicBetaHeader, options) => {
8166
8254
  if (!state.copilotToken) throw new Error("Copilot token not found");
8167
8255
  const enableVision = payload.messages.some((message) => {
8168
8256
  if (!Array.isArray(message.content)) return false;
@@ -8185,8 +8273,7 @@ const createMessagesUpstream = async (payload, anthropicBetaHeader, options) =>
8185
8273
  const response = await fetch(`${copilotBaseUrl(state)}/v1/messages`, {
8186
8274
  method: "POST",
8187
8275
  headers,
8188
- body: JSON.stringify(payload),
8189
- signal: options.signal
8276
+ body: JSON.stringify(payload)
8190
8277
  });
8191
8278
  logCopilotRateLimits(response.headers);
8192
8279
  if (!response.ok) {
@@ -8224,8 +8311,7 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
8224
8311
  subagentMarker,
8225
8312
  requestId,
8226
8313
  sessionId,
8227
- compactType,
8228
- signal: c.req?.raw.signal
8314
+ compactType
8229
8315
  });
8230
8316
  if (isNonStreaming(response)) {
8231
8317
  debugJson(logger, "Non-streaming response from Copilot:", response);
@@ -8380,8 +8466,7 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
8380
8466
  subagentMarker,
8381
8467
  requestId,
8382
8468
  sessionId,
8383
- compactType,
8384
- signal: c.req?.raw.signal
8469
+ compactType
8385
8470
  });
8386
8471
  if (isAsyncIterable(response)) {
8387
8472
  logger.debug("Streaming response from Copilot (Messages API)");
@@ -8520,7 +8605,7 @@ const parseSubagentMarkerFromSystemReminder = (text) => {
8520
8605
  };
8521
8606
  //#endregion
8522
8607
  //#region src/routes/messages/handler.ts
8523
- const logger$8 = createHandlerLogger("messages-handler");
8608
+ const logger$9 = createHandlerLogger("messages-handler");
8524
8609
  const messagesFlowHandlers = {
8525
8610
  handleWithChatCompletions,
8526
8611
  handleWithMessagesApi,
@@ -8535,7 +8620,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
8535
8620
  if (anthropicPayload.model !== requestedModel) consola.debug(`Resolved model mapping: ${requestedModel} -> ${anthropicPayload.model}`);
8536
8621
  if (!dispatchOptions.skipWebSearch) {
8537
8622
  const webSearchResult = await tryHandleWebSearch(c, anthropicPayload, {
8538
- logger: logger$8,
8623
+ logger: logger$9,
8539
8624
  forwardToProvider: (ctx, payload, provider) => handleProviderMessagesForProvider(ctx, {
8540
8625
  payload,
8541
8626
  provider
@@ -8558,21 +8643,21 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
8558
8643
  usageEndpoint: dispatchOptions.usageEndpoint
8559
8644
  });
8560
8645
  }
8561
- debugJson(logger$8, "Anthropic request payload:", anthropicPayload);
8646
+ debugJson(logger$9, "Anthropic request payload:", anthropicPayload);
8562
8647
  normalizeSystemMessages(anthropicPayload);
8563
8648
  sanitizeIdeTools(anthropicPayload);
8564
8649
  const subagentMarker = dispatchOptions.subagentMarker ?? parseSubagentMarkerFromFirstUser(anthropicPayload);
8565
- if (subagentMarker) debugJson(logger$8, "Detected Subagent marker:", subagentMarker);
8650
+ if (subagentMarker) debugJson(logger$9, "Detected Subagent marker:", subagentMarker);
8566
8651
  let sessionId = dispatchOptions.sessionId ?? getRootSessionId(anthropicPayload, c);
8567
8652
  const compactType = dispatchOptions.compactType ?? getCompactType(anthropicPayload);
8568
8653
  const anthropicBeta = c.req.header("anthropic-beta");
8569
- logger$8.debug("Anthropic Beta header:", anthropicBeta);
8654
+ logger$9.debug("Anthropic Beta header:", anthropicBeta);
8570
8655
  if (!state.tokenBasedBilling && !shouldUseClaudeAutoModel) {
8571
8656
  const tools = anthropicPayload.tools;
8572
8657
  const noTools = !tools || tools.length === 0;
8573
8658
  if (anthropicBeta && noTools && compactType === 0) anthropicPayload.model = getSmallModel();
8574
8659
  }
8575
- if (compactType) logger$8.debug("Compact request type:", compactType);
8660
+ if (compactType) logger$9.debug("Compact request type:", compactType);
8576
8661
  if (!state.tokenBasedBilling) {
8577
8662
  const lastMessageCacheControl = getLastMessageContentCacheControl(anthropicPayload.messages.at(-1));
8578
8663
  stripToolReferenceTurnBoundary(anthropicPayload);
@@ -8580,9 +8665,9 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
8580
8665
  applyLastMessageCacheControl(anthropicPayload, lastMessageCacheControl);
8581
8666
  }
8582
8667
  const requestId = dispatchOptions.requestId ?? generateRequestIdFromPayload(anthropicPayload, sessionId);
8583
- logger$8.debug("Generated request ID:", requestId);
8668
+ logger$9.debug("Generated request ID:", requestId);
8584
8669
  if (!sessionId) sessionId = getUUID(requestId);
8585
- logger$8.debug("Extracted session ID:", sessionId);
8670
+ logger$9.debug("Extracted session ID:", sessionId);
8586
8671
  const selectedModel = findEndpointModel(anthropicPayload.model);
8587
8672
  anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model;
8588
8673
  if (shouldUseMessagesApi(selectedModel)) return await messagesFlowHandlers.handleWithMessagesApi(c, anthropicPayload, {
@@ -8592,7 +8677,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
8592
8677
  requestId,
8593
8678
  sessionId,
8594
8679
  compactType,
8595
- logger: logger$8,
8680
+ logger: logger$9,
8596
8681
  usageEndpoint: dispatchOptions.usageEndpoint
8597
8682
  });
8598
8683
  if (shouldUseResponsesApi(selectedModel, compactType)) return await messagesFlowHandlers.handleWithResponsesApi(c, anthropicPayload, {
@@ -8601,7 +8686,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
8601
8686
  requestId,
8602
8687
  sessionId,
8603
8688
  compactType,
8604
- logger: logger$8,
8689
+ logger: logger$9,
8605
8690
  usageEndpoint: dispatchOptions.usageEndpoint
8606
8691
  });
8607
8692
  return await messagesFlowHandlers.handleWithChatCompletions(c, anthropicPayload, {
@@ -8610,7 +8695,7 @@ async function handleCompletionPayload(c, anthropicPayload, dispatchOptions = {}
8610
8695
  requestId,
8611
8696
  sessionId,
8612
8697
  compactType,
8613
- logger: logger$8,
8698
+ logger: logger$9,
8614
8699
  usageEndpoint: dispatchOptions.usageEndpoint
8615
8700
  });
8616
8701
  }
@@ -8641,7 +8726,7 @@ messageRoutes.post("/count_tokens", async (c) => {
8641
8726
  });
8642
8727
  //#endregion
8643
8728
  //#region src/routes/models/codex-models.ts
8644
- const logger$7 = createHandlerLogger("codex-models-handler");
8729
+ const logger$8 = createHandlerLogger("codex-models-handler");
8645
8730
  const CODEX_USER_AGENT_PATTERN = /^codex/iu;
8646
8731
  const FALLBACK_AVAILABLE_IN_PLANS = [
8647
8732
  "business",
@@ -8912,12 +8997,12 @@ function shouldInjectMessagesToolCallTips(userAgent, targetModel) {
8912
8997
  async function logCodexModelsResponse(response) {
8913
8998
  try {
8914
8999
  const models = await response.clone().json();
8915
- debugJson(logger$7, "models.codex.response", {
9000
+ debugJson(logger$8, "models.codex.response", {
8916
9001
  statusCode: response.status,
8917
9002
  models
8918
9003
  });
8919
9004
  } catch (error) {
8920
- logger$7.warn("models.codex.response_log_error", { error });
9005
+ logger$8.warn("models.codex.response_log_error", { error });
8921
9006
  }
8922
9007
  }
8923
9008
  /**
@@ -8937,7 +9022,7 @@ async function handleCodexModelsProxy(c, resolvedProviderConfig) {
8937
9022
  }
8938
9023
  async function handleMergedCodexModels(c, candidatesRequest, options = {}) {
8939
9024
  const [upstreamCatalog, candidates] = await Promise.all([tryGetCodexCatalog(c), Promise.resolve(candidatesRequest).catch((error) => {
8940
- logger$7.warn("models.codex.candidates_error", { error });
9025
+ logger$8.warn("models.codex.candidates_error", { error });
8941
9026
  return [];
8942
9027
  })]);
8943
9028
  const candidatesBySlug = new Map(candidates.map((candidate) => [candidate.slug, candidate]));
@@ -8973,7 +9058,7 @@ async function handleMergedCodexModels(c, candidatesRequest, options = {}) {
8973
9058
  ...upstreamCatalog ?? {},
8974
9059
  models
8975
9060
  };
8976
- debugJson(logger$7, "models.codex.merged_response", {
9061
+ debugJson(logger$8, "models.codex.merged_response", {
8977
9062
  upstreamCount: upstreamModels.length,
8978
9063
  codexProviderAliasCount: codexProviderAliases.length,
8979
9064
  syntheticCount: syntheticModels.length,
@@ -9068,17 +9153,17 @@ async function tryGetCodexCatalog(c) {
9068
9153
  if (!await resolveProviderConfig("codex")) return null;
9069
9154
  const response = await forwardCodexModels(c.req.url, c.req.raw.headers);
9070
9155
  if (!response.ok) {
9071
- logger$7.warn("models.codex.catalog_fallback", { statusCode: response.status });
9156
+ logger$8.warn("models.codex.catalog_fallback", { statusCode: response.status });
9072
9157
  return null;
9073
9158
  }
9074
9159
  const body = await response.json();
9075
9160
  if (!isCodexModelsResponse(body)) {
9076
- logger$7.warn("models.codex.catalog_invalid");
9161
+ logger$8.warn("models.codex.catalog_invalid");
9077
9162
  return null;
9078
9163
  }
9079
9164
  return body;
9080
9165
  } catch (error) {
9081
- logger$7.warn("models.codex.catalog_error", { error });
9166
+ logger$8.warn("models.codex.catalog_error", { error });
9082
9167
  return null;
9083
9168
  }
9084
9169
  }
@@ -9103,7 +9188,7 @@ function isRecord$2(value) {
9103
9188
  //#endregion
9104
9189
  //#region src/routes/models/route.ts
9105
9190
  const modelRoutes = new Hono();
9106
- const logger$6 = createHandlerLogger("models-handler");
9191
+ const logger$7 = createHandlerLogger("models-handler");
9107
9192
  const EPOCH_ISO = (/* @__PURE__ */ new Date(0)).toISOString();
9108
9193
  const RESPONSES_ENDPOINTS = new Set(["/responses", "ws:/responses"]);
9109
9194
  const MESSAGES_ENDPOINT = "/v1/messages";
@@ -9139,7 +9224,7 @@ function getBuiltinProviderModelRecords(provider) {
9139
9224
  }
9140
9225
  function getFallbackProviderModelRecords(provider, reason, details = {}) {
9141
9226
  const fallbackModels = getBuiltinProviderModelRecords(provider);
9142
- logger$6.warn(`models.provider.fallback_${reason}`, {
9227
+ logger$7.warn(`models.provider.fallback_${reason}`, {
9143
9228
  provider,
9144
9229
  ...details,
9145
9230
  fallbackModelCount: fallbackModels.length
@@ -9187,7 +9272,7 @@ async function getProviderModels(provider, requestHeaders) {
9187
9272
  return normalizeProviderModels(providerConfig.name, models);
9188
9273
  } catch (error) {
9189
9274
  if (provider === "codex") {
9190
- logger$6.warn("models.provider.skip_error", {
9275
+ logger$7.warn("models.provider.skip_error", {
9191
9276
  provider,
9192
9277
  error
9193
9278
  });
@@ -9234,7 +9319,7 @@ function getCopilotCodexCandidates() {
9234
9319
  if (getCopilotFastTierBaseModelId(models, model.id)) continue;
9235
9320
  if (isCopilotCodexCandidate(model)) candidates.push(createCopilotCodexCandidate(model, Boolean(findCopilotFastTierModel(models, model.id))));
9236
9321
  } catch (error) {
9237
- logger$6.warn("models.codex.copilot_skip_error", {
9322
+ logger$7.warn("models.codex.copilot_skip_error", {
9238
9323
  modelId: model.id,
9239
9324
  error
9240
9325
  });
@@ -9285,7 +9370,7 @@ async function getProviderCodexCandidates(provider, requestHeaders) {
9285
9370
  }
9286
9371
  return candidates;
9287
9372
  } catch (error) {
9288
- logger$6.warn("models.codex.provider_skip_error", {
9373
+ logger$7.warn("models.codex.provider_skip_error", {
9289
9374
  provider,
9290
9375
  error
9291
9376
  });
@@ -9392,7 +9477,7 @@ modelRoutes.get("/", async (c) => {
9392
9477
  });
9393
9478
  //#endregion
9394
9479
  //#region src/routes/provider/alpha-search/route.ts
9395
- const logger$5 = createHandlerLogger("provider-alpha-search-handler");
9480
+ const logger$6 = createHandlerLogger("provider-alpha-search-handler");
9396
9481
  const providerAlphaSearchRoutes = new Hono();
9397
9482
  const providerAlphaSearchRouteDependencies = {
9398
9483
  createProviderProxyResponse,
@@ -9409,19 +9494,19 @@ providerAlphaSearchRoutes.post("/", async (c) => {
9409
9494
  type: "invalid_request_error"
9410
9495
  } }, 404);
9411
9496
  if (providerConfig.name === "codex") return await providerAlphaSearchRouteDependencies.handleAlphaSearchRequest(c, providerConfig);
9412
- await debugJsonAsync(logger$5, "provider.alpha_search.request", async () => ({
9497
+ await debugJsonAsync(logger$6, "provider.alpha_search.request", async () => ({
9413
9498
  body: await c.req.raw.clone().text(),
9414
9499
  provider
9415
9500
  }));
9416
9501
  const upstreamResponse = await providerAlphaSearchRouteDependencies.forwardProviderAlphaSearch(providerConfig, c.req.raw);
9417
- await debugJsonAsync(logger$5, "provider.alpha_search.response", async () => ({
9502
+ await debugJsonAsync(logger$6, "provider.alpha_search.response", async () => ({
9418
9503
  body: await upstreamResponse.clone().text(),
9419
9504
  provider,
9420
9505
  statusCode: upstreamResponse.status
9421
9506
  }));
9422
9507
  return providerAlphaSearchRouteDependencies.createProviderProxyResponse(upstreamResponse);
9423
9508
  } catch (error) {
9424
- logger$5.error("provider.alpha_search.error", {
9509
+ logger$6.error("provider.alpha_search.error", {
9425
9510
  provider,
9426
9511
  error
9427
9512
  });
@@ -9429,6 +9514,50 @@ providerAlphaSearchRoutes.post("/", async (c) => {
9429
9514
  }
9430
9515
  });
9431
9516
  //#endregion
9517
+ //#region src/routes/provider/images/route.ts
9518
+ const logger$5 = createHandlerLogger("provider-images-handler");
9519
+ const providerImageRoutes = new Hono();
9520
+ function getContentMetadata(headers) {
9521
+ return {
9522
+ contentType: headers.get("content-type"),
9523
+ contentLength: headers.get("content-length")
9524
+ };
9525
+ }
9526
+ async function handleProviderImages(c, operation) {
9527
+ const provider = c.req.param("provider") ?? "";
9528
+ try {
9529
+ const providerConfig = await resolveProviderConfig(provider);
9530
+ if (!providerConfig) return c.json({ error: {
9531
+ message: `Provider '${provider}' not found or disabled`,
9532
+ type: "invalid_request_error"
9533
+ } }, 404);
9534
+ if (providerConfig.name === "codex") return await handleCodexImages(c, operation, providerConfig);
9535
+ if (operation === "generations") await debugJsonAsync(logger$5, "provider.images.generations.request", async () => ({
9536
+ body: await c.req.raw.clone().text(),
9537
+ provider
9538
+ }));
9539
+ else debugJson(logger$5, "provider.images.edits.request", {
9540
+ ...getContentMetadata(c.req.raw.headers),
9541
+ provider
9542
+ });
9543
+ const upstreamResponse = await forwardProviderImages(providerConfig, c.req.raw, operation);
9544
+ debugJson(logger$5, `provider.images.${operation}.response`, {
9545
+ ...getContentMetadata(upstreamResponse.headers),
9546
+ provider,
9547
+ statusCode: upstreamResponse.status
9548
+ });
9549
+ return createProviderProxyResponse(upstreamResponse);
9550
+ } catch (error) {
9551
+ logger$5.error(`provider.images.${operation}.error`, {
9552
+ provider,
9553
+ error
9554
+ });
9555
+ return await forwardError(c, error);
9556
+ }
9557
+ }
9558
+ providerImageRoutes.post("/generations", (c) => handleProviderImages(c, "generations"));
9559
+ providerImageRoutes.post("/edits", (c) => handleProviderImages(c, "edits"));
9560
+ //#endregion
9432
9561
  //#region src/routes/provider/messages/route.ts
9433
9562
  const providerMessageRoutes = new Hono();
9434
9563
  providerMessageRoutes.post("/", async (c) => {
@@ -11560,18 +11689,22 @@ server.route("/usage", usageRoute);
11560
11689
  server.route("/token-usage", tokenUsageRoute);
11561
11690
  server.route("/responses", responsesRoutes);
11562
11691
  server.route("/alpha/search", alphaSearchRoutes);
11692
+ server.route("/images", imageRoutes);
11563
11693
  server.route("/v1/chat/completions", completionRoutes);
11564
11694
  server.route("/v1/models", modelRoutes);
11565
11695
  server.route("/v1/embeddings", embeddingRoutes);
11566
11696
  server.route("/v1/responses", responsesRoutes);
11567
11697
  server.route("/v1/alpha/search", alphaSearchRoutes);
11698
+ server.route("/v1/images", imageRoutes);
11568
11699
  server.route("/v1/messages", messageRoutes);
11569
11700
  server.route("/:provider/v1/messages", providerMessageRoutes);
11570
11701
  server.route("/:provider/v1/models", providerModelRoutes);
11571
11702
  server.route("/:provider/v1/responses", providerResponsesRoutes);
11572
11703
  server.route("/:provider/v1/alpha/search", providerAlphaSearchRoutes);
11704
+ server.route("/:provider/v1/images", providerImageRoutes);
11573
11705
  server.route("/:provider/models", providerModelRoutes);
11574
11706
  server.route("/:provider/responses", providerResponsesRoutes);
11575
11707
  server.route("/:provider/alpha/search", providerAlphaSearchRoutes);
11708
+ server.route("/:provider/images", providerImageRoutes);
11576
11709
  //#endregion
11577
11710
  export { server };