@jeffreycao/copilot-api 2.7.40 → 2.7.42

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-BCdcNCtc.js","names":["resolveTraceId","fs","COST_NANOS_PER_UNIT","getHeaderValue","undiciFetch","logger","createCopilotResponses","invalidRequest","logger","invalidRequest","uniqueIndexes","logger","logger","handleCompletion","isNonStreaming","handleCompletion","undiciFetch","logger","isRecord","logger","isRecord","handleOutputItemAdded","handleOutputItemDone","parseResponsesStreamEvent","isRecord","getStringField","removeWebSearchTool","getConfiguredModelResponsesApiCompactThreshold","isConfiguredContextManagementEnabledForMessages","isConfiguredContextManagementEnabledForResponses","isConfiguredResponsesApiWebSocketEnabled","createCopilotResponses","logger","logger","getCodexModels","createCopilotChatCompletions","createCopilotMessages","createCopilotResponses","normalizeCopilotUsage","logger","MESSAGES_ENDPOINT","logger","getCodexModels","logger","logger","(\n fallbackCodexCatalogJson as unknown as CodexModelsResponse\n).models","logger","logger","logger","getCodexModels","decompressFallback","logger","logger","shouldFallbackToMessages","getCodexModels","logger","createCopilotResponses","isConfiguredResponsesApiWebSearchEnabled","logger"],"sources":["../src/lib/trace.ts","../src/lib/sqlite.ts","../src/lib/token-usage/store.ts","../src/lib/request-events.ts","../src/lib/logger.ts","../src/lib/models.ts","../src/lib/provider-model.ts","../src/lib/provider-resolver.ts","../src/lib/token-usage/pricing.ts","../src/lib/token-usage/index.ts","../src/routes/alpha-search/alpha-search-types.ts","../src/routes/messages/web-search/backend.ts","../src/lib/copilot-rate-limit.ts","../src/services/copilot/create-responses.ts","../src/lib/grok-build.ts","../src/lib/timeout-dispatcher.ts","../src/services/providers/provider-proxy.ts","../src/routes/alpha-search/alpha-search-responses.ts","../src/services/codex/alpha-search.ts","../src/routes/alpha-search/route.ts","../src/lib/first-token.ts","../src/lib/sse.ts","../src/lib/dashscope.ts","../src/lib/reasoning-effort.ts","../src/routes/provider/utils.ts","../src/routes/provider/chat-completions/handler.ts","../src/services/copilot/create-chat-completions.ts","../src/routes/chat-completions/handler.ts","../src/routes/chat-completions/route.ts","../src/lib/config-reload.ts","../src/routes/admin/config/route.ts","../src/services/copilot/create-embeddings.ts","../src/routes/embeddings/route.ts","../src/lib/xai-image-model.ts","../src/routes/images/forward-provider-images.ts","../src/services/codex/images.ts","../src/routes/images/shared.ts","../src/services/xai/images.ts","../src/routes/images/xai-handler.ts","../src/routes/images/edits-handler.ts","../src/routes/images/generations-handler.ts","../src/routes/images/route.ts","../src/lib/model-pdf-support.ts","../src/lib/claude-models.ts","../src/lib/tokenizer.ts","../src/routes/messages/utils.ts","../src/routes/messages/completions-translation.ts","../src/routes/messages/preprocess.ts","../src/routes/provider/messages/count-tokens-handler.ts","../src/routes/messages/count-tokens-handler.ts","../src/lib/codex-rate-limit.ts","../src/routes/messages/completions-stream-translation.ts","../src/routes/messages/responses-translation.ts","../src/routes/messages/responses-stream-translation.ts","../src/routes/messages/responses-stream-collection.ts","../src/routes/responses/messages-translation.ts","../src/routes/responses/utils.ts","../src/routes/messages/web-search/fulfill.ts","../src/services/codex/get-models.ts","../src/routes/messages/google-thinking.ts","../src/routes/messages/google-translation.ts","../src/routes/messages/google-stream-translation.ts","../src/services/providers/google.ts","../src/routes/provider/messages/google-handler.ts","../src/routes/provider/messages/handler.ts","../src/services/copilot/create-messages.ts","../src/routes/messages/api-flows.ts","../src/lib/subagent.ts","../src/routes/messages/subagent-marker.ts","../src/routes/messages/handler.ts","../src/routes/messages/route.ts","../src/lib/model-display-name.ts","../src/routes/models/model-discovery.ts","../src/routes/models/claude-models.ts","../src/lib/codex-model-catalog.ts","../src/routes/models/model-metadata.ts","../src/routes/models/codex-model-candidates.ts","../src/routes/models/models.json","../src/routes/models/codex-models.ts","../src/routes/models/default-models.ts","../src/routes/models/opencode-models.ts","../src/routes/models/route.ts","../src/routes/provider/alpha-search/route.ts","../src/routes/provider/images/route.ts","../src/routes/provider/messages/route.ts","../src/routes/provider/models/route.ts","../src/lib/zstd-request.ts","../src/routes/responses/custom-tool-input-stream-decoder.ts","../src/routes/responses/messages-stream-translation.ts","../src/routes/responses/messages-handler.ts","../src/routes/responses/task-title.ts","../src/routes/provider/responses/handler.ts","../src/routes/provider/responses/route.ts","../src/routes/responses/stream-id-sync.ts","../src/routes/responses/handler.ts","../src/routes/responses/route.ts","../src/routes/token-usage/route.ts","../src/services/subscription-usage.ts","../src/routes/usage/route.ts","../src/services/xai/videos.ts","../src/routes/videos/route.ts","../src/server.ts"],"sourcesContent":["import type { MiddlewareHandler } from \"hono\"\n\nimport { requestContext, resolveTraceId } from \"./request-context\"\nimport {\n getRootSessionIdFromHeaders,\n getSessionAffinityFromHeaders,\n} from \"./utils\"\n\nexport const traceIdMiddleware: MiddlewareHandler = async (c, next) => {\n const traceId = resolveTraceId(c.req.header(\"x-trace-id\"))\n\n c.header(\"x-trace-id\", traceId)\n\n const context = {\n traceId,\n startTime: Date.now(),\n userAgent: c.req.header(\"user-agent\") || \"\",\n sessionAffinity: getSessionAffinityFromHeaders(c),\n rootSessionId: getRootSessionIdFromHeaders(c),\n parentSessionId: c.req.header(\"x-parent-session-id\"),\n }\n\n await requestContext.run(context, async () => {\n await next()\n })\n}\n","import fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\ntype SqliteValue = string | number | null\n\nexport const MINIMUM_NODE_SQLITE_VERSION = \"22.13.0\"\n\nexport interface SqliteStatement {\n all: (...values: Array<SqliteValue>) => Array<unknown>\n get: (...values: Array<SqliteValue>) => unknown\n run: (...values: Array<SqliteValue>) => unknown\n}\n\nexport interface SqliteDatabase {\n close?: () => void\n exec: (sql: string) => unknown\n prepare: (sql: string) => SqliteStatement\n}\n\ninterface SqliteDbStoreOptions {\n getPath: () => string\n initialize?: (db: SqliteDatabase) => void\n}\n\nconst isBunRuntime = (): boolean =>\n Boolean((globalThis as { Bun?: unknown }).Bun)\n\nfunction parseNodeVersion(version: string): Array<number> {\n return version.split(\".\", 3).map((part) => {\n const parsed = Number.parseInt(part, 10)\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0\n })\n}\n\ninterface SqliteRuntimeSupportInput {\n isBun?: boolean\n nodeVersion?: string\n}\n\nexport function isNodeSqliteSupportedVersion(version: string): boolean {\n const current = parseNodeVersion(version)\n const minimum = parseNodeVersion(MINIMUM_NODE_SQLITE_VERSION)\n\n for (const [index, minimumPart] of minimum.entries()) {\n const currentPart = current[index] ?? 0\n if (currentPart > minimumPart) return true\n if (currentPart < minimumPart) return false\n }\n\n return true\n}\n\nexport function isSqliteRuntimeSupported(\n input: SqliteRuntimeSupportInput = {},\n): boolean {\n if (input.isBun ?? isBunRuntime()) {\n return true\n }\n\n return isNodeSqliteSupportedVersion(\n input.nodeVersion ?? process.versions.node,\n )\n}\n\nfunction getUnsupportedNodeSqliteMessage(nodeVersion: string): string {\n return (\n `SQLite-backed token usage requires Bun or Node.js >= ${MINIMUM_NODE_SQLITE_VERSION}. `\n + `Detected Node.js ${nodeVersion}. Upgrade Node.js or run the CLI with Bun, for example `\n + \"`bunx --bun @jeffreycao/copilot-api@latest start` or `bun run start start`.\"\n )\n}\n\nexport class UnsupportedNodeSqliteRuntimeError extends Error {\n constructor(nodeVersion: string, cause?: unknown) {\n super(getUnsupportedNodeSqliteMessage(nodeVersion), { cause })\n this.name = \"UnsupportedNodeSqliteRuntimeError\"\n }\n}\n\nasync function openBunDatabase(dbPath: string): Promise<SqliteDatabase> {\n const specifier = [\"bun\", \"sqlite\"].join(\":\")\n const sqlite = (await import(specifier)) as {\n Database: new (filename: string) => SqliteDatabase\n }\n return new sqlite.Database(dbPath)\n}\n\nasync function loadNodeSqliteModule(): Promise<{\n DatabaseSync: new (location: string) => SqliteDatabase\n}> {\n const nodeVersion = process.versions.node\n if (!isNodeSqliteSupportedVersion(nodeVersion)) {\n throw new UnsupportedNodeSqliteRuntimeError(nodeVersion)\n }\n\n const emitWarning = process.emitWarning.bind(process) as (\n ...args: unknown[]\n ) => void\n process.emitWarning = (warning: unknown, ...args: unknown[]) => {\n if (\n typeof warning === \"string\"\n && warning.includes(\"SQLite is an experimental feature\")\n ) {\n return\n }\n return emitWarning(warning, ...args)\n }\n\n const specifier = [\"node\", \"sqlite\"].join(\":\")\n try {\n return (await import(specifier)) as {\n DatabaseSync: new (location: string) => SqliteDatabase\n }\n } catch (error) {\n throw new UnsupportedNodeSqliteRuntimeError(nodeVersion, error)\n } finally {\n process.emitWarning = emitWarning\n }\n}\n\nasync function openNodeDatabase(dbPath: string): Promise<SqliteDatabase> {\n const sqlite = await loadNodeSqliteModule()\n return new sqlite.DatabaseSync(dbPath)\n}\n\nexport async function openSqliteDatabase(\n dbPath: string,\n): Promise<SqliteDatabase> {\n const dir = path.dirname(dbPath)\n if (dbPath !== \":memory:\" && dir !== \".\") {\n await fs.mkdir(dir, { recursive: true })\n }\n return isBunRuntime() ? openBunDatabase(dbPath) : openNodeDatabase(dbPath)\n}\n\nexport class SqliteDbStore {\n private dbPromise: Promise<SqliteDatabase> | null = null\n private readonly options: SqliteDbStoreOptions\n\n constructor(options: SqliteDbStoreOptions) {\n this.options = options\n }\n\n getDb(): Promise<SqliteDatabase> {\n this.dbPromise ??= this.open()\n return this.dbPromise\n }\n\n async close(input?: {\n beforeClose?: (db: SqliteDatabase) => void\n }): Promise<void> {\n const currentDbPromise = this.dbPromise\n this.dbPromise = null\n\n if (!currentDbPromise) {\n return\n }\n\n const db = await currentDbPromise\n input?.beforeClose?.(db)\n db.close?.()\n }\n\n private async open(): Promise<SqliteDatabase> {\n const db = await openSqliteDatabase(this.options.getPath())\n this.options.initialize?.(db)\n return db\n }\n}\n","import consola from \"consola\"\nimport path from \"node:path\"\n\nimport type { RequestTiming } from \"~/lib/request-context\"\nimport { PATHS } from \"~/lib/paths\"\nimport { registerProcessCleanup } from \"~/lib/process-cleanup\"\nimport {\n isSqliteRuntimeSupported,\n SqliteDbStore,\n type SqliteDatabase,\n} from \"~/lib/sqlite\"\n\nexport type TokenUsageSource = \"copilot\" | \"provider\"\n\nexport type TokenUsageEndpoint =\n | \"chat_completions\"\n | \"embeddings\"\n | \"messages\"\n | \"provider_messages\"\n | \"responses\"\n\nexport type TokenUsagePeriod =\n | \"today\"\n | \"this_week\"\n | \"last_7_days\"\n | \"this_month\"\n | \"last_30_days\"\n | \"lifetime\"\n\nexport interface UsageTokens {\n cache_creation_input_tokens?: number | null\n cache_read_input_tokens?: number | null\n cost?: number | null\n input_tokens?: number | null\n output_tokens?: number | null\n total_nano_aiu?: number | null\n total_tokens?: number | null\n}\n\nexport interface TokenUsageCost {\n amount: number\n currency: string\n total_cost_nanos: number\n}\n\nexport interface TokenUsageEventCost extends TokenUsageCost {\n source: string\n}\n\nexport interface TokenUsageTiming {\n request_id: string | null\n first_token_ms: number | null\n duration_ms: number | null\n request_outcome: RequestTiming[\"outcome\"]\n}\n\nexport interface PersistedTokenUsageEvent extends TokenUsageTiming {\n cache_creation_input_tokens: number\n cache_read_input_tokens: number\n cost_currency: string | null\n cost_source: string | null\n created_at_ms: number\n created_at_utc: string\n endpoint: TokenUsageEndpoint\n input_tokens: number\n model: string\n output_tokens: number\n provider_name: string | null\n session_id: string\n source: TokenUsageSource\n total_cost_nanos: number | null\n total_nano_aiu: number | null\n total_tokens: number\n trace_id: string\n user_agent: string\n user_id: string\n}\n\nexport interface TokenUsageTotals {\n cache_creation_input_tokens: number\n cache_read_input_tokens: number\n costs: Array<TokenUsageCost>\n input_tokens: number\n output_tokens: number\n request_count: number\n total_nano_aiu: number | null\n total_tokens: number\n}\n\nexport interface TokenUsageModelSummary extends TokenUsageTotals {\n average_first_token_ms: number | null\n output_tokens_per_second: number | null\n model: string\n}\n\nexport interface TokenUsageSessionSummary extends TokenUsageTotals {\n session_id: string\n}\n\nexport interface TokenUsageEventRecord extends TokenUsageTiming {\n output_tokens_per_second: number | null\n cache_creation_input_tokens: number\n cache_read_input_tokens: number\n cost: TokenUsageEventCost | null\n created_at_ms: number\n created_at_utc: string\n endpoint: TokenUsageEndpoint\n id: number\n input_tokens: number\n model: string\n output_tokens: number\n provider_name: string | null\n session_id: string\n source: TokenUsageSource\n total_nano_aiu: number | null\n total_tokens: number\n trace_id: string\n user_agent: string\n user_id: string\n}\n\nexport interface TokenUsageSummary {\n byModel: Array<TokenUsageModelSummary>\n period: TokenUsagePeriod\n range: {\n end_ms: number\n end_utc: string\n start_ms: number\n start_utc: string\n }\n totals: TokenUsageTotals\n}\n\nexport interface TokenUsageDailyBucket {\n byModel: Array<TokenUsageModelSummary>\n date: string\n end_ms: number\n start_ms: number\n totals: TokenUsageTotals\n}\n\nexport interface TokenUsageDailySummary {\n byModel: Array<TokenUsageModelSummary>\n days: Array<TokenUsageDailyBucket>\n period: TokenUsagePeriod\n range: {\n end_ms: number\n end_utc: string\n start_ms: number\n start_utc: string\n }\n totals: TokenUsageTotals\n}\n\ninterface TokenUsagePage<T> {\n items: Array<T>\n page: number\n page_size: number\n period: TokenUsagePeriod\n range: {\n end_ms: number\n end_utc: string\n start_ms: number\n start_utc: string\n }\n total: number\n total_pages: number\n}\n\nexport type TokenUsageEventsPage = TokenUsagePage<TokenUsageEventRecord>\nexport type TokenUsageSessionsPage = TokenUsagePage<TokenUsageSessionSummary>\n\nconst DB_PATH_ENV = \"COPILOT_API_SQLITE_DB_PATH\"\nconst DEFAULT_DB_FILENAME = \"copilot-api.sqlite\"\nconst COST_NANOS_PER_UNIT = 1_000_000_000\n\nlet writeQueue: Promise<void> = Promise.resolve()\n\nfunction getDbPath(): string {\n return (\n process.env[DB_PATH_ENV] ?? path.join(PATHS.APP_DIR, DEFAULT_DB_FILENAME)\n )\n}\n\nconst tokenUsageDbStore = new SqliteDbStore({\n getPath: getDbPath,\n initialize: initializeTokenUsageDb,\n})\n\nfunction getDb(): Promise<SqliteDatabase> {\n return tokenUsageDbStore.getDb()\n}\n\nexport function isTokenUsageStorageEnabled(): boolean {\n return isSqliteRuntimeSupported()\n}\n\nfunction initializeTokenUsageDb(db: SqliteDatabase): void {\n db.exec(\"PRAGMA journal_mode = WAL\")\n db.exec(\"PRAGMA busy_timeout = 5000\")\n db.exec(`\n CREATE TABLE IF NOT EXISTS token_usage_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n created_at_ms INTEGER NOT NULL,\n created_at_utc TEXT NOT NULL,\n trace_id TEXT NOT NULL,\n session_id TEXT NOT NULL DEFAULT '',\n user_id TEXT NOT NULL DEFAULT '',\n user_agent TEXT NOT NULL DEFAULT '',\n source TEXT NOT NULL,\n endpoint TEXT NOT NULL,\n provider_name TEXT,\n model TEXT NOT NULL,\n input_tokens INTEGER NOT NULL DEFAULT 0,\n output_tokens INTEGER NOT NULL DEFAULT 0,\n cache_read_input_tokens INTEGER NOT NULL DEFAULT 0,\n cache_creation_input_tokens INTEGER NOT NULL DEFAULT 0,\n total_tokens INTEGER NOT NULL DEFAULT 0,\n total_nano_aiu INTEGER,\n cost_currency TEXT,\n total_cost_nanos INTEGER,\n cost_source TEXT\n )\n `)\n ensureColumn(db, \"user_id\", \"TEXT NOT NULL DEFAULT ''\")\n ensureColumn(db, \"user_agent\", \"TEXT NOT NULL DEFAULT ''\")\n ensureColumn(db, \"total_tokens\", \"INTEGER NOT NULL DEFAULT 0\")\n ensureColumn(db, \"total_nano_aiu\", \"INTEGER\")\n ensureColumn(db, \"cost_currency\", \"TEXT\")\n ensureColumn(db, \"total_cost_nanos\", \"INTEGER\")\n ensureColumn(db, \"cost_source\", \"TEXT\")\n ensureColumn(db, \"request_id\", \"TEXT\")\n ensureColumn(db, \"first_token_ms\", \"REAL\")\n ensureColumn(db, \"duration_ms\", \"REAL\")\n ensureColumn(db, \"request_outcome\", \"TEXT\")\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_token_usage_events_request_id\n ON token_usage_events(request_id)\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_token_usage_events_created_at_ms\n ON token_usage_events(created_at_ms)\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_token_usage_events_model\n ON token_usage_events(model)\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_token_usage_events_trace_id\n ON token_usage_events(trace_id)\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_token_usage_events_session_id\n ON token_usage_events(session_id)\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_token_usage_events_user_id\n ON token_usage_events(user_id)\n `)\n}\n\nfunction ensureColumn(\n db: SqliteDatabase,\n name: string,\n definition: string,\n): void {\n const rows = db\n .prepare(\"PRAGMA table_info(token_usage_events)\")\n .all() as Array<Record<string, unknown>>\n const hasColumn = rows.some((row) => row.name === name)\n if (!hasColumn) {\n db.exec(`ALTER TABLE token_usage_events ADD COLUMN ${name} ${definition}`)\n }\n}\n\nexport function normalizeToken(value: number | null | undefined): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return 0\n }\n return Math.max(0, Math.floor(value))\n}\n\nexport function normalizeOptionalToken(\n value: number | null | undefined,\n): number | undefined {\n return value === null || value === undefined ?\n undefined\n : normalizeToken(value)\n}\n\nexport function hasAnyToken(tokens: UsageTokens): boolean {\n return (\n normalizeToken(tokens.input_tokens) > 0\n || normalizeToken(tokens.output_tokens) > 0\n || normalizeToken(tokens.cache_read_input_tokens) > 0\n || normalizeToken(tokens.cache_creation_input_tokens) > 0\n || normalizeToken(tokens.total_tokens) > 0\n || normalizeToken(tokens.total_nano_aiu) > 0\n )\n}\n\nexport function resolveTotalTokens(input: UsageTokens): number {\n const explicitTotal = normalizeOptionalToken(input.total_tokens)\n if (explicitTotal !== undefined) {\n return explicitTotal\n }\n return (\n normalizeToken(input.input_tokens)\n + normalizeToken(input.output_tokens)\n + normalizeToken(input.cache_read_input_tokens)\n + normalizeToken(input.cache_creation_input_tokens)\n )\n}\n\nasync function writeTokenUsageEvent(\n event: PersistedTokenUsageEvent,\n): Promise<void> {\n const db = await getDb()\n db.prepare(\n `\n INSERT INTO token_usage_events (\n created_at_ms,\n created_at_utc,\n trace_id,\n session_id,\n user_id,\n source,\n endpoint,\n provider_name,\n model,\n input_tokens,\n output_tokens,\n cache_read_input_tokens,\n cache_creation_input_tokens,\n total_tokens,\n total_nano_aiu,\n cost_currency,\n total_cost_nanos,\n cost_source,\n request_id,\n first_token_ms,\n duration_ms,\n request_outcome,\n user_agent\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n ).run(\n event.created_at_ms,\n event.created_at_utc,\n event.trace_id,\n event.session_id,\n event.user_id,\n event.source,\n event.endpoint,\n event.provider_name,\n event.model,\n event.input_tokens,\n event.output_tokens,\n event.cache_read_input_tokens,\n event.cache_creation_input_tokens,\n event.total_tokens,\n event.total_nano_aiu,\n event.cost_currency,\n event.total_cost_nanos,\n event.cost_source,\n event.request_id,\n event.first_token_ms,\n event.duration_ms,\n event.request_outcome,\n event.user_agent,\n )\n}\n\nexport function enqueueTokenUsageWrite(event: PersistedTokenUsageEvent): void {\n if (!isTokenUsageStorageEnabled()) {\n return\n }\n\n writeQueue = writeQueue\n .then(() => writeTokenUsageEvent(event))\n .catch((error: unknown) => {\n consola.warn(\"Failed to record token usage\", error)\n })\n}\n\n// Share the insert queue: early usage is preserved, then completed with timing.\n// Late usage carries the final snapshot directly, without a pending-request map.\nexport function enqueueTokenUsageTiming(timing: RequestTiming): void {\n if (!isTokenUsageStorageEnabled()) return\n const { id, firstTokenMs, durationMs, outcome } = timing\n writeQueue = writeQueue\n .then(async () => {\n const db = await getDb()\n db.prepare(\n `\n UPDATE token_usage_events\n SET first_token_ms = ?, duration_ms = ?, request_outcome = ?\n WHERE request_id = ?\n `,\n ).run(firstTokenMs, durationMs, outcome, id)\n })\n .catch((error: unknown) => {\n consola.warn(\"Failed to record token usage timing\", error)\n })\n}\n\nasync function flushTokenUsageEvents(): Promise<void> {\n let currentQueue = writeQueue\n while (true) {\n await currentQueue\n if (currentQueue === writeQueue) {\n return\n }\n currentQueue = writeQueue\n }\n}\n\nfunction getPeriodRange(period: TokenUsagePeriod, now = new Date()) {\n const nowMs = now.getTime()\n if (period === \"lifetime\") {\n return {\n endMs: nowMs + 1,\n startMs: nowMs + 1,\n }\n }\n\n const start = new Date(now)\n start.setHours(0, 0, 0, 0)\n\n switch (period) {\n case \"today\": {\n break\n }\n case \"this_week\": {\n const daysSinceMonday = (start.getDay() + 6) % 7\n start.setDate(start.getDate() - daysSinceMonday)\n break\n }\n case \"last_7_days\": {\n start.setDate(start.getDate() - 6)\n break\n }\n case \"this_month\": {\n start.setDate(1)\n break\n }\n case \"last_30_days\": {\n start.setDate(start.getDate() - 29)\n break\n }\n default: {\n break\n }\n }\n\n return {\n endMs: nowMs + 1,\n startMs: start.getTime(),\n }\n}\n\nfunction getPeriodRangeFromDb(\n db: SqliteDatabase,\n period: TokenUsagePeriod,\n now = new Date(),\n) {\n if (period !== \"lifetime\") {\n return getPeriodRange(period, now)\n }\n\n const nowMs = now.getTime()\n const row = db\n .prepare(\n `\n SELECT MIN(created_at_ms) AS start_ms\n FROM token_usage_events\n WHERE created_at_ms <= ?\n `,\n )\n .get(nowMs) as Record<string, unknown> | undefined\n const earliestEventMs = row?.start_ms\n const hasEarliestEvent =\n typeof earliestEventMs === \"number\" && Number.isFinite(earliestEventMs)\n const startMs = hasEarliestEvent ? earliestEventMs : nowMs + 1\n\n return {\n endMs: nowMs + 1,\n startMs,\n }\n}\n\nfunction formatLocalDate(date: Date): string {\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n return `${year}-${month}-${day}`\n}\n\nfunction createDailyIntervals(range: { endMs: number; startMs: number }) {\n const intervals: Array<{\n date: string\n endMs: number\n startMs: number\n }> = []\n const cursor = new Date(range.startMs)\n cursor.setHours(0, 0, 0, 0)\n\n while (cursor.getTime() < range.endMs) {\n const startMs = Math.max(cursor.getTime(), range.startMs)\n const next = new Date(cursor)\n next.setDate(next.getDate() + 1)\n const endMs = Math.min(next.getTime(), range.endMs)\n if (startMs < endMs) {\n intervals.push({\n date: formatLocalDate(cursor),\n endMs,\n startMs,\n })\n }\n cursor.setTime(next.getTime())\n }\n\n return intervals\n}\n\nfunction createEmptyTotals(): TokenUsageTotals {\n return {\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n costs: [],\n input_tokens: 0,\n output_tokens: 0,\n request_count: 0,\n total_nano_aiu: null,\n total_tokens: 0,\n }\n}\n\nfunction addTotals(target: TokenUsageTotals, next: TokenUsageTotals): void {\n target.cache_creation_input_tokens += next.cache_creation_input_tokens\n target.cache_read_input_tokens += next.cache_read_input_tokens\n target.costs = mergeCosts(target.costs, next.costs)\n target.input_tokens += next.input_tokens\n target.output_tokens += next.output_tokens\n target.request_count += next.request_count\n target.total_nano_aiu = addNullableNumbers(\n target.total_nano_aiu,\n next.total_nano_aiu,\n )\n target.total_tokens += next.total_tokens\n}\n\nfunction addNullableNumbers(\n current: number | null,\n next: number | null,\n): number | null {\n if (current === null) return next\n if (next === null) return current\n return current + next\n}\n\nfunction mergeCosts(\n current: Array<TokenUsageCost>,\n next: Array<TokenUsageCost>,\n): Array<TokenUsageCost> {\n const byCurrency = new Map<string, number>()\n for (const cost of [...current, ...next]) {\n byCurrency.set(\n cost.currency,\n (byCurrency.get(cost.currency) ?? 0) + cost.total_cost_nanos,\n )\n }\n\n return [...byCurrency.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, totalCostNanos]) => createCost(currency, totalCostNanos))\n}\n\nfunction createEmptySummary(period: TokenUsagePeriod): TokenUsageSummary {\n const range = getPeriodRange(period)\n\n return {\n byModel: [],\n period,\n range: {\n end_ms: range.endMs,\n end_utc: new Date(range.endMs).toISOString(),\n start_ms: range.startMs,\n start_utc: new Date(range.startMs).toISOString(),\n },\n totals: createEmptyTotals(),\n }\n}\n\nfunction createEmptyDailySummary(\n period: TokenUsagePeriod,\n): TokenUsageDailySummary {\n const range = getPeriodRange(period)\n\n return {\n byModel: [],\n days: createDailyIntervals(range).map((interval) => ({\n byModel: [],\n date: interval.date,\n end_ms: interval.endMs,\n start_ms: interval.startMs,\n totals: createEmptyTotals(),\n })),\n period,\n range: {\n end_ms: range.endMs,\n end_utc: new Date(range.endMs).toISOString(),\n start_ms: range.startMs,\n start_utc: new Date(range.startMs).toISOString(),\n },\n totals: createEmptyTotals(),\n }\n}\n\nfunction createEmptyEventsPage(input: {\n page: number\n pageSize: number\n period: TokenUsagePeriod\n}): TokenUsageEventsPage {\n const range = getPeriodRange(input.period)\n const page = Math.max(1, Math.floor(input.page))\n const pageSize = Math.min(100, Math.max(1, Math.floor(input.pageSize)))\n\n return {\n items: [],\n page,\n page_size: pageSize,\n period: input.period,\n range: {\n end_ms: range.endMs,\n end_utc: new Date(range.endMs).toISOString(),\n start_ms: range.startMs,\n start_utc: new Date(range.startMs).toISOString(),\n },\n total: 0,\n total_pages: 1,\n }\n}\n\nfunction rangePayload(range: { endMs: number; startMs: number }) {\n return {\n end_ms: range.endMs,\n end_utc: new Date(range.endMs).toISOString(),\n start_ms: range.startMs,\n start_utc: new Date(range.startMs).toISOString(),\n }\n}\n\nfunction numberFromRow(\n row: Record<string, unknown> | undefined,\n key: string,\n): number {\n const value = row?.[key]\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0\n}\n\nfunction nullableNumberFromRow(\n row: Record<string, unknown> | undefined,\n key: string,\n): number | null {\n const value = row?.[key]\n return typeof value === \"number\" && Number.isFinite(value) ? value : null\n}\n\nfunction createCost(currency: string, totalCostNanos: number): TokenUsageCost {\n return {\n amount: totalCostNanos / COST_NANOS_PER_UNIT,\n currency,\n total_cost_nanos: totalCostNanos,\n }\n}\n\nfunction costFromRow(row: Record<string, unknown>): TokenUsageCost | null {\n const currency = row.cost_currency\n const totalCostNanos = row.total_cost_nanos\n if (\n typeof currency !== \"string\"\n || !currency\n || typeof totalCostNanos !== \"number\"\n || !Number.isFinite(totalCostNanos)\n ) {\n return null\n }\n\n return createCost(currency, totalCostNanos)\n}\n\nfunction eventCostFromRow(\n row: Record<string, unknown>,\n): TokenUsageEventCost | null {\n const cost = costFromRow(row)\n const source = row.cost_source\n if (!cost || typeof source !== \"string\" || !source) {\n return null\n }\n\n return {\n ...cost,\n source,\n }\n}\n\nfunction totalsFromRow(\n row: Record<string, unknown> | undefined,\n costs: Array<TokenUsageCost> = [],\n): TokenUsageTotals {\n return {\n cache_creation_input_tokens: numberFromRow(\n row,\n \"cache_creation_input_tokens\",\n ),\n cache_read_input_tokens: numberFromRow(row, \"cache_read_input_tokens\"),\n costs,\n input_tokens: numberFromRow(row, \"input_tokens\"),\n output_tokens: numberFromRow(row, \"output_tokens\"),\n request_count: numberFromRow(row, \"request_count\"),\n total_nano_aiu: nullableNumberFromRow(row, \"total_nano_aiu\"),\n total_tokens: numberFromRow(row, \"total_tokens\"),\n }\n}\n\nfunction modelSummaryFromRow(\n row: Record<string, unknown>,\n costs: Array<TokenUsageCost> = [],\n): TokenUsageModelSummary {\n return {\n ...totalsFromRow(row, costs),\n average_first_token_ms: nullableNumberFromRow(\n row,\n \"average_first_token_ms\",\n ),\n output_tokens_per_second: nullableNumberFromRow(\n row,\n \"output_tokens_per_second\",\n ),\n model: typeof row.model === \"string\" ? row.model : \"unknown\",\n }\n}\n\nfunction stringFromRow(row: Record<string, unknown>, key: string): string {\n const value = row[key]\n return typeof value === \"string\" ? value : \"\"\n}\n\nfunction nullableStringFromRow(\n row: Record<string, unknown>,\n key: string,\n): string | null {\n const value = row[key]\n return typeof value === \"string\" ? value : null\n}\n\nfunction outputTokensPerSecond(row: Record<string, unknown>): number | null {\n const first = nullableNumberFromRow(row, \"first_token_ms\")\n const duration = nullableNumberFromRow(row, \"duration_ms\")\n const output = numberFromRow(row, \"output_tokens\")\n // A row cannot attribute shared request time to just one of multiple calls.\n if (\n row.request_outcome !== \"completed\"\n || row.usage_event_count !== 1\n || first === null\n || first < 0\n || duration === null\n || duration <= first\n || output <= 0\n )\n return null\n const rate = (output * 1000) / (duration - first)\n return Number.isFinite(rate) ? rate : null\n}\n\nfunction usageEventFromRow(\n row: Record<string, unknown>,\n): TokenUsageEventRecord {\n return {\n request_id: nullableStringFromRow(row, \"request_id\"),\n first_token_ms: nullableNumberFromRow(row, \"first_token_ms\"),\n duration_ms: nullableNumberFromRow(row, \"duration_ms\"),\n request_outcome: nullableStringFromRow(\n row,\n \"request_outcome\",\n ) as RequestTiming[\"outcome\"],\n output_tokens_per_second: outputTokensPerSecond(row),\n cache_creation_input_tokens: numberFromRow(\n row,\n \"cache_creation_input_tokens\",\n ),\n cache_read_input_tokens: numberFromRow(row, \"cache_read_input_tokens\"),\n cost: eventCostFromRow(row),\n created_at_ms: numberFromRow(row, \"created_at_ms\"),\n created_at_utc: stringFromRow(row, \"created_at_utc\"),\n endpoint: stringFromRow(row, \"endpoint\") as TokenUsageEndpoint,\n id: numberFromRow(row, \"id\"),\n input_tokens: numberFromRow(row, \"input_tokens\"),\n model: stringFromRow(row, \"model\") || \"unknown\",\n output_tokens: numberFromRow(row, \"output_tokens\"),\n provider_name: nullableStringFromRow(row, \"provider_name\"),\n session_id: stringFromRow(row, \"session_id\"),\n source: stringFromRow(row, \"source\") as TokenUsageSource,\n total_nano_aiu: nullableNumberFromRow(row, \"total_nano_aiu\"),\n total_tokens: numberFromRow(row, \"total_tokens\"),\n trace_id: stringFromRow(row, \"trace_id\"),\n user_id: stringFromRow(row, \"user_id\"),\n user_agent: stringFromRow(row, \"user_agent\"),\n }\n}\n\nfunction getTotalsRow(\n db: SqliteDatabase,\n range: { endMs: number; startMs: number },\n): Record<string, unknown> | undefined {\n return db\n .prepare(\n `\n SELECT\n COUNT(*) AS request_count,\n COALESCE(SUM(input_tokens), 0) AS input_tokens,\n COALESCE(SUM(output_tokens), 0) AS output_tokens,\n COALESCE(SUM(cache_read_input_tokens), 0) AS cache_read_input_tokens,\n COALESCE(SUM(cache_creation_input_tokens), 0) AS cache_creation_input_tokens,\n SUM(total_nano_aiu) AS total_nano_aiu,\n COALESCE(SUM(total_tokens), 0) AS total_tokens\n FROM token_usage_events\n WHERE created_at_ms >= ? AND created_at_ms < ?\n `,\n )\n .get(range.startMs, range.endMs) as Record<string, unknown> | undefined\n}\n\nfunction getModelRows(\n db: SqliteDatabase,\n range: { endMs: number; startMs: number },\n): Array<Record<string, unknown>> {\n return db\n .prepare(\n `\n SELECT\n model,\n COUNT(*) AS request_count,\n COALESCE(SUM(input_tokens), 0) AS input_tokens,\n COALESCE(SUM(output_tokens), 0) AS output_tokens,\n COALESCE(SUM(cache_read_input_tokens), 0) AS cache_read_input_tokens,\n COALESCE(SUM(cache_creation_input_tokens), 0) AS cache_creation_input_tokens,\n SUM(total_nano_aiu) AS total_nano_aiu,\n COALESCE(SUM(total_tokens), 0) AS total_tokens\n FROM token_usage_events\n WHERE created_at_ms >= ? AND created_at_ms < ?\n GROUP BY model\n ORDER BY\n total_tokens DESC,\n model ASC\n `,\n )\n .all(range.startMs, range.endMs) as Array<Record<string, unknown>>\n}\n\nfunction getCostRows(\n db: SqliteDatabase,\n range: { endMs: number; startMs: number },\n): Array<TokenUsageCost> {\n const rows = db\n .prepare(\n `\n SELECT\n cost_currency,\n COALESCE(SUM(total_cost_nanos), 0) AS total_cost_nanos\n FROM token_usage_events\n WHERE\n created_at_ms >= ?\n AND created_at_ms < ?\n AND cost_currency IS NOT NULL\n AND total_cost_nanos IS NOT NULL\n GROUP BY cost_currency\n ORDER BY cost_currency ASC\n `,\n )\n .all(range.startMs, range.endMs) as Array<Record<string, unknown>>\n\n return rows.flatMap((row) => {\n const cost = costFromRow(row)\n return cost ? [cost] : []\n })\n}\n\nfunction getModelCostMap(\n db: SqliteDatabase,\n range: { endMs: number; startMs: number },\n): Map<string, Array<TokenUsageCost>> {\n const rows = db\n .prepare(\n `\n SELECT\n model,\n cost_currency,\n COALESCE(SUM(total_cost_nanos), 0) AS total_cost_nanos\n FROM token_usage_events\n WHERE\n created_at_ms >= ?\n AND created_at_ms < ?\n AND cost_currency IS NOT NULL\n AND total_cost_nanos IS NOT NULL\n GROUP BY model, cost_currency\n ORDER BY model ASC, cost_currency ASC\n `,\n )\n .all(range.startMs, range.endMs) as Array<Record<string, unknown>>\n\n const costMap = new Map<string, Array<TokenUsageCost>>()\n for (const row of rows) {\n const model = stringFromRow(row, \"model\") || \"unknown\"\n const cost = costFromRow(row)\n if (!cost) {\n continue\n }\n costMap.set(model, [...(costMap.get(model) ?? []), cost])\n }\n\n return costMap\n}\n\nfunction getSessionSummaries(\n db: SqliteDatabase,\n range: { endMs: number; startMs: number },\n limit: number,\n offset: number,\n): Array<TokenUsageSessionSummary> {\n const rows = db\n .prepare(\n `\n SELECT\n session_id,\n COUNT(*) AS request_count,\n COALESCE(SUM(input_tokens), 0) AS input_tokens,\n COALESCE(SUM(output_tokens), 0) AS output_tokens,\n COALESCE(SUM(cache_read_input_tokens), 0) AS cache_read_input_tokens,\n COALESCE(SUM(cache_creation_input_tokens), 0) AS cache_creation_input_tokens,\n SUM(total_nano_aiu) AS total_nano_aiu,\n COALESCE(SUM(total_tokens), 0) AS total_tokens\n FROM token_usage_events\n WHERE created_at_ms >= ? AND created_at_ms < ?\n GROUP BY session_id\n ORDER BY total_tokens DESC, session_id ASC\n LIMIT ? OFFSET ?\n `,\n )\n .all(range.startMs, range.endMs, limit, offset) as Array<\n Record<string, unknown>\n >\n const sessionIds = rows.map((row) => stringFromRow(row, \"session_id\"))\n const costRows = db\n .prepare(\n `\n SELECT\n session_id,\n cost_currency,\n COALESCE(SUM(total_cost_nanos), 0) AS total_cost_nanos\n FROM token_usage_events\n WHERE\n created_at_ms >= ?\n AND created_at_ms < ?\n AND session_id IN (${sessionIds.map(() => \"?\").join(\", \")})\n AND cost_currency IS NOT NULL\n AND total_cost_nanos IS NOT NULL\n GROUP BY session_id, cost_currency\n ORDER BY session_id ASC, cost_currency ASC\n `,\n )\n .all(range.startMs, range.endMs, ...sessionIds) as Array<\n Record<string, unknown>\n >\n const costMap = new Map<string, Array<TokenUsageCost>>()\n for (const row of costRows) {\n const cost = costFromRow(row)\n if (cost) {\n const id = stringFromRow(row, \"session_id\")\n costMap.set(id, [...(costMap.get(id) ?? []), cost])\n }\n }\n\n return rows.map((row) => {\n const session_id = stringFromRow(row, \"session_id\")\n return {\n ...totalsFromRow(row, costMap.get(session_id) ?? []),\n session_id,\n }\n })\n}\n\n// Expand candidate IDs through the request index before grouping. A request\n// contributes once even when usage arrives in several rows. Mixed-model calls\n// and requests crossing a bucket boundary have no unambiguous per-model timing.\nfunction getModelTimingRows(\n db: SqliteDatabase,\n intervals: Array<{ date: string; endMs: number; startMs: number }>,\n): Array<Record<string, unknown>> {\n if (intervals.length === 0) return []\n return db\n .prepare(\n `\n WITH selected_requests AS (\n SELECT DISTINCT request_id FROM token_usage_events\n WHERE created_at_ms >= ? AND created_at_ms < ? AND request_id IS NOT NULL\n ), requests AS (\n SELECT e.request_id, MIN(e.model) AS model,\n MIN(e.created_at_ms) AS first_usage_at_ms,\n MAX(e.created_at_ms) AS last_usage_at_ms,\n SUM(e.output_tokens) AS output_tokens,\n MAX(e.first_token_ms) AS first_token_ms,\n MAX(e.duration_ms) AS duration_ms\n FROM selected_requests r JOIN token_usage_events e USING (request_id)\n GROUP BY e.request_id\n HAVING COUNT(DISTINCT e.model) = 1\n AND COUNT(e.first_token_ms) = COUNT(*)\n AND COUNT(e.duration_ms) = COUNT(*)\n AND COUNT(e.request_outcome) = COUNT(*)\n AND MIN(e.request_outcome) = 'completed'\n AND MAX(e.request_outcome) = 'completed'\n AND MIN(e.first_token_ms) >= 0\n AND MIN(e.duration_ms) >= MAX(e.first_token_ms)\n ), buckets(usage_date, start_ms, end_ms) AS (VALUES ${intervals.map(() => \"(?, ?, ?)\").join(\", \")})\n SELECT buckets.usage_date, model,\n AVG(first_token_ms) AS average_first_token_ms,\n 1000.0 * SUM(CASE WHEN duration_ms > first_token_ms AND output_tokens > 0 THEN output_tokens END)\n / SUM(CASE WHEN duration_ms > first_token_ms AND output_tokens > 0 THEN duration_ms - first_token_ms END)\n AS output_tokens_per_second\n FROM requests JOIN buckets\n ON first_usage_at_ms >= start_ms AND last_usage_at_ms < end_ms\n GROUP BY buckets.usage_date, model\n `,\n )\n .all(\n intervals[0].startMs,\n intervals[intervals.length - 1].endMs,\n ...intervals.flatMap(({ date, startMs, endMs }) => [\n date,\n startMs,\n endMs,\n ]),\n ) as Array<Record<string, unknown>>\n}\n\nfunction getModelSummaries(\n db: SqliteDatabase,\n range: { endMs: number; startMs: number },\n): Array<TokenUsageModelSummary> {\n const costMap = getModelCostMap(db, range)\n const timings = new Map(\n getModelTimingRows(db, [{ date: \"\", ...range }]).map((row) => [\n stringFromRow(row, \"model\"),\n row,\n ]),\n )\n return getModelRows(db, range).map((row) => {\n const model = stringFromRow(row, \"model\") || \"unknown\"\n return modelSummaryFromRow(\n { ...row, ...timings.get(model) },\n costMap.get(model) ?? [],\n )\n })\n}\n\nfunction getDailyModelSummaries(\n db: SqliteDatabase,\n intervals: Array<{ date: string; endMs: number; startMs: number }>,\n): Map<string, Array<TokenUsageModelSummary>> {\n if (intervals.length === 0) {\n return new Map()\n }\n\n // Bucket events by the same local-day intervals the response reports.\n // SQLite's 'localtime' follows the C library timezone, which can disagree\n // with the JavaScript runtime (bun test forces UTC; images without tzdata\n // ignore TZ), putting events in the wrong day.\n const usageDays = `usage_days(usage_date, day_start_ms, day_end_ms) AS (VALUES ${intervals\n .map(() => \"(?, ?, ?)\")\n .join(\", \")})`\n const dayParams = intervals.flatMap((interval) => [\n interval.date,\n interval.startMs,\n interval.endMs,\n ])\n const rows = db\n .prepare(\n `\n WITH ${usageDays}\n SELECT\n usage_days.usage_date AS usage_date,\n model,\n COUNT(*) AS request_count,\n COALESCE(SUM(input_tokens), 0) AS input_tokens,\n COALESCE(SUM(output_tokens), 0) AS output_tokens,\n COALESCE(SUM(cache_read_input_tokens), 0) AS cache_read_input_tokens,\n COALESCE(SUM(cache_creation_input_tokens), 0) AS cache_creation_input_tokens,\n SUM(total_nano_aiu) AS total_nano_aiu,\n COALESCE(SUM(total_tokens), 0) AS total_tokens\n FROM usage_days\n JOIN token_usage_events\n ON created_at_ms >= usage_days.day_start_ms\n AND created_at_ms < usage_days.day_end_ms\n GROUP BY usage_days.usage_date, model\n ORDER BY usage_days.usage_date ASC, total_tokens DESC, model ASC\n `,\n )\n .all(...dayParams) as Array<Record<string, unknown>>\n const costRows = db\n .prepare(\n `\n WITH ${usageDays}\n SELECT\n usage_days.usage_date AS usage_date,\n model,\n cost_currency,\n COALESCE(SUM(total_cost_nanos), 0) AS total_cost_nanos\n FROM usage_days\n JOIN token_usage_events\n ON created_at_ms >= usage_days.day_start_ms\n AND created_at_ms < usage_days.day_end_ms\n WHERE cost_currency IS NOT NULL\n AND total_cost_nanos IS NOT NULL\n GROUP BY usage_days.usage_date, model, cost_currency\n ORDER BY usage_days.usage_date ASC, model ASC, cost_currency ASC\n `,\n )\n .all(...dayParams) as Array<Record<string, unknown>>\n const costsByDateAndModel = new Map<string, Array<TokenUsageCost>>()\n for (const row of costRows) {\n const date = stringFromRow(row, \"usage_date\")\n const model = stringFromRow(row, \"model\") || \"unknown\"\n const cost = costFromRow(row)\n if (!date || !cost) {\n continue\n }\n\n const key = `${date}\\u0000${model}`\n costsByDateAndModel.set(key, [\n ...(costsByDateAndModel.get(key) ?? []),\n cost,\n ])\n }\n\n const timings = new Map(\n getModelTimingRows(db, intervals).map((row) => [\n `${stringFromRow(row, \"usage_date\")}\\u0000${stringFromRow(row, \"model\")}`,\n row,\n ]),\n )\n const summariesByDate = new Map<string, Array<TokenUsageModelSummary>>()\n for (const row of rows) {\n const date = stringFromRow(row, \"usage_date\")\n if (!date) {\n continue\n }\n\n const model = stringFromRow(row, \"model\") || \"unknown\"\n const summaries = summariesByDate.get(date) ?? []\n summaries.push(\n modelSummaryFromRow(\n { ...row, ...timings.get(`${date}\\u0000${model}`) },\n costsByDateAndModel.get(`${date}\\u0000${model}`) ?? [],\n ),\n )\n summariesByDate.set(date, summaries)\n }\n\n return summariesByDate\n}\n\nfunction createDailyBucket(\n interval: { date: string; endMs: number; startMs: number },\n byModel: Array<TokenUsageModelSummary>,\n): TokenUsageDailyBucket {\n const totals = createEmptyTotals()\n for (const model of byModel) {\n addTotals(totals, model)\n }\n\n return {\n byModel,\n date: interval.date,\n end_ms: interval.endMs,\n start_ms: interval.startMs,\n totals,\n }\n}\n\nexport async function getTokenUsageSummary(\n period: TokenUsagePeriod,\n): Promise<TokenUsageSummary> {\n if (!isTokenUsageStorageEnabled()) {\n return createEmptySummary(period)\n }\n\n await flushTokenUsageEvents()\n const db = await getDb()\n const range = getPeriodRangeFromDb(db, period)\n const totalsRow = getTotalsRow(db, range)\n\n return {\n byModel: getModelSummaries(db, range),\n period,\n range: rangePayload(range),\n totals: totalsFromRow(totalsRow, getCostRows(db, range)),\n }\n}\n\nexport async function getTokenUsageDailySummary(\n period: TokenUsagePeriod,\n): Promise<TokenUsageDailySummary> {\n if (!isTokenUsageStorageEnabled()) {\n return createEmptyDailySummary(period)\n }\n\n await flushTokenUsageEvents()\n const db = await getDb()\n const range = getPeriodRangeFromDb(db, period)\n const intervals = createDailyIntervals(range)\n const dailySummaries = getDailyModelSummaries(db, intervals)\n\n return {\n byModel: getModelSummaries(db, range),\n days: intervals.map((interval) =>\n createDailyBucket(interval, dailySummaries.get(interval.date) ?? []),\n ),\n period,\n range: rangePayload(range),\n totals: totalsFromRow(getTotalsRow(db, range), getCostRows(db, range)),\n }\n}\n\nexport async function getTokenUsageEventsPage(input: {\n page: number\n pageSize: number\n period: TokenUsagePeriod\n}): Promise<TokenUsageEventsPage> {\n if (!isTokenUsageStorageEnabled()) {\n return createEmptyEventsPage(input)\n }\n\n await flushTokenUsageEvents()\n const page = Math.max(1, Math.floor(input.page))\n const pageSize = Math.min(100, Math.max(1, Math.floor(input.pageSize)))\n const offset = (page - 1) * pageSize\n const db = await getDb()\n const range = getPeriodRangeFromDb(db, input.period)\n\n const totalRow = db\n .prepare(\n `\n SELECT COUNT(*) AS total\n FROM token_usage_events\n WHERE created_at_ms >= ? AND created_at_ms < ?\n `,\n )\n .get(range.startMs, range.endMs) as Record<string, unknown> | undefined\n\n const rows = db\n .prepare(\n `\n SELECT\n id,\n created_at_ms,\n created_at_utc,\n trace_id,\n session_id,\n user_id,\n source,\n endpoint,\n provider_name,\n model,\n input_tokens,\n output_tokens,\n cache_read_input_tokens,\n cache_creation_input_tokens,\n total_nano_aiu,\n total_tokens,\n cost_currency,\n total_cost_nanos,\n cost_source,\n request_id,\n first_token_ms,\n duration_ms,\n request_outcome,\n user_agent,\n (SELECT COUNT(*) FROM token_usage_events sibling\n WHERE sibling.request_id = token_usage_events.request_id) AS usage_event_count\n FROM token_usage_events\n WHERE created_at_ms >= ? AND created_at_ms < ?\n ORDER BY created_at_ms DESC, id DESC\n LIMIT ? OFFSET ?\n `,\n )\n .all(range.startMs, range.endMs, pageSize, offset) as Array<\n Record<string, unknown>\n >\n\n const total = numberFromRow(totalRow, \"total\")\n\n return {\n items: rows.map((row) => usageEventFromRow(row)),\n page,\n page_size: pageSize,\n period: input.period,\n range: {\n end_ms: range.endMs,\n end_utc: new Date(range.endMs).toISOString(),\n start_ms: range.startMs,\n start_utc: new Date(range.startMs).toISOString(),\n },\n total,\n total_pages: Math.max(1, Math.ceil(total / pageSize)),\n }\n}\n\nexport async function getTokenUsageSessionsPage(input: {\n page: number\n pageSize: number\n period: TokenUsagePeriod\n}): Promise<TokenUsageSessionsPage> {\n const page = Math.max(1, Math.floor(input.page))\n const pageSize = Math.min(100, Math.max(1, Math.floor(input.pageSize)))\n if (!isTokenUsageStorageEnabled()) {\n return { ...createEmptyEventsPage(input), items: [] }\n }\n\n await flushTokenUsageEvents()\n const db = await getDb()\n const range = getPeriodRangeFromDb(db, input.period)\n const totalRow = db\n .prepare(\n `\n SELECT COUNT(DISTINCT session_id) AS total\n FROM token_usage_events\n WHERE created_at_ms >= ? AND created_at_ms < ?\n `,\n )\n .get(range.startMs, range.endMs) as Record<string, unknown> | undefined\n const total = numberFromRow(totalRow, \"total\")\n\n return {\n items: getSessionSummaries(db, range, pageSize, (page - 1) * pageSize),\n page,\n page_size: pageSize,\n period: input.period,\n range: rangePayload(range),\n total,\n total_pages: Math.max(1, Math.ceil(total / pageSize)),\n }\n}\n\nexport async function closeUsageStore(): Promise<void> {\n await flushTokenUsageEvents()\n await tokenUsageDbStore.close({\n beforeClose: (db) => {\n try {\n db.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\")\n } catch {\n // Ignore cleanup errors in tests.\n }\n },\n })\n writeQueue = Promise.resolve()\n}\n\nregisterProcessCleanup(closeUsageStore)\n","import { randomUUID } from \"node:crypto\"\nimport type { MiddlewareHandler } from \"hono\"\n\nimport type {\n GatewayPlugins,\n PluginRequest,\n GatewayPluginEvents,\n} from \"./gateway-plugins\"\nimport { requestContext, type RequestTiming } from \"./request-context\"\nimport { enqueueTokenUsageTiming } from \"./token-usage/store\"\n\nconst TRACKED = /\\/(chat\\/completions|responses|messages|alpha\\/search)$/\n\n// Called only where the handler already has a parsed payload.\nexport function setPluginRequestModel(model: string): void {\n requestContext.getStore()?.pluginRequest?.setModel(model)\n}\n\nexport function requestEventsMiddleware(\n plugins: GatewayPlugins | undefined,\n port: number,\n): MiddlewareHandler {\n return async (c, next) => {\n if (c.req.method !== \"POST\" || !TRACKED.test(c.req.path)) {\n return await next()\n }\n const store = requestContext.getStore()\n if (!store) return await next()\n const started = performance.now()\n const info: PluginRequest = {\n id: randomUUID(),\n traceId: store.traceId,\n userAgent: store.userAgent,\n sessionId: store.sessionAffinity?.trim() || null,\n path: c.req.path,\n port,\n startedAt: Date.now(),\n model: null,\n actualModel: null,\n }\n let finished = false\n const signal = c.req.raw.signal\n const timing: RequestTiming = {\n id: info.id,\n firstTokenMs: null,\n durationMs: null,\n outcome: null,\n hasUsage: false,\n recordFirstToken: () => {\n if (finished || timing.firstTokenMs !== null) return\n timing.firstTokenMs = performance.now() - started\n plugins?.publish(\"request.first_token\", {\n ...info,\n firstTokenMs: timing.firstTokenMs,\n })\n },\n }\n store.requestTiming = timing\n let status = 0\n const finish = (outcome: GatewayPluginEvents[\"request.end\"][\"outcome\"]) => {\n if (finished) return\n finished = true\n timing.durationMs = performance.now() - started\n timing.outcome = outcome\n if (timing.hasUsage) enqueueTokenUsageTiming(timing)\n plugins?.publish(\"request.end\", {\n ...info,\n durationMs: timing.durationMs,\n firstTokenMs: timing.firstTokenMs,\n status,\n outcome,\n })\n signal.removeEventListener(\"abort\", abort)\n }\n const abort = () => finish(\"cancelled\")\n if (plugins?.enabled)\n store.pluginRequest = {\n id: info.id,\n setModel: (model) => {\n if (\n finished\n || typeof model !== \"string\"\n || !model\n || info.model === model\n )\n return\n info.model = model\n plugins.publish(\"request.model\", info)\n },\n setActualModel: (model) => {\n if (\n finished\n || typeof model !== \"string\"\n || !model\n || info.actualModel === model\n )\n return\n info.actualModel = model\n plugins.publish(\"request.actual_model\", info)\n },\n setSessionId: (sessionId) => {\n if (!sessionId || info.sessionId === sessionId) return\n info.sessionId = sessionId\n if (!finished) plugins.publish(\"request.session\", info)\n },\n recordFirstToken: timing.recordFirstToken,\n recordUsage: (event) =>\n plugins.publish(\"usage.recorded\", {\n ...event,\n requestId: info.id,\n userAgent: info.userAgent,\n sessionId: event.session_id || null,\n actualModel: event.model,\n }),\n }\n plugins?.publish(\"request.start\", info)\n signal.addEventListener(\"abort\", abort, { once: true })\n if (signal.aborted) abort()\n try {\n await next()\n const response = c.res\n status = response.status\n if (!response.body) {\n finish(status >= 400 ? \"error\" : \"completed\")\n return\n }\n const reader = (response.body as ReadableStream<Uint8Array>).getReader()\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const result = await reader.read()\n if (result.done) {\n finish(status >= 400 ? \"error\" : \"completed\")\n controller.close()\n reader.releaseLock()\n return\n }\n controller.enqueue(result.value)\n } catch (error) {\n finish(\"error\")\n controller.error(error)\n reader.releaseLock()\n }\n },\n async cancel(reason) {\n finish(\"cancelled\")\n try {\n await reader.cancel(reason)\n } finally {\n reader.releaseLock()\n }\n },\n })\n c.res = new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n } catch (error) {\n finish(\"error\")\n throw error\n }\n }\n}\n","import consola, { type ConsolaInstance } from \"consola\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport util from \"node:util\"\n\nimport { PATHS } from \"./paths\"\nimport { registerProcessCleanup } from \"./process-cleanup\"\nimport { requestContext } from \"./request-context\"\nimport { state } from \"./state\"\n\nconst LOG_RETENTION_DAYS = 7\nconst LOG_RETENTION_MS = LOG_RETENTION_DAYS * 24 * 60 * 60 * 1000\nconst CLEANUP_INTERVAL_MS = 24 * 60 * 60 * 1000\nconst LOG_DIR_ENV = \"COPILOT_API_LOG_DIR\"\nconst DEFAULT_LOG_DIR = path.join(PATHS.APP_DIR, \"logs\")\nconst FLUSH_INTERVAL_MS = 1000\nconst MAX_BUFFER_SIZE = 100\n\nconst getLogDir = () => process.env[LOG_DIR_ENV]?.trim() || DEFAULT_LOG_DIR\n\nconst logStreams = new Map<string, fs.WriteStream>()\nconst logBuffers = new Map<string, Array<string>>()\n\nlet runtimeInitialized = false\nlet flushInterval: ReturnType<typeof setInterval> | undefined\nlet cleanupInterval: ReturnType<typeof setInterval> | undefined\nlet currentLogDateKey: string | undefined\n\nconst ensureLogDirectory = () => {\n const logDir = getLogDir()\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true })\n }\n}\n\nconst formatArgs = (args: Array<unknown>) =>\n args\n .map((arg) =>\n typeof arg === \"string\" ? arg : (\n util.inspect(arg, { depth: null, colors: false })\n ),\n )\n .join(\" \")\n\nconst sanitizeName = (name: string) => {\n const normalized = name\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"-\")\n .replaceAll(/^-+|-+$/g, \"\")\n\n return normalized === \"\" ? \"handler\" : normalized\n}\n\nconst maybeUnref = (timer: ReturnType<typeof setInterval>) => {\n timer.unref()\n}\n\nconst flushBuffer = (filePath: string) => {\n const buffer = logBuffers.get(filePath)\n if (!buffer) {\n return\n }\n\n logBuffers.delete(filePath)\n if (buffer.length === 0) {\n return\n }\n\n const stream = getLogStream(filePath)\n const content = buffer.join(\"\\n\") + \"\\n\"\n stream.write(content, (error) => {\n if (error) {\n console.warn(\"Failed to write handler log\", error)\n }\n })\n}\n\nconst flushAllBuffers = () => {\n for (const filePath of logBuffers.keys()) {\n flushBuffer(filePath)\n }\n}\n\nconst closeLogFile = async (filePath: string): Promise<void> => {\n flushBuffer(filePath)\n const stream = logStreams.get(filePath)\n logStreams.delete(filePath)\n logBuffers.delete(filePath)\n\n if (!stream || stream.closed) {\n return\n }\n\n await new Promise<void>((resolve) => {\n stream.once(\"close\", resolve)\n stream.end()\n })\n}\n\nconst closePreviousDateLogFiles = (dateKey: string): void => {\n if (currentLogDateKey === undefined) {\n currentLogDateKey = dateKey\n return\n }\n if (currentLogDateKey === dateKey) {\n return\n }\n\n const filePaths = new Set([...logBuffers.keys(), ...logStreams.keys()])\n currentLogDateKey = dateKey\n for (const filePath of filePaths) {\n void closeLogFile(filePath).catch((error) => {\n console.warn(\"Failed to rotate handler log\", error)\n })\n }\n}\n\nconst cleanupOldLogs = async (): Promise<void> => {\n const logDir = getLogDir()\n if (!fs.existsSync(logDir)) {\n return\n }\n\n const now = Date.now()\n for (const entry of fs.readdirSync(logDir)) {\n const filePath = path.join(logDir, entry)\n\n let stats: fs.Stats\n try {\n stats = fs.statSync(filePath)\n } catch {\n continue\n }\n\n if (!stats.isFile() || now - stats.mtimeMs <= LOG_RETENTION_MS) {\n continue\n }\n\n try {\n await closeLogFile(filePath)\n } catch (error) {\n console.warn(`Failed to close old handler log: ${filePath}`, error)\n continue\n }\n\n try {\n fs.rmSync(filePath)\n } catch (error) {\n console.warn(`Failed to remove old handler log: ${filePath}`, error)\n }\n }\n}\n\nconst scheduleLogCleanup = (): void => {\n void cleanupOldLogs().catch((error) => {\n console.warn(\"Failed to clean up handler logs\", error)\n })\n}\n\nconst flushAndCloseLogStreams = () => {\n flushAllBuffers()\n for (const stream of logStreams.values()) {\n stream.end()\n }\n\n logStreams.clear()\n logBuffers.clear()\n currentLogDateKey = undefined\n}\n\n// Stops the background timers, flushes and closes all log streams, and resets\n// runtime state so the logger can be initialized again. Runs on process exit\n// and is also used by tests to release file handles before removing log dirs.\nexport const shutdownLoggerRuntime = () => {\n if (flushInterval) {\n clearInterval(flushInterval)\n flushInterval = undefined\n }\n if (cleanupInterval) {\n clearInterval(cleanupInterval)\n cleanupInterval = undefined\n }\n\n flushAndCloseLogStreams()\n runtimeInitialized = false\n}\n\nconst initializeLoggerRuntime = () => {\n if (runtimeInitialized) {\n return\n }\n\n runtimeInitialized = true\n\n ensureLogDirectory()\n scheduleLogCleanup()\n\n flushInterval = setInterval(flushAllBuffers, FLUSH_INTERVAL_MS)\n maybeUnref(flushInterval)\n\n cleanupInterval = setInterval(scheduleLogCleanup, CLEANUP_INTERVAL_MS)\n maybeUnref(cleanupInterval)\n\n registerProcessCleanup(shutdownLoggerRuntime)\n}\n\nconst getLogStream = (filePath: string): fs.WriteStream => {\n initializeLoggerRuntime()\n\n let stream = logStreams.get(filePath)\n if (!stream || stream.destroyed) {\n const createdStream = fs.createWriteStream(filePath, { flags: \"a\" })\n stream = createdStream\n logStreams.set(filePath, createdStream)\n\n createdStream.on(\"error\", (error: unknown) => {\n console.warn(\"Log stream error\", error)\n if (logStreams.get(filePath) === createdStream) {\n logStreams.delete(filePath)\n }\n })\n }\n return stream\n}\n\nconst appendLine = (filePath: string, line: string) => {\n let buffer = logBuffers.get(filePath)\n if (!buffer) {\n buffer = []\n logBuffers.set(filePath, buffer)\n }\n\n buffer.push(line)\n\n if (buffer.length >= MAX_BUFFER_SIZE) {\n flushBuffer(filePath)\n }\n}\n\ntype DebugLogger = Pick<ConsolaInstance, \"debug\">\n\ntype AsyncDebugValueFactory = () => Promise<unknown>\n\nexport const debugLazy = (\n logger: DebugLogger,\n factory: () => [unknown, ...Array<unknown>],\n): void => {\n if (!state.verbose) {\n return\n }\n\n logger.debug(...factory())\n}\n\nexport const debugJson = (\n logger: DebugLogger,\n label: string,\n value: unknown,\n): void => {\n debugLazy(logger, () => [label, JSON.stringify(value)])\n}\n\nexport const debugJsonAsync = async (\n logger: DebugLogger,\n label: string,\n factory: AsyncDebugValueFactory,\n): Promise<void> => {\n if (!state.verbose) {\n return\n }\n\n logger.debug(label, JSON.stringify(await factory()))\n}\n\nexport const debugJsonTail = (\n logger: DebugLogger,\n label: string,\n { value, tailLength = 400 }: { value: unknown; tailLength?: number },\n): void => {\n debugLazy(logger, () => [label, JSON.stringify(value).slice(-tailLength)])\n}\n\nexport const createHandlerLogger = (name: string): ConsolaInstance => {\n const sanitizedName = sanitizeName(name)\n const instance = consola.withTag(name)\n\n if (state.verbose) {\n instance.level = 5\n }\n instance.setReporters([])\n\n instance.addReporter({\n log(logObj) {\n initializeLoggerRuntime()\n\n const context = requestContext.getStore()\n const traceId = context?.traceId\n const date = logObj.date\n const dateKey = date.toLocaleDateString(\"sv-SE\")\n const timestamp = date.toLocaleString(\"sv-SE\", { hour12: false })\n const filePath = path.join(getLogDir(), `${sanitizedName}-${dateKey}.log`)\n const message = formatArgs(logObj.args as Array<unknown>)\n const traceIdStr = traceId ? ` [${traceId}]` : \"\"\n const line = `[${timestamp}] [${logObj.type}] [${logObj.tag || name}]${traceIdStr}${\n message ? ` ${message}` : \"\"\n }`\n\n closePreviousDateLogFiles(dateKey)\n appendLine(filePath, line)\n },\n })\n\n return instance\n}\n","import type { Model } from \"~/lib/types/models\"\n\nimport { state } from \"~/lib/state\"\n\n/**\n * Converts a Copilot upstream model ID to a client-friendly ID that Claude Code\n * and Claude Desktop recognize (dots in version replaced with hyphens).\n * e.g. \"claude-sonnet-4.6\" -> \"claude-sonnet-4-6\"\n * Non-Claude models are returned unchanged.\n */\nexport const toClientModelId = (modelId: string): string => {\n const normalized = normalizeSdkModelId(modelId)\n if (!normalized) return modelId\n const versionHyphenated = normalized.version.replaceAll(\".\", \"-\")\n return `claude-${normalized.family}-${versionHyphenated}`\n}\n\nexport interface NormalizedSdkModelId {\n family: string\n version: string\n}\n\nexport const findEndpointModel = (sdkModelId: string): Model | undefined => {\n const models = state.models?.data ?? []\n const exactMatch = models.find((m) => m.id === sdkModelId)\n if (exactMatch) {\n return exactMatch\n }\n\n const normalized = normalizeSdkModelId(sdkModelId)\n if (!normalized) {\n return undefined\n }\n\n const modelName = `claude-${normalized.family}-${normalized.version}`\n const model = models.find((m) => m.id === modelName)\n if (model) {\n return model\n }\n\n return undefined\n}\n\n/**\n * Normalizes an SDK model ID to extract the model family and version.\n * this method from github copilot extension\n * Examples:\n * - \"claude-opus-4-5-20251101\" -> { family: \"opus\", version: \"4.5\" }\n * - \"claude-3-5-sonnet-20241022\" -> { family: \"sonnet\", version: \"3.5\" }\n * - \"claude-sonnet-4-20250514\" -> { family: \"sonnet\", version: \"4\" }\n * - \"claude-haiku-3-5-20250514\" -> { family: \"haiku\", version: \"3.5\" }\n * - \"claude-haiku-4.5\" -> { family: \"haiku\", version: \"4.5\" }\n */\nexport const normalizeSdkModelId = (\n sdkModelId: string,\n): NormalizedSdkModelId | undefined => {\n const lower = sdkModelId.toLowerCase()\n\n // Strip date suffix (8 digits at the end)\n const withoutDate = lower.replace(/-\\d{8}$/, \"\")\n\n // Pattern 1: claude-{family}-{major}.{minor} (e.g., claude-haiku-4.5)\n const pattern1 = withoutDate.match(/^claude-(\\w+)-(\\d+)\\.(\\d+)$/)\n if (pattern1) {\n return { family: pattern1[1], version: `${pattern1[2]}.${pattern1[3]}` }\n }\n\n // Pattern 2: claude-{family}-{major}-{minor} (e.g., claude-opus-4-5, claude-haiku-3-5)\n const pattern2 = withoutDate.match(/^claude-(\\w+)-(\\d+)-(\\d+)$/)\n if (pattern2) {\n return { family: pattern2[1], version: `${pattern2[2]}.${pattern2[3]}` }\n }\n\n // Pattern 3: claude-{major}-{minor}-{family} (e.g., claude-3-5-sonnet)\n const pattern3 = withoutDate.match(/^claude-(\\d+)-(\\d+)-(\\w+)$/)\n if (pattern3) {\n return { family: pattern3[3], version: `${pattern3[1]}.${pattern3[2]}` }\n }\n\n // Pattern 4: claude-{family}-{major} (e.g., claude-sonnet-4)\n const pattern4 = withoutDate.match(/^claude-(\\w+)-(\\d+)$/)\n if (pattern4) {\n return { family: pattern4[1], version: pattern4[2] }\n }\n\n // Pattern 5: claude-{major}-{family} (e.g., claude-3-opus)\n const pattern5 = withoutDate.match(/^claude-(\\d+)-(\\w+)$/)\n if (pattern5) {\n return { family: pattern5[2], version: pattern5[1] }\n }\n\n return undefined\n}\n","import type { Model } from \"~/lib/types/models\"\n\nexport interface ProviderModelAlias {\n model: string\n provider: string\n}\n\nexport const parseProviderModelAlias = (\n model: string,\n): ProviderModelAlias | null => {\n const separatorIndex = model.indexOf(\"/\")\n if (separatorIndex <= 0 || separatorIndex === model.length - 1) {\n return null\n }\n\n const provider = model.slice(0, separatorIndex).trim()\n const providerModel = model.slice(separatorIndex + 1).trim()\n if (!provider || !providerModel) {\n return null\n }\n\n return {\n model: providerModel,\n provider,\n }\n}\n\nexport const createFallbackModel = (modelId: string): Model => ({\n capabilities: {\n family: \"provider\",\n limits: {},\n object: \"model_capabilities\",\n supports: {},\n tokenizer: \"o200k_base\",\n type: \"chat\",\n },\n id: modelId,\n model_picker_enabled: false,\n name: modelId,\n object: \"model\",\n preview: false,\n vendor: \"provider\",\n version: \"unknown\",\n})\n","import {\n getRawProviderConfig,\n getProviderConfig,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport {\n parseProviderModelAlias,\n type ProviderModelAlias,\n} from \"~/lib/provider-model\"\nimport { state } from \"~/lib/state\"\nimport { setupCodexToken } from \"~/lib/token\"\nimport { getXaiAccessToken } from \"~/lib/xai-token\"\nimport { XAI_API_BASE_URL } from \"~/lib/oauth/xai\"\n\nconst AZURE_OPENAI_SCOPE = \"https://cognitiveservices.azure.com/.default\"\n\ntype AzureAccessTokenProvider = () => Promise<string>\n\nlet cachedAzureAccessTokenProvider: Promise<AzureAccessTokenProvider> | null =\n null\n\n/**\n * Lazily creates the Entra token provider on first use and reuses it\n * afterwards. Importing @azure/identity eagerly adds ~0.5s to every process\n * startup, and constructing a new DefaultAzureCredential per call would drop\n * the token cache, so both the import and the credential are singletons.\n */\nasync function getAzureAccessTokenProvider(): Promise<AzureAccessTokenProvider> {\n cachedAzureAccessTokenProvider ??= (async () => {\n try {\n const { DefaultAzureCredential, getBearerTokenProvider } = await import(\n \"@azure/identity\"\n )\n return getBearerTokenProvider(\n new DefaultAzureCredential(),\n AZURE_OPENAI_SCOPE,\n )\n } catch (error) {\n cachedAzureAccessTokenProvider = null\n throw error\n }\n })()\n return cachedAzureAccessTokenProvider\n}\n\nasync function getDefaultAzureAccessToken(): Promise<string> {\n return (await getAzureAccessTokenProvider())()\n}\n\nfunction isMissingCodexCredentialsError(error: unknown): boolean {\n return (\n error instanceof Error\n && error.message\n === \"Codex credentials not found. Run `copilot-api auth login --provider codex` first.\"\n )\n}\n\nexport async function resolveProviderConfig(\n providerName: string,\n getAzureAccessToken: () => Promise<string> = getDefaultAzureAccessToken,\n): Promise<ResolvedProviderConfig | null> {\n const normalizedProviderName = providerName.trim()\n if (!normalizedProviderName) {\n return null\n }\n\n if (normalizedProviderName === \"codex\") {\n const rawProviderConfig = getRawProviderConfig(normalizedProviderName)\n if (rawProviderConfig?.enabled === false) {\n return null\n }\n\n try {\n await setupCodexToken()\n } catch (error) {\n if (isMissingCodexCredentialsError(error)) {\n return null\n }\n throw error\n }\n\n const providerConfig = getProviderConfig(normalizedProviderName)\n if (!providerConfig) {\n return null\n }\n\n return {\n ...providerConfig,\n apiKey: state.codexAccessToken ?? providerConfig.apiKey,\n }\n }\n\n const providerConfig = getProviderConfig(normalizedProviderName)\n if (providerConfig?.name === \"xai\" && providerConfig.authType === \"oauth2\") {\n const accessToken = await getXaiAccessToken()\n return accessToken ?\n {\n ...providerConfig,\n baseUrl:\n providerConfig.baseUrl === \"https://api.x.ai\" ?\n XAI_API_BASE_URL\n : providerConfig.baseUrl,\n apiKey: accessToken,\n }\n : null\n }\n if (providerConfig?.authType !== \"azure-entra\") {\n return providerConfig\n }\n\n try {\n return { ...providerConfig, apiKey: await getAzureAccessToken() }\n } catch (error) {\n throw new Error(\n `Failed to acquire Azure Entra token for provider '${normalizedProviderName}': ${\n error instanceof Error ? error.message : String(error)\n }`,\n { cause: error },\n )\n }\n}\n\nexport type ProviderConfigResolver = typeof resolveProviderConfig\n\n/**\n * Returns the parsed \"provider/model\" alias only when that provider is\n * actually configured, otherwise null so the caller falls through to its\n * default flow. GitHub Copilot enterprise models can ship with namespaced ids\n * such as \"org/family/model\": without this check the first segment is\n * misrouted to a non-existent provider and surfaced as a 400/404.\n */\nexport async function ensureConfiguredProviderModelAlias(\n alias: ProviderModelAlias | null,\n resolveConfig: ProviderConfigResolver = resolveProviderConfig,\n): Promise<ProviderModelAlias | null> {\n if (!alias) {\n return null\n }\n\n return (await resolveConfig(alias.provider)) ? alias : null\n}\n\n/** parseProviderModelAlias + ensureConfiguredProviderModelAlias. */\nexport async function resolveConfiguredProviderModelAlias(\n model: string,\n resolveConfig: ProviderConfigResolver = resolveProviderConfig,\n): Promise<ProviderModelAlias | null> {\n return ensureConfiguredProviderModelAlias(\n parseProviderModelAlias(model),\n resolveConfig,\n )\n}\n","import { builtinProviderModelRegistry } from \"../builtin-provider-models\"\nimport { getModelsDevModelPricing } from \"../models-dev-cache\"\nimport {\n resolveProviderModelsDevId,\n usesModelsDevModelCatalog,\n} from \"../provider-model-catalog\"\nimport type { TokenUsagePeakWindow } from \"./peak-windows\"\nimport {\n normalizeToken,\n type TokenUsageSource,\n type UsageTokens,\n} from \"./store\"\n\nexport type { TokenUsagePeakWindow } from \"./peak-windows\"\n\nexport interface TokenUsagePricingTier {\n cachedInput?: number\n cacheCreationInput?: number\n explicitCachedInput?: number\n input?: number\n maxInputTokens?: number\n output?: number\n}\n\nexport interface TokenUsagePricingConfig extends TokenUsagePricingTier {\n // Prices billed outside every UTC peak window, for providers that discount\n // off-peak traffic. Ignored unless `peakWindows` is non-empty.\n offPeak?: TokenUsagePricingTier\n peakWindows?: Array<TokenUsagePeakWindow>\n tiers?: Array<TokenUsagePricingTier>\n}\n\nexport interface CalculatedTokenUsageCost {\n currency: string\n source: string\n total_cost_nanos: number\n}\n\nexport interface TokenUsageCostInput extends UsageTokens {\n serviceTier?: string | null\n // Timestamp used to pick peak or off-peak prices; defaults to the current\n // time when omitted.\n at?: Date | null\n model: string\n pricing?: TokenUsagePricingConfig | null\n pricingCurrency?: string | null\n providerName?: string | null\n source: TokenUsageSource\n}\n\ninterface ResolvedPricing {\n pricing: TokenUsagePricingConfig\n source: string\n currency?: string\n}\n\nconst COST_NANOS_PER_UNIT = 1_000_000_000\nconst COST_NANOS_PER_TOKEN_AT_ONE_PER_MILLION = 1_000\nconst COPILOT_NANO_AIU_PER_USD = 100_000_000_000\nconst COPILOT_NANO_AIU_TO_COST_NANOS =\n COST_NANOS_PER_UNIT / COPILOT_NANO_AIU_PER_USD\nconst BUILTIN_PROVIDER_CURRENCIES: Record<string, string> = {\n codex: \"USD\",\n dashscope: \"CNY\",\n deepseek: \"CNY\",\n kimi: \"USD\",\n \"opencode-go\": \"USD\",\n}\n\nexport function resolveTokenUsageCost(\n input: TokenUsageCostInput,\n): CalculatedTokenUsageCost | null {\n if (\n input.source === \"provider\"\n && input.providerName?.trim().toLowerCase() === \"openrouter\"\n ) {\n const reportedCost = resolveReportedProviderCost(input)\n if (reportedCost) {\n return reportedCost\n }\n }\n\n if (input.source === \"copilot\") {\n return resolveCopilotCost(input)\n }\n\n const providerName = input.providerName?.trim()\n if (!providerName) {\n return null\n }\n\n const resolvedPricing = resolveProviderPricing(\n providerName,\n input.model,\n input.pricing,\n )\n if (!resolvedPricing) {\n return null\n }\n\n const pricing = resolvePricingTier(\n resolvedPricing.pricing,\n getInputTokenTotal(input),\n resolvePricingTime(input.at),\n )\n const currency =\n resolvedPricing.currency\n ?? resolveProviderCurrency(providerName, input.pricingCurrency)\n if (!currency) {\n return null\n }\n\n const inputPrice = normalizePrice(pricing.input)\n const outputPrice = normalizePrice(pricing.output)\n const cacheReadPrice = resolveCacheReadPrice(pricing, input)\n const cacheCreationPrice = resolveCacheCreationPrice(pricing)\n\n const baseCostNanos =\n costNanosForTokens(input.input_tokens, inputPrice)\n + costNanosForTokens(input.output_tokens, outputPrice)\n + costNanosForTokens(input.cache_read_input_tokens, cacheReadPrice)\n + costNanosForTokens(input.cache_creation_input_tokens, cacheCreationPrice)\n const totalCostNanos = Math.round(\n baseCostNanos * resolveCodexServiceTierMultiplier(input, providerName),\n )\n\n if (totalCostNanos <= 0) {\n return null\n }\n\n return {\n currency,\n source: resolvedPricing.source,\n total_cost_nanos: totalCostNanos,\n }\n}\n\nfunction resolveCodexServiceTierMultiplier(\n input: TokenUsageCostInput,\n providerName: string,\n): number {\n if (providerName.toLowerCase() !== \"codex\") {\n return 1\n }\n\n // Price-estimate multipliers, applied after selecting the context rates.\n // https://developers.openai.com/api/docs/pricing\n switch (input.serviceTier?.trim().toLowerCase()) {\n case \"priority\":\n case \"fast\":\n return 2\n case \"ultrafast\":\n return 6\n default:\n return 1\n }\n}\n\nfunction resolveReportedProviderCost(\n input: TokenUsageCostInput,\n): CalculatedTokenUsageCost | null {\n const cost = normalizePrice(input.cost)\n if (cost === null) {\n return null\n }\n\n const totalCostNanos = Math.round(cost * COST_NANOS_PER_UNIT)\n if (totalCostNanos < 0) {\n return null\n }\n\n return {\n currency: \"USD\",\n source: \"upstream\",\n total_cost_nanos: totalCostNanos,\n }\n}\n\nexport function getCostAmount(totalCostNanos: number): number {\n return totalCostNanos / COST_NANOS_PER_UNIT\n}\n\nfunction resolveCopilotCost(\n input: TokenUsageCostInput,\n): CalculatedTokenUsageCost | null {\n const totalNanoAiu = normalizeToken(input.total_nano_aiu)\n if (totalNanoAiu <= 0) {\n return null\n }\n\n const totalCostNanos = Math.round(\n totalNanoAiu * COPILOT_NANO_AIU_TO_COST_NANOS,\n )\n if (totalCostNanos <= 0) {\n return null\n }\n\n return {\n currency: \"USD\",\n source: \"copilot_aiu\",\n total_cost_nanos: totalCostNanos,\n }\n}\n\nfunction resolveProviderPricing(\n providerName: string,\n model: string,\n configuredPricing: TokenUsagePricingConfig | null | undefined,\n): ResolvedPricing | null {\n if (configuredPricing) {\n return {\n pricing: configuredPricing,\n source: \"config\",\n }\n }\n\n if (usesModelsDevModelCatalog(providerName)) {\n const pricing = getModelsDevModelPricing(\n resolveProviderModelsDevId(providerName),\n model,\n )\n if (pricing) return { pricing, source: \"models.dev\", currency: \"USD\" }\n }\n\n const pricingModel =\n (\n providerName.toLowerCase() === \"codex\"\n && model.trim().toLowerCase() === \"gpt-5.6\"\n ) ?\n \"gpt-5.6-sol\"\n : model\n const builtinPricing = builtinProviderModelRegistry.getModelConfig(\n providerName,\n pricingModel,\n )?.pricing\n if (!builtinPricing) {\n return null\n }\n\n return {\n pricing: builtinPricing,\n source: \"builtin\",\n }\n}\n\nfunction resolvePricingTier(\n pricing: TokenUsagePricingConfig,\n inputTokenTotal: number,\n at: Date,\n): TokenUsagePricingTier {\n const tiers = pricing.tiers\n ?.filter((tier) => typeof tier === \"object\" && tier !== null)\n .toSorted((a, b) => normalizeTierMax(a) - normalizeTierMax(b))\n\n const selectedTier =\n tiers?.find((tier) => inputTokenTotal <= normalizeTierMax(tier))\n ?? tiers?.at(-1)\n\n const resolvedTier = {\n ...pricing,\n ...selectedTier,\n }\n\n const offPeak = pricing.offPeak\n const peakWindows = pricing.peakWindows\n if (offPeak && peakWindows?.length && !isPeakPricingTime(peakWindows, at)) {\n return { ...resolvedTier, ...offPeak }\n }\n\n return resolvedTier\n}\n\nfunction resolvePricingTime(at: Date | null | undefined): Date {\n return at instanceof Date && Number.isFinite(at.getTime()) ? at : new Date()\n}\n\n// Peak windows are matched against UTC minutes and ISO weekdays so a catalog\n// entry bills the same no matter which timezone the host runs in.\nexport function isPeakPricingTime(\n windows: Array<TokenUsagePeakWindow>,\n at: Date,\n): boolean {\n const minuteOfDay = at.getUTCHours() * 60 + at.getUTCMinutes()\n const isoWeekday = at.getUTCDay() || 7\n\n return windows.some((window) => {\n const startMinute = normalizeMinuteOfDay(window.startMinuteUtc)\n const endMinute = normalizeMinuteOfDay(window.endMinuteUtc)\n if (\n startMinute === null\n || endMinute === null\n || endMinute <= startMinute\n ) {\n return false\n }\n\n if (window.weekdays?.length && !window.weekdays.includes(isoWeekday)) {\n return false\n }\n\n return minuteOfDay >= startMinute && minuteOfDay < endMinute\n })\n}\n\nfunction normalizeMinuteOfDay(value: number | undefined): number | null {\n return (\n typeof value === \"number\"\n && Number.isFinite(value)\n && value >= 0\n && value <= 1_440\n ) ?\n value\n : null\n}\n\nfunction normalizeTierMax(tier: TokenUsagePricingTier): number {\n const maxInputTokens = tier.maxInputTokens\n return (\n typeof maxInputTokens === \"number\"\n && Number.isFinite(maxInputTokens)\n && maxInputTokens > 0\n ) ?\n maxInputTokens\n : Number.POSITIVE_INFINITY\n}\n\nfunction getInputTokenTotal(input: UsageTokens): number {\n return (\n normalizeToken(input.input_tokens)\n + normalizeToken(input.cache_read_input_tokens)\n + normalizeToken(input.cache_creation_input_tokens)\n )\n}\n\nfunction normalizePrice(value: number | null | undefined): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ?\n value\n : null\n}\n\nexport function resolveProviderCurrency(\n providerName: string,\n configuredCurrency: string | null | undefined,\n): string | null {\n const currency =\n configuredCurrency?.trim().toUpperCase()\n || BUILTIN_PROVIDER_CURRENCIES[providerName.toLowerCase()]\n return currency || null\n}\n\nfunction resolveCacheCreationPrice(\n pricing: TokenUsagePricingTier,\n): number | null {\n return normalizePrice(pricing.cacheCreationInput)\n}\n\nfunction resolveCacheReadPrice(\n pricing: TokenUsagePricingTier,\n input: UsageTokens,\n): number | null {\n const hasCacheCreationSignal =\n input.cache_creation_input_tokens !== undefined\n && input.cache_creation_input_tokens !== null\n\n if (hasCacheCreationSignal) {\n const explicitPrice = normalizePrice(pricing.explicitCachedInput)\n if (explicitPrice !== null) {\n return explicitPrice\n }\n }\n\n return normalizePrice(pricing.cachedInput)\n}\n\nfunction costNanosForTokens(\n tokens: number | null | undefined,\n pricePerMillionTokens: number | null,\n): number {\n if (pricePerMillionTokens === null) {\n return 0\n }\n\n return Math.round(\n normalizeToken(tokens)\n * pricePerMillionTokens\n * COST_NANOS_PER_TOKEN_AT_ONE_PER_MILLION,\n )\n}\n","import { requestContext, generateTraceId } from \"~/lib/request-context\"\nimport { state } from \"~/lib/state\"\n\nimport { EventBus } from \"../event-bus\"\nimport { resolveTokenUsageCost, type TokenUsagePricingConfig } from \"./pricing\"\nimport {\n enqueueTokenUsageWrite,\n hasAnyToken,\n normalizeOptionalToken,\n normalizeToken,\n resolveTotalTokens,\n type PersistedTokenUsageEvent,\n type TokenUsageEndpoint,\n type TokenUsageSource,\n type UsageTokens,\n} from \"./store\"\n\nexport {\n closeUsageStore,\n getTokenUsageDailySummary,\n getTokenUsageEventsPage,\n getTokenUsageSessionsPage,\n getTokenUsageSummary,\n normalizeOptionalToken,\n normalizeToken,\n} from \"./store\"\n\nexport type {\n TokenUsageDailyBucket,\n TokenUsageDailySummary,\n TokenUsageCost,\n TokenUsageEventCost,\n TokenUsageEndpoint,\n TokenUsageEventRecord,\n TokenUsageEventsPage,\n TokenUsageModelSummary,\n TokenUsagePeriod,\n TokenUsageSessionsPage,\n TokenUsageSessionSummary,\n TokenUsageSource,\n TokenUsageSummary,\n TokenUsageTotals,\n UsageTokens,\n} from \"./store\"\n\nexport interface TokenUsageEventInput extends UsageTokens {\n serviceTier?: string | null\n endpoint: TokenUsageEndpoint\n fallbackSessionId?: string | null\n model: string\n pricing?: TokenUsagePricingConfig | null\n pricingCurrency?: string | null\n providerName?: string | null\n sessionId?: string | null\n source: TokenUsageSource\n traceId?: string | null\n}\n\ninterface TokenUsageRecorderOptions {\n serviceTier?: string | null\n endpoint: TokenUsageEndpoint\n fallbackSessionId?: string | null\n model: string\n pricing?: TokenUsagePricingConfig | null\n pricingCurrency?: string | null\n providerName?: string | null\n sessionId?: string | null\n source: TokenUsageSource\n traceId?: string | null\n}\n\ntype CopilotTokenUsageRecorderOptions = Omit<\n TokenUsageRecorderOptions,\n \"providerName\" | \"source\"\n>\n\ntype ProviderTokenUsageRecorderOptions = Omit<\n TokenUsageRecorderOptions,\n \"source\"\n>\n\ninterface TokenUsageEventMap {\n \"token_usage.recorded\": PersistedTokenUsageEvent\n}\n\nconst tokenUsageEventBus = new EventBus<TokenUsageEventMap>()\nconst USER_AGENT_MAX_LENGTH = 64\n\nfunction resolveTraceId(traceId: string | null | undefined): string {\n return (\n traceId?.trim() || requestContext.getStore()?.traceId || generateTraceId()\n )\n}\n\nexport function resolveTokenUsageSessionId(\n sessionId: string | null | undefined,\n fallbackSessionId?: string | null,\n): string {\n return (\n requestContext.getStore()?.sessionAffinity?.trim()\n || sessionId?.trim()\n || fallbackSessionId?.trim()\n || \"\"\n )\n}\n\nfunction resolveUserId(input: TokenUsageEventInput): string {\n if (input.source === \"provider\") {\n return input.providerName?.trim() || \"\"\n }\n return state.userName?.trim() || \"\"\n}\n\nfunction toPersistedEvent(\n input: TokenUsageEventInput,\n): PersistedTokenUsageEvent | null {\n if (!hasAnyToken(input)) {\n return null\n }\n\n const now = new Date()\n const timing = requestContext.getStore()?.requestTiming\n const cost = resolveTokenUsageCost({ ...input, at: now })\n return {\n request_id: timing?.id ?? null,\n first_token_ms: timing?.firstTokenMs ?? null,\n duration_ms: timing?.durationMs ?? null,\n request_outcome: timing?.outcome ?? null,\n cache_creation_input_tokens: normalizeToken(\n input.cache_creation_input_tokens,\n ),\n cache_read_input_tokens: normalizeToken(input.cache_read_input_tokens),\n cost_currency: cost?.currency ?? null,\n cost_source: cost?.source ?? null,\n created_at_ms: now.getTime(),\n created_at_utc: now.toISOString(),\n endpoint: input.endpoint,\n input_tokens: normalizeToken(input.input_tokens),\n model: input.model.trim() || \"unknown\",\n output_tokens: normalizeToken(input.output_tokens),\n provider_name: input.providerName?.trim() || null,\n session_id: resolveTokenUsageSessionId(\n input.sessionId,\n input.fallbackSessionId,\n ),\n source: input.source,\n total_nano_aiu:\n input.total_nano_aiu === undefined || input.total_nano_aiu === null ?\n null\n : normalizeToken(input.total_nano_aiu),\n total_cost_nanos: cost?.total_cost_nanos ?? null,\n total_tokens: resolveTotalTokens(input),\n trace_id: resolveTraceId(input.traceId),\n user_agent: (requestContext.getStore()?.userAgent ?? \"\").slice(\n 0,\n USER_AGENT_MAX_LENGTH,\n ),\n user_id: resolveUserId(input),\n }\n}\n\ntokenUsageEventBus.subscribe(\"token_usage.recorded\", enqueueTokenUsageWrite)\n\nexport function recordTokenUsageEvent(input: TokenUsageEventInput): void {\n const event = toPersistedEvent(input)\n if (!event) {\n return\n }\n\n const observer = requestContext.getStore()?.pluginRequest\n const timing = requestContext.getStore()?.requestTiming\n if (timing) timing.hasUsage = true\n observer?.setSessionId(event.session_id)\n observer?.recordUsage(event)\n tokenUsageEventBus.publish(\"token_usage.recorded\", event)\n}\n\nexport function createTokenUsageRecorder(\n options: TokenUsageRecorderOptions,\n): (usage: UsageTokens) => void {\n requestContext\n .getStore()\n ?.pluginRequest?.setSessionId(\n resolveTokenUsageSessionId(options.sessionId, options.fallbackSessionId),\n )\n return (usage) => {\n recordTokenUsageEvent({\n ...usage,\n ...options,\n })\n }\n}\n\nexport function createCopilotTokenUsageRecorder(\n options: CopilotTokenUsageRecorderOptions,\n): (usage: UsageTokens) => void {\n return createTokenUsageRecorder({\n ...options,\n source: \"copilot\",\n })\n}\n\nexport function createProviderTokenUsageRecorder(\n options: ProviderTokenUsageRecorderOptions,\n): (usage: UsageTokens) => void {\n return createTokenUsageRecorder({\n ...options,\n source: \"provider\",\n })\n}\n\nexport function normalizeOpenAIUsage(\n usage:\n | {\n completion_tokens?: number\n prompt_tokens?: number\n total_tokens?: number\n prompt_cache_hit_tokens?: number\n prompt_cache_miss_tokens?: number\n prompt_tokens_details?: {\n cache_creation_input_tokens?: number\n cached_tokens?: number\n }\n }\n | null\n | undefined,\n): UsageTokens {\n if (\n usage\n && (Object.hasOwn(usage, \"prompt_cache_hit_tokens\")\n || Object.hasOwn(usage, \"prompt_cache_miss_tokens\"))\n ) {\n return {\n cache_read_input_tokens: normalizeToken(usage.prompt_cache_hit_tokens),\n input_tokens: normalizeToken(usage.prompt_cache_miss_tokens),\n output_tokens: normalizeToken(usage.completion_tokens),\n total_tokens: normalizeOptionalToken(usage.total_tokens),\n }\n }\n\n const promptDetails = usage?.prompt_tokens_details\n const hasCacheCreationTokens = Boolean(\n promptDetails\n && Object.hasOwn(promptDetails, \"cache_creation_input_tokens\"),\n )\n const hasCachedTokens = Boolean(\n promptDetails && Object.hasOwn(promptDetails, \"cached_tokens\"),\n )\n const cachedTokens = normalizeToken(promptDetails?.cached_tokens)\n const cacheCreationTokens = normalizeToken(\n promptDetails?.cache_creation_input_tokens,\n )\n const promptTokens = normalizeToken(usage?.prompt_tokens)\n return {\n ...(hasCacheCreationTokens && {\n cache_creation_input_tokens: cacheCreationTokens,\n }),\n ...(hasCachedTokens && {\n cache_read_input_tokens: cachedTokens,\n }),\n input_tokens: Math.max(\n 0,\n promptTokens - cachedTokens - cacheCreationTokens,\n ),\n output_tokens: normalizeToken(usage?.completion_tokens),\n total_tokens: normalizeOptionalToken(usage?.total_tokens),\n }\n}\n\nexport function normalizeResponsesUsage(\n usage:\n | {\n cost?: number\n input_tokens?: number\n input_tokens_details?: {\n cached_tokens?: number\n cache_write_tokens?: number\n }\n output_tokens?: number\n total_tokens?: number\n }\n | null\n | undefined,\n): UsageTokens {\n const cachedTokens = normalizeToken(\n usage?.input_tokens_details?.cached_tokens,\n )\n const cacheWriteTokens = normalizeToken(\n usage?.input_tokens_details?.cache_write_tokens,\n )\n const inputTokens = normalizeToken(usage?.input_tokens)\n return {\n ...(cacheWriteTokens > 0 && {\n cache_creation_input_tokens: cacheWriteTokens,\n }),\n cache_read_input_tokens: cachedTokens,\n cost: normalizeOptionalCost(usage?.cost),\n input_tokens: Math.max(0, inputTokens - cachedTokens - cacheWriteTokens),\n output_tokens: normalizeToken(usage?.output_tokens),\n total_tokens: normalizeOptionalToken(usage?.total_tokens),\n }\n}\n\nexport function normalizeAnthropicUsage(\n usage:\n | {\n cache_creation_input_tokens?: number\n cache_read_input_tokens?: number\n cost?: number\n input_tokens?: number\n output_tokens?: number\n total_tokens?: number\n }\n | null\n | undefined,\n): UsageTokens {\n return {\n cache_creation_input_tokens: normalizeOptionalToken(\n usage?.cache_creation_input_tokens,\n ),\n cache_read_input_tokens: normalizeOptionalToken(\n usage?.cache_read_input_tokens,\n ),\n cost: normalizeOptionalCost(usage?.cost),\n input_tokens: normalizeOptionalToken(usage?.input_tokens),\n output_tokens: normalizeOptionalToken(usage?.output_tokens),\n total_tokens: normalizeOptionalToken(usage?.total_tokens),\n }\n}\n\nexport function mergeAnthropicUsage(\n current: UsageTokens,\n next: UsageTokens,\n): UsageTokens {\n return {\n cache_creation_input_tokens:\n next.cache_creation_input_tokens ?? current.cache_creation_input_tokens,\n cache_read_input_tokens:\n next.cache_read_input_tokens ?? current.cache_read_input_tokens,\n cost: next.cost ?? current.cost,\n input_tokens: next.input_tokens ?? current.input_tokens,\n output_tokens: next.output_tokens ?? current.output_tokens,\n total_nano_aiu: next.total_nano_aiu ?? current.total_nano_aiu,\n total_tokens: next.total_tokens ?? current.total_tokens,\n }\n}\n\nfunction normalizeOptionalCost(\n value: number | null | undefined,\n): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ?\n value\n : undefined\n}\n","import { z } from \"zod\"\n\nconst unsignedInteger = z.number().int().nonnegative()\nconst passthroughRecord = z.record(z.string(), z.unknown())\n\nconst searchQuerySchema = z\n .object({\n q: z.string(),\n recency: unsignedInteger.optional(),\n domains: z.array(z.string()).optional(),\n })\n .loose()\n\nconst openOperationSchema = z\n .object({\n ref_id: z.string(),\n lineno: unsignedInteger.optional(),\n })\n .loose()\n\nconst clickOperationSchema = z\n .object({\n ref_id: z.string(),\n id: unsignedInteger,\n })\n .loose()\n\nconst findOperationSchema = z\n .object({\n ref_id: z.string(),\n pattern: z.string(),\n })\n .loose()\n\nconst screenshotOperationSchema = z\n .object({\n ref_id: z.string(),\n pageno: unsignedInteger,\n })\n .loose()\n\nconst financeOperationSchema = z\n .object({\n ticker: z.string(),\n type: z.enum([\"equity\", \"fund\", \"crypto\", \"index\"]),\n market: z.string().optional(),\n })\n .loose()\n\nconst weatherOperationSchema = z\n .object({\n location: z.string(),\n start: z.string().optional(),\n duration: unsignedInteger.optional(),\n })\n .loose()\n\nconst sportsOperationSchema = z\n .object({\n tool: z.literal(\"sports\").optional(),\n fn: z.enum([\"schedule\", \"standings\"]),\n league: z.enum([\n \"nba\",\n \"wnba\",\n \"nfl\",\n \"nhl\",\n \"mlb\",\n \"epl\",\n \"ncaamb\",\n \"ncaawb\",\n \"ipl\",\n ]),\n team: z.string().optional(),\n opponent: z.string().optional(),\n date_from: z.string().optional(),\n date_to: z.string().optional(),\n num_games: unsignedInteger.optional(),\n locale: z.string().optional(),\n })\n .loose()\n\nconst timeOperationSchema = z\n .object({\n utc_offset: z.string().regex(/^[+-](?:[01]\\d|2[0-3]):[0-5]\\d$/u),\n })\n .loose()\n\nexport const alphaSearchCommandsSchema = z\n .object({\n search_query: z.array(searchQuerySchema).optional(),\n image_query: z.array(searchQuerySchema).optional(),\n open: z.array(openOperationSchema).optional(),\n click: z.array(clickOperationSchema).optional(),\n find: z.array(findOperationSchema).optional(),\n screenshot: z.array(screenshotOperationSchema).optional(),\n finance: z.array(financeOperationSchema).optional(),\n weather: z.array(weatherOperationSchema).optional(),\n sports: z.array(sportsOperationSchema).optional(),\n time: z.array(timeOperationSchema).optional(),\n response_length: z.enum([\"short\", \"medium\", \"long\"]).optional(),\n })\n .loose()\n\nconst reasoningSchema = z\n .object({\n effort: z.string().min(1).nullable().optional(),\n summary: z\n .enum([\"auto\", \"concise\", \"detailed\", \"none\"])\n .nullable()\n .optional(),\n context: z\n .enum([\"auto\", \"current_turn\", \"all_turns\"])\n .nullable()\n .optional(),\n })\n .loose()\n\nconst settingsSchema = z\n .object({\n user_location: z\n .object({\n type: z.literal(\"approximate\"),\n country: z.string().optional(),\n region: z.string().optional(),\n city: z.string().optional(),\n timezone: z.string().optional(),\n })\n .loose()\n .optional(),\n search_context_size: z.enum([\"low\", \"medium\", \"high\"]).optional(),\n filters: z\n .object({\n allowed_domains: z.array(z.string()).optional(),\n blocked_domains: z.array(z.string()).optional(),\n })\n .loose()\n .optional(),\n image_settings: z\n .object({\n max_results: unsignedInteger.optional(),\n caption: z.boolean().optional(),\n })\n .loose()\n .optional(),\n allowed_callers: z\n .array(z.enum([\"direct\", \"shell\", \"code_interpreter\"]))\n .optional(),\n external_web_access: z\n .union([z.boolean(), z.enum([\"cached\", \"indexed\", \"live\"])])\n .optional(),\n })\n .loose()\n\nexport const alphaSearchRequestSchema = z\n .object({\n id: z.string(),\n model: z.string(),\n reasoning: reasoningSchema.optional(),\n input: z.union([z.string(), z.array(passthroughRecord)]).optional(),\n commands: alphaSearchCommandsSchema.optional(),\n settings: settingsSchema.optional(),\n max_output_tokens: unsignedInteger.optional(),\n })\n .loose()\n\nexport type AlphaSearchRequest = z.infer<typeof alphaSearchRequestSchema>\nexport type AlphaSearchCommands = z.infer<typeof alphaSearchCommandsSchema>\n\nexport interface AlphaSearchResponse {\n encrypted_output: string | null\n output: string\n results: Array<AlphaSearchResult>\n}\n\nexport type AlphaSearchResult = AlphaSearchTextResult\n\nexport interface AlphaSearchTextResult {\n type: \"text_result\"\n domain: string\n ref_id: string\n snippet: string\n title: string\n url: string\n}\n","import type {\n ResponseOutputMessage,\n ResponsesResult,\n} from \"~/lib/types/responses\"\n\nexport interface WebSearchSource {\n url: string\n title: string\n snippet?: string\n page_age?: string | null\n}\n\nexport interface WebSearchExtract {\n /** The grounded answer text produced by the GPT backend (with inline cites). */\n answerText: string\n /** Deduped citation and included action sources. */\n sources: Array<WebSearchSource>\n /** Search queries the backend actually ran. */\n queries: Array<string>\n}\n\nexport interface WebSearchToolConfig {\n allowedDomains?: Array<string>\n blockedDomains?: Array<string>\n userLocation?: Record<string, unknown>\n searchContextSize?: \"low\" | \"medium\" | \"high\"\n}\n\ninterface UrlCitationAnnotation {\n type: \"url_citation\"\n url: string\n title?: string\n start_index?: number\n end_index?: number\n}\n\n/** Builds the Responses API web_search tool object from normalized config. */\nexport const buildResponsesWebSearchTool = (\n config: WebSearchToolConfig,\n): Record<string, unknown> => {\n const tool: Record<string, unknown> = { type: \"web_search\" }\n const filters: Record<string, unknown> = {}\n if (config.allowedDomains?.length) {\n filters.allowed_domains = config.allowedDomains\n }\n if (config.blockedDomains?.length) {\n filters.blocked_domains = config.blockedDomains\n }\n if (Object.keys(filters).length > 0) tool.filters = filters\n if (config.userLocation) tool.user_location = config.userLocation\n if (config.searchContextSize) {\n tool.search_context_size = config.searchContextSize\n }\n return tool\n}\n\nconst isMessageItem = (\n item: ResponsesResult[\"output\"][number],\n): item is ResponseOutputMessage => item.type === \"message\"\n\nconst isValidUrlCitation = (\n annotation: unknown,\n seenUrls: Set<string>,\n): annotation is UrlCitationAnnotation => {\n const ann = annotation as UrlCitationAnnotation\n return (\n ann.type === \"url_citation\" && Boolean(ann.url) && !seenUrls.has(ann.url)\n )\n}\n\nconst collectTextParts = (\n blocks:\n | Array<{ type?: string; text?: string; annotations?: Array<unknown> }>\n | undefined,\n seenUrls: Set<string>,\n): { textParts: Array<string>; sources: Array<WebSearchSource> } => {\n const textParts: Array<string> = []\n const sources: Array<WebSearchSource> = []\n for (const block of blocks ?? []) {\n if (block.type !== \"output_text\") continue\n if (block.text) textParts.push(block.text)\n for (const annotation of block.annotations ?? []) {\n if (!isValidUrlCitation(annotation, seenUrls)) continue\n const ann = annotation\n seenUrls.add(ann.url)\n const start = Math.max(0, (ann.start_index ?? 0) - 120)\n const end = Math.min(\n block.text?.length ?? 0,\n (ann.end_index ?? block.text?.length ?? 0) + 120,\n )\n sources.push({\n url: ann.url,\n title: ann.title ?? ann.url,\n snippet: block.text?.slice(start, end).trim(),\n })\n }\n }\n return { textParts, sources }\n}\n\nconst collectQuery = (\n item: { action?: { query?: string; queries?: Array<string> } },\n queries: Array<string>,\n): void => {\n if (item.action?.queries?.length) {\n queries.push(...item.action.queries)\n } else if (item.action?.query) {\n queries.push(item.action.query)\n }\n}\n\n/**\n * Extracts the answer text, deduped sources, and run queries from a GPT\n * /responses web_search result.\n */\nexport const extractWebSearchResult = (\n result: ResponsesResult,\n): WebSearchExtract => {\n const textParts: Array<string> = []\n const sources: Array<WebSearchSource> = []\n const seenUrls = new Set<string>()\n const queries: Array<string> = []\n\n for (const item of result.output) {\n if (isMessageItem(item)) {\n const collected = collectTextParts(item.content, seenUrls)\n textParts.push(...collected.textParts)\n sources.push(...collected.sources)\n }\n }\n\n for (const item of result.output) {\n if ((item as { type?: string }).type === \"web_search_call\") {\n const action = (\n item as {\n action?: {\n query?: string\n queries?: Array<string>\n sources?: Array<{ url?: string }>\n }\n }\n ).action\n collectQuery({ action }, queries)\n for (const source of action?.sources ?? []) {\n if (!source.url || seenUrls.has(source.url)) continue\n seenUrls.add(source.url)\n sources.push({ url: source.url, title: source.url })\n }\n }\n }\n\n const answerText =\n textParts.join(\"\\n\\n\").trim() || (result.output_text ?? \"\").trim()\n return { answerText, sources, queries }\n}\n","import consola from \"consola\"\n\nconst copilotRateLimitTypes = [\"session\", \"weekly\"] as const\n\nexport type CopilotRateLimitType = (typeof copilotRateLimitTypes)[number]\ntype HeadersMap = Record<string, string | undefined>\ntype HeadersLike = Headers | HeadersMap\ntype QuotaSnapshotMap = Record<string, unknown>\n\nexport interface CopilotRateLimitUsage {\n type: CopilotRateLimitType\n remaining: string\n resetAt: string\n}\n\nexport interface CopilotQuotaSnapshot {\n entitlement: string\n percent_remaining: number\n overage_permitted: boolean\n overage_count: number\n reset_date: string\n}\n\nconst copilotRateLimitHeaders: Record<CopilotRateLimitType, string> = {\n session: \"x-usage-ratelimit-session\",\n weekly: \"x-usage-ratelimit-weekly\",\n}\n\nconst copilotQuotaSnapshotKeys: Record<CopilotRateLimitType, string> = {\n session: \"5Hour-Session-RateLimits\",\n weekly: \"Weekly-Session-RateLimits\",\n}\n\nconst hasGetMethod = (headers: HeadersLike): headers is Headers => {\n return \"get\" in headers && typeof headers.get === \"function\"\n}\n\nconst getHeaderValue = (\n headers: HeadersLike,\n headerName: string,\n): string | null => {\n if (hasGetMethod(headers)) {\n return headers.get(headerName)\n }\n\n const normalizedHeaderName = headerName.toLowerCase()\n const matchedEntry = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === normalizedHeaderName,\n )\n\n return matchedEntry?.[1] ?? null\n}\n\nexport const parseCopilotRateLimitHeader = (\n headerValue: string,\n): Omit<CopilotRateLimitUsage, \"type\"> | null => {\n const params = new URLSearchParams(headerValue)\n const remaining = params.get(\"rem\")\n const resetAt = params.get(\"rst\")\n\n if (!remaining || !resetAt) {\n return null\n }\n\n return {\n remaining,\n resetAt,\n }\n}\n\nexport const getCopilotRateLimitUsage = (\n headers: HeadersLike,\n type: CopilotRateLimitType,\n): CopilotRateLimitUsage | null => {\n const headerName = copilotRateLimitHeaders[type]\n const headerValue = getHeaderValue(headers, headerName)\n\n if (!headerValue) {\n return null\n }\n\n const parsed = parseCopilotRateLimitHeader(headerValue)\n\n if (!parsed) {\n return null\n }\n\n return {\n type,\n ...parsed,\n }\n}\n\nexport const getCopilotRateLimitUsageFromSnapshots = (\n snapshots: QuotaSnapshotMap | undefined,\n type: CopilotRateLimitType,\n): CopilotRateLimitUsage | null => {\n const snapshot = snapshots?.[copilotQuotaSnapshotKeys[type]]\n if (!isCopilotQuotaSnapshot(snapshot)) {\n return null\n }\n\n return {\n remaining: String(snapshot.percent_remaining),\n resetAt: snapshot.reset_date,\n type,\n }\n}\n\nexport const logCopilotRateLimits = (headers: HeadersLike): void => {\n for (const type of copilotRateLimitTypes) {\n const usage = getCopilotRateLimitUsage(headers, type)\n\n if (!usage) {\n continue\n }\n\n logCopilotRateLimitUsage(usage)\n }\n}\n\nexport const logCopilotQuotaSnapshots = (\n snapshots: QuotaSnapshotMap | undefined,\n): void => {\n for (const type of copilotRateLimitTypes) {\n const usage = getCopilotRateLimitUsageFromSnapshots(snapshots, type)\n\n if (!usage) {\n continue\n }\n\n logCopilotRateLimitUsage(usage)\n }\n}\n\nconst logCopilotRateLimitUsage = (usage: CopilotRateLimitUsage): void => {\n const d = new Date(usage.resetAt)\n const dateStr = Number.isNaN(d.getTime()) ? usage.resetAt : d.toLocaleString()\n consola.log(\n `Copilot ${usage.type} quota remaining: ${usage.remaining}, resets at: ${dateStr}`,\n )\n}\n\nconst isCopilotQuotaSnapshot = (\n value: unknown,\n): value is CopilotQuotaSnapshot => {\n if (!value || typeof value !== \"object\") {\n return false\n }\n\n const record = value as Record<string, unknown>\n return (\n typeof record.entitlement === \"string\"\n && typeof record.percent_remaining === \"number\"\n && typeof record.overage_permitted === \"boolean\"\n && typeof record.overage_count === \"number\"\n && typeof record.reset_date === \"string\"\n )\n}\n","import consola from \"consola\"\nimport { createHash } from \"node:crypto\"\n\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type {\n CreateResponsesReturn,\n ResponsesPayload,\n ResponsesResult,\n ResponsesStream,\n ResponsesTransport,\n} from \"~/lib/types/responses\"\nimport type { PooledWebSocketRequest } from \"~/services/responses-websocket\"\n\nimport {\n copilotBaseUrl,\n copilotHeaders,\n copilotWebSocketHeaders,\n prepareForCompact,\n prepareInteractionHeaders,\n} from \"~/lib/api-config\"\nimport { COMPACT_REQUEST, type CompactType } from \"~/lib/compact\"\nimport { getUpstreamTransportConfig } from \"~/lib/config\"\nimport {\n logCopilotQuotaSnapshots,\n logCopilotRateLimits,\n type CopilotQuotaSnapshot,\n} from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { setPluginRequestActualModel } from \"~/lib/request-context\"\nimport { state } from \"~/lib/state\"\nimport {\n createPooledWebSocketStream,\n createWebSocketUrl,\n} from \"~/services/responses-websocket\"\nimport {\n createResponsesSafeStream,\n encodePoolKeyPart,\n getResponsesStreamTerminalDisposition,\n} from \"~/services/responses-websocket-helpers\"\nimport { createResponsesHttpEventStream } from \"~/services/responses-http\"\nimport { fetchUpstreamWithLifecycle } from \"~/services/upstream-http\"\n\ninterface ResponsesRequestOptions {\n vision: boolean\n initiator: \"agent\" | \"user\"\n subagentMarker?: SubagentMarker | null\n requestId: string\n sessionId?: string\n compactType?: CompactType\n transport?: ResponsesTransport\n clientSignal?: AbortSignal\n}\n\nexport const createResponses = async (\n payload: ResponsesPayload,\n {\n vision,\n initiator,\n subagentMarker,\n requestId,\n sessionId,\n compactType,\n transport = \"http\",\n clientSignal,\n }: ResponsesRequestOptions,\n): Promise<CreateResponsesReturn> => {\n if (!state.copilotToken) throw new Error(\"Copilot token not found\")\n\n const headers: Record<string, string> = {\n ...copilotHeaders(state, requestId, vision),\n \"x-initiator\": initiator,\n }\n\n prepareInteractionHeaders(sessionId, Boolean(subagentMarker), headers)\n\n prepareForCompact(headers, compactType)\n\n // service_tier is not supported by github copilot\n payload.service_tier = undefined\n\n consola.log(`<-- model: ${payload.model}`)\n\n const effectiveTransport =\n compactType === COMPACT_REQUEST ? \"http\" : transport\n\n setPluginRequestActualModel(payload.model)\n if (payload.stream === true && effectiveTransport === \"websocket\") {\n clientSignal?.throwIfAborted()\n const websocketRequest = prepareResponsesWebSocketRequest(\n payload,\n headers,\n {\n requestId,\n subagentMarker,\n },\n )\n const stream = createPooledResponsesWebSocketStream(\n websocketRequest,\n clientSignal,\n )\n return stream\n }\n\n return await createHttpResponses(payload, headers, clientSignal)\n}\n\nconst createHttpResponses = async (\n payload: ResponsesPayload,\n headers: Record<string, string>,\n clientSignal?: AbortSignal,\n): Promise<CreateResponsesReturn> => {\n const transportConfig = getUpstreamTransportConfig()\n const response = await fetchUpstreamWithLifecycle(\n `${copilotBaseUrl(state)}/responses`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n },\n {\n clientSignal,\n headersTimeoutMs: transportConfig.headersTimeoutMs,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n },\n )\n\n logCopilotRateLimits(response.headers)\n\n if (!response.ok) {\n consola.error(\"Failed to create responses\", response)\n throw new HTTPError(\"Failed to create responses\", response)\n }\n\n if (payload.stream) {\n return createResponsesSafeStream(createResponsesHttpEventStream(response))\n }\n\n return (await response.json()) as ResponsesResult\n}\n\ntype ResponsesWebSocketPayload = ResponsesPayload & {\n type: \"response.create\"\n initiator: \"agent\" | \"user\"\n}\n\ntype ResponsesWebSocketRequest =\n PooledWebSocketRequest<ResponsesWebSocketPayload>\n\nexport const prepareResponsesWebSocketRequest = (\n payload: ResponsesPayload,\n preparedHeaders: Record<string, string>,\n options: {\n requestId: string\n subagentMarker?: SubagentMarker | null\n },\n): ResponsesWebSocketRequest => {\n const initiator = getResponsesWebSocketInitiator(preparedHeaders)\n\n return {\n headers: copilotWebSocketHeaders(preparedHeaders),\n poolKey: buildResponsesWebSocketPoolKey(payload, options),\n payload: buildResponsesWebSocketPayload(payload, initiator),\n url: buildResponsesWebSocketUrl(copilotBaseUrl(state)),\n }\n}\n\nexport const buildResponsesWebSocketPoolKey = (\n payload: ResponsesPayload,\n {\n requestId,\n subagentMarker,\n }: {\n requestId: string\n subagentMarker?: SubagentMarker | null\n },\n): string => {\n const tokenFingerprint =\n state.copilotToken ?\n createHash(\"sha256\").update(state.copilotToken).digest(\"hex\").slice(0, 16)\n : \"missing-token\"\n const subagentKey =\n subagentMarker ?\n [\n subagentMarker.session_id,\n subagentMarker.agent_id,\n subagentMarker.agent_type,\n ].join(\":\")\n : \"main\"\n\n return [tokenFingerprint, payload.model, requestId, subagentKey]\n .map(encodePoolKeyPart)\n .join(\"|\")\n}\n\nexport const getResponsesWebSocketInitiator = (\n preparedHeaders: Record<string, string>,\n): \"agent\" | \"user\" => {\n const initiator = getHeaderValue(preparedHeaders, \"x-initiator\")\n return initiator?.toLowerCase() === \"agent\" ? \"agent\" : \"user\"\n}\n\nconst createPooledResponsesWebSocketStream = (\n request: ResponsesWebSocketRequest,\n clientSignal?: AbortSignal,\n): ResponsesStream =>\n createResponsesSafeStream(\n createClientPreflightStream(\n createPooledWebSocketStream(request, {\n ...getResponsesWebSocketOptions(),\n }),\n clientSignal,\n ),\n )\n\nconst getResponsesWebSocketOptions = () => {\n const transportConfig = getUpstreamTransportConfig()\n return {\n createChunk: createResponsesWebSocketStreamChunk,\n maxBufferedBytes: transportConfig.websocketMaxBufferedBytes,\n maxBufferedMessages: transportConfig.websocketMaxBufferedMessages,\n getTerminalDisposition: getResponsesStreamTerminalDisposition,\n openErrorMessage: \"Failed to create responses websocket\",\n openTimeoutMs: transportConfig.websocketOpenTimeoutMs,\n poolIdleTimeoutMs: transportConfig.websocketPoolIdleTimeoutMs,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n streamErrorMessage:\n \"Upstream connection lost, Responses websocket stream error\",\n terminalChunkMissingMessage:\n \"Responses websocket ended without a terminal response, retry your request.\",\n }\n}\n\nconst createClientPreflightStream = async function* <T>(\n source: AsyncIterable<T>,\n clientSignal?: AbortSignal,\n): AsyncGenerator<T, void, unknown> {\n if (clientSignal?.aborted) return\n yield* source\n}\n\nexport const buildResponsesWebSocketPayload = (\n payload: ResponsesPayload,\n initiator: \"agent\" | \"user\",\n): ResponsesWebSocketPayload => {\n const websocketPayload: ResponsesWebSocketPayload = {\n ...payload,\n type: \"response.create\",\n initiator,\n }\n\n delete websocketPayload.stream\n delete websocketPayload[\"background\"]\n delete websocketPayload.service_tier\n\n return websocketPayload\n}\n\nexport const buildResponsesWebSocketUrl = (baseUrl: string): string => {\n return createWebSocketUrl(`${baseUrl.replace(/\\/+$/u, \"\")}/responses`)\n}\n\nconst getHeaderValue = (\n headers: Record<string, string>,\n headerName: string,\n): string | undefined => {\n const normalizedHeaderName = headerName.toLowerCase()\n const match = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === normalizedHeaderName,\n )\n\n return match?.[1]\n}\n\nexport const createResponsesWebSocketStreamChunk = (\n data: string,\n): { data?: string; event?: string; id?: string } => {\n if (data === \"[DONE]\") {\n return { data }\n }\n\n try {\n const parsed = JSON.parse(data) as {\n copilot_quota_snapshots?: Record<string, CopilotQuotaSnapshot>\n id?: unknown\n type?: unknown\n error?: {\n code: string | null\n message: string\n }\n code?: string | null\n message?: string\n }\n if (parsed.type === \"response.completed\") {\n logCopilotQuotaSnapshots(parsed.copilot_quota_snapshots)\n }\n // Normal events have no payload changes: forward their original bytes.\n // Error events still expose the legacy top-level code/message fields.\n let forwardedData = data\n if (parsed.type === \"error\" && parsed.error) {\n consola.warn(\"Copilot responses websocket stream error:\", parsed.error)\n parsed.code = parsed.error.code\n parsed.message = parsed.error.message\n forwardedData = JSON.stringify(parsed)\n }\n return {\n event: typeof parsed.type === \"string\" ? parsed.type : undefined,\n data: forwardedData,\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n }\n } catch {\n return { data }\n }\n}\n","const VERSION_URL = \"https://x.ai/cli/stable\"\nconst VERSION_CACHE_MS = 24 * 60 * 60 * 1000\nconst VERSION_RETRY_MS = 5 * 60 * 1000\n\n// Verified against the official stable channel on 2026-10-06; used offline only.\nlet cachedVersion = \"1.0.46\"\nlet nextVersionCheck = 0\nlet versionInFlight: Promise<string> | undefined\n\nasync function refreshGrokBuildVersion(): Promise<string> {\n nextVersionCheck = Date.now() + VERSION_RETRY_MS\n try {\n // This is the channel pointer used by https://x.ai/cli/install.ps1.\n const response = await fetch(VERSION_URL, {\n signal: AbortSignal.timeout(3000),\n })\n if (response.ok) {\n const version = (await response.text()).trim()\n if (/^\\d+\\.\\d+\\.\\d+$/u.test(version)) {\n cachedVersion = version\n nextVersionCheck = Date.now() + VERSION_CACHE_MS\n }\n }\n } catch {\n // A version lookup failure must not prevent inference.\n }\n return cachedVersion\n}\n\nexport async function getGrokBuildVersion(): Promise<string> {\n if (versionInFlight) return await versionInFlight\n if (Date.now() < nextVersionCheck) return cachedVersion\n versionInFlight = refreshGrokBuildVersion().finally(() => {\n versionInFlight = undefined\n })\n return await versionInFlight\n}\n","import { getGlobalDispatcher, type Dispatcher } from \"undici\"\n\n/**\n * Node's global fetch keeps Undici's shorter default headers/body timeouts.\n * Wrap the global dispatcher so long-running requests (e.g. image\n * generation) get an explicit cap.\n */\nexport const createTimeoutDispatcher = (timeoutMs: number): Dispatcher =>\n ({\n dispatch(\n options: Dispatcher.DispatchOptions,\n handler: Dispatcher.DispatchHandler,\n ) {\n return getGlobalDispatcher().dispatch(\n {\n ...options,\n bodyTimeout: timeoutMs,\n headersTimeout: timeoutMs,\n },\n handler,\n )\n },\n }) as Dispatcher\n","import consola from \"consola\"\nimport { randomUUID } from \"node:crypto\"\nimport {\n fetch as undiciFetch,\n type RequestInit as UndiciRequestInit,\n} from \"undici\"\n\nimport {\n getUpstreamTransportConfig,\n normalizeProviderBaseUrl,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport { getGrokBuildVersion } from \"~/lib/grok-build\"\nimport { XAI_API_BASE_URL } from \"~/lib/oauth/xai\"\nimport {\n requestContext,\n setPluginRequestActualModel,\n} from \"~/lib/request-context\"\nimport { createTimeoutDispatcher } from \"~/lib/timeout-dispatcher\"\nimport type { AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\nimport type { ChatCompletionsPayload } from \"~/lib/types/chat-completions\"\nimport type { ResponsesPayload } from \"~/lib/types/responses\"\nimport type { GoogleModelsResponse } from \"~/lib/types/google\"\nimport { parseUserIdMetadata } from \"~/lib/utils\"\nimport { fetchUpstreamWithLifecycle } from \"~/services/upstream-http\"\n\nconst OPENCODE_GO_PROVIDER_NAME = \"opencode-go\"\nconst OPENCODE_SESSION_HEADER = \"x-opencode-session\"\n\nconst SHARED_FORWARDABLE_HEADERS = [\"accept\", \"user-agent\"] as const\n\nconst ANTHROPIC_FORWARDABLE_HEADERS = [\n \"anthropic-version\",\n \"anthropic-beta\",\n] as const\n\nconst STRIPPED_RESPONSE_HEADERS = [\n \"connection\",\n \"content-encoding\",\n \"content-length\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n] as const\n\nexport function resolveProviderEndpointUrl(\n providerConfig: ResolvedProviderConfig,\n endpoint: string,\n): string {\n if (providerConfig.name === OPENCODE_GO_PROVIDER_NAME) {\n const base = normalizeProviderBaseUrl(providerConfig.baseUrl)\n const apiBase = /\\/v\\d+(?:alpha|beta)?$/u.test(base) ? base : `${base}/v1`\n return `${apiBase}/${endpoint}`\n }\n if (providerConfig.type === \"google\") {\n const base = providerConfig.baseUrl.replace(/\\/+$/u, \"\")\n const apiBase =\n /\\/v\\d+(?:alpha|beta)?$/u.test(base) ? base : `${base}/v1beta`\n return `${apiBase}/${endpoint}`\n }\n const apiBaseUrl =\n providerConfig.modelsDevProviderId ?\n providerConfig.baseUrl.replace(/\\/(?:chat\\/completions|responses)$/u, \"\")\n : `${providerConfig.baseUrl}/v1`\n return `${apiBaseUrl}/${endpoint}`\n}\n\nexport function buildProviderUpstreamHeaders(\n providerConfig: ResolvedProviderConfig,\n requestHeaders: Headers,\n): Record<string, string> {\n const authHeaders: Record<string, string> = {}\n if (\n providerConfig.authType === \"x-api-key\"\n || providerConfig.authType === \"x-goog-api-key\"\n ) {\n authHeaders[providerConfig.authType] = providerConfig.apiKey\n } else {\n authHeaders.authorization = `Bearer ${providerConfig.apiKey}`\n }\n\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n ...authHeaders,\n }\n\n for (const headerName of SHARED_FORWARDABLE_HEADERS) {\n const headerValue = requestHeaders.get(headerName)\n if (headerValue) {\n headers[headerName] = headerValue\n }\n }\n\n if (providerConfig.type !== \"anthropic\") {\n return headers\n }\n\n if (providerConfig.modelsDevProviderId) {\n headers[\"anthropic-version\"] = \"2023-06-01\"\n }\n\n for (const headerName of ANTHROPIC_FORWARDABLE_HEADERS) {\n const headerValue = requestHeaders.get(headerName)\n if (headerValue) {\n headers[headerName] = headerValue\n }\n }\n\n return headers\n}\n\nexport const resolveOpencodeMessagesSession = (\n payload: AnthropicMessagesPayload,\n): string | undefined => {\n const store = requestContext.getStore()\n // Keep sibling subagents on the root session so opencode-go routes them to the\n // same prompt cache group, matching the chat completions/responses flows.\n const rootSessionId = store?.rootSessionId?.trim()\n if (rootSessionId) {\n return rootSessionId\n }\n\n const sessionAffinity = store?.sessionAffinity?.trim()\n if (sessionAffinity) {\n return sessionAffinity\n }\n\n const userId = payload.metadata?.user_id\n if (!userId?.trim()) {\n return undefined\n }\n\n const { sessionId } = parseUserIdMetadata(userId)\n return sessionId ?? userId\n}\n\nexport const applyOpencodeSessionHeader = (\n providerConfig: ResolvedProviderConfig,\n headers: Record<string, string>,\n session: string | undefined,\n): void => {\n if (providerConfig.name !== OPENCODE_GO_PROVIDER_NAME || !session) {\n return\n }\n headers[OPENCODE_SESSION_HEADER] = session\n}\n\nasync function applyXaiGrokBuildHeaders(\n providerConfig: ResolvedProviderConfig,\n headers: Record<string, string>,\n payload: ResponsesPayload,\n): Promise<void> {\n if (\n providerConfig.name !== \"xai\"\n || providerConfig.authType !== \"oauth2\"\n || new URL(providerConfig.baseUrl).origin !== XAI_API_BASE_URL\n ) {\n return\n }\n\n const cacheKey = payload.prompt_cache_key\n const sessionId =\n cacheKey?.trim() ?\n cacheKey\n : requestContext.getStore()?.sessionAffinity?.trim()\n if (!sessionId) {\n throw new Error(\n \"xAI OAuth Responses requests require prompt_cache_key or session affinity\",\n )\n }\n headers[\"x-xai-token-auth\"] = \"xai-grok-cli\"\n headers[\"x-authenticateresponse\"] = \"authenticate-response\"\n headers[\"x-grok-client-version\"] = await getGrokBuildVersion()\n headers[\"x-grok-client-identifier\"] = \"grok-shell\"\n headers[\"x-grok-client-mode\"] = \"headless\"\n headers[\"x-grok-model-override\"] = payload.model\n headers[\"x-grok-conv-id\"] = sessionId\n headers[\"x-grok-session-id\"] = sessionId\n headers[\"x-grok-req-id\"] = randomUUID()\n}\n\nexport function createProviderProxyResponse(\n upstreamResponse: Response,\n body?: ReadableStream<Uint8Array> | null,\n): Response {\n return new Response(body ?? upstreamResponse.body, {\n headers: createProviderProxyResponseHeaders(upstreamResponse.headers),\n status: upstreamResponse.status,\n statusText: upstreamResponse.statusText,\n })\n}\n\nexport function createProviderProxyResponseHeaders(\n upstreamHeaders: Headers,\n): Headers {\n const headers = new Headers(upstreamHeaders)\n\n for (const headerName of STRIPPED_RESPONSE_HEADERS) {\n headers.delete(headerName)\n }\n\n return headers\n}\n\nexport async function forwardProviderMessages(\n providerConfig: ResolvedProviderConfig,\n payload: AnthropicMessagesPayload,\n requestHeaders: Headers,\n options: { clientSignal?: AbortSignal } = {},\n): Promise<Response> {\n consola.log(`<-- model: ${payload.model}`)\n const headers = buildProviderUpstreamHeaders(providerConfig, requestHeaders)\n applyOpencodeSessionHeader(\n providerConfig,\n headers,\n resolveOpencodeMessagesSession(payload),\n )\n const transportConfig = getUpstreamTransportConfig()\n setPluginRequestActualModel(payload.model)\n return await fetchUpstreamWithLifecycle(\n resolveProviderEndpointUrl(providerConfig, \"messages\"),\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n },\n {\n clientSignal: options.clientSignal,\n headersTimeoutMs: transportConfig.headersTimeoutMs,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n },\n )\n}\n\nexport async function forwardProviderChatCompletions(\n providerConfig: ResolvedProviderConfig,\n payload: ChatCompletionsPayload,\n requestHeaders: Headers,\n options: { clientSignal?: AbortSignal } = {},\n): Promise<Response> {\n consola.log(`<-- model: ${payload.model}`)\n const headers = buildProviderUpstreamHeaders(providerConfig, requestHeaders)\n applyOpencodeSessionHeader(\n providerConfig,\n headers,\n payload.prompt_cache_key?.trim() || undefined,\n )\n const transportConfig = getUpstreamTransportConfig()\n setPluginRequestActualModel(payload.model)\n return await fetchUpstreamWithLifecycle(\n resolveProviderEndpointUrl(providerConfig, \"chat/completions\"),\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n },\n {\n clientSignal: options.clientSignal,\n headersTimeoutMs: transportConfig.headersTimeoutMs,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n },\n )\n}\n\nexport async function forwardProviderResponses(\n providerConfig: ResolvedProviderConfig,\n payload: ResponsesPayload,\n requestHeaders: Headers,\n options: { clientSignal?: AbortSignal } = {},\n): Promise<Response> {\n consola.log(`<-- model: ${payload.model}`)\n const transportConfig = getUpstreamTransportConfig()\n const headers = buildProviderUpstreamHeaders(providerConfig, requestHeaders)\n applyOpencodeSessionHeader(\n providerConfig,\n headers,\n payload.prompt_cache_key?.trim() || undefined,\n )\n await applyXaiGrokBuildHeaders(providerConfig, headers, payload)\n setPluginRequestActualModel(payload.model)\n return await fetchUpstreamWithLifecycle(\n resolveProviderEndpointUrl(providerConfig, \"responses\"),\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n },\n {\n headersTimeoutMs: transportConfig.headersTimeoutMs,\n clientSignal: options.clientSignal,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n },\n )\n}\n\nconst PROVIDER_MODELS_TIMEOUT_MS = 15_000\n\nexport async function forwardProviderModels(\n providerConfig: ResolvedProviderConfig,\n requestHeaders: Headers,\n): Promise<Response> {\n if (providerConfig.type === \"google\") {\n return await forwardGoogleModels(providerConfig, requestHeaders)\n }\n return await fetch(resolveProviderEndpointUrl(providerConfig, \"models\"), {\n method: \"GET\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n signal: AbortSignal.timeout(PROVIDER_MODELS_TIMEOUT_MS),\n })\n}\n\nasync function forwardGoogleModels(\n provider: ResolvedProviderConfig,\n requestHeaders: Headers,\n): Promise<Response> {\n const data: Array<Record<string, unknown>> = []\n const pageTokens = new Set<string>()\n let pageToken: string | undefined\n const signal = AbortSignal.timeout(PROVIDER_MODELS_TIMEOUT_MS)\n do {\n const url = new URL(resolveProviderEndpointUrl(provider, \"models\"))\n url.searchParams.set(\"pageSize\", \"1000\")\n if (pageToken) url.searchParams.set(\"pageToken\", pageToken)\n const upstream = await fetch(url, {\n headers: buildProviderUpstreamHeaders(provider, requestHeaders),\n signal,\n })\n if (!upstream.ok) return upstream\n const body = (await upstream.json()) as GoogleModelsResponse\n for (const model of body.models ?? []) {\n if (!model.supportedGenerationMethods?.includes(\"generateContent\"))\n continue\n data.push({\n id: model.name.replace(/^models\\//u, \"\"),\n object: \"model\",\n owned_by: provider.name,\n name: model.displayName,\n display_name: model.displayName,\n description: model.description,\n context_window: model.inputTokenLimit,\n max_output_tokens: model.outputTokenLimit,\n })\n }\n pageToken = body.nextPageToken\n if (pageToken && pageTokens.has(pageToken))\n throw new Error(\"Google models returned a repeated page token\")\n if (pageToken) pageTokens.add(pageToken)\n } while (pageToken)\n return Response.json({ object: \"list\", data, has_more: false })\n}\n\n/** Align with Codex images: long-running generation/edits need a generous cap. */\nconst PROVIDER_IMAGES_TIMEOUT_MS = 15 * 60 * 1000\n\nconst providerImagesDispatcher = createTimeoutDispatcher(\n PROVIDER_IMAGES_TIMEOUT_MS,\n)\n\nfunction resolveProviderRequestUrl(\n providerConfig: ResolvedProviderConfig,\n requestUrl: string,\n path: string,\n): string {\n const upstreamUrl = new URL(\n resolveProviderEndpointUrl(providerConfig, path.replace(/^\\/v1\\//u, \"\")),\n )\n upstreamUrl.search = new URL(requestUrl, \"http://localhost\").search\n return upstreamUrl.toString()\n}\n\nexport async function forwardProviderAlphaSearch(\n providerConfig: ResolvedProviderConfig,\n request: Request,\n options: { clientSignal?: AbortSignal } = {},\n): Promise<Response> {\n const headers = buildProviderUpstreamHeaders(providerConfig, request.headers)\n const body = await request.arrayBuffer()\n const transportConfig = getUpstreamTransportConfig()\n\n return await fetchUpstreamWithLifecycle(\n resolveProviderRequestUrl(providerConfig, request.url, \"/v1/alpha/search\"),\n {\n method: \"POST\",\n headers,\n body,\n },\n {\n clientSignal: options.clientSignal,\n headersTimeoutMs: transportConfig.headersTimeoutMs,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n },\n )\n}\n\nexport async function forwardProviderImages(\n providerConfig: ResolvedProviderConfig,\n request: Request,\n operation: \"generations\" | \"edits\",\n): Promise<Response> {\n const headers = buildProviderUpstreamHeaders(providerConfig, request.headers)\n const contentType = request.headers.get(\"content-type\")\n if (contentType) {\n headers[\"content-type\"] = contentType\n } else if (operation === \"edits\") {\n delete headers[\"content-type\"]\n }\n\n const init: RequestInit & { duplex: \"half\" } = {\n method: \"POST\",\n headers,\n body: request.body,\n duplex: \"half\",\n signal: AbortSignal.any([\n request.signal,\n AbortSignal.timeout(PROVIDER_IMAGES_TIMEOUT_MS),\n ]),\n }\n\n const upstreamUrl = resolveProviderRequestUrl(\n providerConfig,\n request.url,\n `/v1/images/${operation}`,\n )\n\n if (typeof Bun !== \"undefined\") {\n return await fetch(upstreamUrl, init)\n }\n\n // Node's global fetch keeps Undici's shorter default headers/body timeouts.\n // Use an explicit dispatcher so the documented 15-minute cap applies there.\n return (await undiciFetch(upstreamUrl, {\n ...init,\n dispatcher: providerImagesDispatcher,\n } as unknown as UndiciRequestInit)) as unknown as Response\n}\n","import type { Context } from \"hono\"\nimport consola from \"consola\"\n\nimport {\n resolveEffectiveProviderType,\n resolveMappedModel,\n resolveProviderConfigForModel,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { debugJson, createHandlerLogger } from \"~/lib/logger\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport {\n createCopilotTokenUsageRecorder,\n createProviderTokenUsageRecorder,\n normalizeOptionalToken,\n normalizeResponsesUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { generateRequestIdFromPayload, getUUID } from \"~/lib/utils\"\nimport {\n alphaSearchRequestSchema,\n type AlphaSearchCommands,\n type AlphaSearchRequest,\n type AlphaSearchResponse,\n type AlphaSearchTextResult,\n} from \"~/routes/alpha-search/alpha-search-types\"\nimport {\n buildResponsesWebSearchTool,\n extractWebSearchResult,\n type WebSearchSource,\n} from \"~/routes/messages/web-search/backend\"\nimport type { ResponsesPayload, ResponsesResult } from \"~/lib/types/responses\"\nimport { createResponses as createCopilotResponses } from \"~/services/copilot/create-responses\"\nimport { forwardProviderResponses } from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"alpha-search-responses-handler\")\n\nconst SESSION_TTL_MS = 60 * 60 * 1000\nconst MAX_SESSIONS = 128\nconst MAX_URL_REFERENCES = 256\nconst MAX_SNAPSHOTS = 16\nconst MAX_SNAPSHOT_CHARACTERS = 20_000\n// ponytail: bounded process-local state is intentional; use persistent\n// per-account storage only if measured sessions outgrow these fixed ceilings.\n\nconst IMAGE_UNSUPPORTED =\n \"Unsupported by GitHub Copilot web search: image_query. Do not retry this operation; use search_query for image-source pages.\"\nconst SCREENSHOT_UNSUPPORTED =\n \"Unsupported by GitHub Copilot web search: screenshot. Do not retry this operation; open the PDF for text content.\"\n\nconst KNOWN_COMMANDS = new Set([\n \"search_query\",\n \"image_query\",\n \"open\",\n \"click\",\n \"find\",\n \"screenshot\",\n \"finance\",\n \"weather\",\n \"sports\",\n \"time\",\n \"response_length\",\n])\n\ninterface UrlReference {\n result: AlphaSearchTextResult\n}\n\ninterface PageSnapshot {\n refId: string\n source: UrlReference\n text: string\n links: Array<UrlReference>\n}\n\ninterface SearchSession {\n nextTurn: number\n touchedAt: number\n referencesById: Map<string, UrlReference>\n referencesByUrl: Map<string, UrlReference>\n snapshots: Map<string, PageSnapshot>\n}\n\ninterface RemotePageOperation {\n kind: \"open\" | \"find\"\n source: UrlReference\n lineno?: number\n pattern?: string\n}\n\ninterface RemoteOperation {\n operation: string\n [key: string]: unknown\n}\n\ninterface PageOperationOptions {\n lineno?: number\n pattern?: string\n}\n\ninterface SearchTurn {\n number: number\n nextReferenceIndex: number\n}\n\ninterface SearchOperationState {\n session: SearchSession\n turn: SearchTurn\n output: Array<string>\n warnings: Array<string>\n resultReferences: Map<string, UrlReference>\n remoteOperations: Array<RemoteOperation>\n remotePages: Array<RemotePageOperation>\n}\n\nexport interface AlphaSearchResponsesOptions {\n provider?: string\n request: AlphaSearchRequest\n}\n\ninterface RemoteModelTarget {\n model: string\n providerConfig?: ResolvedProviderConfig\n}\n\nconst sessions = new Map<string, SearchSession>()\n\nexport const alphaSearchResponsesDependencies = {\n createResponses: createCopilotResponses,\n findEndpointModel,\n now: (): number => Date.now(),\n resolveMappedModel,\n resolveEffectiveProviderType,\n resolveProviderConfig,\n createUsageRecorder: (\n model: string,\n sessionId: string,\n ): ((usage: UsageTokens) => void) =>\n createCopilotTokenUsageRecorder({\n endpoint: \"responses\",\n fallbackSessionId: sessionId,\n model,\n }),\n}\n\nexport function resetAlphaSearchState(): void {\n sessions.clear()\n}\n\nfunction reserveSession(\n id: string,\n now: number,\n): {\n session: SearchSession\n turn: number\n} {\n for (const [sessionId, session] of sessions) {\n if (now - session.touchedAt >= SESSION_TTL_MS) {\n sessions.delete(sessionId)\n }\n }\n\n let session = sessions.get(id)\n if (!session) {\n if (sessions.size >= MAX_SESSIONS) {\n const oldestSession = sessions.keys().next()\n if (!oldestSession.done) sessions.delete(oldestSession.value)\n }\n session = {\n nextTurn: 0,\n touchedAt: now,\n referencesById: new Map(),\n referencesByUrl: new Map(),\n snapshots: new Map(),\n }\n } else {\n sessions.delete(id)\n session.touchedAt = now\n }\n sessions.set(id, session)\n\n const turn = session.nextTurn\n session.nextTurn += 1\n return { session, turn }\n}\n\nfunction parseHttpUrl(value: string): string | null {\n try {\n const url = new URL(value)\n return url.protocol === \"http:\" || url.protocol === \"https:\" ?\n url.toString()\n : null\n } catch {\n return null\n }\n}\n\nfunction extractMarkdownSources(text: string): Array<WebSearchSource> {\n // ponytail: Copilot emits simple Markdown links here; add a Markdown parser\n // only if measured responses exceed this shape.\n return Array.from(\n text.matchAll(\n /(?<!!)\\[([^\\]\\n]+)\\]\\((https?:\\/\\/(?:[^\\s<>()]|\\([^\\s<>()]*\\))+)\\)/gu, //NOSONAR\n ),\n ([, title, url]) => ({ title, url }),\n )\n}\n\nfunction addUrlReference(\n session: SearchSession,\n source: WebSearchSource,\n turn: SearchTurn,\n): UrlReference | null {\n const url = parseHttpUrl(source.url)\n if (!url) return null\n\n const existing = session.referencesByUrl.get(url)\n if (existing) {\n if (existing.result.title === existing.result.url && source.title) {\n existing.result.title = source.title\n }\n if (source.snippet) existing.result.snippet = source.snippet\n return existing\n }\n\n if (session.referencesById.size >= MAX_URL_REFERENCES) {\n const oldest = session.referencesById.entries().next().value\n if (oldest) {\n const [refId, reference] = oldest\n session.referencesById.delete(refId)\n session.referencesByUrl.delete(reference.result.url)\n }\n }\n\n const refId = `turn${turn.number}search${turn.nextReferenceIndex}`\n turn.nextReferenceIndex += 1\n\n const reference: UrlReference = {\n result: {\n type: \"text_result\",\n domain: new URL(url).hostname,\n ref_id: refId,\n snippet: source.snippet?.trim() || source.title || url,\n title: source.title || url,\n url,\n },\n }\n session.referencesById.set(refId, reference)\n session.referencesByUrl.set(url, reference)\n return reference\n}\n\nfunction resolveUrlReference(\n session: SearchSession,\n refId: string,\n turn: SearchTurn,\n): UrlReference | null {\n const stored = session.referencesById.get(refId)\n if (stored) return stored\n\n const url = parseHttpUrl(refId)\n return url ? addUrlReference(session, { title: url, url }, turn) : null\n}\n\nfunction getSnapshot(\n session: SearchSession,\n refId: string,\n): PageSnapshot | null {\n const snapshot = session.snapshots.get(refId)\n if (!snapshot) return null\n session.snapshots.delete(refId)\n session.snapshots.set(refId, snapshot)\n return snapshot\n}\n\nfunction findSnapshotByUrl(\n session: SearchSession,\n url: string,\n): PageSnapshot | null {\n for (const snapshot of session.snapshots.values()) {\n if (snapshot.source.result.url === url) {\n return getSnapshot(session, snapshot.refId)\n }\n }\n return null\n}\n\nfunction addSnapshot(\n session: SearchSession,\n source: UrlReference,\n turn: number,\n index: number,\n text: string,\n links: Array<UrlReference>,\n): PageSnapshot {\n const existing = findSnapshotByUrl(session, source.result.url)\n if (existing) {\n existing.text = text.slice(0, MAX_SNAPSHOT_CHARACTERS)\n existing.links = links\n return existing\n }\n\n if (session.snapshots.size >= MAX_SNAPSHOTS) {\n const oldestRefId = session.snapshots.keys().next().value\n if (oldestRefId) session.snapshots.delete(oldestRefId)\n }\n\n const snapshot = {\n refId: `turn${turn}view${index}`,\n source,\n text: text.slice(0, MAX_SNAPSHOT_CHARACTERS),\n links,\n }\n session.snapshots.set(snapshot.refId, snapshot)\n return snapshot\n}\n\nfunction renderSnapshot(snapshot: PageSnapshot, lineno?: number): string {\n const lines = snapshot.text.split(\"\\n\")\n const start =\n lineno === undefined ? 0 : (\n Math.max(0, Math.min(lineno, lines.length - 1) - 10)\n )\n const end =\n lineno === undefined ? lines.length : Math.min(lines.length, start + 21)\n const numbered = lines\n .slice(start, end)\n .map((line, index) => `L${start + index}: ${line}`)\n .join(\"\\n\")\n const links = snapshot.links\n .map(\n (link, index) =>\n `[${index}] ${link.result.title} — ${link.result.url} (${link.result.ref_id})`,\n )\n .join(\"\\n\")\n\n return [\n `Open ${snapshot.refId} (${snapshot.source.result.url})`,\n numbered,\n links ? `Links:\\n${links}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\")\n}\n\nfunction findInSnapshot(\n snapshot: PageSnapshot,\n pattern: string,\n): string | null {\n const normalizedPattern = pattern.toLowerCase()\n const matches = snapshot.text\n .split(\"\\n\")\n .map((line, index) => ({ line, index }))\n .filter(({ line }) => line.toLowerCase().includes(normalizedPattern))\n .slice(0, 20)\n if (matches.length === 0) return null\n\n return [\n `Find results for ${JSON.stringify(pattern)} in ${snapshot.refId}:`,\n ...matches.map(({ line, index }) => `L${index}: ${line}`),\n ].join(\"\\n\")\n}\n\nfunction formatTime(utcOffset: string, now: number): string {\n const direction = utcOffset.startsWith(\"+\") ? 1 : -1\n const offsetMinutes =\n direction\n * (Number.parseInt(utcOffset.slice(1, 3), 10) * 60\n + Number.parseInt(utcOffset.slice(4, 6), 10))\n const localIso = new Date(now + offsetMinutes * 60_000).toISOString()\n return `Time at UTC${utcOffset}: ${localIso.slice(0, 19).replace(\"T\", \" \")}`\n}\n\nfunction buildInstruction(\n operations: Array<RemoteOperation>,\n responseLength: \"short\" | \"medium\" | \"long\" | undefined,\n): string {\n return [\n \"The Operations JSON below is the complete and exclusive request for this response.\",\n \"Use web_search to execute every listed operation and only those operations. Do not validate, infer, or mention operations absent from the JSON; the adapter already handled them.\",\n \"Return only grounded results and citations for these operations. Do not discuss unrelated tasks or conversations.\",\n \"For search operations, honor every query, recency, domain, market, date, league, team, and locale constraint.\",\n \"For open operations, open the exact URL and return grounded page text plus cited links.\",\n \"For find operations, find the exact pattern in the specified URL and return matching context.\",\n `Requested response length: ${responseLength ?? \"medium\"}.`,\n `Operations:\\n${JSON.stringify(operations, null, 2)}`,\n ].join(\"\\n\")\n}\n\nfunction unavailableReference(refId: string): string {\n return `Reference ${JSON.stringify(refId)} is unavailable or expired. Search or open the URL again.`\n}\n\nfunction invalidRequest(c: Context, message: string): Response {\n return c.json(\n {\n error: {\n message,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n}\n\nfunction createSearchOperationState(\n session: SearchSession,\n turn: SearchTurn,\n): SearchOperationState {\n return {\n session,\n turn,\n output: [],\n warnings: [],\n resultReferences: new Map(),\n remoteOperations: [],\n remotePages: [],\n }\n}\n\nfunction includeResult(\n state: SearchOperationState,\n reference: UrlReference,\n): void {\n state.resultReferences.set(reference.result.url, reference)\n}\n\nfunction queuePage(\n state: SearchOperationState,\n kind: \"open\" | \"find\",\n source: UrlReference,\n options: PageOperationOptions = {},\n): void {\n state.remoteOperations.push({\n operation: kind,\n url: source.result.url,\n ...(options.lineno === undefined ? {} : { lineno: options.lineno }),\n ...(options.pattern === undefined ? {} : { pattern: options.pattern }),\n })\n state.remotePages.push({ kind, source, ...options })\n includeResult(state, source)\n}\n\nfunction processSearchCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n): void {\n for (const command of commands.search_query ?? []) {\n state.remoteOperations.push({ ...command, operation: \"search_query\" })\n }\n}\n\nfunction processOpenCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n): void {\n for (const command of commands.open ?? []) {\n const directSnapshot = getSnapshot(state.session, command.ref_id)\n if (directSnapshot) {\n state.output.push(renderSnapshot(directSnapshot, command.lineno))\n includeResult(state, directSnapshot.source)\n continue\n }\n\n const source = resolveUrlReference(\n state.session,\n command.ref_id,\n state.turn,\n )\n if (!source) {\n state.output.push(unavailableReference(command.ref_id))\n continue\n }\n const cached = findSnapshotByUrl(state.session, source.result.url)\n if (cached) {\n state.output.push(renderSnapshot(cached, command.lineno))\n includeResult(state, source)\n continue\n }\n queuePage(state, \"open\", source, { lineno: command.lineno })\n }\n}\n\nfunction processClickCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n): void {\n for (const command of commands.click ?? []) {\n const parent = getSnapshot(state.session, command.ref_id)\n const source = parent?.links[command.id]\n if (!source) {\n state.output.push(\n unavailableReference(`${command.ref_id} link ${command.id}`),\n )\n continue\n }\n const cached = findSnapshotByUrl(state.session, source.result.url)\n if (cached) {\n state.output.push(renderSnapshot(cached))\n includeResult(state, source)\n continue\n }\n queuePage(state, \"open\", source)\n }\n}\n\nfunction processFindCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n): void {\n for (const command of commands.find ?? []) {\n const directSnapshot = getSnapshot(state.session, command.ref_id)\n const source =\n directSnapshot?.source\n ?? resolveUrlReference(state.session, command.ref_id, state.turn)\n if (!source) {\n state.output.push(unavailableReference(command.ref_id))\n continue\n }\n const snapshot =\n directSnapshot ?? findSnapshotByUrl(state.session, source.result.url)\n const localResult =\n snapshot ? findInSnapshot(snapshot, command.pattern) : null\n if (localResult) {\n state.output.push(localResult)\n includeResult(state, source)\n continue\n }\n queuePage(state, \"find\", source, { pattern: command.pattern })\n }\n}\n\nfunction processStructuredCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n now: number,\n): void {\n for (const command of commands.finance ?? []) {\n state.remoteOperations.push({ ...command, operation: \"finance\" })\n }\n for (const command of commands.weather ?? []) {\n state.remoteOperations.push({ ...command, operation: \"weather\" })\n }\n for (const command of commands.sports ?? []) {\n state.remoteOperations.push({ ...command, operation: \"sports\" })\n }\n for (const command of commands.time ?? []) {\n state.output.push(formatTime(command.utc_offset, now))\n }\n}\n\nfunction processUnsupportedCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n): void {\n for (const commandName of Object.keys(commands)) {\n if (!KNOWN_COMMANDS.has(commandName)) {\n state.warnings.push(\n `Unsupported by GitHub Copilot web search: ${commandName}. Do not retry this operation.`,\n )\n }\n }\n}\n\nfunction processCommandOperations(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n now: number,\n): void {\n processSearchCommands(commands, state)\n if ((commands.image_query?.length ?? 0) > 0) {\n state.warnings.push(IMAGE_UNSUPPORTED)\n }\n processOpenCommands(commands, state)\n processClickCommands(commands, state)\n processFindCommands(commands, state)\n if ((commands.screenshot?.length ?? 0) > 0) {\n state.warnings.push(SCREENSHOT_UNSUPPORTED)\n }\n processStructuredCommands(commands, state, now)\n processUnsupportedCommands(commands, state)\n}\n\nfunction supportsLiveAccess(request: AlphaSearchRequest): boolean {\n const externalWebAccess = request.settings?.external_web_access\n return (\n externalWebAccess === undefined\n || externalWebAccess === true\n || externalWebAccess === \"live\"\n )\n}\n\nfunction addLiveAccessWarning(\n request: AlphaSearchRequest,\n state: SearchOperationState,\n): void {\n if (state.remoteOperations.length === 0 || supportsLiveAccess(request)) return\n state.warnings.push(\n `GitHub Copilot alpha search supports live retrieval only; external_web_access=${JSON.stringify(request.settings?.external_web_access)} is unsupported. Do not retry this request in this mode.`,\n )\n}\n\nfunction shouldExecuteRemoteOperations(\n request: AlphaSearchRequest,\n state: SearchOperationState,\n): boolean {\n return state.remoteOperations.length > 0 && supportsLiveAccess(request)\n}\n\nasync function resolveRemoteModel(\n c: Context,\n request: AlphaSearchRequest,\n provider?: string,\n): Promise<RemoteModelTarget | Response> {\n const model =\n provider ?\n request.model\n : alphaSearchResponsesDependencies.resolveMappedModel(request.model)\n if (provider) {\n const providerConfig =\n await alphaSearchResponsesDependencies.resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (\n alphaSearchResponsesDependencies.resolveEffectiveProviderType(\n providerConfig,\n model,\n ) !== \"openai-responses\"\n ) {\n return invalidRequest(\n c,\n `Provider '${provider}' does not support the /v1/responses endpoint required for alpha search`,\n )\n }\n\n return {\n model,\n providerConfig: resolveProviderConfigForModel(providerConfig, model),\n }\n }\n\n const selectedModel =\n alphaSearchResponsesDependencies.findEndpointModel(model)\n if (!selectedModel?.supported_endpoints?.includes(\"/responses\")) {\n return invalidRequest(\n c,\n `Model '${model}' does not support the Copilot Responses endpoint required for alpha search`,\n )\n }\n return { model }\n}\n\nfunction createRemoteResponsesPayload(\n request: AlphaSearchRequest,\n model: string,\n instruction: string,\n): ResponsesPayload {\n return {\n model,\n input: instruction,\n tools: [\n buildResponsesWebSearchTool({\n allowedDomains: request.settings?.filters?.allowed_domains,\n blockedDomains: request.settings?.filters?.blocked_domains,\n userLocation: request.settings?.user_location,\n searchContextSize: request.settings?.search_context_size,\n }),\n ],\n tool_choice: \"required\",\n store: false,\n stream: false,\n include: [\"web_search_call.action.sources\"],\n reasoning: request.reasoning as ResponsesPayload[\"reasoning\"],\n max_output_tokens: request.max_output_tokens,\n }\n}\n\nasync function requestProviderSearch(\n c: Context,\n providerConfig: ResolvedProviderConfig,\n payload: ResponsesPayload,\n model: string,\n sessionId: string,\n): Promise<ResponsesResult> {\n debugJson(logger, \"Alpha search provider Responses request:\", {\n payload,\n provider: providerConfig.name,\n })\n const upstreamResponse = await forwardProviderResponses(\n providerConfig,\n payload,\n c.req.raw.headers,\n { clientSignal: c.req.raw.signal },\n )\n if (!upstreamResponse.ok) {\n throw new HTTPError(\n `Failed to create ${providerConfig.name} responses for alpha search`,\n upstreamResponse,\n )\n }\n const result = (await upstreamResponse.json()) as ResponsesResult\n debugJson(logger, \"Alpha search provider Responses result:\", {\n provider: providerConfig.name,\n result,\n })\n createProviderTokenUsageRecorder({\n endpoint: \"responses\",\n fallbackSessionId: sessionId,\n model,\n pricing: providerConfig.models?.[model]?.pricing,\n pricingCurrency: providerConfig.pricingCurrency,\n providerName: providerConfig.name,\n sessionId,\n })(normalizeResponsesUsage(result.usage))\n return result\n}\n\nasync function requestCopilotSearch(\n payload: ResponsesPayload,\n model: string,\n requestId: string,\n sessionId: string,\n clientSignal?: AbortSignal,\n): Promise<ResponsesResult> {\n debugJson(logger, \"Alpha search Copilot Responses request:\", payload)\n const result = (await alphaSearchResponsesDependencies.createResponses(\n payload,\n {\n vision: false,\n initiator: \"agent\",\n transport: \"http\",\n requestId,\n sessionId,\n clientSignal,\n },\n )) as ResponsesResult\n debugJson(logger, \"Alpha search Copilot Responses result:\", result)\n\n alphaSearchResponsesDependencies.createUsageRecorder(\n model,\n sessionId,\n )({\n ...normalizeResponsesUsage(result.usage),\n total_nano_aiu: normalizeOptionalToken(\n result.copilot_usage?.total_nano_aiu,\n ),\n })\n return result\n}\n\nasync function requestRemoteSearch(\n c: Context,\n request: AlphaSearchRequest,\n state: SearchOperationState,\n target: RemoteModelTarget,\n): Promise<ResponsesResult> {\n const instruction = buildInstruction(\n state.remoteOperations,\n request.commands?.response_length,\n )\n const sessionId = getUUID(request.id)\n const requestId = generateRequestIdFromPayload(\n { messages: `${state.turn.number}:${instruction}` },\n sessionId,\n )\n const payload = createRemoteResponsesPayload(\n request,\n target.model,\n instruction,\n )\n\n if (target.providerConfig) {\n return await requestProviderSearch(\n c,\n target.providerConfig,\n payload,\n target.model,\n sessionId,\n )\n }\n\n return await requestCopilotSearch(\n payload,\n target.model,\n requestId,\n sessionId,\n c.req.raw.signal,\n )\n}\n\nfunction getActiveRemoteReferences(\n session: SearchSession,\n references: Array<UrlReference>,\n): Array<UrlReference> {\n return references.filter(\n (reference) =>\n session.referencesById.get(reference.result.ref_id) === reference,\n )\n}\n\nfunction buildSnapshotLinks(\n state: SearchOperationState,\n target: UrlReference,\n markdownReferences: Array<UrlReference>,\n remoteReferences: Array<UrlReference>,\n): Array<UrlReference> {\n return [\n ...new Map(\n [\n ...markdownReferences,\n ...getActiveRemoteReferences(state.session, remoteReferences),\n ]\n .filter(\n (reference) =>\n reference.result.url !== target.result.url\n && state.session.referencesById.get(reference.result.ref_id)\n === reference,\n )\n .map((reference) => [reference.result.url, reference] as const),\n ).values(),\n ]\n}\n\nfunction processRemotePages(\n state: SearchOperationState,\n answerText: string,\n markdownReferences: Array<UrlReference>,\n remoteReferences: Array<UrlReference>,\n): void {\n for (const [index, page] of state.remotePages.entries()) {\n const target =\n addUrlReference(\n state.session,\n {\n url: page.source.result.url,\n title: page.source.result.title,\n snippet: answerText,\n },\n state.turn,\n ) ?? page.source\n includeResult(state, target)\n const snapshotLinks = buildSnapshotLinks(\n state,\n target,\n markdownReferences,\n remoteReferences,\n )\n\n if (page.kind === \"find\") {\n state.output.push(\n `Find results for ${JSON.stringify(page.pattern ?? \"\")} in ${target.result.url}:\\n${answerText}`,\n )\n if (!findSnapshotByUrl(state.session, target.result.url)) {\n addSnapshot(\n state.session,\n target,\n state.turn.number,\n index,\n answerText,\n snapshotLinks,\n )\n }\n continue\n }\n\n const snapshot = addSnapshot(\n state.session,\n target,\n state.turn.number,\n index,\n answerText,\n snapshotLinks,\n )\n state.output.push(renderSnapshot(snapshot, page.lineno))\n }\n}\n\nfunction appendActiveSources(\n state: SearchOperationState,\n references: Array<UrlReference>,\n): void {\n if (references.length === 0) return\n state.output.push(\n [\n \"Sources:\",\n ...references.map(\n (reference) =>\n `- [${reference.result.ref_id}] ${reference.result.title} — ${reference.result.url}`,\n ),\n ].join(\"\\n\"),\n )\n}\n\nfunction processRemoteResult(\n result: ResponsesResult,\n state: SearchOperationState,\n): void {\n const extracted = extractWebSearchResult(result)\n const citedSources = extracted.sources.filter(\n (source) => source.snippet !== undefined,\n )\n const relevantSources =\n citedSources.length > 0 ? citedSources : extracted.sources\n consola.log(\n `--> web search: operations=${[\n ...new Set(\n state.remoteOperations.map(\n (remoteOperation) => remoteOperation.operation,\n ),\n ),\n ].join(\n \",\",\n )} queries=${JSON.stringify(extracted.queries)} sources=${relevantSources.length}`,\n )\n\n const remoteReferences = relevantSources\n .map((source) => addUrlReference(state.session, source, state.turn))\n .filter((reference): reference is UrlReference => Boolean(reference))\n for (const reference of getActiveRemoteReferences(\n state.session,\n remoteReferences,\n )) {\n includeResult(state, reference)\n }\n\n const answerText =\n extracted.answerText || \"GitHub Copilot web search returned no text.\"\n const markdownReferences =\n state.remotePages.length === 0 ?\n []\n : extractMarkdownSources(answerText)\n .map((source) => addUrlReference(state.session, source, state.turn))\n .filter((reference): reference is UrlReference => Boolean(reference))\n for (const reference of markdownReferences) includeResult(state, reference)\n if (state.remotePages.length === 0) state.output.push(answerText)\n\n processRemotePages(state, answerText, markdownReferences, remoteReferences)\n appendActiveSources(\n state,\n getActiveRemoteReferences(state.session, remoteReferences),\n )\n}\n\nasync function executeRemoteOperations(\n c: Context,\n request: AlphaSearchRequest,\n state: SearchOperationState,\n provider?: string,\n): Promise<Response | null> {\n const target = await resolveRemoteModel(c, request, provider)\n if (target instanceof Response) return target\n const result = await requestRemoteSearch(c, request, state, target)\n processRemoteResult(result, state)\n return null\n}\n\nfunction buildAlphaSearchResponse(\n state: SearchOperationState,\n): AlphaSearchResponse {\n state.output.push(...state.warnings)\n if (state.output.length === 0) {\n state.output.push(\"No supported search operations were requested.\")\n }\n\n return {\n encrypted_output: null,\n output: state.output.join(\"\\n\\n\"),\n results: [...state.resultReferences.values()]\n .filter(\n (reference) =>\n state.session.referencesById.get(reference.result.ref_id)\n === reference,\n )\n .map(({ result }) => result),\n }\n}\n\nexport async function handleAlphaSearchResponses(\n c: Context,\n options: AlphaSearchResponsesOptions,\n): Promise<Response> {\n const parsed = alphaSearchRequestSchema.safeParse(options.request)\n if (!parsed.success) {\n const issue = parsed.error.issues[0]\n const path = issue?.path.join(\".\") || \"body\"\n return invalidRequest(\n c,\n `Invalid alpha search request at ${path}: ${issue?.message ?? \"invalid value\"}`,\n )\n }\n const request = parsed.data\n const now = alphaSearchResponsesDependencies.now()\n const reservation = reserveSession(request.id, now)\n const session = reservation.session\n const turn: SearchTurn = {\n number: reservation.turn,\n nextReferenceIndex: 0,\n }\n const state = createSearchOperationState(session, turn)\n const commands = request.commands ?? {}\n processCommandOperations(commands, state, now)\n\n addLiveAccessWarning(request, state)\n\n if (shouldExecuteRemoteOperations(request, state)) {\n const remoteResponse = await executeRemoteOperations(\n c,\n request,\n state,\n options.provider,\n )\n if (remoteResponse) return remoteResponse\n }\n\n return c.json(buildAlphaSearchResponse(state))\n}\n","import {\n buildCodexRequestHeaders,\n CODEX_API_BASE_URL,\n} from \"~/services/codex/create-responses\"\n\nconst CODEX_ALPHA_SEARCH_URL = `${CODEX_API_BASE_URL}/codex/alpha/search`\n\nexport function resolveCodexAlphaSearchUrl(requestUrl: string): string {\n const upstreamUrl = new URL(CODEX_ALPHA_SEARCH_URL)\n upstreamUrl.search = new URL(requestUrl, \"http://localhost\").search\n return upstreamUrl.toString()\n}\n\nexport async function forwardCodexAlphaSearch(\n request: Request,\n): Promise<Response> {\n const headers = buildCodexRequestHeaders(request.headers)\n if (!headers.has(\"accept\")) {\n headers.set(\"accept\", \"application/json\")\n }\n\n const body = await request.arrayBuffer()\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\")\n }\n\n return await fetch(resolveCodexAlphaSearchUrl(request.url), {\n method: \"POST\",\n headers,\n body,\n })\n}\n","import { Hono, type Context } from \"hono\"\nimport consola from \"consola\"\n\nimport {\n getAlphaSearchModel,\n isAlphaSearchCodexPriorityEnabled,\n resolveEffectiveProviderType,\n resolveMappedModel,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport { forwardError } from \"~/lib/error\"\nimport { setPluginRequestModel } from \"~/lib/request-events\"\nimport { setPluginRequestActualModel } from \"~/lib/request-context\"\nimport { createHandlerLogger, debugJsonAsync } from \"~/lib/logger\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { parseProviderModelAlias } from \"~/lib/provider-model\"\nimport {\n ensureConfiguredProviderModelAlias,\n resolveProviderConfig,\n} from \"~/lib/provider-resolver\"\nimport type {\n AlphaSearchRequest,\n AlphaSearchResponse,\n} from \"~/routes/alpha-search/alpha-search-types\"\nimport { handleAlphaSearchResponses } from \"~/routes/alpha-search/alpha-search-responses\"\nimport { forwardCodexAlphaSearch } from \"~/services/codex/alpha-search\"\nimport { createProviderProxyResponse } from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"alpha-search-handler\")\n\nexport const alphaSearchRoutes = new Hono()\n\nexport const alphaSearchRouteDependencies = {\n findEndpointModel,\n forwardCodexAlphaSearch,\n getAlphaSearchModel,\n handleAlphaSearchResponses,\n isAlphaSearchCodexPriorityEnabled,\n resolveEffectiveProviderType,\n resolveMappedModel,\n resolveProviderConfig,\n}\n\nfunction parseDebugBody<T>(body: string): T | string {\n try {\n return JSON.parse(body) as T\n } catch {\n return body\n }\n}\n\nasync function forwardCodexAlphaSearchRequest(\n request: Request,\n model?: string,\n): Promise<Response> {\n await debugJsonAsync(logger, \"alpha_search.codex.request\", async () => ({\n body: parseDebugBody<AlphaSearchRequest>(await request.clone().text()),\n }))\n\n if (model) setPluginRequestActualModel(model)\n const upstreamResponse =\n await alphaSearchRouteDependencies.forwardCodexAlphaSearch(request)\n await debugJsonAsync(logger, \"alpha_search.codex.response\", async () => ({\n body: parseDebugBody<AlphaSearchResponse>(\n await upstreamResponse.clone().text(),\n ),\n statusCode: upstreamResponse.status,\n }))\n return createProviderProxyResponse(upstreamResponse)\n}\n\nfunction createAlphaSearchRequest(\n request: Request,\n payload: AlphaSearchRequest,\n): Request {\n // Rebuild from primitives instead of cloning: under Node runtimes srvx\n // wraps incoming requests in a proxy class whose prototype chain satisfies\n // `instanceof Request` without the native internals, so `new Request(req)`\n // throws \"Cannot read properties of undefined (reading 'window')\".\n return new Request(request.url, {\n body: JSON.stringify(payload),\n headers: request.headers,\n method: request.method,\n signal: request.signal,\n })\n}\n\nasync function handleCodexRequest(\n c: Context,\n request: Request,\n resolvedProviderConfig?: ResolvedProviderConfig,\n model?: string,\n): Promise<Response> {\n const codexProviderConfig =\n resolvedProviderConfig\n ?? (await alphaSearchRouteDependencies.resolveProviderConfig(\"codex\"))\n if (!codexProviderConfig) {\n return c.json(\n {\n error: {\n message: \"Provider 'codex' not found or disabled\",\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n return await forwardCodexAlphaSearchRequest(request, model)\n}\n\nfunction invalidRequest(c: Context, message: string): Response {\n return c.json(\n {\n error: {\n message,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n}\n\nasync function parseAlphaSearchBody(\n c: Context,\n): Promise<AlphaSearchRequest | Response> {\n let body: unknown\n try {\n body = await c.req.raw.clone().json()\n } catch {\n return invalidRequest(c, \"Invalid alpha search request: expected JSON body\")\n }\n\n const model = (body as AlphaSearchRequest | null)?.model\n if (typeof model !== \"string\") {\n return invalidRequest(\n c,\n \"Invalid alpha search request: model must be a string\",\n )\n }\n setPluginRequestModel(model)\n return body as AlphaSearchRequest\n}\n\n/**\n * Handles top-level alpha-search dispatch. Pass `resolvedProviderConfig` when\n * the provider-scoped route has already resolved Codex. Codex is preferred\n * for every top-level request while alphaSearchCodexPriority stays enabled.\n */\nexport async function handleAlphaSearchRequest(\n c: Context,\n resolvedProviderConfig?: ResolvedProviderConfig,\n): Promise<Response> {\n if (resolvedProviderConfig) {\n return await handleCodexRequest(c, c.req.raw, resolvedProviderConfig)\n }\n\n const payload = await parseAlphaSearchBody(c)\n if (payload instanceof Response) return payload\n\n const requestedModel = payload.model\n\n payload.model =\n alphaSearchRouteDependencies.resolveMappedModel(requestedModel)\n if (payload.model !== requestedModel) {\n consola.debug(\n `Resolved model mapping: ${requestedModel} -> ${payload.model}`,\n )\n }\n\n const resolvedRequestedModel = payload.model\n let providerModelAlias = parseProviderModelAlias(payload.model)\n if (providerModelAlias) {\n payload.model = providerModelAlias.model\n if (providerModelAlias.provider === \"codex\") {\n return await handleCodexRequest(\n c,\n createAlphaSearchRequest(c.req.raw, payload),\n undefined,\n payload.model,\n )\n }\n }\n\n if (alphaSearchRouteDependencies.isAlphaSearchCodexPriorityEnabled()) {\n const codexProviderConfig =\n await alphaSearchRouteDependencies.resolveProviderConfig(\"codex\")\n if (codexProviderConfig) {\n if (!payload.model.startsWith(\"gpt\")) {\n payload.model = \"gpt-5.6-luna\"\n }\n return await forwardCodexAlphaSearchRequest(\n createAlphaSearchRequest(c.req.raw, payload),\n payload.model,\n )\n }\n }\n\n const messagesBackedModel = await isMessagesBackedModel(\n resolvedRequestedModel,\n )\n if (messagesBackedModel) {\n const searchModel = alphaSearchRouteDependencies.getAlphaSearchModel()\n if (!searchModel) {\n return invalidRequest(\n c,\n \"alphaSearchModel is disabled; Messages-backed Codex models require a native Responses search model\",\n )\n }\n const resolvedSearchModel =\n alphaSearchRouteDependencies.resolveMappedModel(searchModel)\n if (!(await isNativeResponsesModel(resolvedSearchModel))) {\n return invalidRequest(\n c,\n `Configured alphaSearchModel '${searchModel}' does not support the Responses endpoint required for alpha search`,\n )\n }\n consola.debug(\n `Redirected alpha search model: ${resolvedRequestedModel} -> ${resolvedSearchModel}`,\n )\n payload.model = resolvedSearchModel\n providerModelAlias = parseProviderModelAlias(payload.model)\n if (providerModelAlias) {\n payload.model = providerModelAlias.model\n if (providerModelAlias.provider === \"codex\") {\n return await handleCodexRequest(\n c,\n createAlphaSearchRequest(c.req.raw, payload),\n undefined,\n payload.model,\n )\n }\n }\n }\n const fallbackRequestedModel =\n messagesBackedModel ? payload.model : requestedModel\n\n if (providerModelAlias) {\n const configuredProviderModelAlias =\n await ensureConfiguredProviderModelAlias(\n providerModelAlias,\n alphaSearchRouteDependencies.resolveProviderConfig,\n )\n if (configuredProviderModelAlias) {\n return await alphaSearchRouteDependencies.handleAlphaSearchResponses(c, {\n provider: providerModelAlias.provider,\n request: payload,\n })\n }\n }\n\n return await alphaSearchRouteDependencies.handleAlphaSearchResponses(c, {\n request: {\n ...payload,\n model: fallbackRequestedModel,\n },\n })\n}\n\nasync function isMessagesBackedModel(model: string): Promise<boolean> {\n const providerAlias = parseProviderModelAlias(model)\n if (providerAlias) {\n const providerConfig =\n await alphaSearchRouteDependencies.resolveProviderConfig(\n providerAlias.provider,\n )\n if (!providerConfig) return false\n const effectiveType =\n alphaSearchRouteDependencies.resolveEffectiveProviderType(\n providerConfig,\n providerAlias.model,\n )\n return (\n effectiveType === \"anthropic\" || effectiveType === \"openai-compatible\"\n )\n }\n\n const endpoints =\n alphaSearchRouteDependencies.findEndpointModel(model)?.supported_endpoints\n ?? []\n return (\n (endpoints.includes(\"/v1/messages\")\n || endpoints.includes(\"/chat/completions\"))\n && !endpoints.includes(\"/responses\")\n && !endpoints.includes(\"ws:/responses\")\n )\n}\n\nasync function isNativeResponsesModel(model: string): Promise<boolean> {\n const providerAlias = parseProviderModelAlias(model)\n if (providerAlias) {\n const providerConfig =\n await alphaSearchRouteDependencies.resolveProviderConfig(\n providerAlias.provider,\n )\n return (\n providerConfig !== null\n && alphaSearchRouteDependencies.resolveEffectiveProviderType(\n providerConfig,\n providerAlias.model,\n ) === \"openai-responses\"\n )\n }\n\n const endpoints =\n alphaSearchRouteDependencies.findEndpointModel(model)?.supported_endpoints\n ?? []\n return endpoints.includes(\"/responses\") || endpoints.includes(\"ws:/responses\")\n}\n\nalphaSearchRoutes.post(\"/\", async (c) => {\n try {\n return await handleAlphaSearchRequest(c)\n } catch (error) {\n logger.error(\"alpha_search.error\", { error })\n return await forwardError(c, error)\n }\n})\n","import { requestContext } from \"~/lib/request-context\"\nimport type { AnthropicStreamEventData } from \"~/lib/types/anthropic\"\nimport type { ChatCompletionChunk } from \"~/lib/types/chat-completions\"\nimport type { GoogleGenerateContentResponse } from \"~/lib/types/google\"\nimport type { ResponseStreamEvent } from \"~/lib/types/responses\"\n\nconst nonempty = (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0\n\n// Observe events already parsed by stream handlers. Never read or parse a stream\n// here, and never expose its content to plugins. Explicit thinking starts count\n// even before text is exposed. Whitespace is also valid output.\nexport function recordChatCompletionFirstToken(\n chunk: ChatCompletionChunk | null,\n): void {\n const observer =\n requestContext.getStore()?.requestTiming\n ?? requestContext.getStore()?.pluginRequest\n if (!observer || !chunk) return\n if (\n chunk.choices?.some(\n ({ delta }) =>\n delta\n && (nonempty(delta.content)\n || nonempty(delta.reasoning_text)\n || nonempty(delta.reasoning_content)\n || nonempty(delta.reasoning)\n || delta.tool_calls?.some((tool) =>\n nonempty(tool.function?.arguments),\n )),\n )\n ) {\n observer.recordFirstToken()\n }\n}\n\nexport function recordResponsesFirstToken(\n event: ResponseStreamEvent | null,\n): void {\n const observer =\n requestContext.getStore()?.requestTiming\n ?? requestContext.getStore()?.pluginRequest\n if (!observer || !event) return\n switch (event.type) {\n case \"response.output_item.added\":\n if (event.item?.type === \"reasoning\") observer.recordFirstToken()\n break\n case \"response.reasoning_summary_part.added\":\n observer.recordFirstToken()\n break\n case \"response.output_text.delta\":\n case \"response.reasoning_summary_text.delta\":\n case \"response.function_call_arguments.delta\":\n case \"response.custom_tool_call_input.delta\":\n if (nonempty(event.delta)) observer.recordFirstToken()\n }\n}\n\nexport function recordAnthropicFirstToken(\n event: AnthropicStreamEventData | null,\n): void {\n const observer =\n requestContext.getStore()?.requestTiming\n ?? requestContext.getStore()?.pluginRequest\n if (!observer || !event) return\n if (event.type === \"content_block_delta\") {\n const { delta } = event\n if (\n (delta.type === \"text_delta\" && nonempty(delta.text))\n || (delta.type === \"thinking_delta\" && nonempty(delta.thinking))\n || (delta.type === \"input_json_delta\" && nonempty(delta.partial_json))\n ) {\n observer.recordFirstToken()\n }\n } else if (event.type === \"content_block_start\") {\n const block = event.content_block\n if (\n (block.type === \"text\" && nonempty(block.text))\n || block.type === \"thinking\"\n || ((block.type === \"tool_use\" || block.type === \"server_tool_use\")\n && block.input\n && Object.keys(block.input).length > 0)\n ) {\n observer.recordFirstToken()\n }\n }\n}\n\nexport function recordGoogleFirstToken(\n response: GoogleGenerateContentResponse,\n): void {\n const observer =\n requestContext.getStore()?.requestTiming\n ?? requestContext.getStore()?.pluginRequest\n if (!observer) return\n if (\n response.candidates?.some((candidate) =>\n candidate.content?.parts.some(\n (part) =>\n part.thought === true\n || nonempty(part.text)\n || nonempty(part.functionCall?.name),\n ),\n )\n ) {\n // Google's functionCall part carries a complete generated call, rather than\n // an empty tool-start envelope followed by argument deltas.\n observer.recordFirstToken()\n }\n}\n","import type { SSEMessage, SSEStreamingApi } from \"hono/streaming\"\n\nexport async function writeSSEIfConnected(\n stream: SSEStreamingApi,\n message: SSEMessage,\n): Promise<boolean> {\n if (stream.aborted) return false\n\n try {\n await stream.writeSSE(message)\n return true\n } catch (error) {\n if (stream.aborted) return false\n throw error\n }\n}\n","import type { ResolvedProviderConfig } from \"~/lib/config\"\nimport type { ContentPart, Message } from \"~/lib/types/chat-completions\"\n\nconst OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT = 4\nconst OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL = {\n type: \"ephemeral\",\n} as const\nconst OPENAI_COMPATIBLE_CONTEXT_CACHE_ROLES = new Set<Message[\"role\"]>([\n \"system\",\n \"user\",\n \"assistant\",\n \"tool\",\n])\n\nexport const isDashScopeAliyunProvider = (\n providerConfig: ResolvedProviderConfig,\n): boolean =>\n providerConfig.name === \"dashscope\"\n || providerConfig.baseUrl.includes(\"aliyuncs.com\")\n\nexport const applyDashScopePreserveThinkingDefault = (\n payload: Record<string, unknown>,\n providerConfig: ResolvedProviderConfig,\n): void => {\n if (!isDashScopeAliyunProvider(providerConfig)) {\n return\n }\n\n if (!Object.hasOwn(payload, \"preserve_thinking\")) {\n payload.preserve_thinking = true\n }\n}\n\nexport const applyOpenAICompatibleContextCache = (payload: {\n messages: Array<Message>\n model: string\n}): void => {\n if (payload.model.includes(\"/\")) {\n return\n }\n if (!payload.model.toLowerCase().includes(\"qwen\")) {\n return\n }\n const messageIndexes = selectContextCacheMessageIndexes(payload.messages)\n for (const messageIndex of messageIndexes) {\n applyContextCacheControl(payload.messages[messageIndex])\n }\n}\n\nconst selectContextCacheMessageIndexes = (\n messages: Array<Message>,\n): Array<number> => {\n const cacheableIndexes = messages.flatMap((message, index) =>\n isContextCacheMarkerEligible(message) ? [index] : [],\n )\n const systemIndexes = cacheableIndexes\n .filter((index) => messages[index]?.role === \"system\")\n .slice(0, 2)\n const finalIndexes = cacheableIndexes\n .filter((index) => messages[index]?.role !== \"system\")\n .slice(-1)\n return uniqueIndexes([...systemIndexes, ...finalIndexes]).sort(\n (a, b) => a - b,\n )\n}\n\nconst uniqueIndexes = (indexes: Array<number>): Array<number> =>\n [...new Set(indexes)].slice(0, OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT)\n\nconst isContextCacheMarkerEligible = (message: Message): boolean => {\n if (!OPENAI_COMPATIBLE_CONTEXT_CACHE_ROLES.has(message.role)) {\n return false\n }\n\n if (typeof message.content === \"string\") {\n return message.content.length > 0\n }\n\n return Array.isArray(message.content) && message.content.length > 0\n}\n\nconst applyContextCacheControl = (message: Message | undefined): void => {\n if (!message) {\n return\n }\n\n if (typeof message.content === \"string\") {\n message.content = [\n {\n type: \"text\",\n text: message.content,\n cache_control: { ...OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL },\n },\n ]\n return\n }\n\n if (!Array.isArray(message.content)) {\n return\n }\n\n const lastPart = message.content.at(-1)\n if (!lastPart) {\n return\n }\n setContextCacheControl(lastPart)\n}\n\nconst setContextCacheControl = (part: ContentPart): void => {\n part.cache_control = { ...OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL }\n}\n","import type { Reasoning } from \"~/lib/types/responses\"\n\nexport type ResponsesReasoningEffort = Exclude<\n Reasoning[\"effort\"],\n null | undefined\n>\n\n// Ascending reasoning intensity understood by upstream APIs.\nconst REASONING_EFFORT_LEVELS: Array<ResponsesReasoningEffort> = [\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n]\n\nconst KNOWN_REASONING_EFFORTS: ReadonlySet<string> = new Set(\n REASONING_EFFORT_LEVELS,\n)\n\n// Client-facing levels that upstream APIs do not understand. Codex's \"ultra\"\n// tier is an execution mode that combines max reasoning with multi-agent\n// orchestration. The orchestration is client-side, so Codex sends \"max\" on the\n// wire and never forwards \"ultra\" upstream. \"minimal\" pins to \"low\" only when\n// the upstream capabilities show that \"minimal\" is unsupported.\nconst REASONING_EFFORT_ALIASES: Record<string, ResponsesReasoningEffort> = {\n minimal: \"low\",\n ultra: \"max\",\n}\n\nconst reasoningEffortRank = (effort: ResponsesReasoningEffort): number =>\n REASONING_EFFORT_LEVELS.indexOf(effort)\n\n/**\n * Resolves the reasoning effort to send upstream for a requested effort.\n *\n * Policy:\n * - A supported effort passes through unchanged.\n * - Client-only levels are aliased first (\"ultra\" -> \"max\").\n * - An unsupported request clamps to the highest supported level not above\n * the request, e.g. \"max\" against [\"low\", \"medium\", \"high\", \"xhigh\"]\n * resolves to \"xhigh\".\n * - A request below every supported level resolves to the lowest supported\n * level, e.g. \"none\" against [\"low\", \"medium\", \"high\"] resolves to \"low\".\n * - Without any known supported levels, valid wire efforts pass through and\n * client-facing aliases are converted (for example, \"ultra\" -> \"max\").\n * - An unrecognized request is left unresolved so the upstream can validate\n * it instead of receiving a silently substituted effort.\n */\nexport const resolveSupportedReasoningEffort = (\n requestedEffort: string,\n supportedEfforts: Array<string> | undefined,\n): ResponsesReasoningEffort | undefined => {\n const supported = (supportedEfforts ?? []).filter(\n (effort): effort is ResponsesReasoningEffort =>\n KNOWN_REASONING_EFFORTS.has(effort),\n )\n const requestedWireEffort =\n KNOWN_REASONING_EFFORTS.has(requestedEffort) ?\n (requestedEffort as ResponsesReasoningEffort)\n : undefined\n if (supported.length === 0) {\n return requestedWireEffort ?? REASONING_EFFORT_ALIASES[requestedEffort]\n }\n if (requestedWireEffort && supported.includes(requestedWireEffort)) {\n return requestedWireEffort\n }\n\n const aliasedEffort =\n REASONING_EFFORT_ALIASES[requestedEffort] ?? requestedWireEffort\n if (!aliasedEffort) {\n return undefined\n }\n if (supported.includes(aliasedEffort)) {\n return aliasedEffort\n }\n\n const requestedRank = reasoningEffortRank(aliasedEffort)\n let nearestBelow: ResponsesReasoningEffort | undefined\n for (const effort of supported) {\n if (\n reasoningEffortRank(effort) <= requestedRank\n && (nearestBelow === undefined\n || reasoningEffortRank(effort) > reasoningEffortRank(nearestBelow))\n ) {\n nearestBelow = effort\n }\n }\n if (nearestBelow) {\n return nearestBelow\n }\n\n return supported.reduce((lowest, effort) =>\n reasoningEffortRank(effort) < reasoningEffortRank(lowest) ? effort : lowest,\n )\n}\n","import type { Context } from \"hono\"\n\nimport { getProviderModelConfig } from \"~/lib/provider-model-catalog\"\nimport type { ModelConfig, ResolvedProviderConfig } from \"~/lib/config\"\nimport {\n resolveSupportedReasoningEffort,\n type ResponsesReasoningEffort,\n} from \"~/lib/reasoning-effort\"\nimport type { ResponsesPayload } from \"~/lib/types/responses\"\nimport { createProviderProxyResponseHeaders } from \"~/services/providers/provider-proxy\"\n\nexport const forwardProviderResponseHeaders = (\n c: Context,\n upstreamHeaders: Headers,\n): void => {\n const headers = createProviderProxyResponseHeaders(upstreamHeaders)\n headers.delete(\"set-cookie\")\n headers.delete(\"x-models-etag\")\n\n for (const [headerName, headerValue] of headers) {\n c.header(headerName, headerValue)\n }\n}\n\ninterface SamplingPayload {\n temperature?: number | null\n top_p?: number | null\n top_k?: number | null\n}\n\nexport const applyModelDefaults = (\n payload: SamplingPayload,\n modelConfig: ModelConfig | undefined,\n): void => {\n payload.temperature ??= modelConfig?.temperature\n payload.top_p ??= modelConfig?.topP\n payload.top_k ??= modelConfig?.topK\n}\n\nexport const applyMissingExtraBody = (\n payload: Record<string, unknown>,\n options: { extraBody: Record<string, unknown> | undefined },\n): void => {\n for (const [key, value] of Object.entries(options.extraBody ?? {})) {\n if (!Object.hasOwn(payload, key)) {\n payload[key] = value\n }\n }\n}\n\nexport const normalizeProviderResponsesReasoningEffort = (\n payload: ResponsesPayload,\n providerConfig: ResolvedProviderConfig,\n): { from: string; to: ResponsesReasoningEffort } | undefined => {\n if (!payload.reasoning || typeof payload.reasoning.effort !== \"string\") {\n return undefined\n }\n\n const modelConfig = providerConfig.models?.[payload.model]\n const builtinModelConfig = getProviderModelConfig(\n providerConfig.name,\n payload.model,\n providerConfig,\n )\n const configuredEfforts = modelConfig?.reasoningEfforts\n const supportedEfforts =\n configuredEfforts && configuredEfforts.length > 0 ?\n configuredEfforts\n : builtinModelConfig?.reasoningEfforts\n\n const resolvedEffort = resolveSupportedReasoningEffort(\n payload.reasoning.effort,\n supportedEfforts,\n )\n if (!resolvedEffort || resolvedEffort === payload.reasoning.effort) {\n return undefined\n }\n\n const requestedEffort = payload.reasoning.effort\n payload.reasoning.effort = resolvedEffort\n return { from: requestedEffort, to: resolvedEffort }\n}\n","import { events } from \"fetch-event-stream\"\nimport type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\n\nimport {\n type ModelConfig,\n type ResolvedProviderConfig,\n resolveProviderConfigForModel,\n} from \"~/lib/config\"\nimport {\n applyDashScopePreserveThinkingDefault,\n applyOpenAICompatibleContextCache,\n isDashScopeAliyunProvider,\n} from \"~/lib/dashscope\"\nimport { HTTPError } from \"~/lib/error\"\nimport { recordChatCompletionFirstToken } from \"~/lib/first-token\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { writeSSEIfConnected } from \"~/lib/sse\"\nimport {\n createProviderTokenUsageRecorder,\n normalizeOpenAIUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n} from \"~/lib/types/chat-completions\"\nimport {\n createProviderProxyResponse,\n forwardProviderChatCompletions,\n} from \"~/services/providers/provider-proxy\"\nimport {\n applyMissingExtraBody,\n applyModelDefaults,\n} from \"~/routes/provider/utils\"\n\nconst logger = createHandlerLogger(\"provider-chat-completions-handler\")\n\nexport async function handleProviderChatCompletionsForProvider(\n c: Context,\n options: {\n payload: ChatCompletionsPayload\n provider: string\n },\n): Promise<Response> {\n const { payload, provider } = options\n const configuredProvider = await resolveProviderConfig(provider)\n const providerConfig =\n configuredProvider\n && resolveProviderConfigForModel(configuredProvider, payload.model)\n if (!providerConfig || providerConfig.type !== \"openai-compatible\") {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' does not support the /v1/chat/completions endpoint`,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n const modelConfig = providerConfig.models?.[payload.model]\n applyModelDefaults(payload, modelConfig)\n applyMissingExtraBody(payload, {\n extraBody: modelConfig?.extraBody,\n })\n applyProviderStreamOptions(payload)\n applyDashScopePreserveThinkingDefault(\n payload as unknown as Record<string, unknown>,\n providerConfig,\n )\n applyProviderContextCache(payload, modelConfig, providerConfig)\n\n debugJson(logger, \"provider.chat_completions.request\", {\n payload,\n provider,\n })\n\n const upstreamResponse = await forwardProviderChatCompletions(\n providerConfig,\n payload,\n c.req.raw.headers,\n { clientSignal: c.req.raw.signal },\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\"Failed to create provider chat completions\", {\n provider,\n statusCode: upstreamResponse.status,\n })\n throw new HTTPError(\n `Failed to create ${provider} chat completions`,\n upstreamResponse,\n )\n }\n\n const recordUsage = createProviderChatCompletionsUsageRecorder(\n payload,\n provider,\n modelConfig,\n providerConfig.pricingCurrency,\n )\n const contentType = upstreamResponse.headers.get(\"content-type\") ?? \"\"\n const isStreamingResponse =\n Boolean(payload.stream) && contentType.includes(\"text/event-stream\")\n\n if (isStreamingResponse) {\n return streamProviderChatCompletions(c, upstreamResponse, {\n provider,\n recordUsage,\n })\n }\n\n const responseBody = (await upstreamResponse\n .clone()\n .json()) as ChatCompletionResponse\n recordUsage(normalizeOpenAIUsage(responseBody.usage))\n\n debugJson(logger, \"provider.chat_completions.response\", responseBody)\n return createProviderProxyResponse(upstreamResponse)\n}\n\nconst applyProviderStreamOptions = (payload: ChatCompletionsPayload): void => {\n if (!payload.stream) {\n return\n }\n\n payload.stream_options = {\n ...(payload.stream_options ?? {}),\n include_usage: true,\n }\n}\n\nconst applyProviderContextCache = (\n payload: ChatCompletionsPayload,\n modelConfig: ModelConfig | undefined,\n providerConfig: ResolvedProviderConfig,\n): void => {\n const isDashScopeProvider = isDashScopeAliyunProvider(providerConfig)\n const contextCacheEnabled = modelConfig?.contextCache ?? isDashScopeProvider\n if (contextCacheEnabled) {\n applyOpenAICompatibleContextCache(payload)\n }\n}\n\nconst createProviderChatCompletionsUsageRecorder = (\n payload: ChatCompletionsPayload,\n provider: string,\n modelConfig: ModelConfig | undefined,\n pricingCurrency: string | undefined,\n) =>\n createProviderTokenUsageRecorder({\n endpoint: \"chat_completions\",\n model: payload.model,\n pricing: modelConfig?.pricing,\n pricingCurrency,\n providerName: provider,\n })\n\nconst streamProviderChatCompletions = (\n c: Context,\n upstreamResponse: Response,\n options: {\n provider: string\n recordUsage: (usage: UsageTokens) => void\n },\n): Response => {\n logger.debug(\"provider.chat_completions.streaming\", {\n provider: options.provider,\n })\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n\n try {\n for await (const chunk of events(upstreamResponse)) {\n debugJson(logger, \"provider.chat_completions.stream_chunk\", chunk)\n if (chunk.data && chunk.data !== \"[DONE]\") {\n const parsedChunk = parseChatCompletionChunkData(chunk.data)\n recordChatCompletionFirstToken(parsedChunk)\n if (parsedChunk?.usage) {\n usage = normalizeOpenAIUsage(parsedChunk.usage)\n }\n }\n\n await writeSSEIfConnected(stream, {\n event: chunk.event,\n data: chunk.data ?? \"\",\n })\n }\n } finally {\n options.recordUsage(usage)\n }\n })\n}\n\nconst parseChatCompletionChunkData = (\n data: string,\n): ChatCompletionChunk | null => {\n try {\n return JSON.parse(data) as ChatCompletionChunk\n } catch {\n return null\n }\n}\n","import consola from \"consola\"\nimport { events } from \"fetch-event-stream\"\n\nimport type { CompactType } from \"~/lib/compact\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type {\n ChatCompletionResponse,\n ChatCompletionsPayload,\n} from \"~/lib/types/chat-completions\"\n\nimport {\n copilotBaseUrl,\n copilotHeaders,\n prepareForCompact,\n prepareInteractionHeaders,\n} from \"~/lib/api-config\"\nimport { getUpstreamTransportConfig } from \"~/lib/config\"\nimport { logCopilotRateLimits } from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { setPluginRequestActualModel } from \"~/lib/request-context\"\nimport { state } from \"~/lib/state\"\nimport { fetchUpstreamWithLifecycle } from \"~/services/upstream-http\"\n\nexport const createChatCompletions = async (\n payload: ChatCompletionsPayload,\n options: {\n clientSignal?: AbortSignal\n subagentMarker?: SubagentMarker | null\n requestId: string\n sessionId?: string\n compactType?: CompactType\n },\n) => {\n if (!state.copilotToken) throw new Error(\"Copilot token not found\")\n\n const enableVision = payload.messages.some(\n (x) =>\n typeof x.content !== \"string\"\n && x.content?.some((x) => x.type === \"image_url\"),\n )\n\n // Agent/user check for x-initiator header\n // Determine if any message is from an agent (\"assistant\" or \"tool\")\n // Refactor `isAgentCall` logic to check only the last message in the history rather than any message. This prevents valid user messages from being incorrectly flagged as agent calls due to previous assistant history, ensuring proper credit consumption for multi-turn conversations.\n let isAgentCall = false\n if (payload.messages.length > 0) {\n const lastMessage = payload.messages.at(-1)\n if (lastMessage) {\n isAgentCall = [\"assistant\", \"tool\"].includes(lastMessage.role)\n }\n }\n\n // Build headers and add x-initiator\n const headers: Record<string, string> = {\n ...copilotHeaders(state, options.requestId, enableVision),\n \"x-initiator\": isAgentCall ? \"agent\" : \"user\",\n }\n\n prepareInteractionHeaders(\n options.sessionId,\n Boolean(options.subagentMarker),\n headers,\n )\n\n prepareForCompact(headers, options.compactType)\n\n consola.log(`<-- model: ${payload.model}`)\n\n const transportConfig = getUpstreamTransportConfig()\n setPluginRequestActualModel(payload.model)\n const response = await fetchUpstreamWithLifecycle(\n `${copilotBaseUrl(state)}/chat/completions`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n },\n {\n clientSignal: options.clientSignal,\n headersTimeoutMs: transportConfig.headersTimeoutMs,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n },\n )\n\n logCopilotRateLimits(response.headers)\n\n if (!response.ok) {\n consola.error(\"Failed to create chat completions\", response)\n throw new HTTPError(\"Failed to create chat completions\", response)\n }\n\n if (payload.stream) {\n return events(response)\n }\n\n return (await response.json()) as ChatCompletionResponse\n}\n","import consola from \"consola\"\nimport type { Context } from \"hono\"\n\nimport { streamSSE, type SSEMessage } from \"hono/streaming\"\n\nimport { resolveMappedModel } from \"~/lib/config\"\nimport { recordChatCompletionFirstToken } from \"~/lib/first-token\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { writeSSEIfConnected } from \"~/lib/sse\"\nimport { setPluginRequestModel } from \"~/lib/request-events\"\nimport { resolveConfiguredProviderModelAlias } from \"~/lib/provider-resolver\"\nimport {\n createCopilotTokenUsageRecorder,\n normalizeOpenAIUsage,\n normalizeOptionalToken,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { generateRequestIdFromPayload, getUUID, isNullish } from \"~/lib/utils\"\nimport { handleProviderChatCompletionsForProvider } from \"~/routes/provider/chat-completions/handler\"\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n} from \"~/lib/types/chat-completions\"\nimport { createChatCompletions } from \"~/services/copilot/create-chat-completions\"\n\nconst logger = createHandlerLogger(\"chat-completions-handler\")\n\nexport async function handleCompletion(c: Context) {\n let payload = await c.req.json<ChatCompletionsPayload>()\n setPluginRequestModel(payload.model)\n const requestedModel = payload.model\n payload.model = resolveMappedModel(payload.model)\n if (payload.model !== requestedModel) {\n consola.debug(\n `Resolved model mapping: ${requestedModel} -> ${payload.model}`,\n )\n }\n\n const providerModelAlias = await resolveConfiguredProviderModelAlias(\n payload.model,\n )\n if (providerModelAlias) {\n payload.model = providerModelAlias.model\n return await handleProviderChatCompletionsForProvider(c, {\n payload,\n provider: providerModelAlias.provider,\n })\n }\n\n debugJson(logger, \"Request payload:\", payload)\n\n const selectedModel = findEndpointModel(payload.model)\n payload.model = selectedModel?.id ?? payload.model\n\n if (\n isNullish(payload.max_tokens)\n && isNullish(payload.max_completion_tokens)\n ) {\n payload = {\n ...payload,\n max_tokens: selectedModel?.capabilities.limits.max_output_tokens,\n }\n debugJson(logger, \"Set max_tokens to:\", payload.max_tokens)\n }\n\n if (payload.model.includes(\"gpt\")) {\n if (isNullish(payload.max_completion_tokens)) {\n payload.max_completion_tokens = payload.max_tokens\n }\n delete payload.max_tokens\n }\n\n // not support subagent marker for now , set sessionId = getUUID(requestId)\n const requestId = generateRequestIdFromPayload(payload)\n logger.debug(\"Generated request ID:\", requestId)\n\n const sessionId = getUUID(requestId)\n logger.debug(\"Extracted session ID:\", sessionId)\n const recordUsage = createCopilotTokenUsageRecorder({\n endpoint: \"chat_completions\",\n fallbackSessionId: sessionId,\n model: payload.model,\n })\n\n const response = await createChatCompletions(payload, {\n clientSignal: c.req.raw.signal,\n requestId,\n sessionId,\n })\n\n if (isNonStreaming(response)) {\n debugJson(logger, \"Non-streaming response:\", response)\n recordUsage({\n ...normalizeOpenAIUsage(response.usage),\n total_nano_aiu: normalizeOptionalToken(\n response.copilot_usage?.total_nano_aiu,\n ),\n })\n return c.json(response)\n }\n\n logger.debug(\"Streaming response\")\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n\n for await (const chunk of response) {\n debugJson(logger, \"Streaming chunk:\", chunk)\n const parsedChunk = parseChatCompletionChunk(chunk)\n recordChatCompletionFirstToken(parsedChunk)\n if (parsedChunk?.usage || parsedChunk?.copilot_usage) {\n usage = {\n ...normalizeOpenAIUsage(parsedChunk.usage),\n total_nano_aiu: normalizeOptionalToken(\n parsedChunk.copilot_usage?.total_nano_aiu,\n ),\n }\n }\n await writeSSEIfConnected(stream, chunk as SSEMessage)\n }\n\n recordUsage(usage)\n })\n}\n\nconst isNonStreaming = (\n response: Awaited<ReturnType<typeof createChatCompletions>>,\n): response is ChatCompletionResponse => Object.hasOwn(response, \"choices\")\n\nconst parseChatCompletionChunk = (\n chunk: unknown,\n): ChatCompletionChunk | null => {\n const data = (chunk as { data?: string }).data\n if (!data || data === \"[DONE]\") {\n return null\n }\n\n try {\n return JSON.parse(data) as ChatCompletionChunk\n } catch {\n return null\n }\n}\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\n\nimport { handleCompletion } from \"./handler\"\n\nexport const completionRoutes = new Hono()\n\ncompletionRoutes.post(\"/\", async (c) => {\n try {\n return await handleCompletion(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import consola from \"consola\"\n\nimport { getConfig, reloadConfig } from \"~/lib/config-store\"\nimport { setupCopilotRuntime } from \"~/lib/copilot-runtime\"\nimport { readGitHubToken, readGitHubTokenFromEnv } from \"~/lib/credential-store\"\nimport { isGitHubCopilotEnabled } from \"~/lib/github-copilot-provider\"\nimport { state } from \"~/lib/state\"\nimport { invalidateCodexRuntime, stopCopilotRefreshLoop } from \"~/lib/token\"\nimport { stopModelsRefreshLoop } from \"~/services/copilot/models-cache\"\n\nlet pendingReload: Promise<void> = Promise.resolve()\n\nasync function applyConfigReload(): Promise<void> {\n const previousConfig = getConfig()\n const wasCopilotEnabled = isGitHubCopilotEnabled(previousConfig)\n const config = reloadConfig()\n\n // Credentials can change without changing accountId (signing in again).\n // The next Codex request reads the saved credentials and starts a fresh loop.\n invalidateCodexRuntime()\n if (!isGitHubCopilotEnabled(config)) {\n consola.debug(\n \"Config reload: Copilot is disabled; stopping its refresh loop\",\n )\n stopCopilotRefreshLoop()\n stopModelsRefreshLoop()\n return\n }\n\n const envToken = readGitHubTokenFromEnv()\n const githubToken =\n state.githubTokenSource === \"cli\" ?\n state.githubToken\n : (envToken ?? (await readGitHubToken()))\n\n if (!githubToken) {\n consola.debug(\n \"Config reload: no GitHub token is available; clearing Copilot credentials\",\n )\n stopCopilotRefreshLoop()\n // cacheModels() schedules its own timer that no AbortController owns.\n // Leaving it running would keep polling the Copilot models endpoint with\n // the credentials this branch just cleared, once per refresh interval.\n stopModelsRefreshLoop()\n state.githubToken = undefined\n state.copilotToken = undefined\n state.models = undefined\n state.userName = undefined\n state.copilotApiUrl = undefined\n state.tokenBasedBilling = undefined\n return\n }\n\n if (\n wasCopilotEnabled\n && githubToken === state.githubToken\n && state.copilotToken\n && state.models\n ) {\n consola.debug(\n \"Config reload: GitHub token unchanged and Copilot runtime ready; keeping current credentials\",\n )\n return\n }\n\n stopCopilotRefreshLoop()\n // The old Copilot runtime ends here rather than when its replacement\n // finishes initializing. setupCopilotRuntime() can fail before it reaches\n // cacheModels(), and a models loop left running would then repopulate the\n // credentials this branch is clearing, using the cleared Copilot token.\n stopModelsRefreshLoop()\n state.copilotToken = undefined\n state.models = undefined\n if (state.githubTokenSource !== \"cli\") {\n state.githubTokenSource = envToken ? \"env\" : \"file\"\n }\n consola.debug(\n `Config reload: initializing Copilot runtime with the ${state.githubTokenSource} GitHub token`,\n )\n await setupCopilotRuntime(githubToken)\n consola.debug(\"Config reload: Copilot runtime initialized\")\n}\n\nexport function reloadServerConfig(): Promise<void> {\n const reload = pendingReload.then(applyConfigReload)\n pendingReload = reload.catch(() => {})\n return reload\n}\n","import { Hono } from \"hono\"\nimport { z } from \"zod\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { getModelMappings, setModelMappings } from \"~/lib/config\"\nimport { reloadServerConfig } from \"~/lib/config-reload\"\nimport { PATHS } from \"~/lib/paths\"\n\nexport const configRoutes = new Hono()\n\nconst modelMappingsRequestSchema = z.object({\n modelMappings: z.record(z.string(), z.string()),\n})\n\nconfigRoutes.post(\"/reload\", async (c) => {\n try {\n await reloadServerConfig()\n return c.json({ configPath: PATHS.CONFIG_PATH, reloaded: true })\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n\nconfigRoutes.get(\"/model-mappings\", (c) => {\n return c.json({\n configPath: PATHS.CONFIG_PATH,\n modelMappings: getModelMappings(),\n })\n})\n\nconfigRoutes.post(\"/model-mappings\", async (c) => {\n try {\n const parseResult = modelMappingsRequestSchema.safeParse(await c.req.json())\n if (!parseResult.success) {\n return c.json(\n {\n error: {\n message:\n parseResult.error.issues[0]?.message ?? \"Invalid request body.\",\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n const updatedModelMappings = setModelMappings(\n parseResult.data.modelMappings,\n )\n\n return c.json({\n configPath: PATHS.CONFIG_PATH,\n modelMappings: updatedModelMappings,\n })\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { copilotHeaders, copilotBaseUrl } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\n\nexport const createEmbeddings = async (payload: EmbeddingRequest) => {\n if (!state.copilotToken) throw new Error(\"Copilot token not found\")\n\n const response = await fetch(`${copilotBaseUrl(state)}/embeddings`, {\n method: \"POST\",\n headers: copilotHeaders(state),\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) throw new HTTPError(\"Failed to create embeddings\", response)\n\n return (await response.json()) as EmbeddingResponse\n}\n\nexport interface EmbeddingRequest {\n input: Array<string>\n model: string\n}\n\nexport interface Embedding {\n object: string\n embedding: Array<number>\n index: number\n}\n\nexport interface EmbeddingResponse {\n object: string\n data: Array<Embedding>\n model: string\n usage: {\n prompt_tokens: number\n total_tokens: number\n }\n}\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { createCopilotTokenUsageRecorder } from \"~/lib/token-usage\"\nimport {\n createEmbeddings,\n type EmbeddingRequest,\n} from \"~/services/copilot/create-embeddings\"\n\nexport const embeddingRoutes = new Hono()\n\nembeddingRoutes.post(\"/\", async (c) => {\n try {\n const paylod = await c.req.json<EmbeddingRequest>()\n const response = await createEmbeddings(paylod)\n const recordUsage = createCopilotTokenUsageRecorder({\n endpoint: \"embeddings\",\n model: paylod.model,\n })\n\n recordUsage({\n input_tokens: response.usage.prompt_tokens,\n output_tokens: 0,\n })\n\n return c.json(response)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { getConfig } from \"~/lib/config-store\"\nimport { parseProviderModelAlias } from \"~/lib/provider-model\"\n\nexport type ConfiguredXaiImageModel =\n | { status: \"disabled\" }\n | { status: \"invalid\"; message: string }\n | { model: string; status: \"xai\" }\n\n/**\n * Resolves one image-route model setting. Empty values keep the OpenAI\n * protocol. Only an xai/model alias selects the xAI Imagine API.\n */\nexport function resolveConfiguredXaiImageModel(\n configured: unknown,\n settingName: string,\n): ConfiguredXaiImageModel {\n if (configured === undefined || configured === null) {\n return { status: \"disabled\" }\n }\n if (typeof configured !== \"string\") {\n return {\n message: `${settingName} must be an xai/model alias`,\n status: \"invalid\",\n }\n }\n\n const trimmed = configured.trim()\n if (!trimmed) return { status: \"disabled\" }\n\n const alias = parseProviderModelAlias(trimmed)\n if (alias?.provider.toLowerCase() !== \"xai\") {\n return {\n message: `${settingName} only supports an xai/model alias, received '${trimmed}'`,\n status: \"invalid\",\n }\n }\n\n return { model: alias.model, status: \"xai\" }\n}\n\nexport function getImageGenerationModel(): ConfiguredXaiImageModel {\n return resolveConfiguredXaiImageModel(\n getConfig().imageGenerationModel,\n \"imageGenerationModel\",\n )\n}\n\nexport function getImageEditModel(): ConfiguredXaiImageModel {\n return resolveConfiguredXaiImageModel(\n getConfig().imageEditModel,\n \"imageEditModel\",\n )\n}\n","import type { ConsolaInstance } from \"consola\"\n\nimport type { ResolvedProviderConfig } from \"~/lib/config\"\nimport { debugJson, debugJsonAsync } from \"~/lib/logger\"\nimport type { CodexImagesOperation } from \"~/services/codex/images\"\nimport {\n createProviderProxyResponse,\n forwardProviderImages,\n} from \"~/services/providers/provider-proxy\"\n\nexport interface ProviderImagesForwardLogContext {\n logger: ConsolaInstance\n provider: string\n}\n\n/**\n * Forwards an images request to a configured provider with debug logging.\n * Shared by the top-level images routes (model mapping) and the\n * provider-scoped images routes so both log and proxy identically.\n */\nexport async function forwardProviderImagesWithLogging(\n providerConfig: ResolvedProviderConfig,\n request: Request,\n operation: CodexImagesOperation,\n { logger, provider }: ProviderImagesForwardLogContext,\n): Promise<Response> {\n if (operation === \"generations\") {\n await debugJsonAsync(\n logger,\n `provider.images.${operation}.request`,\n async () => ({\n body: await request.clone().text(),\n provider,\n }),\n )\n } else {\n debugJson(logger, `provider.images.${operation}.request`, {\n contentType: request.headers.get(\"content-type\"),\n contentLength: request.headers.get(\"content-length\"),\n provider,\n })\n }\n\n const upstreamResponse = await forwardProviderImages(\n providerConfig,\n request,\n operation,\n )\n debugJson(logger, `provider.images.${operation}.response`, {\n contentType: upstreamResponse.headers.get(\"content-type\"),\n contentLength: upstreamResponse.headers.get(\"content-length\"),\n provider,\n statusCode: upstreamResponse.status,\n })\n return createProviderProxyResponse(upstreamResponse)\n}\n","import {\n fetch as undiciFetch,\n type RequestInit as UndiciRequestInit,\n} from \"undici\"\n\nimport { createTimeoutDispatcher } from \"~/lib/timeout-dispatcher\"\nimport {\n buildCodexRequestHeaders,\n CODEX_API_BASE_URL,\n} from \"~/services/codex/create-responses\"\n\nexport type CodexImagesOperation = \"generations\" | \"edits\"\n\nconst CODEX_IMAGES_TIMEOUT_MS = 15 * 60 * 1000\n\nconst codexImagesDispatcher = createTimeoutDispatcher(CODEX_IMAGES_TIMEOUT_MS)\n\ntype StreamingRequestInit = RequestInit & {\n duplex: \"half\"\n}\n\nexport function resolveCodexImagesUrl(\n requestUrl: string,\n operation: CodexImagesOperation,\n): string {\n const upstreamUrl = new URL(`${CODEX_API_BASE_URL}/codex/images/${operation}`)\n upstreamUrl.search = new URL(requestUrl, \"http://localhost\").search\n return upstreamUrl.toString()\n}\n\nexport async function forwardCodexImages(\n request: Request,\n operation: CodexImagesOperation,\n): Promise<Response> {\n const headers = buildCodexRequestHeaders(request.headers)\n if (!headers.has(\"accept\")) {\n headers.set(\"accept\", \"application/json\")\n }\n\n if (operation === \"generations\" && !headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\")\n }\n\n const init: StreamingRequestInit = {\n method: \"POST\",\n headers,\n body: request.body,\n duplex: \"half\",\n signal: AbortSignal.timeout(CODEX_IMAGES_TIMEOUT_MS),\n }\n\n const upstreamUrl = resolveCodexImagesUrl(request.url, operation)\n if (typeof Bun !== \"undefined\") {\n return await fetch(upstreamUrl, init)\n }\n\n // Node and Undici expose separate fetch types, but their streamed request\n // and response objects are runtime-compatible here.\n return (await undiciFetch(upstreamUrl, {\n ...init,\n dispatcher: codexImagesDispatcher,\n } as unknown as UndiciRequestInit)) as unknown as Response\n}\n","import consola from \"consola\"\nimport type { Context } from \"hono\"\n\nimport { resolveMappedModel, type ResolvedProviderConfig } from \"~/lib/config\"\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJson, debugJsonAsync } from \"~/lib/logger\"\nimport { parseProviderModelAlias } from \"~/lib/provider-model\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport {\n getImageEditModel,\n getImageGenerationModel,\n} from \"~/lib/xai-image-model\"\nimport { forwardProviderImagesWithLogging } from \"~/routes/images/forward-provider-images\"\nimport {\n forwardCodexImages,\n type CodexImagesOperation,\n} from \"~/services/codex/images\"\nimport { createProviderProxyResponse } from \"~/services/providers/provider-proxy\"\n\nexport const logger = createHandlerLogger(\"images-handler\")\n\nexport const imageRouteDependencies = {\n debugJsonAsync,\n getImageEditModel,\n getImageGenerationModel,\n resolveMappedModel,\n resolveProviderConfig,\n}\n\nexport interface ParsedImagesRequest {\n /** Rebuilds the forwarding request with the resolved model in the body. */\n createRequest: (model: string) => Request\n model: string\n /** Unchanged request, forwarded as-is when no rebuild is needed. */\n originalRequest?: Request\n}\n\nexport function imageEditContentTypeErrorResponse(c: Context): Response | null {\n const mediaType = c.req\n .header(\"content-type\")\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase()\n if (mediaType === \"application/json\") return null\n\n return c.json(\n {\n error: {\n message:\n \"Image edits require application/json with images: [{ image_url }] or [{ file_id }]; multipart uploads are not supported\",\n type: \"invalid_request_error\",\n },\n },\n 415,\n )\n}\n\nfunction getContentMetadata(headers: Headers) {\n return {\n contentType: headers.get(\"content-type\"),\n contentLength: headers.get(\"content-length\"),\n }\n}\n\n/**\n * Snapshots generated request headers before consuming the body.\n */\nexport function snapshotRequestHeaders(request: Request): Headers {\n return new Headers(request.headers)\n}\n\n/**\n * Rebuilds a request from primitives instead of cloning: under Node runtimes\n * srvx wraps incoming requests in a proxy class whose prototype chain\n * satisfies `instanceof Request` without the native internals, so\n * `new Request(request)` throws.\n */\nexport function createForwardRequest(\n request: Request,\n requestHeaders: Headers,\n body: Bun.BodyInit | null,\n): Request {\n const init: RequestInit & { duplex: \"half\" } = {\n body,\n duplex: \"half\",\n headers: requestHeaders,\n method: request.method,\n signal: request.signal,\n }\n return new Request(request.url, init)\n}\n\nfunction createJsonImagesRequest(\n request: Request,\n requestHeaders: Headers,\n payload: Record<string, unknown>,\n model: string,\n): Request {\n const headers = new Headers(requestHeaders)\n headers.delete(\"content-length\")\n\n return createForwardRequest(\n request,\n headers,\n new TextEncoder().encode(JSON.stringify({ ...payload, model })),\n )\n}\n\n/**\n * Parses an image request body as JSON, retaining the original bytes for\n * unchanged forwarding while allowing model mapping to rebuild the payload.\n * Rebuilt bodies stay binary so Node does not synthesize a text/plain content type.\n */\nexport async function parseJsonImagesRequest(\n request: Request,\n): Promise<ParsedImagesRequest | Request> {\n const requestHeaders = snapshotRequestHeaders(request)\n const body = new Uint8Array(await request.arrayBuffer())\n const originalRequest = createForwardRequest(request, requestHeaders, body)\n\n let payload: unknown\n try {\n const bodyText = new TextDecoder(\"utf-8\", { fatal: true }).decode(body)\n payload = JSON.parse(bodyText)\n } catch {\n return originalRequest\n }\n\n if (\n payload === null\n || typeof payload !== \"object\"\n || Array.isArray(payload)\n || typeof (payload as { model?: unknown }).model !== \"string\"\n ) {\n return originalRequest\n }\n\n const model = (payload as { model: string }).model\n return {\n createRequest: (mappedModel) =>\n createJsonImagesRequest(\n request,\n requestHeaders,\n payload as Record<string, unknown>,\n mappedModel,\n ),\n model,\n originalRequest,\n }\n}\n\n/**\n * Handles Codex images proxying. Pass a resolvedProviderConfig when the\n * caller already resolved the codex provider to avoid a second resolve, and\n * pass a request when model mapping rebuilt the request body.\n */\nexport async function handleCodexImages(\n c: Context,\n operation: CodexImagesOperation,\n resolvedProviderConfig?: ResolvedProviderConfig,\n request: Request = c.req.raw,\n): Promise<Response> {\n try {\n const codexProviderConfig =\n resolvedProviderConfig\n ?? (await imageRouteDependencies.resolveProviderConfig(\"codex\"))\n if (!codexProviderConfig) {\n return c.json(\n {\n error: {\n message: \"Provider 'codex' not found or disabled\",\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (operation === \"generations\") {\n await imageRouteDependencies.debugJsonAsync(\n logger,\n \"images.generations.codex.request\",\n async () => ({\n body: await request.clone().text(),\n }),\n )\n } else {\n debugJson(\n logger,\n \"images.edits.codex.request\",\n getContentMetadata(request.headers),\n )\n }\n\n const upstreamResponse = await forwardCodexImages(request, operation)\n debugJson(logger, `images.${operation}.codex.response`, {\n ...getContentMetadata(upstreamResponse.headers),\n statusCode: upstreamResponse.status,\n })\n return createProviderProxyResponse(upstreamResponse)\n } catch (error) {\n logger.error(`images.${operation}.codex.error`, { error })\n return await forwardError(c, error)\n }\n}\n\n/**\n * Routes a parsed images request: applies the model mapping, forwards to a\n * mapped provider when configured, and otherwise falls back to Codex.\n */\nexport async function routeImagesRequest(\n c: Context,\n operation: CodexImagesOperation,\n parsed: ParsedImagesRequest,\n): Promise<Response> {\n const requestedModel = parsed.model\n const mappedModel = imageRouteDependencies.resolveMappedModel(requestedModel)\n if (mappedModel !== requestedModel) {\n consola.debug(`Resolved model mapping: ${requestedModel} -> ${mappedModel}`)\n }\n\n const providerModelAlias = parseProviderModelAlias(mappedModel)\n if (providerModelAlias) {\n const providerConfig = await imageRouteDependencies.resolveProviderConfig(\n providerModelAlias.provider,\n )\n if (providerConfig) {\n const request = parsed.createRequest(providerModelAlias.model)\n if (providerConfig.name === \"codex\") {\n return await handleCodexImages(c, operation, providerConfig, request)\n }\n\n return await forwardProviderImagesWithLogging(\n providerConfig,\n request,\n operation,\n { logger, provider: providerModelAlias.provider },\n )\n }\n\n // The mapped provider is not configured: keep the pre-mapping behavior\n // and forward the client-sent model to Codex, not the prefixed alias.\n consola.debug(\n `Provider '${providerModelAlias.provider}' not found or disabled; forwarding the original model to Codex`,\n )\n return await handleCodexImages(\n c,\n operation,\n undefined,\n parsed.originalRequest ?? parsed.createRequest(requestedModel),\n )\n }\n\n if (parsed.originalRequest && mappedModel === requestedModel) {\n return await handleCodexImages(\n c,\n operation,\n undefined,\n parsed.originalRequest,\n )\n }\n\n return await handleCodexImages(\n c,\n operation,\n undefined,\n parsed.createRequest(mappedModel),\n )\n}\n","const XAI_ASPECT_RATIOS = [\n { label: \"1:1\", width: 1, height: 1 },\n { label: \"16:9\", width: 16, height: 9 },\n { label: \"9:16\", width: 9, height: 16 },\n { label: \"4:3\", width: 4, height: 3 },\n { label: \"3:4\", width: 3, height: 4 },\n { label: \"3:2\", width: 3, height: 2 },\n { label: \"2:3\", width: 2, height: 3 },\n { label: \"2:1\", width: 2, height: 1 },\n { label: \"1:2\", width: 1, height: 2 },\n { label: \"19.5:9\", width: 19.5, height: 9 },\n { label: \"9:19.5\", width: 9, height: 19.5 },\n { label: \"20:9\", width: 20, height: 9 },\n { label: \"9:20\", width: 9, height: 20 },\n] as const\n\nconst XAI_ASPECT_RATIO_LABELS = new Set<string>([\n ...XAI_ASPECT_RATIOS.map((ratio) => ratio.label),\n \"auto\",\n])\n\nconst XAI_RESPONSE_FORMATS = new Set([\"url\", \"b64_json\"])\nconst XAI_RESOLUTIONS = new Set([\"1k\", \"2k\"])\nconst MAX_EDIT_IMAGES = 5\nconst MAX_IMAGE_COUNT = 10\nconst HIGH_RESOLUTION_EDGE = 1536\n\nexport class XaiImagesRequestError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"XaiImagesRequestError\"\n }\n}\n\ninterface XaiImageReference {\n type: \"image_url\"\n url: string\n}\n\ntype ParsedSize = { height: number; width: number } | \"auto\"\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction readPrompt(value: unknown): string {\n if (typeof value !== \"string\" || value.trim() === \"\") {\n throw new XaiImagesRequestError(\"prompt is required\")\n }\n\n return value\n}\n\nfunction assertNotStreaming(value: unknown): void {\n if (value === true || value === \"true\") {\n throw new XaiImagesRequestError(\n \"xAI image requests do not support streaming\",\n )\n }\n}\n\nfunction readCount(value: unknown): number | undefined {\n if (value === undefined || value === null) return undefined\n\n const parsed =\n typeof value === \"number\" ? value\n : typeof value === \"string\" ? Number(value.trim())\n : Number.NaN\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > MAX_IMAGE_COUNT) {\n throw new XaiImagesRequestError(\n `n must be an integer from 1 to ${MAX_IMAGE_COUNT}`,\n )\n }\n\n return parsed\n}\n\nfunction readQuality(value: unknown): \"auto\" | \"low\" | \"medium\" | undefined {\n if (typeof value !== \"string\") return undefined\n\n switch (value.trim().toLowerCase()) {\n case \"low\":\n return \"low\"\n case \"medium\":\n case \"standard\":\n case \"high\":\n case \"hd\":\n return \"medium\"\n case \"auto\":\n return \"auto\"\n default:\n return undefined\n }\n}\n\nfunction readChoice(\n value: unknown,\n allowed: ReadonlySet<string>,\n name: string,\n normalize: (value: string) => string = (item) => item,\n): string | undefined {\n if (value === undefined || value === null) return undefined\n if (typeof value !== \"string\") {\n throw new XaiImagesRequestError(`${name} is invalid`)\n }\n\n const trimmed = value.trim()\n if (!trimmed) return undefined\n\n const normalized = normalize(trimmed)\n if (!allowed.has(normalized)) {\n throw new XaiImagesRequestError(\n `${name} must be one of ${Array.from(allowed).join(\", \")}`,\n )\n }\n\n return normalized\n}\n\nfunction readAspectRatio(value: unknown): string | undefined {\n if (value === undefined) return undefined\n if (typeof value !== \"string\") {\n throw new XaiImagesRequestError(\"aspect_ratio is invalid\")\n }\n\n const trimmed = value.trim()\n if (!trimmed) return undefined\n\n const normalized = trimmed.toLowerCase() === \"auto\" ? \"auto\" : trimmed\n if (!XAI_ASPECT_RATIO_LABELS.has(normalized)) {\n throw new XaiImagesRequestError(\n \"aspect_ratio must be a supported xAI ratio such as 1:1, 16:9, 9:16, or auto\",\n )\n }\n\n return normalized\n}\n\nfunction readSize(value: unknown): ParsedSize | undefined {\n if (typeof value !== \"string\") return undefined\n\n const trimmed = value.trim().toLowerCase()\n if (!trimmed) return undefined\n if (trimmed === \"auto\") return \"auto\"\n\n const match = /^(\\d+)x(\\d+)$/u.exec(trimmed)\n if (!match?.[1] || !match[2]) return undefined\n\n const width = Number(match[1])\n const height = Number(match[2])\n if (\n !Number.isSafeInteger(width)\n || !Number.isSafeInteger(height)\n || width <= 0\n || height <= 0\n ) {\n return undefined\n }\n\n return { height, width }\n}\n\nfunction aspectRatioFromSize(size: ParsedSize | undefined): string | undefined {\n if (!size) return undefined\n if (size === \"auto\") return \"auto\"\n\n let best: string = XAI_ASPECT_RATIOS[0].label\n let bestDistance = Number.POSITIVE_INFINITY\n const ratio = Math.log(size.width / size.height)\n for (const candidate of XAI_ASPECT_RATIOS) {\n const distance = Math.abs(\n ratio - Math.log(candidate.width / candidate.height),\n )\n if (distance < bestDistance) {\n best = candidate.label\n bestDistance = distance\n }\n }\n\n return best\n}\n\nfunction resolutionFromSize(\n size: ParsedSize | undefined,\n): \"1k\" | \"2k\" | undefined {\n if (!size || size === \"auto\") return undefined\n return Math.max(size.width, size.height) >= HIGH_RESOLUTION_EDGE ? \"2k\" : \"1k\"\n}\n\nfunction applyCommonImageFields(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): void {\n assertNotStreaming(source.stream)\n\n const count = readCount(source.n)\n const quality = readQuality(source.quality)\n const responseFormat = readChoice(\n source.response_format,\n XAI_RESPONSE_FORMATS,\n \"response_format\",\n )\n const aspectRatio =\n readAspectRatio(source.aspect_ratio)\n ?? aspectRatioFromSize(readSize(source.size))\n const resolution =\n readChoice(source.resolution, XAI_RESOLUTIONS, \"resolution\", (value) =>\n value.toLowerCase(),\n ) ?? resolutionFromSize(readSize(source.size))\n\n if (count !== undefined) target.n = count\n // Only Imagine 2.0 accepts quality; legacy models must omit the field.\n if (quality && target.model === \"grok-imagine-image-2.0\") {\n target.quality = quality\n }\n // OpenAI image clients decode b64_json. xAI omits that field unless asked.\n target.response_format = responseFormat ?? \"b64_json\"\n if (aspectRatio) target.aspect_ratio = aspectRatio\n if (resolution) target.resolution = resolution\n}\n\nfunction normalizeImageUrl(value: string): string {\n const trimmed = value.trim()\n if (\n /^https?:\\/\\//iu.test(trimmed)\n || /^data:image\\/[a-z0-9.+-]+;base64,/iu.test(trimmed)\n ) {\n return trimmed\n }\n\n throw new XaiImagesRequestError(\n \"image must be an http(s) URL or a base64 data URL\",\n )\n}\n\nfunction base64ToDataUrl(value: string, mime: unknown): string {\n const compact = value.trim().replaceAll(/\\s+/gu, \"\")\n if (compact.startsWith(\"data:image/\")) return normalizeImageUrl(compact)\n if (!/^[a-z0-9+/]+={0,2}$/iu.test(compact)) {\n throw new XaiImagesRequestError(\"image b64_json is not valid base64\")\n }\n\n const mediaType =\n typeof mime === \"string\" && mime.trim().toLowerCase().startsWith(\"image/\") ?\n mime.trim().toLowerCase()\n : \"image/png\"\n return `data:${mediaType};base64,${compact}`\n}\n\nfunction readImageReference(value: unknown): XaiImageReference {\n if (typeof value === \"string\") {\n return { type: \"image_url\", url: normalizeImageUrl(value) }\n }\n if (!isRecord(value)) {\n throw new XaiImagesRequestError(\"image must be a URL or an image object\")\n }\n if (typeof value.url === \"string\") {\n return { type: \"image_url\", url: normalizeImageUrl(value.url) }\n }\n if (typeof value.image_url === \"string\") {\n return { type: \"image_url\", url: normalizeImageUrl(value.image_url) }\n }\n if (typeof value.b64_json === \"string\") {\n return {\n type: \"image_url\",\n url: base64ToDataUrl(value.b64_json, value.mime_type ?? value.media_type),\n }\n }\n\n if (value.file_id !== undefined) {\n throw new XaiImagesRequestError(\n \"file_id is not supported for xAI image edits; provide an image_url instead\",\n )\n }\n throw new XaiImagesRequestError(\n \"image must include a url, image_url, or b64_json\",\n )\n}\n\nfunction collectJsonImages(payload: Record<string, unknown>): Array<unknown> {\n const values: Array<unknown> = []\n if (isUnknownArray(payload.image)) values.push(...payload.image)\n else if (payload.image !== undefined) values.push(payload.image)\n if (isUnknownArray(payload.images)) values.push(...payload.images)\n if (payload.image_url !== undefined) values.push(payload.image_url)\n return values\n}\n\nfunction isUnknownArray(value: unknown): value is Array<unknown> {\n return Array.isArray(value)\n}\n\nfunction buildEditPayload(\n model: string,\n prompt: string,\n images: Array<XaiImageReference>,\n source: Record<string, unknown>,\n): Record<string, unknown> {\n if (source.mask !== undefined) {\n throw new XaiImagesRequestError(\"xAI image edits do not support mask\")\n }\n if (images.length === 0) {\n throw new XaiImagesRequestError(\"image is required\")\n }\n if (images.length > MAX_EDIT_IMAGES) {\n throw new XaiImagesRequestError(\n `xAI image edits accept at most ${MAX_EDIT_IMAGES} images`,\n )\n }\n\n const payload: Record<string, unknown> = { model, prompt }\n applyCommonImageFields(payload, source)\n if (images.length === 1) payload.image = images[0]\n else payload.images = images\n return payload\n}\n\n/**\n * Translates an OpenAI image generation body into an xAI Imagine generation\n * request. The configured model replaces the client model.\n */\nexport function translateXaiImageGeneration(\n payload: unknown,\n model: string,\n): Record<string, unknown> {\n if (!isRecord(payload)) {\n throw new XaiImagesRequestError(\n \"Image generation body must be a JSON object\",\n )\n }\n\n const translated: Record<string, unknown> = {\n model,\n prompt: readPrompt(payload.prompt),\n }\n applyCommonImageFields(translated, payload)\n return translated\n}\n\n/**\n * Translates an OpenAI JSON image edit body into an xAI Imagine edit request.\n */\nexport function translateXaiImageEditJson(\n payload: unknown,\n model: string,\n): Record<string, unknown> {\n if (!isRecord(payload)) {\n throw new XaiImagesRequestError(\"Image edit body must be a JSON object\")\n }\n\n return buildEditPayload(\n model,\n readPrompt(payload.prompt),\n collectJsonImages(payload).map((image) => readImageReference(image)),\n payload,\n )\n}\n\nconst MAX_RESPONSE_IMAGE_BYTES = 32 * 1024 * 1024\n\nfunction responseHasB64Json(value: unknown): boolean {\n return typeof value === \"string\" && value.trim() !== \"\"\n}\n\nfunction imageCreatedTimestamp(value: unknown): number {\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\n return Math.trunc(value)\n }\n\n return Math.floor(Date.now() / 1000)\n}\n\nfunction trustedImageUrl(value: unknown): string | null {\n if (typeof value !== \"string\" || !value.trim()) return null\n\n try {\n const url = new URL(value.trim())\n // xAI's documented output CDN is imgen.x.ai. Never let an upstream\n // response turn this fallback into a request to an arbitrary host/port.\n if (\n url.protocol !== \"https:\"\n || url.hostname !== \"imgen.x.ai\"\n || url.port\n || url.username\n || url.password\n ) {\n return null\n }\n return url.toString()\n } catch {\n return null\n }\n}\n\nasync function readImageBytes(response: Response): Promise<Buffer | null> {\n const declaredLength = Number(response.headers.get(\"content-length\"))\n if (\n Number.isFinite(declaredLength)\n && declaredLength > MAX_RESPONSE_IMAGE_BYTES\n ) {\n await response.body?.cancel().catch(() => {})\n return null\n }\n\n if (!response.body) return null\n\n const reader = (response.body as ReadableStream<Uint8Array>).getReader()\n const chunks: Array<Uint8Array> = []\n let length = 0\n let complete = false\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n complete = true\n return length > 0 ? Buffer.concat(chunks, length) : null\n }\n\n length += value.byteLength\n if (length > MAX_RESPONSE_IMAGE_BYTES) return null\n chunks.push(value)\n }\n } finally {\n if (!complete) await reader.cancel().catch(() => {})\n reader.releaseLock()\n }\n}\n\nfunction imageDownloadErrorResponse(): Response {\n return Response.json(\n {\n error: {\n message: \"Failed to retrieve xAI image output as b64_json\",\n type: \"upstream_error\",\n },\n },\n { status: 502 },\n )\n}\n\ninterface ImageResponseOptions {\n clientSignal?: AbortSignal\n onImageUrl?: (url: string) => void\n responseFormat?: \"url\" | \"b64_json\"\n}\n\nfunction imageOutputUrlForLog(value: unknown): string | null {\n if (typeof value !== \"string\" || !value.trim()) return null\n try {\n const url = new URL(value.trim())\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") return null\n url.username = \"\"\n url.password = \"\"\n for (const key of url.searchParams.keys()) {\n if (\n /token|secret|signature|credential|password|authorization|api[_-]?key|^key$|^sig$/iu.test(\n key,\n )\n ) {\n url.searchParams.set(key, \"[REDACTED]\")\n }\n }\n return url.toString()\n } catch {\n return null\n }\n}\n\nfunction rebuildJsonResponse(response: Response, body: string): Response {\n const headers = new Headers(response.headers)\n headers.delete(\"content-length\")\n if (!headers.get(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\")\n }\n return new Response(body, {\n headers,\n status: response.status,\n statusText: response.statusText,\n })\n}\n\n/**\n * Adapts an xAI image body to the OpenAI Images response.\n * Generation returns created: null, and edits omit created. OpenAI clients\n * require a unix timestamp. When b64_json is requested, a URL-only result\n * is downloaded from the xAI CDN with redirects disabled and a byte limit.\n */\nexport async function ensureImageResponseB64Json(\n response: Response,\n fetchImage: (\n url: string,\n init: RequestInit,\n ) => Promise<Response> = globalThis.fetch,\n {\n clientSignal,\n onImageUrl,\n responseFormat = \"b64_json\",\n }: ImageResponseOptions = {},\n): Promise<Response> {\n if (!response.ok) return response\n\n clientSignal?.throwIfAborted()\n\n const body = await response.text()\n let payload: unknown\n try {\n payload = JSON.parse(body)\n } catch {\n return rebuildJsonResponse(response, body)\n }\n if (!isRecord(payload) || !Array.isArray(payload.data)) {\n return rebuildJsonResponse(response, body)\n }\n\n let changed = false\n const data: Array<unknown> = []\n for (const item of payload.data) {\n if (isRecord(item) && onImageUrl) {\n const outputUrl = imageOutputUrlForLog(item.url)\n if (outputUrl) onImageUrl(outputUrl)\n }\n if (\n !isRecord(item)\n || responseFormat === \"url\"\n || responseHasB64Json(item.b64_json)\n ) {\n data.push(item)\n continue\n }\n\n const url = trustedImageUrl(item.url)\n if (!url) return imageDownloadErrorResponse()\n\n try {\n clientSignal?.throwIfAborted()\n const timeoutSignal = AbortSignal.timeout(60_000)\n const imageResponse = await fetchImage(url, {\n method: \"GET\",\n redirect: \"error\",\n signal:\n clientSignal ?\n AbortSignal.any([clientSignal, timeoutSignal])\n : timeoutSignal,\n })\n if (!imageResponse.ok) {\n await imageResponse.body?.cancel().catch(() => {})\n return imageDownloadErrorResponse()\n }\n const bytes = await readImageBytes(imageResponse)\n if (!bytes) return imageDownloadErrorResponse()\n data.push({\n ...item,\n b64_json: bytes.toString(\"base64\"),\n })\n changed = true\n } catch {\n clientSignal?.throwIfAborted()\n return imageDownloadErrorResponse()\n }\n }\n\n const created = imageCreatedTimestamp(payload.created)\n if (!changed && payload.created === created) {\n return rebuildJsonResponse(response, body)\n }\n return rebuildJsonResponse(\n response,\n JSON.stringify({ ...payload, created, data }),\n )\n}\n","import type { Context } from \"hono\"\n\nimport type { ResolvedProviderConfig } from \"~/lib/config\"\nimport { forwardProviderImagesWithLogging } from \"~/routes/images/forward-provider-images\"\nimport { imageRouteDependencies, logger } from \"~/routes/images/shared\"\nimport type { CodexImagesOperation } from \"~/services/codex/images\"\nimport {\n ensureImageResponseB64Json,\n translateXaiImageEditJson,\n translateXaiImageGeneration,\n XaiImagesRequestError,\n} from \"~/services/xai/images\"\n\nexport function xaiImagesRequestErrorResponse(\n c: Context,\n error: unknown,\n): Response | null {\n if (!(error instanceof XaiImagesRequestError)) return null\n\n return c.json(\n {\n error: {\n message: error.message,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n}\n\nasync function readJsonBody(\n request: Request,\n message: string,\n): Promise<unknown> {\n try {\n const body = new TextDecoder(\"utf-8\", { fatal: true }).decode(\n new Uint8Array(await request.arrayBuffer()),\n )\n return JSON.parse(body)\n } catch {\n throw new XaiImagesRequestError(message)\n }\n}\n\nasync function forwardTranslatedXaiImages(\n c: Context,\n operation: CodexImagesOperation,\n payload: Record<string, unknown>,\n): Promise<Response> {\n const providerConfig =\n await imageRouteDependencies.resolveProviderConfig(\"xai\")\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: \"Provider 'xai' not found or disabled\",\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n return await forwardXaiImages(providerConfig, c.req.raw, operation, payload)\n}\n\nasync function forwardXaiImages(\n providerConfig: ResolvedProviderConfig,\n request: Request,\n operation: CodexImagesOperation,\n payload: Record<string, unknown>,\n): Promise<Response> {\n const upstreamRequest = new Request(request.url, {\n body: JSON.stringify(payload),\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n method: \"POST\",\n signal: request.signal,\n })\n const upstreamResponse = await forwardProviderImagesWithLogging(\n providerConfig,\n upstreamRequest,\n operation,\n { logger, provider: \"xai\" },\n )\n return await ensureImageResponseB64Json(upstreamResponse, undefined, {\n clientSignal: request.signal,\n onImageUrl: (url) => {\n logger.info(\"images.xai.output.url\", JSON.stringify({ operation, url }))\n },\n responseFormat: payload.response_format === \"url\" ? \"url\" : \"b64_json\",\n })\n}\n\nexport async function handleXaiImageGeneration(\n c: Context,\n model: string,\n): Promise<Response> {\n const payload = translateXaiImageGeneration(\n await readJsonBody(c.req.raw, \"Image generation body must be JSON\"),\n model,\n )\n return await forwardTranslatedXaiImages(c, \"generations\", payload)\n}\n\nexport async function handleXaiImageEdit(\n c: Context,\n model: string,\n): Promise<Response> {\n const payload = translateXaiImageEditJson(\n await readJsonBody(c.req.raw, \"Image edit body must be JSON\"),\n model,\n )\n return await forwardTranslatedXaiImages(c, \"edits\", payload)\n}\n","import type { Context } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport {\n handleCodexImages,\n imageEditContentTypeErrorResponse,\n imageRouteDependencies,\n logger,\n parseJsonImagesRequest,\n routeImagesRequest,\n} from \"~/routes/images/shared\"\nimport {\n handleXaiImageEdit,\n xaiImagesRequestErrorResponse,\n} from \"~/routes/images/xai-handler\"\n\nexport async function handleImagesEdits(c: Context): Promise<Response> {\n try {\n const configuredModel = imageRouteDependencies.getImageEditModel()\n if (configuredModel.status === \"invalid\") {\n return c.json(\n {\n error: {\n message: configuredModel.message,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n const contentTypeError = imageEditContentTypeErrorResponse(c)\n if (contentTypeError) return contentTypeError\n\n if (configuredModel.status === \"xai\") {\n return await handleXaiImageEdit(c, configuredModel.model)\n }\n\n const parsed = await parseJsonImagesRequest(c.req.raw)\n if (parsed instanceof Request) {\n return await handleCodexImages(c, \"edits\", undefined, parsed)\n }\n return await routeImagesRequest(c, \"edits\", parsed)\n } catch (error) {\n const invalidRequest = xaiImagesRequestErrorResponse(c, error)\n if (invalidRequest) return invalidRequest\n\n logger.error(\"images.edits.error\", { error })\n return await forwardError(c, error)\n }\n}\n","import type { Context } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport {\n handleCodexImages,\n imageRouteDependencies,\n logger,\n parseJsonImagesRequest,\n routeImagesRequest,\n} from \"~/routes/images/shared\"\nimport {\n handleXaiImageGeneration,\n xaiImagesRequestErrorResponse,\n} from \"~/routes/images/xai-handler\"\n\nexport async function handleImagesGenerations(c: Context): Promise<Response> {\n try {\n const configuredModel = imageRouteDependencies.getImageGenerationModel()\n if (configuredModel.status === \"invalid\") {\n return c.json(\n {\n error: {\n message: configuredModel.message,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n if (configuredModel.status === \"xai\") {\n return await handleXaiImageGeneration(c, configuredModel.model)\n }\n\n const parsed = await parseJsonImagesRequest(c.req.raw)\n if (parsed instanceof Request) {\n return await handleCodexImages(c, \"generations\", undefined, parsed)\n }\n\n return await routeImagesRequest(c, \"generations\", parsed)\n } catch (error) {\n const invalidRequest = xaiImagesRequestErrorResponse(c, error)\n if (invalidRequest) return invalidRequest\n\n logger.error(\"images.generations.error\", { error })\n return await forwardError(c, error)\n }\n}\n","import { Hono } from \"hono\"\n\nimport { handleImagesEdits } from \"~/routes/images/edits-handler\"\nimport { handleImagesGenerations } from \"~/routes/images/generations-handler\"\n\nexport const imageRoutes = new Hono()\n\n// Re-exported for the provider-scoped images routes and tests.\nexport {\n handleCodexImages,\n imageRouteDependencies,\n} from \"~/routes/images/shared\"\n\nimageRoutes.post(\"/generations\", handleImagesGenerations)\nimageRoutes.post(\"/edits\", handleImagesEdits)\n","import type { ResolvedProviderConfig } from \"~/lib/config\"\nimport type { Model } from \"~/lib/types/models\"\n\nimport { builtinProviderModelRegistry } from \"~/lib/builtin-provider-models\"\nimport { GITHUB_COPILOT_PROVIDER } from \"~/lib/github-copilot-provider\"\nimport { getModelsDevModel } from \"~/lib/models-dev-cache\"\nimport { resolveProviderModelsDevId } from \"~/lib/provider-model-catalog\"\n\ninterface PdfSupportOptions {\n supportPdf?: boolean\n catalogInputModalities?: unknown\n supportedMediaTypes?: unknown\n builtinSupportPdf?: boolean\n}\n\nexport function resolveModelPdfSupport(\n provider: string,\n options: PdfSupportOptions,\n): boolean {\n if (options.supportPdf !== undefined) return options.supportPdf\n\n return (\n options.builtinSupportPdf === true\n || (provider === GITHUB_COPILOT_PROVIDER\n && Array.isArray(options.supportedMediaTypes)\n && options.supportedMediaTypes.includes(\"application/pdf\"))\n || (Array.isArray(options.catalogInputModalities)\n && options.catalogInputModalities.includes(\"pdf\"))\n )\n}\n\nexport function getProviderModelPdfSupport(\n modelId: string,\n provider: Pick<\n ResolvedProviderConfig,\n \"name\" | \"modelsDevProviderId\" | \"models\"\n >\n & Partial<Pick<ResolvedProviderConfig, \"baseUrl\">>,\n selectedModel?: Model,\n): boolean {\n const rawId = selectedModel?.id ?? modelId\n const modelConfig = provider.models?.[rawId] ?? provider.models?.[modelId]\n const catalogProvider = resolveProviderModelsDevId(provider.name, provider)\n const catalog =\n getModelsDevModel(catalogProvider, rawId)\n ?? getModelsDevModel(catalogProvider, modelId)\n const builtin = builtinProviderModelRegistry.getModelConfig(\n provider.name,\n rawId,\n )\n\n return resolveModelPdfSupport(provider.name, {\n supportPdf: modelConfig?.supportPdf,\n catalogInputModalities: catalog?.modalities?.input,\n supportedMediaTypes:\n selectedModel?.capabilities.limits.vision?.supported_media_types,\n builtinSupportPdf:\n builtin?.supportPdf\n ?? builtinProviderModelRegistry.getProviderDefaults(provider.name)\n ?.supportPdf,\n })\n}\n","const DISCOVERY_MODEL_PREFIX = \"my-claude-\"\nconst DISCOVERY_MODEL_SUFFIX = \"[1m]\"\n\nexport function isClaudeUserAgent(userAgent: string | undefined): boolean {\n return userAgent?.toLowerCase().includes(\"claude\") ?? false\n}\n\n/** Advertise every discovery ID with [1m], keeping its provider namespace. */\nexport function toClaudeDiscoveryModelId(modelId: string): string {\n const discoveryId = `${stripDiscoveryModelSuffix(modelId)}${DISCOVERY_MODEL_SUFFIX}`\n if (discoveryId.toLowerCase().includes(\"claude\")) return discoveryId\n const modelStart = discoveryId.indexOf(\"/\") + 1\n const model = discoveryId.slice(modelStart)\n return `${discoveryId.slice(0, modelStart)}${DISCOVERY_MODEL_PREFIX}${model}`\n}\n\n/** Restore the upstream ID before model mappings and provider resolution. */\nexport function fromClaudeDiscoveryModelId(modelId: string): string {\n const upstreamId = stripDiscoveryModelSuffix(modelId)\n if (upstreamId.startsWith(DISCOVERY_MODEL_PREFIX)) {\n return upstreamId.slice(DISCOVERY_MODEL_PREFIX.length)\n }\n const modelStart = upstreamId.indexOf(\"/\") + 1\n const model = upstreamId.slice(modelStart)\n if (!model.startsWith(DISCOVERY_MODEL_PREFIX)) return upstreamId\n return `${upstreamId.slice(0, modelStart)}${model.slice(DISCOVERY_MODEL_PREFIX.length)}`\n}\n\nfunction stripDiscoveryModelSuffix(modelId: string): string {\n return modelId.endsWith(DISCOVERY_MODEL_SUFFIX) ?\n modelId.slice(0, -DISCOVERY_MODEL_SUFFIX.length)\n : modelId\n}\n","import type {\n ChatCompletionsPayload,\n ContentPart,\n Message,\n Tool,\n ToolCall,\n} from \"~/lib/types/chat-completions\"\nimport type { Model } from \"~/lib/types/models\"\n\n// Encoder type mapping\nconst ENCODING_MAP = {\n o200k_base: () => import(\"gpt-tokenizer/encoding/o200k_base\"),\n cl100k_base: () => import(\"gpt-tokenizer/encoding/cl100k_base\"),\n p50k_base: () => import(\"gpt-tokenizer/encoding/p50k_base\"),\n p50k_edit: () => import(\"gpt-tokenizer/encoding/p50k_edit\"),\n r50k_base: () => import(\"gpt-tokenizer/encoding/r50k_base\"),\n} as const\n\ntype SupportedEncoding = keyof typeof ENCODING_MAP\n\n// Define encoder interface\ninterface Encoder {\n encode: (text: string) => Array<number>\n}\n\n// Cache loaded encoders to avoid repeated imports\nconst encodingCache = new Map<string, Encoder>()\n\n/**\n * Calculate tokens for tool calls\n */\nconst calculateToolCallsTokens = (\n toolCalls: Array<ToolCall>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let tokens = 0\n for (const toolCall of toolCalls) {\n tokens += constants.funcInit\n tokens += encoder.encode(toolCall.id).length\n tokens += encoder.encode(toolCall.function.name).length\n tokens += encoder.encode(toolCall.function.arguments).length\n }\n tokens += constants.funcEnd\n return tokens\n}\n\n/**\n * Calculate tokens for content parts\n */\nconst calculateContentPartsTokens = (\n contentParts: Array<ContentPart>,\n encoder: Encoder,\n): number => {\n let tokens = 0\n for (const part of contentParts) {\n if (part.type === \"image_url\") {\n tokens += encoder.encode(part.image_url.url).length + 85\n } else if (part.type === \"file\") {\n tokens += encoder.encode(part.file.file_data).length\n if (part.file.filename) {\n tokens += encoder.encode(part.file.filename).length\n }\n } else if (part.text) {\n tokens += encoder.encode(part.text).length\n }\n }\n return tokens\n}\n\n/**\n * Calculate tokens for a single message\n */\nconst calculateMessageTokens = (\n message: Message,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n const tokensPerMessage = 3\n const tokensPerName = 1\n let tokens = tokensPerMessage\n for (const [key, value] of Object.entries(message)) {\n if (key === \"reasoning_opaque\") {\n continue\n }\n if (typeof value === \"string\") {\n tokens += encoder.encode(value).length\n }\n if (key === \"name\") {\n tokens += tokensPerName\n }\n if (key === \"tool_calls\") {\n tokens += calculateToolCallsTokens(\n value as Array<ToolCall>,\n encoder,\n constants,\n )\n }\n if (key === \"content\" && Array.isArray(value)) {\n tokens += calculateContentPartsTokens(\n value as Array<ContentPart>,\n encoder,\n )\n }\n }\n return tokens\n}\n\n/**\n * Calculate tokens using custom algorithm\n */\nconst calculateTokens = (\n messages: Array<Message>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n if (messages.length === 0) {\n return 0\n }\n let numTokens = 0\n for (const message of messages) {\n numTokens += calculateMessageTokens(message, encoder, constants)\n }\n // every reply is primed with <|start|>assistant<|message|>\n numTokens += 3\n return numTokens\n}\n\n/**\n * Get the corresponding encoder module based on encoding type\n */\nconst getEncodeChatFunction = async (encoding: string): Promise<Encoder> => {\n if (encodingCache.has(encoding)) {\n const cached = encodingCache.get(encoding)\n if (cached) {\n return cached\n }\n }\n\n const supportedEncoding = encoding as SupportedEncoding\n if (!(supportedEncoding in ENCODING_MAP)) {\n const fallbackModule = (await ENCODING_MAP.o200k_base()) as Encoder\n encodingCache.set(encoding, fallbackModule)\n return fallbackModule\n }\n\n const encodingModule = (await ENCODING_MAP[supportedEncoding]()) as Encoder\n encodingCache.set(encoding, encodingModule)\n return encodingModule\n}\n\n/**\n * Get tokenizer type from model information\n */\nexport const getTokenizerFromModel = (model: Model): string => {\n return model.capabilities.tokenizer || \"o200k_base\"\n}\n\n/**\n * Get model-specific constants for token calculation\n */\nconst getModelConstants = (model: Model) => {\n return model.id === \"gpt-3.5-turbo\" || model.id === \"gpt-4\" ?\n {\n funcInit: 10,\n propInit: 3,\n propKey: 3,\n enumInit: -3,\n enumItem: 3,\n funcEnd: 12,\n isGpt: true,\n }\n : {\n funcInit: 7,\n propInit: 3,\n propKey: 3,\n enumInit: -3,\n enumItem: 3,\n funcEnd: 12,\n isGpt: model.id.startsWith(\"gpt-\"),\n }\n}\n\n/**\n * Calculate tokens for a single parameter\n */\nconst calculateParameterTokens = (\n key: string,\n prop: unknown,\n context: {\n encoder: Encoder\n constants: ReturnType<typeof getModelConstants>\n },\n): number => {\n const { encoder, constants } = context\n let tokens = constants.propKey\n\n // Early return if prop is not an object\n if (typeof prop !== \"object\" || prop === null) {\n return tokens\n }\n\n // Type assertion for parameter properties\n const param = prop as {\n type?: string\n description?: string\n enum?: Array<unknown>\n [key: string]: unknown\n }\n\n const paramName = key\n const paramType = param.type || \"string\"\n let paramDesc = param.description || \"\"\n\n // Handle enum values\n if (param.enum && Array.isArray(param.enum)) {\n tokens += constants.enumInit\n for (const item of param.enum) {\n tokens += constants.enumItem\n tokens += encoder.encode(String(item)).length\n }\n }\n\n // Clean up description\n if (paramDesc.endsWith(\".\")) {\n paramDesc = paramDesc.slice(0, -1)\n }\n\n // Encode the main parameter line\n const line = `${paramName}:${paramType}:${paramDesc}`\n tokens += encoder.encode(line).length\n\n if (param.type === \"array\" && param[\"items\"]) {\n tokens += calculateParametersTokens(param[\"items\"], encoder, constants)\n }\n\n // Handle additional properties (excluding standard ones)\n const excludedKeys = new Set([\"type\", \"description\", \"enum\", \"items\"])\n for (const propertyName of Object.keys(param)) {\n if (!excludedKeys.has(propertyName)) {\n const propertyValue = param[propertyName]\n const propertyText =\n typeof propertyValue === \"string\" ? propertyValue : (\n JSON.stringify(propertyValue)\n )\n tokens += encoder.encode(`${propertyName}:${propertyText}`).length\n }\n }\n\n return tokens\n}\n\n/**\n * Calculate tokens for properties object\n */\nconst calculatePropertiesTokens = (\n properties: Record<string, unknown>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let tokens = 0\n if (Object.keys(properties).length > 0) {\n tokens += constants.propInit\n for (const propKey of Object.keys(properties)) {\n tokens += calculateParameterTokens(propKey, properties[propKey], {\n encoder,\n constants,\n })\n }\n }\n return tokens\n}\n\n/**\n * Calculate tokens for function parameters\n */\nconst calculateParametersTokens = (\n parameters: unknown,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n if (!parameters || typeof parameters !== \"object\") {\n return 0\n }\n\n const params = parameters as Record<string, unknown>\n let tokens = 0\n\n const excludedKeys = new Set([\"$schema\", \"additionalProperties\"])\n for (const [key, value] of Object.entries(params)) {\n if (excludedKeys.has(key)) {\n continue\n }\n if (key === \"properties\") {\n tokens += calculatePropertiesTokens(\n value as Record<string, unknown>,\n encoder,\n constants,\n )\n } else {\n const paramText =\n typeof value === \"string\" ? value : JSON.stringify(value)\n tokens += encoder.encode(`${key}:${paramText}`).length\n }\n }\n\n return tokens\n}\n\n/**\n * Calculate tokens for a single tool\n */\nconst calculateToolTokens = (\n tool: Tool,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let tokens = constants.funcInit\n const func = tool.function\n const fName = func.name\n let fDesc = func.description || \"\"\n if (fDesc.endsWith(\".\")) {\n fDesc = fDesc.slice(0, -1)\n }\n const line = fName + \":\" + fDesc\n tokens += encoder.encode(line).length\n if (\n typeof func.parameters === \"object\" // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n && func.parameters !== null\n ) {\n tokens += calculateParametersTokens(func.parameters, encoder, constants)\n }\n return tokens\n}\n\n/**\n * Calculate token count for tools based on model\n */\nexport const numTokensForTools = (\n tools: Array<Tool>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let funcTokenCount = 0\n if (constants.isGpt) {\n for (const tool of tools) {\n funcTokenCount += calculateToolTokens(tool, encoder, constants)\n }\n funcTokenCount += constants.funcEnd\n } else {\n for (const tool of tools) {\n funcTokenCount += encoder.encode(JSON.stringify(tool)).length\n }\n }\n return funcTokenCount\n}\n\n/**\n * Calculate the token count of messages, supporting multiple GPT encoders\n */\nexport const getTokenCount = async (\n payload: ChatCompletionsPayload,\n model: Model,\n): Promise<{ input: number; output: number }> => {\n // Get tokenizer string\n const tokenizer = getTokenizerFromModel(model)\n\n // Get corresponding encoder module\n const encoder = await getEncodeChatFunction(tokenizer)\n\n const simplifiedMessages = payload.messages\n const inputMessages = simplifiedMessages.filter(\n (msg) => msg.role !== \"assistant\",\n )\n const outputMessages = simplifiedMessages.filter(\n (msg) => msg.role === \"assistant\",\n )\n\n const constants = getModelConstants(model)\n // gpt count token https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb\n let inputTokens = calculateTokens(inputMessages, encoder, constants)\n if (payload.tools && payload.tools.length > 0) {\n inputTokens += numTokensForTools(payload.tools, encoder, constants)\n }\n const outputTokens = calculateTokens(outputMessages, encoder, constants)\n\n return {\n input: inputTokens,\n output: outputTokens,\n }\n}\n","import { type AnthropicResponse } from \"~/lib/types/anthropic\"\n\nexport function mapOpenAIStopReasonToAnthropic(\n finishReason: \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\" | null,\n): AnthropicResponse[\"stop_reason\"] {\n if (finishReason === null) {\n return null\n }\n const stopReasonMap = {\n stop: \"end_turn\",\n length: \"max_tokens\",\n tool_calls: \"tool_use\",\n content_filter: \"end_turn\",\n } as const\n return stopReasonMap[finishReason]\n}\n","import type { ToolContentSupportType } from \"~/lib/config\"\nimport type { Model } from \"~/lib/types/models\"\n\nimport { state } from \"~/lib/state\"\nimport {\n type ChatCompletionResponse,\n type ChatCompletionsPayload,\n type ContentPart,\n type Message,\n type TextPart,\n type Tool,\n type ToolCall,\n} from \"~/lib/types/chat-completions\"\n\nimport {\n type AnthropicAssistantContentBlock,\n type AnthropicAssistantMessage,\n type AnthropicDocumentBlock,\n type AnthropicMessagesPayload,\n type AnthropicResponse,\n type AnthropicSystemMessage,\n type AnthropicTextBlock,\n type AnthropicThinkingBlock,\n type AnthropicTool,\n type AnthropicToolResultContentBlock,\n type AnthropicToolResultBlock,\n type AnthropicToolUseBlock,\n type AnthropicUserContentBlock,\n type AnthropicUserMessage,\n} from \"~/lib/types/anthropic\"\nimport { mapOpenAIStopReasonToAnthropic } from \"./utils\"\nimport { getPromptCacheKey } from \"~/lib/utils\"\n\n// Compatible with opencode, it will filter out blocks where the thinking text is empty, so we need add a default thinking text\nexport const THINKING_TEXT = \"Thinking...\"\nexport const RICH_TOOL_RESULT_MOVED_TEXT =\n \"Rich tool result content was moved to a user message because this upstream does not support it in tool messages.\"\n\ninterface TranslationCapabilities {\n supportPdf: boolean\n toolContentSupportType: Array<ToolContentSupportType>\n}\n\ninterface ToolContentSupport {\n array: boolean\n image: boolean\n pdf: boolean\n}\n\ninterface ToolResultMessages {\n movedUserMessage?: Message\n toolMessage: Message\n}\n\ninterface TranslateToOpenAIOptions {\n supportPdf?: boolean\n toolContentSupportType?: Array<ToolContentSupportType>\n validateReasoningEffort?: boolean\n reasoningEffortSupport?: Array<string>\n}\n\ntype MappableContentBlock =\n | AnthropicUserContentBlock\n | AnthropicAssistantContentBlock\n | AnthropicToolResultContentBlock\n\n// Payload translation\nexport function translateToOpenAI(\n payload: AnthropicMessagesPayload,\n options: TranslateToOpenAIOptions = {},\n): ChatCompletionsPayload {\n const modelId = payload.model\n const model = state.models?.data.find((m) => m.id === modelId)\n const thinkingBudget = getThinkingBudget(payload, model)\n const reasoningEffort = getReasoningEffort(payload, options)\n const promptCacheKey = getPromptCacheKey(payload)\n const capabilities = {\n supportPdf: options.supportPdf ?? false,\n toolContentSupportType: options.toolContentSupportType ?? [],\n }\n const tools = translateAnthropicToolsToOpenAI(payload.tools)\n const parallelToolCalls = translateParallelToolCalls(payload.tool_choice)\n return {\n model: modelId,\n messages: translateAnthropicMessagesToOpenAI(\n payload,\n modelId,\n capabilities,\n ),\n max_completion_tokens: payload.max_tokens,\n stop: payload.stop_sequences,\n stream: payload.stream,\n temperature: payload.temperature,\n top_p: payload.top_p,\n user: payload.metadata?.user_id,\n tools,\n tool_choice:\n tools && tools.length > 0 ?\n translateAnthropicToolChoiceToOpenAI(payload.tool_choice)\n : undefined,\n thinking_budget: thinkingBudget,\n ...(reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),\n ...(promptCacheKey ? { prompt_cache_key: promptCacheKey } : {}),\n ...(parallelToolCalls === undefined ?\n {}\n : { parallel_tool_calls: parallelToolCalls }),\n }\n}\n\nfunction getReasoningEffort(\n payload: AnthropicMessagesPayload,\n options: TranslateToOpenAIOptions,\n): string | undefined {\n const effort = payload.output_config?.effort\n if (!effort) {\n return undefined\n }\n\n if (!options.validateReasoningEffort) {\n return effort\n }\n\n const supportedEfforts = options.reasoningEffortSupport\n if (!supportedEfforts || supportedEfforts.length === 0) {\n return undefined\n }\n\n if (supportedEfforts.includes(effort)) {\n return effort\n }\n\n return supportedEfforts.at(-1)\n}\n\nfunction getThinkingBudget(\n payload: AnthropicMessagesPayload,\n model: Model | undefined,\n): number | undefined {\n const thinking = payload.thinking\n if (model && thinking?.budget_tokens !== undefined) {\n const maxThinkingBudget = Math.min(\n model.capabilities.supports.max_thinking_budget ?? 0,\n (model.capabilities.limits.max_output_tokens ?? 0) - 1,\n )\n thinking.budget_tokens ??= maxThinkingBudget\n if (maxThinkingBudget > 0) {\n const budgetTokens = Math.min(thinking.budget_tokens, maxThinkingBudget)\n return Math.max(\n budgetTokens,\n model.capabilities.supports.min_thinking_budget ?? 1024,\n )\n }\n }\n return undefined\n}\n\nfunction translateAnthropicMessagesToOpenAI(\n payload: AnthropicMessagesPayload,\n modelId: string,\n capabilities: TranslationCapabilities,\n): Array<Message> {\n const systemMessages = handleSystemPrompt(payload.system)\n const otherMessages = payload.messages.flatMap((message) => {\n if (message.role === \"user\") {\n return handleUserMessage(message, capabilities)\n }\n if (message.role === \"system\") {\n return [handleInlineSystemMessage(message)]\n }\n return handleAssistantMessage(message, modelId, capabilities)\n })\n return [...systemMessages, ...otherMessages]\n}\n\nfunction handleSystemPrompt(\n system: string | Array<AnthropicTextBlock> | undefined,\n): Array<Message> {\n if (!system) {\n return []\n }\n\n if (typeof system === \"string\") {\n return [{ role: \"system\", content: system }]\n } else {\n const systemText = system\n .map((block) => {\n return block.text\n })\n .join(\"\\n\\n\")\n return [{ role: \"system\", content: systemText }]\n }\n}\n\nfunction handleInlineSystemMessage(message: AnthropicSystemMessage): Message {\n return {\n role: \"user\",\n content: mapContent(message.content),\n }\n}\n\nfunction handleUserMessage(\n message: AnthropicUserMessage,\n capabilities: TranslationCapabilities,\n): Array<Message> {\n const newMessages: Array<Message> = []\n\n if (Array.isArray(message.content)) {\n const toolResultBlocks = message.content.filter(\n (block): block is AnthropicToolResultBlock =>\n block.type === \"tool_result\",\n )\n const otherBlocks = message.content.filter(\n (block) => block.type !== \"tool_result\",\n )\n\n // Tool results must come first to maintain protocol: tool_use -> tool_result -> user\n const movedToolResultUserMessages: Array<Message> = []\n for (const block of toolResultBlocks) {\n const result = handleToolResultBlock(block, capabilities)\n newMessages.push(result.toolMessage)\n if (result.movedUserMessage) {\n movedToolResultUserMessages.push(result.movedUserMessage)\n }\n }\n newMessages.push(...movedToolResultUserMessages)\n\n if (otherBlocks.length > 0) {\n newMessages.push({\n role: \"user\",\n content: mapContent(otherBlocks, {\n supportPdf: capabilities.supportPdf,\n }),\n })\n }\n } else {\n newMessages.push({\n role: \"user\",\n content: mapContent(message.content),\n })\n }\n\n return newMessages\n}\n\nfunction handleToolResultBlock(\n block: AnthropicToolResultBlock,\n capabilities: TranslationCapabilities,\n): ToolResultMessages {\n if (typeof block.content === \"string\") {\n return {\n toolMessage: createToolMessage(block.tool_use_id, block.content),\n }\n }\n\n if (!Array.isArray(block.content)) {\n return {\n toolMessage: createToolMessage(block.tool_use_id, \"\"),\n }\n }\n\n const support = getToolContentSupport(capabilities)\n const hasImage = block.content.some((block) => block.type === \"image\")\n const hasDocument = block.content.some((block) => block.type === \"document\")\n const content = mapContent(block.content, {\n supportPdf: capabilities.supportPdf,\n })\n\n const hasPdfFile = hasDocument && capabilities.supportPdf\n const shouldMoveImageToUserMessage = hasImage && !support.image\n const shouldMovePdfToUserMessage = hasPdfFile && !support.pdf\n if (shouldMoveImageToUserMessage || shouldMovePdfToUserMessage) {\n return {\n movedUserMessage: createToolResultUserMessage(\n block,\n capabilities.supportPdf,\n ),\n toolMessage: createToolMessage(\n block.tool_use_id,\n getTextToolContent(content) || RICH_TOOL_RESULT_MOVED_TEXT,\n ),\n }\n }\n\n const hasRichContent = hasImage || hasPdfFile\n if (support.array || hasRichContent) {\n return {\n toolMessage: createToolMessage(block.tool_use_id, content),\n }\n }\n\n return {\n toolMessage: createToolMessage(\n block.tool_use_id,\n getTextToolContent(content),\n ),\n }\n}\n\nfunction getTextToolContent(content: Message[\"content\"]): string {\n if (!Array.isArray(content)) {\n return content ?? \"\"\n }\n\n return content\n .flatMap((part) =>\n part.type === \"text\" && part.text.length > 0 ? [part.text] : [],\n )\n .join(\"\\n\")\n}\n\nfunction getToolContentSupport(\n capabilities: TranslationCapabilities,\n): ToolContentSupport {\n return {\n array: capabilities.toolContentSupportType.includes(\"array\"),\n image: capabilities.toolContentSupportType.includes(\"image\"),\n pdf:\n capabilities.supportPdf\n && capabilities.toolContentSupportType.includes(\"pdf\"),\n }\n}\n\nfunction createToolMessage(\n toolCallId: string,\n content: Message[\"content\"],\n): Message {\n return {\n role: \"tool\",\n tool_call_id: toolCallId,\n content,\n }\n}\n\nfunction createToolResultUserMessage(\n block: AnthropicToolResultBlock,\n supportPdf: boolean,\n): Message {\n const prefix: TextPart = {\n type: \"text\",\n text: `Tool result for ${block.tool_use_id}:`,\n }\n const content = mapContent(block.content, {\n supportPdf,\n })\n if (Array.isArray(content)) {\n return {\n role: \"user\",\n content: [prefix, ...content],\n }\n }\n\n return {\n role: \"user\",\n content: [prefix, { type: \"text\", text: content ?? \"\" }],\n }\n}\n\nfunction handleAssistantMessage(\n message: AnthropicAssistantMessage,\n modelId: string,\n capabilities: TranslationCapabilities,\n): Array<Message> {\n if (!Array.isArray(message.content)) {\n return [\n {\n role: \"assistant\",\n content: mapContent(message.content),\n },\n ]\n }\n\n // Skip assistant messages with empty content array\n if (message.content.length === 0) {\n return []\n }\n\n const toolUseBlocks = message.content.filter(\n (block): block is AnthropicToolUseBlock => block.type === \"tool_use\",\n )\n\n let thinkingBlocks = message.content.filter(\n (block): block is AnthropicThinkingBlock => block.type === \"thinking\",\n )\n\n if (modelId.startsWith(\"claude\")) {\n // Keep signature-only blocks (empty thinking text): the signature, not the\n // summary text, carries reasoning continuity and is forwarded upstream as\n // reasoning_opaque. Dropping empty-text blocks would silently lose those\n // signatures. The THINKING_TEXT placeholder is still excluded: it is a\n // synthetic value emitted by older versions, never real model output.\n thinkingBlocks = thinkingBlocks.filter(\n (b) =>\n b.thinking !== THINKING_TEXT\n && b.signature\n // gpt signature has @ in it, so filter those out for claude models\n && !b.signature.includes(\"@\"),\n )\n }\n\n const thinkingContents = thinkingBlocks\n .filter((b) => b.thinking && b.thinking !== THINKING_TEXT)\n .map((b) => b.thinking)\n\n const allThinkingContent =\n thinkingContents.length > 0 ? thinkingContents.join(\"\\n\\n\") : undefined\n\n const signature = thinkingBlocks.find((b) => b.signature)?.signature\n\n const content = normalizeAssistantTextContent(\n mapContent(message.content, {\n supportPdf: capabilities.supportPdf,\n }),\n )\n\n return toolUseBlocks.length > 0 ?\n [\n {\n role: \"assistant\",\n content,\n reasoning_text: allThinkingContent,\n reasoning_opaque: signature,\n tool_calls: toolUseBlocks.map((toolUse) => ({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: JSON.stringify(toolUse.input),\n },\n })),\n },\n ]\n : [\n {\n role: \"assistant\",\n content,\n reasoning_text: allThinkingContent,\n reasoning_opaque: signature,\n },\n ]\n}\n\n/**\n * DashScope-compatible upstreams reject assistant messages whose content is an\n * array of text parts, so collapse text-only arrays into a plain string here.\n */\nfunction normalizeAssistantTextContent(\n content: string | Array<ContentPart> | null,\n): string | Array<ContentPart> | null {\n if (!Array.isArray(content)) {\n return content\n }\n\n const textParts = content.filter(\n (part): part is TextPart => part.type === \"text\",\n )\n return textParts.length === content.length ?\n textParts.map((part) => part.text).join(\"\")\n : content\n}\n\nfunction mapContent(\n content: string | Array<MappableContentBlock>,\n options: { supportPdf?: boolean } = {},\n): string | Array<ContentPart> | null {\n if (typeof content === \"string\") {\n return content\n }\n if (!Array.isArray(content)) {\n return null\n }\n\n const contentParts: Array<ContentPart> = []\n for (const block of content) {\n switch (block.type) {\n case \"text\": {\n contentParts.push({ type: \"text\", text: block.text })\n break\n }\n case \"image\": {\n contentParts.push({\n type: \"image_url\",\n image_url: {\n url: `data:${block.source.media_type};base64,${block.source.data}`,\n },\n })\n break\n }\n case \"document\": {\n contentParts.push(\n options.supportPdf ?\n createDocumentFilePart(block)\n : createDocumentTextPart(),\n )\n break\n }\n case \"tool_reference\": {\n contentParts.push({\n type: \"text\",\n text: `Tool ${block.tool_name} loaded`,\n })\n break\n }\n // No default\n }\n }\n if (contentParts.length === 0) {\n return \"\"\n }\n return contentParts\n}\n\nfunction createDocumentTextPart(): TextPart {\n return {\n type: \"text\",\n text: \"PDF/document content is not supported by this Chat Completions upstream. Use the available text extracted from the document.\",\n }\n}\n\nfunction createDocumentFilePart(block: AnthropicDocumentBlock): ContentPart {\n return {\n type: \"file\",\n file: {\n file_data: `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.title ?? \"document.pdf\",\n },\n }\n}\n\nfunction translateAnthropicToolsToOpenAI(\n anthropicTools: Array<AnthropicTool> | undefined,\n): Array<Tool> | undefined {\n if (!anthropicTools) {\n return undefined\n }\n return anthropicTools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: normalizeToolSchema(tool.input_schema),\n ...(tool.strict === undefined ? {} : { strict: tool.strict }),\n },\n }))\n}\n\n/**\n * Ensures `type: \"object\"` schema has a `properties` field.\n * OpenAI's API rejects object schemas without it.\n */\nexport const normalizeToolSchema = (\n schema: Record<string, unknown>,\n): Record<string, unknown> => {\n if (schema.type === \"object\" && !schema.properties) {\n return { ...schema, properties: {} }\n }\n return schema\n}\n\nfunction translateAnthropicToolChoiceToOpenAI(\n anthropicToolChoice: AnthropicMessagesPayload[\"tool_choice\"],\n): ChatCompletionsPayload[\"tool_choice\"] {\n if (!anthropicToolChoice) {\n return undefined\n }\n\n switch (anthropicToolChoice.type) {\n case \"auto\": {\n return \"auto\"\n }\n case \"any\": {\n return \"required\"\n }\n case \"tool\": {\n if (anthropicToolChoice.name) {\n return {\n type: \"function\",\n function: { name: anthropicToolChoice.name },\n }\n }\n return undefined\n }\n case \"none\": {\n return \"none\"\n }\n default: {\n return undefined\n }\n }\n}\n\nfunction translateParallelToolCalls(\n toolChoice: AnthropicMessagesPayload[\"tool_choice\"],\n): boolean | undefined {\n if (typeof toolChoice?.disable_parallel_tool_use !== \"boolean\") {\n return undefined\n }\n\n return !toolChoice.disable_parallel_tool_use\n}\n\n// Response translation\n\nexport function translateToAnthropic(\n response: ChatCompletionResponse,\n): AnthropicResponse {\n // Merge content from all choices\n const assistantContentBlocks: Array<AnthropicAssistantContentBlock> = []\n let stopReason = response.choices[0]?.finish_reason ?? null\n\n // Process all choices to extract text and tool use blocks\n for (const choice of response.choices) {\n const textBlocks = getAnthropicTextBlocks(choice.message.content)\n const thinkBlocks = getAnthropicThinkBlocks(\n getOpenAIReasoningText(choice.message),\n choice.message.reasoning_opaque,\n )\n const toolUseBlocks = getAnthropicToolUseBlocks(choice.message.tool_calls)\n\n assistantContentBlocks.push(...thinkBlocks, ...textBlocks, ...toolUseBlocks)\n\n // Use the finish_reason from the first choice, or prioritize tool_calls\n if (choice.finish_reason === \"tool_calls\" || stopReason === \"stop\") {\n stopReason = choice.finish_reason\n }\n }\n\n return {\n id: response.id,\n type: \"message\",\n role: \"assistant\",\n model: response.model,\n content: assistantContentBlocks,\n stop_reason: mapOpenAIStopReasonToAnthropic(stopReason),\n stop_sequence: null,\n usage: mapOpenAIChatCompletionUsage(response),\n }\n}\n\nfunction mapOpenAIChatCompletionUsage(\n response: ChatCompletionResponse,\n): AnthropicResponse[\"usage\"] {\n const promptDetails = response.usage?.prompt_tokens_details\n const promptTokens = response.usage?.prompt_tokens ?? 0\n const cachedTokens = promptDetails?.cached_tokens ?? 0\n const cacheCreationTokens = promptDetails?.cache_creation_input_tokens ?? 0\n const usage: AnthropicResponse[\"usage\"] = {\n input_tokens: Math.max(\n 0,\n promptTokens - cachedTokens - cacheCreationTokens,\n ),\n output_tokens: response.usage?.completion_tokens ?? 0,\n }\n\n if (promptDetails?.cache_creation_input_tokens !== undefined) {\n usage.cache_creation_input_tokens = cacheCreationTokens\n }\n if (promptDetails?.cached_tokens !== undefined) {\n usage.cache_read_input_tokens = cachedTokens\n }\n\n return usage\n}\n\nfunction getOpenAIReasoningText(message: {\n reasoning_content?: string | null\n reasoning_text?: string | null\n reasoning?: string | null\n}): string | null | undefined {\n return (\n message.reasoning_text ?? message.reasoning_content ?? message.reasoning\n )\n}\n\nfunction getAnthropicTextBlocks(\n messageContent: Message[\"content\"],\n): Array<AnthropicTextBlock> {\n if (typeof messageContent === \"string\" && messageContent.length > 0) {\n return [{ type: \"text\", text: messageContent }]\n }\n\n if (Array.isArray(messageContent)) {\n return messageContent\n .filter((part): part is TextPart => part.type === \"text\")\n .map((part) => ({ type: \"text\", text: part.text }))\n }\n\n return []\n}\n\nfunction getAnthropicThinkBlocks(\n reasoningText: string | null | undefined,\n reasoningOpaque: string | null | undefined,\n): Array<AnthropicThinkingBlock> {\n if (reasoningText && reasoningText.length > 0) {\n return [\n {\n type: \"thinking\",\n thinking: reasoningText,\n signature: reasoningOpaque || \"\",\n },\n ]\n }\n if (reasoningOpaque && reasoningOpaque.length > 0) {\n return [\n {\n type: \"thinking\",\n thinking: \"\",\n signature: reasoningOpaque,\n },\n ]\n }\n return []\n}\n\nfunction getAnthropicToolUseBlocks(\n toolCalls: Array<ToolCall> | undefined,\n): Array<AnthropicToolUseBlock> {\n if (!toolCalls) {\n return []\n }\n return toolCalls.map((toolCall) => ({\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments) as Record<string, unknown>,\n }))\n}\n","import type { Model } from \"~/lib/types/models\"\n\nimport {\n COMPACT_AUTO_CONTINUE,\n COMPACT_REQUEST,\n compactAutoContinuePromptStarts,\n compactMessageSections,\n compactSummaryPromptStart,\n compactSystemPromptStarts,\n compactTextOnlyGuard,\n type CompactType,\n} from \"~/lib/compact\"\nimport { isClaudeUserAgent } from \"~/lib/claude-models\"\nimport { getReasoningEffortForModel } from \"~/lib/config\"\nimport { normalizeSdkModelId } from \"~/lib/models\"\n\nimport type {\n AnthropicAssistantContentBlock,\n AnthropicCacheControl,\n AnthropicDocumentBlock,\n AnthropicImageBlock,\n AnthropicInputMessage,\n AnthropicMessage,\n AnthropicMessagesPayload,\n AnthropicTextBlock,\n AnthropicToolResultBlock,\n AnthropicToolResultContentBlock,\n AnthropicUserContentBlock,\n AnthropicUserMessage,\n} from \"~/lib/types/anthropic\"\n\nexport const TOOL_REFERENCE_TURN_BOUNDARY = \"Tool loaded.\"\nconst SYSTEM_REMINDER_START = \"<system-reminder>\"\nconst SYSTEM_REMINDER_END = \"</system-reminder>\"\nconst SUBAGENT_START_HOOK_ADDITIONAL_PREFIX = \"SubagentStart hook additional\"\nexport const claudeAutoModelSystemPromptStart =\n \"You are a security monitor for autonomous AI coding agents.\"\nexport const claudeAutoModelStopSequence = \"</block>\"\n\nconst IDE_GET_DIAGNOSTICS_TOOL = \"mcp__ide__getDiagnostics\"\nconst IDE_GET_DIAGNOSTICS_DESCRIPTION =\n \"Get language diagnostics from VS Code. Returns errors, warnings, information, and hints for files in the workspace.\"\nconst PDF_FILE_READ_PREFIX = \"PDF file read:\"\nconst CLAUDE_CODE_BILLING_HEADER_PREFIX = \"x-anthropic-billing-header:\"\nconst CLAUDE_CODE_CCH_SEGMENT_PATTERN = /(^|;\\s*)cch=[^;]+;/u\n\ntype AnthropicAttachmentBlock = AnthropicImageBlock | AnthropicDocumentBlock\ntype AnthropicMessageContentBlock =\n | AnthropicUserContentBlock\n | AnthropicAssistantContentBlock\n\nconst createTextBlock = (text: string): AnthropicTextBlock => ({\n type: \"text\",\n text,\n})\n\nconst appendTextSegment = (base: string, addition: string): string => {\n if (base.length === 0) {\n return addition\n }\n if (addition.length === 0) {\n return base\n }\n\n return `${base}\\n\\n${addition}`\n}\n\nconst ensureSystemReminderText = (text: string): string => {\n if (text.startsWith(SYSTEM_REMINDER_START)) {\n return text\n }\n\n return `${SYSTEM_REMINDER_START}\\n${text.trim()}\\n${SYSTEM_REMINDER_END}`\n}\n\nconst normalizeSystemStringForMerge = (\n text: string,\n): string | Array<AnthropicTextBlock> => {\n if (!text.startsWith(SUBAGENT_START_HOOK_ADDITIONAL_PREFIX)) {\n return ensureSystemReminderText(text)\n }\n\n const lineBreakMatch = /\\r?\\n/.exec(text)\n if (!lineBreakMatch) {\n return [createTextBlock(ensureSystemReminderText(text))]\n }\n\n const firstLine = text.slice(0, lineBreakMatch.index)\n const rest = text.slice(lineBreakMatch.index + lineBreakMatch[0].length)\n return [\n createTextBlock(ensureSystemReminderText(firstLine)),\n ...(rest.length > 0 ?\n [createTextBlock(ensureSystemReminderText(rest))]\n : []),\n ]\n}\n\nconst normalizeSystemContentForMerge = (\n content: string | Array<AnthropicTextBlock>,\n): string | Array<AnthropicTextBlock> => {\n if (typeof content === \"string\") {\n return normalizeSystemStringForMerge(content)\n }\n\n return content.flatMap((block) => {\n const normalized = normalizeSystemStringForMerge(block.text)\n if (typeof normalized === \"string\") {\n return [{ ...block, text: normalized }]\n }\n\n return normalized.map((normalizedBlock, index) =>\n index === normalized.length - 1 ?\n { ...block, text: normalizedBlock.text }\n : normalizedBlock,\n )\n })\n}\n\nconst toSystemTextBlocks = (\n content: string | Array<AnthropicTextBlock>,\n): Array<AnthropicTextBlock> => {\n return typeof content === \"string\" ? [createTextBlock(content)] : [...content]\n}\n\nconst mergeSystemPromptContent = (\n current: string | Array<AnthropicTextBlock> | undefined,\n addition: string | Array<AnthropicTextBlock>,\n): string | Array<AnthropicTextBlock> => {\n if (current === undefined) {\n return typeof addition === \"string\" ? addition : [...addition]\n }\n\n if (typeof current === \"string\" && typeof addition === \"string\") {\n return appendTextSegment(current, addition)\n }\n\n return [...toSystemTextBlocks(current), ...toSystemTextBlocks(addition)]\n}\n\nconst prependSystemContentToUserMessage = (\n message: AnthropicUserMessage,\n addition: string | Array<AnthropicTextBlock>,\n): void => {\n if (typeof message.content === \"string\" && typeof addition === \"string\") {\n message.content = appendTextSegment(addition, message.content)\n return\n }\n\n if (Array.isArray(message.content)) {\n const lastToolResultIndex = message.content.findLastIndex(\n (block) => block.type === \"tool_result\",\n )\n if (lastToolResultIndex >= 0) {\n message.content = [\n ...message.content.slice(0, lastToolResultIndex + 1),\n ...toSystemTextBlocks(addition),\n ...message.content.slice(lastToolResultIndex + 1),\n ]\n return\n }\n }\n\n message.content = [\n ...toSystemTextBlocks(addition),\n ...(typeof message.content === \"string\" ?\n [createTextBlock(message.content)]\n : message.content),\n ]\n}\n\nconst normalizeClaudeCodeBillingHeader = (text: string): string => {\n if (!text.startsWith(CLAUDE_CODE_BILLING_HEADER_PREFIX)) {\n return text\n }\n\n return text.replace(CLAUDE_CODE_CCH_SEGMENT_PATTERN, \"$1cch=<stable>;\")\n}\n\nexport const normalizeClaudeCodeBillingHeaderInSystem = (\n payload: AnthropicMessagesPayload,\n): void => {\n const system = payload.system\n if (!system) {\n return\n }\n\n if (typeof system === \"string\") {\n payload.system = normalizeClaudeCodeBillingHeader(system)\n return\n }\n\n if (system.length === 0) {\n return\n }\n\n payload.system = system.map((block, index) =>\n index === 0 ?\n { ...block, text: normalizeClaudeCodeBillingHeader(block.text) }\n : block,\n )\n}\n\nconst supportsMidSystemMessages = (model: string): boolean =>\n model.startsWith(\"gpt\")\n || model.startsWith(\"codex\")\n || model.startsWith(\"claude\")\n\nexport const normalizeSystemMessages = (\n payload: AnthropicMessagesPayload,\n): void => {\n normalizeClaudeCodeBillingHeaderInSystem(payload)\n\n if (supportsMidSystemMessages(payload.model)) {\n return\n }\n\n if (!payload.messages.some((msg) => msg.role === \"system\")) {\n return\n }\n\n const normalizedMessages: Array<AnthropicMessage> = []\n let system = payload.system\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n const normalizedContent = normalizeSystemContentForMerge(message.content)\n const previousMessage = normalizedMessages.at(-1)\n if (previousMessage?.role === \"user\") {\n prependSystemContentToUserMessage(previousMessage, normalizedContent)\n } else if (!previousMessage) {\n system = mergeSystemPromptContent(system, normalizedContent)\n }\n continue\n }\n\n normalizedMessages.push(message)\n }\n\n payload.messages = normalizedMessages\n payload.system = system\n}\n\nconst isVersionAtLeast = (\n version: string,\n minimumMajor: number,\n minimumMinor: number,\n): boolean => {\n const [majorPart, minorPart = \"0\"] = version.split(\".\")\n const major = Number.parseInt(majorPart, 10)\n const minor = Number.parseInt(minorPart, 10)\n if (!Number.isInteger(major) || !Number.isInteger(minor)) {\n return false\n }\n\n return (\n major > minimumMajor || (major === minimumMajor && minor >= minimumMinor)\n )\n}\n\nconst shouldSummarizeThinkingDisplayForModel = (model: string): boolean => {\n const normalized = normalizeSdkModelId(model)\n return Boolean(normalized && isVersionAtLeast(normalized.version, 4, 7))\n}\n\ntype IndexedAttachment = {\n attachment: AnthropicAttachmentBlock\n order: number\n}\n\nconst getBlockCacheControl = (\n block: AnthropicMessageContentBlock | undefined,\n): AnthropicCacheControl | undefined => {\n if (!block || block.type === \"thinking\") {\n return undefined\n }\n\n const cacheControl = block.cache_control\n if (!cacheControl || typeof cacheControl !== \"object\") {\n return\n }\n\n return cacheControl\n}\n\nexport const getLastMessageContentCacheControl = (\n lastMessage: AnthropicInputMessage | undefined,\n): AnthropicCacheControl | undefined => {\n if (!lastMessage || !Array.isArray(lastMessage.content)) {\n return undefined\n }\n\n const cacheControl = getBlockCacheControl(lastMessage.content.at(-1))\n return cacheControl ? { ...cacheControl } : undefined\n}\n\n// Apply the original last message tail's cache_control to the rewritten tail. If\n// the original tail was not marked, fall back to a default ephemeral marker.\nexport const applyLastMessageCacheControl = (\n anthropicPayload: AnthropicMessagesPayload,\n lastMessageCacheControl: AnthropicCacheControl | undefined,\n): void => {\n const cacheControl = lastMessageCacheControl ?? {\n type: \"ephemeral\",\n }\n\n const lastMessage = anthropicPayload.messages.at(-1)\n if (!lastMessage || !Array.isArray(lastMessage.content)) {\n return\n }\n\n const lastBlock = lastMessage.content.at(-1)\n if (!lastBlock || lastBlock.type === \"thinking\" || lastBlock.cache_control) {\n return\n }\n\n lastBlock.cache_control = { ...cacheControl }\n}\n\nconst getCompactCandidateText = (message: AnthropicInputMessage): string => {\n if (message.role !== \"user\") {\n return \"\"\n }\n\n if (typeof message.content === \"string\") {\n return message.content\n }\n\n return message.content\n .filter((block): block is AnthropicTextBlock => block.type === \"text\")\n .map((block) =>\n block.text.startsWith(\"<system-reminder>\") ? \"\" : block.text,\n )\n .filter((text) => text.length > 0)\n .join(\"\\n\\n\")\n}\n\nconst isCompactMessage = (lastMessage: AnthropicInputMessage): boolean => {\n const text = getCompactCandidateText(lastMessage)\n if (!text) {\n return false\n }\n\n return (\n text.includes(compactTextOnlyGuard)\n && text.includes(compactSummaryPromptStart)\n && compactMessageSections.some((section) => text.includes(section))\n )\n}\n\nconst isCompactAutoContinueMessage = (\n lastMessage: AnthropicInputMessage,\n): boolean => {\n const text = getCompactCandidateText(lastMessage)\n return (\n Boolean(text)\n && compactAutoContinuePromptStarts.some((promptStart) =>\n text.startsWith(promptStart),\n )\n )\n}\n\nexport const getCompactType = (\n anthropicPayload: AnthropicMessagesPayload,\n): CompactType => {\n const lastMessage = anthropicPayload.messages.at(-1)\n if (lastMessage && isCompactMessage(lastMessage)) {\n return COMPACT_REQUEST\n }\n\n if (lastMessage && isCompactAutoContinueMessage(lastMessage)) {\n return COMPACT_AUTO_CONTINUE\n }\n\n const system = anthropicPayload.system\n if (typeof system === \"string\") {\n const hasCompactSystemPrompt = compactSystemPromptStarts.some(\n (promptStart) => system.startsWith(promptStart),\n )\n return hasCompactSystemPrompt ? COMPACT_REQUEST : 0\n }\n if (!Array.isArray(system)) return 0\n\n const hasCompactSystemPrompt = system.some(\n (msg) =>\n typeof msg.text === \"string\"\n && compactSystemPromptStarts.some((promptStart) =>\n msg.text.startsWith(promptStart),\n ),\n )\n if (hasCompactSystemPrompt) {\n return COMPACT_REQUEST\n }\n\n return 0\n}\n\nexport const applyClaudeNoToolsEffort = (\n payload: AnthropicMessagesPayload,\n userAgent: string | undefined,\n): void => {\n if (!isClaudeUserAgent(userAgent) || (payload.tools?.length ?? 0) > 0) {\n return\n }\n\n payload.output_config = {\n ...payload.output_config,\n effort: \"low\",\n }\n}\n\n/**\n * True for Claude Code background security-monitor requests: no tools,\n * `stop_sequences: [\"</block>\"]`, and a system prompt starting with the\n * security-monitor prefix. These can be rerouted via `claudeAutoModel`.\n */\nexport const isClaudeAutoModelRequest = (\n payload: AnthropicMessagesPayload,\n): boolean => {\n if (payload.tools && payload.tools.length > 0) {\n return false\n }\n\n const stopSequences = payload.stop_sequences\n if (\n !Array.isArray(stopSequences)\n || stopSequences.length !== 1\n || stopSequences[0] !== claudeAutoModelStopSequence\n ) {\n return false\n }\n\n const system = payload.system\n if (typeof system === \"string\") {\n return system.startsWith(claudeAutoModelSystemPromptStart)\n }\n if (!Array.isArray(system)) {\n return false\n }\n\n return system.some(\n (block) =>\n typeof block.text === \"string\"\n && block.text.startsWith(claudeAutoModelSystemPromptStart),\n )\n}\n\nconst mergeContentWithText = (\n tr: AnthropicToolResultBlock,\n textBlock: AnthropicTextBlock,\n): AnthropicToolResultBlock => {\n if (typeof tr.content === \"string\") {\n return { ...tr, content: `${tr.content}\\n\\n${textBlock.text}` }\n }\n // Unable to merge, discard other text blocks, wait for the next round of re-request\n if (hasToolRef(tr)) {\n return tr\n }\n return {\n ...tr,\n content: [...tr.content, stripContentBlockCacheControl(textBlock)],\n }\n}\n\nconst mergeContentWithTexts = (\n tr: AnthropicToolResultBlock,\n textBlocks: Array<AnthropicTextBlock>,\n): AnthropicToolResultBlock => {\n if (typeof tr.content === \"string\") {\n const appendedTexts = textBlocks.map((tb) => tb.text).join(\"\\n\\n\")\n return { ...tr, content: `${tr.content}\\n\\n${appendedTexts}` }\n }\n // Unable to merge, discard other text blocks, wait for the next round of re-request\n if (hasToolRef(tr)) {\n return tr\n }\n return {\n ...tr,\n content: [...tr.content, ...textBlocks.map(stripContentBlockCacheControl)],\n }\n}\n\nconst mergeContentWithAttachments = (\n tr: AnthropicToolResultBlock,\n attachments: Array<AnthropicAttachmentBlock>,\n): AnthropicToolResultBlock => {\n const cleanAttachments = attachments.map(stripContentBlockCacheControl)\n\n if (typeof tr.content === \"string\") {\n return {\n ...tr,\n content: [{ type: \"text\", text: tr.content }, ...cleanAttachments],\n }\n }\n\n return {\n ...tr,\n content: [...tr.content, ...cleanAttachments],\n }\n}\n\nconst stripContentBlockCacheControl = <\n T extends AnthropicToolResultContentBlock,\n>(\n block: T,\n): T => {\n if (!Object.hasOwn(block, \"cache_control\")) {\n return block\n }\n\n const copy = { ...block }\n delete copy.cache_control\n return copy\n}\n\nconst isAttachmentBlock = (\n block: AnthropicUserContentBlock,\n): block is AnthropicAttachmentBlock => {\n return block.type === \"image\" || block.type === \"document\"\n}\n\nconst getMergeableToolResultIndices = (\n toolResults: Array<AnthropicToolResultBlock>,\n): Array<number> => {\n return toolResults.flatMap((block, index) =>\n block.is_error || hasToolRef(block) ? [] : [index],\n )\n}\n\nconst mergeAttachmentsIntoToolResults = (\n toolResults: Array<AnthropicToolResultBlock>,\n attachmentsByToolResultIndex: Map<number, Array<IndexedAttachment>>,\n): Array<AnthropicToolResultBlock> => {\n if (attachmentsByToolResultIndex.size === 0) {\n return toolResults\n }\n\n return toolResults.map((block, index) => {\n const matchedAttachments = attachmentsByToolResultIndex.get(index)\n if (!matchedAttachments) {\n return block\n }\n\n const orderedAttachments = [...matchedAttachments]\n .sort((left, right) => left.order - right.order)\n .map(({ attachment }) => attachment)\n\n return mergeContentWithAttachments(block, orderedAttachments)\n })\n}\n\nconst assignAttachmentsToToolResults = (\n target: Map<number, Array<IndexedAttachment>>,\n attachments: Array<IndexedAttachment>,\n options: {\n toolResultIndices: Array<number>\n fallbackToolResultIndices?: Array<number>\n },\n): void => {\n const { toolResultIndices } = options\n const fallbackToolResultIndices =\n options.fallbackToolResultIndices ?? toolResultIndices\n\n if (attachments.length === 0) {\n return\n }\n\n if (\n toolResultIndices.length > 0\n && toolResultIndices.length === attachments.length\n ) {\n for (const [index, toolResultIndex] of toolResultIndices.entries()) {\n const currentAttachments = target.get(toolResultIndex)\n if (currentAttachments) {\n currentAttachments.push(attachments[index])\n continue\n }\n\n target.set(toolResultIndex, [attachments[index]])\n }\n return\n }\n\n const lastToolResultIndex = fallbackToolResultIndices.at(-1)\n if (lastToolResultIndex === undefined) {\n return\n }\n\n const currentAttachments = target.get(lastToolResultIndex)\n if (currentAttachments) {\n currentAttachments.push(...attachments)\n return\n }\n\n target.set(lastToolResultIndex, [...attachments])\n}\n\nconst startsWithPdfFileRead = (\n toolResult: AnthropicToolResultBlock,\n): boolean => {\n if (typeof toolResult.content === \"string\") {\n return toolResult.content.startsWith(PDF_FILE_READ_PREFIX)\n }\n\n if (toolResult.content.some((block) => block.type === \"document\")) {\n return false\n }\n\n if (toolResult.content.length === 0) {\n return false\n }\n\n const firstBlock = toolResult.content[0]\n if (firstBlock.type !== \"text\") {\n return false\n }\n\n return firstBlock.text.startsWith(PDF_FILE_READ_PREFIX)\n}\n\nconst collectMergeableUserContent = (\n content: Array<AnthropicUserContentBlock>,\n): {\n toolResults: Array<AnthropicToolResultBlock>\n textBlocks: Array<AnthropicTextBlock>\n attachments: Array<IndexedAttachment>\n} | null => {\n const toolResults: Array<AnthropicToolResultBlock> = []\n const textBlocks: Array<AnthropicTextBlock> = []\n const attachments: Array<IndexedAttachment> = []\n\n for (const [order, block] of content.entries()) {\n if (block.type === \"tool_result\") {\n toolResults.push(block)\n continue\n }\n if (block.type === \"text\") {\n textBlocks.push(block)\n continue\n }\n if (isAttachmentBlock(block)) {\n attachments.push({ attachment: block, order })\n continue\n }\n\n return null\n }\n\n return {\n toolResults,\n textBlocks,\n attachments,\n }\n}\n\nconst mergeAttachmentsForToolResults = (\n toolResults: Array<AnthropicToolResultBlock>,\n attachments: Array<IndexedAttachment>,\n): Array<AnthropicToolResultBlock> => {\n if (attachments.length === 0) {\n return toolResults\n }\n\n const documentBlocks = attachments.filter(\n ({ attachment }) => attachment.type === \"document\",\n )\n const mergeableToolResultIndices = getMergeableToolResultIndices(toolResults)\n const pdfReadToolResultIndices = mergeableToolResultIndices.filter((index) =>\n startsWithPdfFileRead(toolResults[index]),\n )\n\n const attachmentsByToolResultIndex = new Map<\n number,\n Array<IndexedAttachment>\n >()\n let remainingAttachments = attachments\n let countMatchToolResultIndices = mergeableToolResultIndices\n\n // Match PDF read tool results and documents in order first, then leave any\n // unmatched documents to the generic fallback path below.\n if (documentBlocks.length > 0 && pdfReadToolResultIndices.length > 0) {\n const matchedDocumentCount = Math.min(\n pdfReadToolResultIndices.length,\n documentBlocks.length,\n )\n const matchedDocuments = documentBlocks.slice(0, matchedDocumentCount)\n const matchedDocumentOrders = new Set(\n matchedDocuments.map(({ order }) => order),\n )\n const matchedPdfToolResultIndices = pdfReadToolResultIndices.slice(\n 0,\n matchedDocumentCount,\n )\n const matchedPdfToolResultIndexSet = new Set(matchedPdfToolResultIndices)\n\n assignAttachmentsToToolResults(\n attachmentsByToolResultIndex,\n matchedDocuments,\n {\n toolResultIndices: matchedPdfToolResultIndices,\n },\n )\n countMatchToolResultIndices = mergeableToolResultIndices.filter(\n (index) => !matchedPdfToolResultIndexSet.has(index),\n )\n remainingAttachments = attachments.filter(\n ({ attachment, order }) =>\n attachment.type !== \"document\" || !matchedDocumentOrders.has(order),\n )\n }\n\n // Everything else keeps the existing count-match / last-tool-result fallback.\n assignAttachmentsToToolResults(\n attachmentsByToolResultIndex,\n remainingAttachments,\n {\n toolResultIndices: countMatchToolResultIndices,\n fallbackToolResultIndices: mergeableToolResultIndices,\n },\n )\n\n return mergeAttachmentsIntoToolResults(\n toolResults,\n attachmentsByToolResultIndex,\n )\n}\n\nconst mergeUserMessageContent = (\n content: Array<AnthropicUserContentBlock>,\n): Array<AnthropicUserContentBlock> | null => {\n const mergeableContent = collectMergeableUserContent(content)\n if (!mergeableContent) {\n return null\n }\n\n const { toolResults, textBlocks, attachments } = mergeableContent\n if (\n toolResults.length === 0\n || (textBlocks.length === 0 && attachments.length === 0)\n ) {\n return null\n }\n\n const mergedToolResults =\n textBlocks.length === 0 ?\n toolResults\n : mergeToolResult(toolResults, textBlocks)\n\n return mergeAttachmentsForToolResults(mergedToolResults, attachments)\n}\n\nconst mergeToolResult = (\n toolResults: Array<AnthropicToolResultBlock>,\n textBlocks: Array<AnthropicTextBlock>,\n): Array<AnthropicToolResultBlock> => {\n if (toolResults.length === textBlocks.length) {\n return toolResults.map((tr, i) => mergeContentWithText(tr, textBlocks[i]))\n }\n\n const lastIndex = toolResults.length - 1\n return toolResults.map((tr, i) =>\n i === lastIndex ? mergeContentWithTexts(tr, textBlocks) : tr,\n )\n}\n\nexport const stripToolReferenceTurnBoundary = (\n anthropicPayload: AnthropicMessagesPayload,\n): void => {\n for (const msg of anthropicPayload.messages) {\n if (msg.role !== \"user\" || !Array.isArray(msg.content)) continue\n\n const hasToolReference = msg.content.some(\n (block) => block.type === \"tool_result\" && hasToolRef(block),\n )\n if (!hasToolReference) continue\n\n msg.content = msg.content.filter(\n (block) =>\n block.type !== \"text\"\n || block.text.trim() !== TOOL_REFERENCE_TURN_BOUNDARY,\n )\n }\n}\n\nexport const mergeToolResultForClaude = (\n anthropicPayload: AnthropicMessagesPayload,\n options?: {\n skipLastMessage?: boolean\n },\n): void => {\n const lastMessageIndex = anthropicPayload.messages.length - 1\n\n for (const [index, msg] of anthropicPayload.messages.entries()) {\n if (options?.skipLastMessage && index === lastMessageIndex) continue\n\n if (msg.role !== \"user\" || !Array.isArray(msg.content)) continue\n\n const mergedContent = mergeUserMessageContent(msg.content)\n if (mergedContent) {\n msg.content = mergedContent\n }\n }\n}\n\n// align with vscode copilot claude agent tools\nexport const sanitizeIdeTools = (payload: AnthropicMessagesPayload): void => {\n if (!payload.tools || payload.tools.length === 0) {\n return\n }\n\n payload.tools = payload.tools.flatMap((tool) => {\n if (tool.name === IDE_GET_DIAGNOSTICS_TOOL) {\n return [\n {\n ...tool,\n description: IDE_GET_DIAGNOSTICS_DESCRIPTION,\n },\n ]\n }\n\n return [tool]\n })\n}\n\nconst hasToolRef = (block: AnthropicToolResultBlock) => {\n return (\n Array.isArray(block.content)\n && block.content.some((c) => c.type === \"tool_reference\")\n )\n}\n\n// Strip cache_control from system content blocks as the\n// Copilot Messages API does not support them (rejects extra fields like scope).\n// commit by nicktogo\nconst stripCacheControl = (payload: AnthropicMessagesPayload): void => {\n if (Array.isArray(payload.system)) {\n for (const block of payload.system) {\n const cacheControl = block.cache_control\n if (cacheControl && typeof cacheControl === \"object\") {\n const { scope, ...rest } = cacheControl\n block.cache_control = rest\n }\n }\n }\n}\n\n// Port top-level cache_control onto the last cacheable block as a lossless\n// polyfill, then drop the top-level field.\nconst applyTopLevelCacheControl = (payload: AnthropicMessagesPayload): void => {\n const topLevel = payload.cache_control\n if (!topLevel || typeof topLevel !== \"object\") {\n if (topLevel !== undefined) {\n delete payload.cache_control\n }\n return\n }\n\n delete payload.cache_control\n\n for (let m = payload.messages.length - 1; m >= 0; m--) {\n const message = payload.messages[m]\n\n if (typeof message.content === \"string\") {\n message.content = [\n {\n type: \"text\",\n text: message.content,\n cache_control: { ...topLevel },\n },\n ]\n return\n }\n\n if (!Array.isArray(message.content)) continue\n\n for (let b = message.content.length - 1; b >= 0; b--) {\n const block = message.content[b]\n if (\n block.type !== \"text\"\n && block.type !== \"image\"\n && block.type !== \"tool_use\"\n && block.type !== \"tool_result\"\n ) {\n continue\n }\n block.cache_control ??= { ...topLevel }\n return\n }\n }\n}\n\n// Strip per-tool eager_input_streaming.\nconst stripToolEagerInputStreaming = (\n payload: AnthropicMessagesPayload,\n): void => {\n if (!payload.tools || payload.tools.length === 0) return\n\n for (const tool of payload.tools) {\n const extended = tool as typeof tool & { eager_input_streaming?: unknown }\n if (\"eager_input_streaming\" in extended) {\n delete extended.eager_input_streaming\n }\n }\n}\n\n// Pre-request processing: filter thinking blocks for Claude models so only\n// valid thinking blocks are sent to the Copilot Messages API.\nconst filterAssistantThinkingBlocks = (\n payload: AnthropicMessagesPayload,\n): void => {\n for (const msg of payload.messages) {\n if (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n msg.content = msg.content.filter((block) => {\n if (block.type !== \"thinking\") return true\n // Keep signature-only blocks (empty `thinking` text). On the Anthropic\n // Messages API it is the signature, not the summary text, that carries\n // reasoning continuity across turns, and Copilot's upstream frequently\n // returns thinking blocks with an empty summary. Requiring non-empty\n // text here silently drops those blocks — and their signatures — so the\n // reasoning chain breaks on exactly those turns. The `\"Thinking...\"`\n // placeholder is still excluded: it is a synthetic value this project\n // adds for clients that filter empty text, never real model output.\n return (\n block.thinking !== \"Thinking...\"\n && block.signature\n && !block.signature.includes(\"@\")\n )\n })\n }\n }\n}\n\nexport const appendClaudeContinuationMessage = (\n payload: AnthropicMessagesPayload,\n): void => {\n const lastMessage = payload.messages.at(-1)\n if (payload.model.includes(\"claude\") && lastMessage?.role === \"assistant\") {\n payload.messages.push({\n role: \"user\",\n content: [{ type: \"text\", text: \"Please continue.\" }],\n })\n }\n}\n\nexport const prepareMessagesApiPayload = (\n payload: AnthropicMessagesPayload,\n selectedModel?: Model,\n): void => {\n stripCacheControl(payload)\n applyTopLevelCacheControl(payload)\n stripToolEagerInputStreaming(payload)\n filterAssistantThinkingBlocks(payload)\n\n const hasThinking = Boolean(payload.thinking)\n\n // https://platform.claude.com/docs/en/build-with-claude/extended-thinking#extended-thinking-with-tool-use\n // Using tool_choice: {\"type\": \"any\"} or tool_choice: {\"type\": \"tool\", \"name\": \"...\"} will result in an error because these options force tool use, which is incompatible with extended thinking.\n const toolChoice = payload.tool_choice\n const disableThink = toolChoice?.type === \"any\" || toolChoice?.type === \"tool\"\n\n if (selectedModel?.capabilities.supports.adaptive_thinking && !disableThink) {\n payload.thinking = {\n type: \"adaptive\",\n }\n // align with vscode copilot\n if (!hasThinking) {\n payload.thinking.display = \"summarized\"\n }\n if (shouldSummarizeThinkingDisplayForModel(payload.model)) {\n payload.thinking.display = \"summarized\"\n }\n let effort =\n payload.output_config?.effort ?? getReasoningEffortForModel(payload.model)\n if (effort === \"none\" || effort === \"minimal\") {\n effort = \"low\"\n }\n const reasoningEffort = selectedModel.capabilities.supports.reasoning_effort\n if (reasoningEffort && !reasoningEffort.includes(effort)) {\n effort = reasoningEffort.at(-1) as\n | \"low\"\n | \"medium\"\n | \"high\"\n | \"xhigh\"\n | \"max\"\n }\n payload.output_config = {\n ...payload.output_config,\n effort: effort,\n }\n }\n\n const modelSupports = selectedModel?.capabilities.supports\n if (!modelSupports?.adaptive_thinking) {\n const reasoningEfforts = modelSupports?.reasoning_effort\n if (!reasoningEfforts || reasoningEfforts.length === 0) {\n if (payload.output_config?.effort) {\n delete payload.output_config.effort\n if (Object.keys(payload.output_config).length === 0) {\n delete payload.output_config\n }\n }\n }\n\n if (disableThink) {\n delete payload.thinking\n } else {\n const budgetTokens = modelSupports?.max_thinking_budget ?? 4096\n if (payload.thinking?.type === \"adaptive\") {\n payload.thinking = {\n type: \"enabled\",\n budget_tokens: budgetTokens - 1,\n }\n }\n }\n }\n}\n","import type { Context, Env } from \"hono\"\n\nimport { resolveEffectiveProviderType } from \"~/lib/config\"\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { fromClaudeDiscoveryModelId } from \"~/lib/claude-models\"\nimport { getProviderModelPdfSupport } from \"~/lib/model-pdf-support\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { createFallbackModel } from \"~/lib/provider-model\"\nimport { getTokenCount } from \"~/lib/tokenizer\"\nimport { type AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\nimport { translateToOpenAI } from \"~/routes/messages/completions-translation\"\nimport { normalizeSystemMessages } from \"~/routes/messages/preprocess\"\n\nconst logger = createHandlerLogger(\"provider-count-tokens-handler\")\n\nexport async function handleProviderCountTokens(\n c: Context<Env, \"/:provider\">,\n): Promise<Response> {\n const provider = c.req.param(\"provider\")\n const payload = await c.req.json<AnthropicMessagesPayload>()\n payload.model = fromClaudeDiscoveryModelId(payload.model)\n return await handleProviderCountTokensForProvider(c, { payload, provider })\n}\n\nexport async function handleProviderCountTokensForProvider(\n c: Context,\n options: {\n payload: AnthropicMessagesPayload\n provider: string\n },\n): Promise<Response> {\n const { payload: anthropicPayload, provider } = options\n normalizeSystemMessages(anthropicPayload)\n const modelId = anthropicPayload.model.trim()\n\n const providerConfig = await resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n const modelConfig = providerConfig.models?.[modelId]\n const effectiveType = resolveEffectiveProviderType(providerConfig, modelId)\n const openAIPayload = translateToOpenAI(anthropicPayload, {\n supportPdf: getProviderModelPdfSupport(modelId, providerConfig),\n ...(effectiveType === \"openai-compatible\" && {\n toolContentSupportType: modelConfig?.toolContentSupportType ?? [],\n }),\n })\n\n const selectedModel = createFallbackModel(modelId)\n\n const tokenCount = await getTokenCount(openAIPayload, selectedModel)\n const finalTokenCount = tokenCount.input + tokenCount.output\n\n logger.debug(\"provider.count_tokens.success\", {\n provider,\n model: anthropicPayload.model,\n input_tokens: finalTokenCount,\n })\n\n return c.json({\n input_tokens: finalTokenCount,\n })\n}\n","import type { Context } from \"hono\"\n\nimport consola from \"consola\"\n\nimport {\n getAnthropicApiKey,\n getClaudeTokenMultiplier,\n getRawProviderConfig,\n resolveMappedModel,\n} from \"~/lib/config\"\nimport { GITHUB_COPILOT_PROVIDER } from \"~/lib/github-copilot-provider\"\nimport { getProviderModelPdfSupport } from \"~/lib/model-pdf-support\"\nimport { createFallbackModel } from \"~/lib/provider-model\"\nimport { fromClaudeDiscoveryModelId } from \"~/lib/claude-models\"\nimport { resolveConfiguredProviderModelAlias } from \"~/lib/provider-resolver\"\nimport { getTokenCount } from \"~/lib/tokenizer\"\nimport { handleProviderCountTokensForProvider } from \"~/routes/provider/messages/count-tokens-handler\"\nimport { type Model } from \"~/lib/types/models\"\n\nimport { findEndpointModel } from \"../../lib/models\"\nimport { type AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\nimport { translateToOpenAI } from \"./completions-translation\"\nimport { normalizeSystemMessages } from \"./preprocess\"\n\nexport const resolveCountTokensModel = (\n modelId: string,\n findModel: (sdkModelId: string) => Model | undefined = findEndpointModel,\n): { fallback: boolean; model: Model } => {\n const selectedModel = findModel(modelId)\n if (selectedModel) {\n return {\n fallback: false,\n model: selectedModel,\n }\n }\n\n return {\n fallback: true,\n model: createFallbackModel(modelId.trim()),\n }\n}\n\n/**\n * Forwards token counting to Anthropic's real /v1/messages/count_tokens endpoint.\n * Returns the result on success, or null to fall through to estimation.\n */\nasync function countTokensViaAnthropic(\n c: Context,\n payload: AnthropicMessagesPayload,\n): Promise<Response | null> {\n if (!payload.model.startsWith(\"claude\")) return null\n\n const apiKey = getAnthropicApiKey()\n if (!apiKey) return null\n\n // Copilot uses dotted names (claude-opus-4.6) but Anthropic requires dashes (claude-opus-4-6)\n const model = payload.model.replaceAll(\".\", \"-\")\n\n const res = await fetch(\n \"https://api.anthropic.com/v1/messages/count_tokens\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"token-counting-2024-11-01\",\n },\n body: JSON.stringify({ ...payload, model }),\n },\n )\n\n if (!res.ok) {\n consola.warn(\n \"Anthropic count_tokens failed:\",\n res.status,\n await res.text().catch(() => \"\"),\n \"- falling back to estimation\",\n )\n return null\n }\n\n const result = (await res.json()) as { input_tokens: number }\n consola.info(\"Token count (Anthropic API):\", result.input_tokens)\n return c.json(result)\n}\n\n/**\n * Handles token counting for Anthropic messages.\n *\n * When an Anthropic API key is available (via config or ANTHROPIC_API_KEY env var)\n * and the model is a Claude model, forwards to Anthropic's free /v1/messages/count_tokens\n * endpoint for accurate counts. Otherwise falls back to GPT tokenizer estimation.\n */\nexport async function handleCountTokens(c: Context) {\n const anthropicPayload = await c.req.json<AnthropicMessagesPayload>()\n anthropicPayload.model = resolveMappedModel(\n fromClaudeDiscoveryModelId(anthropicPayload.model),\n )\n normalizeSystemMessages(anthropicPayload)\n\n const providerModelAlias = await resolveConfiguredProviderModelAlias(\n anthropicPayload.model,\n )\n if (providerModelAlias) {\n anthropicPayload.model = providerModelAlias.model\n return await handleProviderCountTokensForProvider(c, {\n payload: anthropicPayload,\n provider: providerModelAlias.provider,\n })\n }\n\n // Try Anthropic's real endpoint first (Claude models only)\n const anthropicResult = await countTokensViaAnthropic(c, anthropicPayload)\n if (anthropicResult) return anthropicResult\n\n // Fallback: GPT tokenizer estimation (also used for non-Claude models)\n const anthropicBeta = c.req.header(\"anthropic-beta\")\n\n const requestedModel = anthropicPayload.model\n const resolve = resolveCountTokensModel(requestedModel)\n\n const selectedModel = resolve.model\n anthropicPayload.model = selectedModel.id\n\n const openAIPayload = translateToOpenAI(anthropicPayload, {\n supportPdf: getProviderModelPdfSupport(\n requestedModel,\n {\n ...getRawProviderConfig(GITHUB_COPILOT_PROVIDER),\n name: GITHUB_COPILOT_PROVIDER,\n },\n selectedModel,\n ),\n })\n\n if (resolve.fallback) {\n consola.warn(\n `Model '${requestedModel}' not found, using o200k_base fallback tokenizer`,\n )\n }\n\n const tokenCount = await getTokenCount(openAIPayload, selectedModel)\n\n if (anthropicPayload.tools && anthropicPayload.tools.length > 0) {\n let addToolSystemPromptCount = false\n if (anthropicBeta) {\n const toolsLength = anthropicPayload.tools.length\n addToolSystemPromptCount = !anthropicPayload.tools.some(\n (tool) =>\n tool.name.startsWith(\"mcp__\")\n || (tool.name === \"Skill\" && toolsLength === 1),\n )\n }\n if (addToolSystemPromptCount) {\n if (anthropicPayload.model.startsWith(\"claude\")) {\n // https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/overview#pricing\n tokenCount.input = tokenCount.input + 346\n } else if (anthropicPayload.model.startsWith(\"grok\")) {\n tokenCount.input = tokenCount.input + 120\n }\n }\n }\n\n let finalTokenCount = tokenCount.input + tokenCount.output\n if (anthropicPayload.model.startsWith(\"claude\")) {\n finalTokenCount = Math.round(finalTokenCount * getClaudeTokenMultiplier())\n }\n\n consola.info(\"Token count:\", finalTokenCount)\n\n return c.json({\n input_tokens: finalTokenCount,\n })\n}\n","import consola from \"consola\"\n\nconst codexRateLimitScopes = [\"primary\", \"secondary\"] as const\n\ninterface CodexRateLimitWindow {\n reset_after_seconds: number\n reset_at: number\n used_percent: number\n window_minutes: number\n}\n\nexport const formatCodexRateLimitResetAt = (resetAt: number): string => {\n const date = new Date(resetAt * 1000)\n return Number.isNaN(date.getTime()) ? String(resetAt) : date.toLocaleString()\n}\n\nexport const logCodexRateLimitsEvent = (event: unknown): void => {\n if (!event || typeof event !== \"object\") {\n return\n }\n\n const eventRecord = event as Record<string, unknown>\n if (eventRecord.type !== \"codex.rate_limits\") {\n return\n }\n\n const rateLimits = eventRecord.rate_limits\n if (!rateLimits || typeof rateLimits !== \"object\") {\n return\n }\n\n const planType =\n typeof eventRecord.plan_type === \"string\" ? eventRecord.plan_type : null\n const rateLimitRecord = rateLimits as Record<string, unknown>\n const allowed =\n typeof rateLimitRecord.allowed === \"boolean\" ?\n rateLimitRecord.allowed\n : null\n const limitReached =\n typeof rateLimitRecord.limit_reached === \"boolean\" ?\n rateLimitRecord.limit_reached\n : null\n\n for (const scope of codexRateLimitScopes) {\n const window = rateLimitRecord[scope]\n if (!isCodexRateLimitWindow(window)) {\n continue\n }\n\n const summary: Array<string> = []\n if (allowed !== null) {\n summary.push(`allowed=${allowed}`)\n }\n if (limitReached !== null) {\n summary.push(`limit_reached=${limitReached}`)\n }\n summary.push(\n `used=${window.used_percent}%`,\n `reset_at=${formatCodexRateLimitResetAt(window.reset_at)}`,\n )\n\n const label =\n planType ?\n `Codex ${scope} rate limit (${planType})`\n : `Codex ${scope} rate limit`\n consola.log(`${label}: ${summary.join(\", \")}`)\n }\n}\n\nconst isCodexRateLimitWindow = (\n value: unknown,\n): value is CodexRateLimitWindow => {\n if (!value || typeof value !== \"object\") {\n return false\n }\n\n const record = value as Record<string, unknown>\n return (\n typeof record.reset_after_seconds === \"number\"\n && typeof record.reset_at === \"number\"\n && typeof record.used_percent === \"number\"\n && typeof record.window_minutes === \"number\"\n )\n}\n","import {\n type ChatCompletionChunk,\n type Choice,\n type Delta,\n} from \"~/lib/types/chat-completions\"\n\nimport {\n type AnthropicMessageDeltaEvent,\n type AnthropicStreamEventData,\n type AnthropicStreamState,\n} from \"~/lib/types/anthropic\"\nimport { mapOpenAIStopReasonToAnthropic } from \"./utils\"\n\nfunction isToolBlockOpen(state: AnthropicStreamState): boolean {\n if (!state.contentBlockOpen) {\n return false\n }\n // Check if the current block index corresponds to any known tool call\n return Object.values(state.toolCalls).some(\n (tc) => tc.anthropicBlockIndex === state.contentBlockIndex,\n )\n}\n\nexport function translateChunkToAnthropicEvents(\n chunk: ChatCompletionChunk,\n state: AnthropicStreamState,\n): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n\n if (chunk.choices.length === 0) {\n // Empty-choices chunks without usage are metadata-only events (e.g.\n // inference cost) that may arrive before the final usage chunk. Only\n // complete the pending message when usage is present; otherwise wait\n // for the usage chunk or the final stream flush.\n if (chunk.usage) {\n completePendingMessage(state, events, chunk)\n }\n return events\n }\n\n const choice = chunk.choices[0]\n const { delta } = choice\n\n handleMessageStart(state, events, chunk)\n\n handleThinkingText(delta, state, events)\n\n handleContent(delta, state, events)\n\n handleToolCalls(delta, state, events)\n\n handleFinish(choice, state, { events, chunk })\n\n return events\n}\n\nexport function flushPendingAnthropicStreamEvents(\n state: AnthropicStreamState,\n): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n completePendingMessage(state, events)\n return events\n}\n\nfunction completePendingMessage(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n chunk?: ChatCompletionChunk,\n): void {\n if (!state.pendingMessageDelta) {\n return\n }\n\n if (chunk?.usage) {\n state.pendingMessageDelta.usage = getAnthropicUsageFromOpenAIChunk(chunk)\n }\n\n events.push(state.pendingMessageDelta, {\n type: \"message_stop\",\n })\n state.pendingMessageDelta = undefined\n state.messageCompleted = true\n}\n\nfunction handleFinish(\n choice: Choice,\n state: AnthropicStreamState,\n context: {\n events: Array<AnthropicStreamEventData>\n chunk: ChatCompletionChunk\n },\n) {\n const { events, chunk } = context\n if (choice.finish_reason && choice.finish_reason.length > 0) {\n if (state.contentBlockOpen) {\n const toolBlockOpen = isToolBlockOpen(state)\n context.events.push({\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n })\n state.contentBlockOpen = false\n state.contentBlockIndex++\n if (!toolBlockOpen) {\n handleReasoningOpaque(choice.delta, events, state)\n }\n }\n\n flushDeferredContent(state, events)\n\n state.pendingMessageDelta = {\n type: \"message_delta\",\n delta: {\n stop_reason: mapOpenAIStopReasonToAnthropic(choice.finish_reason),\n stop_sequence: null,\n },\n usage: getAnthropicUsageFromOpenAIChunk(chunk),\n }\n if (chunk.usage) {\n completePendingMessage(state, events, chunk)\n }\n }\n}\n\nfunction getAnthropicUsageFromOpenAIChunk(\n chunk: ChatCompletionChunk,\n): NonNullable<AnthropicMessageDeltaEvent[\"usage\"]> {\n const { cachedTokens, cacheCreationTokens, inputTokens } =\n getOpenAIChunkUsageTokens(chunk)\n\n return {\n input_tokens: inputTokens,\n output_tokens: chunk.usage?.completion_tokens ?? 0,\n ...(chunk.usage?.prompt_tokens_details?.cache_creation_input_tokens\n !== undefined && {\n cache_creation_input_tokens: cacheCreationTokens,\n }),\n ...(chunk.usage?.prompt_tokens_details?.cached_tokens !== undefined && {\n cache_read_input_tokens: cachedTokens,\n }),\n }\n}\n\nfunction getOpenAIChunkUsageTokens(chunk: ChatCompletionChunk): {\n cacheCreationTokens: number\n cachedTokens: number\n inputTokens: number\n} {\n const promptTokens = chunk.usage?.prompt_tokens ?? 0\n const cachedTokens = chunk.usage?.prompt_tokens_details?.cached_tokens ?? 0\n const cacheCreationTokens =\n chunk.usage?.prompt_tokens_details?.cache_creation_input_tokens ?? 0\n\n return {\n cacheCreationTokens,\n cachedTokens,\n inputTokens: Math.max(0, promptTokens - cachedTokens - cacheCreationTokens),\n }\n}\n\nfunction handleToolCalls(\n delta: Delta,\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n) {\n if (delta.tool_calls && delta.tool_calls.length > 0) {\n closeThinkingBlockIfOpen(state, events)\n\n handleReasoningOpaqueInToolCalls(state, events, delta)\n\n for (const toolCall of delta.tool_calls) {\n if (toolCall.id && toolCall.function?.name) {\n // New tool call starting.\n if (state.contentBlockOpen) {\n // Close any previously open block.\n events.push({\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n })\n state.contentBlockIndex++\n state.contentBlockOpen = false\n }\n\n const anthropicBlockIndex = state.contentBlockIndex\n state.toolCalls[toolCall.index] = {\n id: toolCall.id,\n name: toolCall.function.name,\n anthropicBlockIndex,\n }\n\n events.push({\n type: \"content_block_start\",\n index: anthropicBlockIndex,\n content_block: {\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.function.name,\n input: {},\n },\n })\n state.contentBlockOpen = true\n }\n\n if (toolCall.function?.arguments) {\n const toolCallInfo = state.toolCalls[toolCall.index]\n // Tool call can still be empty\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (toolCallInfo) {\n events.push({\n type: \"content_block_delta\",\n index: toolCallInfo.anthropicBlockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: toolCall.function.arguments,\n },\n })\n }\n }\n }\n }\n}\n\nfunction handleReasoningOpaqueInToolCalls(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n delta: Delta,\n) {\n if (state.contentBlockOpen && !isToolBlockOpen(state)) {\n events.push({\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n })\n state.contentBlockIndex++\n state.contentBlockOpen = false\n }\n handleReasoningOpaque(delta, events, state)\n}\n\nfunction handleContent(\n delta: Delta,\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n) {\n if (delta.content && delta.content.length > 0) {\n closeThinkingBlockIfOpen(state, events)\n\n if (isToolBlockOpen(state)) {\n state.deferredContent = `${state.deferredContent ?? \"\"}${delta.content}`\n return\n }\n\n if (!state.contentBlockOpen) {\n events.push({\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"text\",\n text: \"\",\n },\n })\n state.contentBlockOpen = true\n }\n\n events.push({\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"text_delta\",\n text: delta.content,\n },\n })\n }\n\n // handle for claude model\n if (\n delta.content === \"\"\n && delta.reasoning_opaque\n && delta.reasoning_opaque.length > 0\n && state.thinkingBlockOpen\n ) {\n events.push(\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"signature_delta\",\n signature: delta.reasoning_opaque,\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.contentBlockIndex++\n state.thinkingBlockOpen = false\n }\n}\n\nfunction flushDeferredContent(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n): void {\n if (!state.deferredContent) {\n return\n }\n\n if (!state.contentBlockOpen) {\n events.push({\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"text\",\n text: \"\",\n },\n })\n state.contentBlockOpen = true\n }\n\n events.push(\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"text_delta\",\n text: state.deferredContent,\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.deferredContent = undefined\n state.contentBlockOpen = false\n state.contentBlockIndex++\n}\n\nfunction handleMessageStart(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n chunk: ChatCompletionChunk,\n) {\n if (!state.messageStartSent) {\n const { cachedTokens, cacheCreationTokens, inputTokens } =\n getOpenAIChunkUsageTokens(chunk)\n\n events.push({\n type: \"message_start\",\n message: {\n id: chunk.id,\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: chunk.model,\n stop_reason: null,\n stop_sequence: null,\n usage: {\n input_tokens: inputTokens,\n output_tokens: 0, // Will be updated in message_delta when finished\n ...(chunk.usage?.prompt_tokens_details?.cache_creation_input_tokens\n !== undefined && {\n cache_creation_input_tokens: cacheCreationTokens,\n }),\n ...(chunk.usage?.prompt_tokens_details?.cached_tokens\n !== undefined && {\n cache_read_input_tokens: cachedTokens,\n }),\n },\n },\n })\n state.messageStartSent = true\n }\n}\n\nfunction handleReasoningOpaque(\n delta: Delta,\n events: Array<AnthropicStreamEventData>,\n state: AnthropicStreamState,\n) {\n if (delta.reasoning_opaque && delta.reasoning_opaque.length > 0) {\n events.push(\n {\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"thinking\",\n thinking: \"\",\n },\n },\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: \"\",\n },\n },\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"signature_delta\",\n signature: delta.reasoning_opaque,\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.contentBlockIndex++\n }\n}\n\nfunction handleThinkingText(\n delta: Delta,\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n) {\n const reasoningText =\n delta.reasoning_text ?? delta.reasoning_content ?? delta.reasoning\n if (reasoningText && reasoningText.length > 0) {\n // compatible with copilot API returning content->reasoning_text->reasoning_opaque in different deltas\n // this is an extremely abnormal situation, probably a server-side bug\n // only occurs in the claude model, with a very low probability of occurrence\n if (state.contentBlockOpen) {\n delta.content = reasoningText\n delta.reasoning_text = undefined\n delta.reasoning_content = undefined\n delta.reasoning = undefined\n return\n }\n\n if (!state.thinkingBlockOpen) {\n events.push({\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"thinking\",\n thinking: \"\",\n },\n })\n state.thinkingBlockOpen = true\n }\n\n events.push({\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: reasoningText,\n },\n })\n }\n}\n\nfunction closeThinkingBlockIfOpen(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n): void {\n if (state.thinkingBlockOpen) {\n events.push(\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"signature_delta\",\n signature: \"\",\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.contentBlockIndex++\n state.thinkingBlockOpen = false\n }\n}\n\nexport function translateErrorToAnthropicErrorEvent(): AnthropicStreamEventData {\n return {\n type: \"error\",\n error: {\n type: \"api_error\",\n message:\n \"An unexpected error occurred during streaming, retry your request.\",\n },\n }\n}\n","import consola from \"consola\"\n\nimport {\n BRIDGE_TOOL_SEARCH_NAME,\n formatToolSearchBridgeArguments,\n isBridgeToolSearchName,\n isDeferredToolName,\n listDeferredToolNames,\n normalizeToolSearchBridgeArguments,\n parseMcpToolSearchSentinel,\n selectDeferredToolsByNames,\n shouldEnableResponsesToolSearch,\n} from \"~/lib/tool-search\"\nimport { HTTPError } from \"~/lib/error\"\nimport {\n getExtraPromptForModel,\n getReasoningEffortForModel,\n isGpt56OrAbove,\n} from \"~/lib/config\"\nimport { getPromptCacheKey } from \"~/lib/utils\"\nimport {\n type ResponsesPayload,\n type ResponseInputCompaction,\n type ResponseInputContent,\n type ResponseInputFile,\n type ResponseInputImage,\n type ResponseInputItem,\n type ResponseInputMessage,\n type ResponseInputReasoning,\n type ResponseInputText,\n type ResponsesResult,\n type ResponseOutputContentBlock,\n type ResponseOutputCompaction,\n type ResponseOutputFunctionCall,\n type ResponseOutputToolSearchCall,\n type ResponseOutputItem,\n type ResponseOutputReasoning,\n type ResponseReasoningBlock,\n type ResponseOutputRefusal,\n type ResponseOutputText,\n type ResponseFunctionToolCallItem,\n type ResponseFunctionCallOutputItem,\n type ResponseToolSearchCallItem,\n type ResponseToolSearchOutputItem,\n type Tool,\n type ToolChoiceFunction,\n type ToolChoiceOptions,\n} from \"~/lib/types/responses\"\n\nimport {\n type AnthropicAssistantContentBlock,\n type AnthropicAssistantMessage,\n type AnthropicDocumentBlock,\n type AnthropicResponse,\n type AnthropicImageBlock,\n type AnthropicInputMessage,\n type AnthropicMessagesPayload,\n type AnthropicSystemMessage,\n type AnthropicTextBlock,\n type AnthropicThinkingBlock,\n type AnthropicTool,\n type AnthropicToolResultContentBlock,\n type AnthropicToolResultBlock,\n type AnthropicToolUseBlock,\n type AnthropicUserContentBlock,\n type AnthropicUserMessage,\n} from \"~/lib/types/anthropic\"\nimport { normalizeToolSchema, THINKING_TEXT } from \"./completions-translation\"\n\nconst MESSAGE_TYPE = \"message\"\nconst COMPACTION_SIGNATURE_PREFIX = \"cm1#\"\nconst COMPACTION_SIGNATURE_SEPARATOR = \"@\"\n\nexport { THINKING_TEXT }\nexport const REASONING_SUMMARY_SEPARATOR = \"\\u00A0\\n\\n\"\nconst REASONING_SUMMARY_SEPARATOR_PATTERN = /\\u00a0\\n\\n|\\u2063\\n\\n/\n\nconst resolveReasoningEffort = (payload: AnthropicMessagesPayload) =>\n payload.output_config?.effort ?? getReasoningEffortForModel(payload.model)\n\nexport const translateAnthropicMessagesToResponsesPayload = (\n payload: AnthropicMessagesPayload,\n): ResponsesPayload => {\n const input: Array<ResponseInputItem> = []\n const applyPhase = shouldApplyPhase(payload.model)\n const toolSearchEnabled = shouldEnableResponsesToolSearch({\n model: payload.model,\n tools: payload.tools,\n })\n const translationState: TranslationState = {\n originalTools: payload.tools ?? [],\n toolSearchEnabled,\n toolUseNameById: new Map(),\n }\n\n for (const message of payload.messages) {\n input.push(\n ...translateMessage(message, payload.model, applyPhase, translationState),\n )\n }\n\n const hasOriginalTools =\n Array.isArray(payload.tools) && payload.tools.length > 0\n const translatedTools = convertAnthropicTools(\n payload.tools,\n toolSearchEnabled,\n )\n const toolChoice = convertAnthropicToolChoice(\n payload.tool_choice,\n toolSearchEnabled,\n )\n\n // Remove safetyIdentifier to align with vscode copilot\n const promptCacheKey = getPromptCacheKey(payload)\n\n const responsesPayload: ResponsesPayload = {\n model: payload.model,\n input,\n instructions: translateSystemPrompt(payload.system, payload.model),\n temperature: 1, // reasoning high temperature fixed to 1\n top_p: payload.top_p ?? null,\n max_output_tokens: Math.max(payload.max_tokens, 12800),\n tools: translatedTools,\n metadata: payload.metadata ? { ...payload.metadata } : null,\n //prompt_cache_retention: \"24h\", not work in gpt-5.4\n stream: payload.stream ?? null,\n store: false,\n parallel_tool_calls: !payload.tool_choice?.disable_parallel_tool_use,\n reasoning: {\n effort: resolveReasoningEffort(payload),\n summary: payload.model.includes(\"grok\") ? \"concise\" : \"auto\",\n context: isSupportAllTurns(payload) ? \"all_turns\" : \"auto\",\n },\n include: [\"reasoning.encrypted_content\"],\n }\n\n // Copilot /responses rejects tool_choice when no tools were translated.\n if (translatedTools && translatedTools.length > 0) {\n responsesPayload.tool_choice = toolChoice\n }\n\n if (hasOriginalTools) {\n responsesPayload.prompt_cache_key = promptCacheKey\n }\n\n // grok meatadata is not supported\n if (responsesPayload.model.includes(\"grok\")) {\n delete responsesPayload.metadata\n delete responsesPayload.temperature\n delete responsesPayload.top_p\n // Match Grok Build: omit the output limit and use upstream defaults.\n delete responsesPayload.max_output_tokens\n if (responsesPayload.instructions) {\n input.unshift(createMessage(\"system\", responsesPayload.instructions))\n }\n delete responsesPayload.instructions\n }\n\n return responsesPayload\n}\n\ninterface TranslationState {\n originalTools: Array<AnthropicTool>\n toolSearchEnabled: boolean\n toolUseNameById: Map<string, string>\n}\n\ntype CompactionCarrier = {\n id: string\n encrypted_content: string\n}\n\nexport const encodeCompactionCarrierSignature = (\n compaction: CompactionCarrier,\n): string => {\n return `${COMPACTION_SIGNATURE_PREFIX}${compaction.encrypted_content}${COMPACTION_SIGNATURE_SEPARATOR}${compaction.id}`\n}\n\nexport const decodeCompactionCarrierSignature = (\n signature: string,\n): CompactionCarrier | undefined => {\n if (signature.startsWith(COMPACTION_SIGNATURE_PREFIX)) {\n const raw = signature.slice(COMPACTION_SIGNATURE_PREFIX.length)\n const separatorIndex = raw.indexOf(COMPACTION_SIGNATURE_SEPARATOR)\n\n if (separatorIndex <= 0 || separatorIndex === raw.length - 1) {\n return undefined\n }\n\n const encrypted_content = raw.slice(0, separatorIndex)\n const id = raw.slice(separatorIndex + 1)\n\n if (!encrypted_content) {\n return undefined\n }\n\n return {\n id,\n encrypted_content,\n }\n }\n\n return undefined\n}\n\nconst translateMessage = (\n message: AnthropicInputMessage,\n model: string,\n applyPhase: boolean,\n state: TranslationState,\n): Array<ResponseInputItem> => {\n if (message.role === \"user\") {\n return translateUserMessage(message, state)\n }\n\n if (message.role === \"system\") {\n return translateSystemMessage(message)\n }\n\n return translateAssistantMessage(message, model, applyPhase, state)\n}\n\nconst translateSystemMessage = (\n message: AnthropicSystemMessage,\n): Array<ResponseInputItem> => {\n if (typeof message.content === \"string\") {\n return [createMessage(\"developer\", message.content)]\n }\n\n const content = message.content.map((block) => createTextContent(block.text))\n return content.length > 0 ? [createMessage(\"developer\", content)] : []\n}\n\nconst translateUserMessage = (\n message: AnthropicUserMessage,\n state: TranslationState,\n): Array<ResponseInputItem> => {\n if (typeof message.content === \"string\") {\n return [createMessage(\"user\", message.content)]\n }\n\n if (!Array.isArray(message.content)) {\n return []\n }\n\n const items: Array<ResponseInputItem> = []\n const pendingContent: Array<ResponseInputContent> = []\n\n for (const block of message.content) {\n if (block.type === \"tool_result\") {\n flushPendingContent(pendingContent, items, { role: \"user\" })\n items.push(createToolCallOutput(block, state))\n continue\n }\n\n const converted = translateUserContentBlock(block)\n if (converted.length > 0) {\n pendingContent.push(...converted)\n }\n }\n\n flushPendingContent(pendingContent, items, { role: \"user\" })\n\n return items\n}\n\nconst translateAssistantMessage = (\n message: AnthropicAssistantMessage,\n model: string,\n applyPhase: boolean,\n state: TranslationState,\n): Array<ResponseInputItem> => {\n const assistantPhase = resolveAssistantPhase(\n model,\n message.content,\n applyPhase,\n )\n\n if (typeof message.content === \"string\") {\n return [createMessage(\"assistant\", message.content, assistantPhase)]\n }\n\n if (!Array.isArray(message.content)) {\n return []\n }\n\n const items: Array<ResponseInputItem> = []\n const pendingContent: Array<ResponseInputContent> = []\n\n for (const block of message.content) {\n if (block.type === \"tool_use\") {\n state.toolUseNameById.set(block.id, block.name)\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n items.push(createToolCall(block, state))\n continue\n }\n\n if (block.type === \"thinking\" && block.signature) {\n const compactionContent = createCompactionContent(block)\n if (compactionContent) {\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n items.push(compactionContent)\n continue\n }\n\n if (block.signature.includes(\"@\")) {\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n items.push(createReasoningContent(block))\n continue\n }\n }\n\n const converted = translateAssistantContentBlock(block)\n if (converted) {\n pendingContent.push(converted)\n }\n }\n\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n\n return items\n}\n\nconst translateUserContentBlock = (\n block: AnthropicUserContentBlock,\n): Array<ResponseInputContent> => {\n switch (block.type) {\n case \"text\": {\n return [createTextContent(block.text)]\n }\n case \"image\": {\n return [createImageContent(block)]\n }\n case \"document\": {\n return [createFileContent(block)]\n }\n default: {\n return []\n }\n }\n}\n\nconst translateAssistantContentBlock = (\n block: AnthropicAssistantContentBlock,\n): ResponseInputContent | undefined => {\n switch (block.type) {\n case \"text\": {\n return createOutPutTextContent(block.text)\n }\n default: {\n return undefined\n }\n }\n}\n\nconst flushPendingContent = (\n pendingContent: Array<ResponseInputContent>,\n target: Array<ResponseInputItem>,\n message: Pick<ResponseInputMessage, \"role\" | \"phase\">,\n) => {\n if (pendingContent.length === 0) {\n return\n }\n\n const messageContent = [...pendingContent]\n\n target.push(createMessage(message.role, messageContent, message.phase))\n pendingContent.length = 0\n}\n\nconst createMessage = (\n role: ResponseInputMessage[\"role\"],\n content: string | Array<ResponseInputContent>,\n phase?: ResponseInputMessage[\"phase\"],\n): ResponseInputMessage => ({\n type: MESSAGE_TYPE,\n role,\n content,\n ...(role === \"assistant\" && phase ? { phase } : {}),\n})\n\nconst resolveAssistantPhase = (\n _model: string,\n content: AnthropicAssistantMessage[\"content\"],\n applyPhase: boolean,\n): ResponseInputMessage[\"phase\"] | undefined => {\n if (!applyPhase) {\n return undefined\n }\n\n if (typeof content === \"string\") {\n return \"final_answer\"\n }\n\n if (!Array.isArray(content)) {\n return undefined\n }\n\n const hasText = content.some((block) => block.type === \"text\")\n if (!hasText) {\n return undefined\n }\n\n const hasToolUse = content.some((block) => block.type === \"tool_use\")\n return hasToolUse ? \"commentary\" : \"final_answer\"\n}\n\nconst shouldApplyPhase = (_model: string): boolean => {\n return true\n}\n\nconst createTextContent = (text: string): ResponseInputText => ({\n type: \"input_text\",\n text,\n})\n\nconst createOutPutTextContent = (text: string): ResponseInputText => ({\n type: \"output_text\",\n text,\n})\n\nconst createImageContent = (\n block: AnthropicImageBlock,\n): ResponseInputImage => ({\n type: \"input_image\",\n image_url: `data:${block.source.media_type};base64,${block.source.data}`,\n detail: \"auto\",\n})\n\nconst createFileContent = (\n block: AnthropicDocumentBlock,\n): ResponseInputFile => ({\n type: \"input_file\",\n file_data: `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.title ?? \"document.pdf\",\n})\n\nconst createReasoningContent = (\n block: AnthropicThinkingBlock,\n): ResponseInputReasoning => {\n // align with vscode-copilot-chat extractThinkingData, should add id\n // https://github.com/microsoft/vscode/blob/1.128.0/extensions/copilot/src/platform/endpoint/node/responsesApi.ts#L651\n const { encryptedContent, id } = parseReasoningSignature(block.signature)\n const thinking = block.thinking === THINKING_TEXT ? \"\" : block.thinking\n\n return {\n id,\n type: \"reasoning\",\n summary: createReasoningSummary(thinking),\n encrypted_content: encryptedContent,\n }\n}\n\nconst createReasoningSummary = (\n thinking: string,\n): ResponseInputReasoning[\"summary\"] => {\n if (thinking.length === 0) {\n return []\n }\n\n if (!REASONING_SUMMARY_SEPARATOR_PATTERN.test(thinking)) {\n return [{ type: \"summary_text\", text: thinking }]\n }\n\n return thinking.split(REASONING_SUMMARY_SEPARATOR_PATTERN).map((text) => ({\n type: \"summary_text\",\n text,\n }))\n}\n\nconst createCompactionContent = (\n block: AnthropicThinkingBlock,\n): ResponseInputCompaction | undefined => {\n const compaction = decodeCompactionCarrierSignature(block.signature)\n if (!compaction) {\n return undefined\n }\n\n return {\n id: compaction.id,\n type: \"compaction\",\n encrypted_content: compaction.encrypted_content,\n }\n}\n\nconst parseReasoningSignature = (\n signature: string,\n): { encryptedContent: string; id: string } => {\n const splitIndex = signature.lastIndexOf(\"@\")\n\n if (splitIndex <= 0 || splitIndex === signature.length - 1) {\n return { encryptedContent: signature, id: \"\" }\n }\n\n return {\n encryptedContent: signature.slice(0, splitIndex),\n id: signature.slice(splitIndex + 1),\n }\n}\n\nconst createFunctionToolCall = (\n block: AnthropicToolUseBlock,\n state: TranslationState,\n): ResponseFunctionToolCallItem => ({\n type: \"function_call\",\n call_id: block.id,\n name: block.name,\n arguments: JSON.stringify(block.input),\n status: \"completed\",\n ...(state.toolSearchEnabled && isDeferredToolName(block.name) ?\n { namespace: block.name }\n : {}),\n})\n\nconst createToolSearchCall = (\n block: AnthropicToolUseBlock,\n): ResponseToolSearchCallItem => ({\n type: \"tool_search_call\",\n call_id: block.id,\n arguments: normalizeToolSearchBridgeArguments(block.input),\n execution: \"client\",\n status: \"completed\",\n})\n\nconst createToolCall = (\n block: AnthropicToolUseBlock,\n state: TranslationState,\n): ResponseFunctionToolCallItem | ResponseToolSearchCallItem => {\n if (state.toolSearchEnabled && isBridgeToolSearchName(block.name)) {\n return createToolSearchCall(block)\n }\n\n return createFunctionToolCall(block, state)\n}\n\nconst createFunctionCallOutput = (\n block: AnthropicToolResultBlock,\n): ResponseFunctionCallOutputItem => ({\n type: \"function_call_output\",\n call_id: block.tool_use_id,\n output: convertToolResultContent(block.content),\n status: block.is_error ? \"incomplete\" : \"completed\",\n})\n\nconst createToolCallOutput = (\n block: AnthropicToolResultBlock,\n state: TranslationState,\n): ResponseFunctionCallOutputItem | ResponseToolSearchOutputItem => {\n const toolUseName = state.toolUseNameById.get(block.tool_use_id)\n if (state.toolSearchEnabled && isBridgeToolSearchName(toolUseName ?? \"\")) {\n return createToolSearchOutput(block, state.originalTools)\n }\n\n return createFunctionCallOutput(block)\n}\n\nconst createToolSearchOutput = (\n block: AnthropicToolResultBlock,\n originalTools: Array<AnthropicTool>,\n): ResponseToolSearchOutputItem => {\n const referencedToolNames = resolveToolSearchReferencedToolNames(\n block.content,\n originalTools,\n )\n\n return {\n type: \"tool_search_output\",\n call_id: block.tool_use_id,\n tools: referencedToolNames.map((toolName) =>\n convertDeferredToolToNamespace(\n resolveDeferredTool(toolName, originalTools),\n ),\n ),\n execution: \"client\",\n status: block.is_error ? \"incomplete\" : \"completed\",\n }\n}\n\nconst resolveToolSearchReferencedToolNames = (\n content: string | Array<AnthropicToolResultContentBlock>,\n originalTools: Array<AnthropicTool>,\n): Array<string> => {\n const explicitReferences = extractToolReferenceNames(content)\n if (explicitReferences.length > 0) {\n return uniqueToolNames(explicitReferences)\n }\n\n const sentinel = extractMcpToolSearchSentinel(content)\n if (sentinel) {\n return selectDeferredToolsByNames(sentinel.names, originalTools).map(\n (tool) => tool.name,\n )\n }\n\n return []\n}\n\nconst extractToolReferenceNames = (\n content: string | Array<AnthropicToolResultContentBlock>,\n): Array<string> => {\n if (!Array.isArray(content)) {\n return []\n }\n\n return content.flatMap((block) =>\n block.type === \"tool_reference\" ? [block.tool_name] : [],\n )\n}\n\nconst extractMcpToolSearchSentinel = (\n content: string | Array<AnthropicToolResultContentBlock>,\n) => {\n if (typeof content === \"string\") {\n return parseMcpToolSearchSentinel(content)\n }\n\n for (const block of content) {\n if (block.type !== \"text\") {\n continue\n }\n\n const sentinel = parseMcpToolSearchSentinel(block.text)\n if (sentinel) {\n return sentinel\n }\n }\n\n return null\n}\n\nconst resolveDeferredTool = (\n toolName: string,\n originalTools: Array<AnthropicTool>,\n): AnthropicTool => {\n const tool = originalTools.find((candidate) => candidate.name === toolName)\n if (tool && isDeferredToolName(tool.name)) {\n return tool\n }\n\n throw createInvalidRequestError(\n `Tool reference '${toolName}' has no corresponding deferred tool definition`,\n )\n}\n\nconst uniqueToolNames = (toolNames: Array<string>): Array<string> => [\n ...new Set(toolNames),\n]\n\nconst createInvalidRequestError = (message: string): HTTPError =>\n new HTTPError(\n message,\n new Response(\n JSON.stringify({\n error: {\n message,\n type: \"invalid_request_error\",\n },\n }),\n {\n status: 400,\n headers: { \"content-type\": \"application/json\" },\n },\n ),\n )\n\nconst translateSystemPrompt = (\n system: string | Array<AnthropicTextBlock> | undefined,\n model: string,\n): string | null => {\n if (!system) {\n return null\n }\n\n const extraPrompt = getExtraPromptForModel(model)\n\n if (typeof system === \"string\") {\n return system + extraPrompt\n }\n\n const text = system\n .map((block, index) => {\n if (index === 0) {\n return block.text + \"\\n\\n\" + extraPrompt + \"\\n\\n\"\n }\n return block.text\n })\n .join(\" \")\n return text.length > 0 ? text : null\n}\n\nconst convertAnthropicTools = (\n tools: Array<AnthropicTool> | undefined,\n toolSearchEnabled: boolean,\n): Array<Tool> | null => {\n if (!tools || tools.length === 0) {\n return null\n }\n\n const converted: Array<Tool> = []\n let addedToolSearch = false\n const searchableToolNames =\n toolSearchEnabled ? listDeferredToolNames(tools) : []\n\n for (const tool of tools) {\n if (isBridgeToolSearchName(tool.name)) {\n if (toolSearchEnabled && !addedToolSearch) {\n converted.push(createResponsesToolSearchDefinition(searchableToolNames))\n addedToolSearch = true\n }\n continue\n }\n\n if (toolSearchEnabled && isDeferredToolName(tool.name)) {\n converted.push(convertDeferredToolToNamespace(tool))\n continue\n }\n\n converted.push(convertToolToFunction(tool))\n }\n\n return converted\n}\n\nconst createResponsesToolSearchDefinition = (\n searchableToolNames: Array<string>,\n): Tool => ({\n type: \"tool_search\",\n execution: \"client\",\n description:\n \"Load deferred tools by exact name before using them. Return only the searchable tool names you need for the next step.\",\n parameters: {\n type: \"object\",\n properties: {\n names: {\n type: \"array\",\n description: \"Exact deferred tool names to load.\",\n items: {\n type: \"string\",\n enum: searchableToolNames,\n },\n minItems: 1,\n },\n },\n required: [\"names\"],\n additionalProperties: false,\n },\n})\n\nconst convertToolToFunction = (tool: AnthropicTool): Tool => ({\n type: \"function\",\n name: tool.name,\n parameters: normalizeToolSchema(tool.input_schema),\n strict: tool.strict ?? false,\n ...(tool.description ? { description: tool.description } : {}),\n})\n\nconst convertDeferredToolToNamespace = (tool: AnthropicTool): Tool => ({\n type: \"namespace\",\n name: tool.name,\n ...(tool.description ? { description: tool.description } : {}),\n tools: [\n {\n type: \"function\",\n name: tool.name,\n parameters: normalizeToolSchema(tool.input_schema),\n strict: tool.strict ?? false,\n defer_loading: true,\n ...(tool.description ? { description: tool.description } : {}),\n },\n ],\n})\n\nconst convertAnthropicToolChoice = (\n choice: AnthropicMessagesPayload[\"tool_choice\"],\n toolSearchEnabled: boolean,\n): ToolChoiceOptions | ToolChoiceFunction => {\n if (!choice) {\n return \"auto\"\n }\n\n switch (choice.type) {\n case \"auto\": {\n return \"auto\"\n }\n case \"any\": {\n return \"required\"\n }\n case \"tool\": {\n if (\n toolSearchEnabled\n && choice.name\n && isBridgeToolSearchName(choice.name)\n ) {\n return \"auto\"\n }\n return choice.name ? { type: \"function\", name: choice.name } : \"auto\"\n }\n case \"none\": {\n return \"none\"\n }\n default: {\n return \"auto\"\n }\n }\n}\n\ninterface ResponsesToAnthropicOptions {\n toolSearchName?: string\n hasToolCall?: boolean\n}\n\nexport const translateResponsesResultToAnthropic = (\n response: ResponsesResult,\n options?: ResponsesToAnthropicOptions,\n): AnthropicResponse => {\n const contentBlocks = mapOutputToAnthropicContent(response.output, options)\n const usage = mapResponsesUsage(response)\n let anthropicContent = fallbackContentBlocks(response.output_text)\n if (contentBlocks.length > 0) {\n anthropicContent = contentBlocks\n }\n\n const stopReason = mapResponsesStopReason(response, options)\n\n return {\n id: response.id,\n type: \"message\",\n role: \"assistant\",\n content: anthropicContent,\n model: response.model,\n stop_reason: stopReason,\n stop_sequence: null,\n usage,\n }\n}\n\nconst mapOutputToAnthropicContent = (\n output: Array<ResponseOutputItem>,\n options?: ResponsesToAnthropicOptions,\n): Array<AnthropicAssistantContentBlock> => {\n const contentBlocks: Array<AnthropicAssistantContentBlock> = []\n if (!output) {\n output = []\n }\n for (const item of output) {\n switch (item.type) {\n case \"reasoning\": {\n const thinkingText = extractReasoningText(item)\n if (thinkingText.length > 0 || (item.id && item.encrypted_content)) {\n contentBlocks.push({\n type: \"thinking\",\n thinking: thinkingText,\n signature: (item.encrypted_content ?? \"\") + \"@\" + item.id,\n })\n }\n break\n }\n case \"function_call\": {\n const toolUseBlock = createToolUseContentBlock(item)\n if (toolUseBlock) {\n contentBlocks.push(toolUseBlock)\n }\n break\n }\n case \"tool_search_call\": {\n const toolUseBlock = createToolSearchUseContentBlock(\n item,\n options?.toolSearchName,\n )\n if (toolUseBlock) {\n contentBlocks.push(toolUseBlock)\n }\n break\n }\n case \"tool_search_output\": {\n break\n }\n case \"message\": {\n const combinedText = combineMessageTextContent(item.content)\n if (combinedText.length > 0) {\n contentBlocks.push({ type: \"text\", text: combinedText })\n }\n break\n }\n case \"compaction\": {\n const compactionBlock = createCompactionThinkingBlock(item)\n if (compactionBlock) {\n contentBlocks.push(compactionBlock)\n }\n break\n }\n default: {\n // Future compatibility for unrecognized output item types.\n const combinedText = combineMessageTextContent(\n (item as { content?: Array<ResponseOutputContentBlock> }).content,\n )\n if (combinedText.length > 0) {\n contentBlocks.push({ type: \"text\", text: combinedText })\n }\n }\n }\n }\n\n return contentBlocks\n}\n\nconst combineMessageTextContent = (\n content: Array<ResponseOutputContentBlock> | undefined,\n): string => {\n if (!Array.isArray(content)) {\n return \"\"\n }\n\n let aggregated = \"\"\n\n for (const block of content) {\n if (isResponseOutputText(block)) {\n aggregated += block.text\n continue\n }\n\n if (isResponseOutputRefusal(block)) {\n aggregated += block.refusal\n continue\n }\n\n if (typeof (block as { text?: unknown }).text === \"string\") {\n aggregated += (block as { text: string }).text\n continue\n }\n\n if (typeof (block as { reasoning?: unknown }).reasoning === \"string\") {\n aggregated += (block as { reasoning: string }).reasoning\n continue\n }\n }\n\n return aggregated\n}\n\nconst extractReasoningText = (item: ResponseOutputReasoning): string => {\n const segments: Array<string> = []\n\n const collectFromBlocks = (blocks?: Array<ResponseReasoningBlock>) => {\n if (!Array.isArray(blocks)) {\n return\n }\n\n for (const block of blocks) {\n if (typeof block.text === \"string\") {\n segments.push(block.text)\n continue\n }\n }\n }\n\n collectFromBlocks(item.summary)\n\n return segments.join(REASONING_SUMMARY_SEPARATOR).trim()\n}\n\nconst createToolUseContentBlock = (\n call: ResponseOutputFunctionCall,\n): AnthropicToolUseBlock | null => {\n const toolId = call.call_id\n const toolName = resolveToolUseName(call)\n if (!toolName || !toolId) {\n return null\n }\n\n const input = parseFunctionCallArguments(call.arguments)\n\n return {\n type: \"tool_use\",\n id: toolId,\n name: toolName,\n input,\n }\n}\n\nconst createToolSearchUseContentBlock = (\n call: ResponseOutputToolSearchCall,\n toolSearchName = BRIDGE_TOOL_SEARCH_NAME,\n): AnthropicToolUseBlock | null => {\n const toolId = call.call_id\n if (!toolId) {\n return null\n }\n\n return {\n type: \"tool_use\",\n id: toolId,\n name: toolSearchName,\n input: parseToolSearchArguments(call.arguments),\n }\n}\n\nexport const resolveToolUseName = (\n call: Pick<ResponseOutputFunctionCall, \"name\" | \"namespace\">,\n): string => {\n if (typeof call.namespace === \"string\" && call.namespace.length > 0) {\n return call.namespace\n }\n\n return call.name\n}\n\nconst createCompactionThinkingBlock = (\n item: ResponseOutputCompaction,\n): AnthropicAssistantContentBlock | null => {\n if (!item.id || !item.encrypted_content) {\n return null\n }\n\n return {\n type: \"thinking\",\n thinking: \"\",\n signature: encodeCompactionCarrierSignature({\n id: item.id,\n encrypted_content: item.encrypted_content,\n }),\n }\n}\n\nconst parseFunctionCallArguments = (\n rawArguments: string,\n): Record<string, unknown> => {\n if (typeof rawArguments !== \"string\" || rawArguments.trim().length === 0) {\n return {}\n }\n\n try {\n const parsed: unknown = JSON.parse(rawArguments)\n\n if (Array.isArray(parsed)) {\n return { arguments: parsed }\n }\n\n if (parsed && typeof parsed === \"object\") {\n return parsed as Record<string, unknown>\n }\n } catch (error) {\n consola.warn(\"Failed to parse function call arguments\", {\n error,\n rawArguments,\n })\n }\n\n return { raw_arguments: rawArguments }\n}\n\nconst parseToolSearchArguments = (\n argumentsValue: Record<string, unknown> | string,\n): Record<string, unknown> => {\n return formatToolSearchBridgeArguments(argumentsValue)\n}\n\nconst fallbackContentBlocks = (\n outputText: string,\n): Array<AnthropicAssistantContentBlock> => {\n if (!outputText) {\n return []\n }\n\n return [\n {\n type: \"text\",\n text: outputText,\n },\n ]\n}\n\nconst mapResponsesStopReason = (\n response: ResponsesResult,\n options?: ResponsesToAnthropicOptions,\n): AnthropicResponse[\"stop_reason\"] => {\n const { status, incomplete_details: incompleteDetails } = response\n\n if (status === \"completed\") {\n if (!response.output || response.output.length === 0) {\n return options?.hasToolCall ? \"tool_use\" : \"end_turn\"\n }\n\n if (\n response.output.some(\n (item) =>\n item.type === \"function_call\" || item.type === \"tool_search_call\",\n )\n ) {\n return \"tool_use\"\n }\n return \"end_turn\"\n }\n\n if (status === \"incomplete\") {\n if (incompleteDetails?.reason === \"max_output_tokens\") {\n return \"max_tokens\"\n }\n if (incompleteDetails?.reason === \"content_filter\") {\n return \"end_turn\"\n }\n }\n\n return null\n}\n\nconst mapResponsesUsage = (\n response: ResponsesResult,\n): AnthropicResponse[\"usage\"] => {\n const inputTokens = response.usage?.input_tokens ?? 0\n const outputTokens = response.usage?.output_tokens ?? 0\n const inputCachedTokens = response.usage?.input_tokens_details?.cached_tokens\n const cacheWriteTokens =\n response.usage?.input_tokens_details?.cache_write_tokens\n\n return {\n input_tokens:\n inputTokens - (inputCachedTokens ?? 0) - (cacheWriteTokens ?? 0),\n output_tokens: outputTokens,\n ...(inputCachedTokens !== undefined && {\n cache_read_input_tokens: inputCachedTokens,\n }),\n ...(cacheWriteTokens !== undefined && {\n cache_creation_input_tokens: cacheWriteTokens,\n }),\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null\n\nconst isResponseOutputText = (\n block: ResponseOutputContentBlock,\n): block is ResponseOutputText =>\n isRecord(block)\n && \"type\" in block\n && (block as { type?: unknown }).type === \"output_text\"\n\nconst isResponseOutputRefusal = (\n block: ResponseOutputContentBlock,\n): block is ResponseOutputRefusal =>\n isRecord(block)\n && \"type\" in block\n && (block as { type?: unknown }).type === \"refusal\"\n\nconst convertToolResultContent = (\n content: string | Array<AnthropicToolResultContentBlock>,\n): string | Array<ResponseInputContent> => {\n if (typeof content === \"string\") {\n return content\n }\n\n if (Array.isArray(content)) {\n const result: Array<ResponseInputContent> = []\n for (const block of content) {\n switch (block.type) {\n case \"text\": {\n result.push(createTextContent(block.text))\n break\n }\n case \"image\": {\n result.push(createImageContent(block))\n break\n }\n case \"document\": {\n result.push(createFileContent(block))\n break\n }\n case \"tool_reference\": {\n result.push(createTextContent(`Tool ${block.tool_name} loaded`))\n break\n }\n default: {\n break\n }\n }\n }\n return result\n }\n\n return \"\"\n}\n\nconst isSupportAllTurns = (payload: AnthropicMessagesPayload): boolean => {\n if (\n payload.model === \"gpt-5.4\"\n || payload.model === \"gpt-5.4-mini\"\n || payload.model === \"gpt-5.5\"\n ) {\n return true\n }\n return isGpt56OrAbove(payload.model)\n}\n","import {\n BRIDGE_TOOL_SEARCH_NAME,\n formatToolSearchBridgeArguments,\n} from \"~/lib/tool-search\"\nimport {\n type ResponseCompletedEvent,\n type ResponseCreatedEvent,\n type ResponseErrorEvent,\n type ResponseFailedEvent,\n type ResponseFunctionCallArgumentsDeltaEvent,\n type ResponseFunctionCallArgumentsDoneEvent,\n type ResponseIncompleteEvent,\n type ResponseOutputItemAddedEvent,\n type ResponseOutputItemDoneEvent,\n type ResponseReasoningSummaryPartAddedEvent,\n type ResponseReasoningSummaryTextDeltaEvent,\n type ResponseReasoningSummaryTextDoneEvent,\n type ResponsesResult,\n type ResponseStreamEvent,\n type ResponseTextDeltaEvent,\n} from \"~/lib/types/responses\"\n\nimport { type AnthropicStreamEventData } from \"~/lib/types/anthropic\"\nimport {\n REASONING_SUMMARY_SEPARATOR,\n encodeCompactionCarrierSignature,\n resolveToolUseName,\n translateResponsesResultToAnthropic,\n} from \"./responses-translation\"\n\nconst MAX_CONSECUTIVE_FUNCTION_CALL_WHITESPACE = 20\n\nclass FunctionCallArgumentsValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"FunctionCallArgumentsValidationError\"\n }\n}\n\nconst updateWhitespaceRunState = (\n previousCount: number,\n chunk: string,\n): {\n nextCount: number\n exceeded: boolean\n} => {\n let count = previousCount\n\n for (const char of chunk) {\n if (char === \"\\r\" || char === \"\\n\" || char === \"\\t\") {\n count += 1\n if (count > MAX_CONSECUTIVE_FUNCTION_CALL_WHITESPACE) {\n return { nextCount: count, exceeded: true }\n }\n continue\n }\n\n if (char !== \" \") {\n count = 0\n }\n }\n\n return { nextCount: count, exceeded: false }\n}\n\nexport interface ResponsesStreamState {\n messageStartSent: boolean\n messageCompleted: boolean\n nextContentBlockIndex: number\n blockIndexByKey: Map<string, number>\n openBlocks: Set<number>\n blockHasDelta: Set<number>\n reasoningSummaryHasDelta: Set<string>\n functionCallStateByOutputIndex: Map<number, FunctionCallStreamState>\n toolSearchName: string\n hasToolCall: boolean\n}\n\ntype FunctionCallStreamState = {\n blockIndex: number\n toolCallId: string\n name: string\n consecutiveWhitespaceCount: number\n}\n\nexport const createResponsesStreamState = (options?: {\n toolSearchName?: string\n}): ResponsesStreamState => ({\n messageStartSent: false,\n messageCompleted: false,\n nextContentBlockIndex: 0,\n blockIndexByKey: new Map(),\n openBlocks: new Set(),\n blockHasDelta: new Set(),\n reasoningSummaryHasDelta: new Set(),\n functionCallStateByOutputIndex: new Map(),\n toolSearchName: options?.toolSearchName ?? BRIDGE_TOOL_SEARCH_NAME,\n hasToolCall: false,\n})\n\nexport const translateResponsesStreamEvent = (\n rawEvent: ResponseStreamEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const eventType = rawEvent.type\n switch (eventType) {\n case \"response.created\": {\n return handleResponseCreated(rawEvent, state)\n }\n\n case \"response.output_item.added\": {\n return handleOutputItemAdded(rawEvent, state)\n }\n\n case \"response.reasoning_summary_text.delta\": {\n return handleReasoningSummaryTextDelta(rawEvent, state)\n }\n\n case \"response.reasoning_summary_part.added\": {\n return handleReasoningSummaryPartAdded(rawEvent, state)\n }\n\n case \"response.output_text.delta\": {\n return handleOutputTextDelta(rawEvent, state)\n }\n\n case \"response.reasoning_summary_text.done\": {\n return handleReasoningSummaryTextDone(rawEvent, state)\n }\n\n case \"response.output_item.done\": {\n return handleOutputItemDone(rawEvent, state)\n }\n\n case \"response.function_call_arguments.delta\": {\n return handleFunctionCallArgumentsDelta(rawEvent, state)\n }\n\n case \"response.function_call_arguments.done\": {\n return handleFunctionCallArgumentsDone(rawEvent, state)\n }\n\n case \"response.completed\":\n case \"response.incomplete\": {\n return handleResponseCompleted(rawEvent, state)\n }\n\n case \"response.failed\": {\n return handleResponseFailed(rawEvent, state)\n }\n\n case \"error\": {\n return handleErrorEvent(rawEvent, state)\n }\n\n default: {\n return []\n }\n }\n}\n\n// Helper handlers to keep translateResponsesStreamEvent concise\nconst handleResponseCreated = (\n rawEvent: ResponseCreatedEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n return messageStart(state, rawEvent.response)\n}\n\nconst handleOutputItemAdded = (\n rawEvent: ResponseOutputItemAddedEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const functionCallDetails = extractFunctionCallDetails(rawEvent, state)\n if (!functionCallDetails) {\n return events\n }\n\n const { outputIndex, toolCallId, name, initialArguments } =\n functionCallDetails\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n toolCallId,\n name,\n events,\n })\n\n if (initialArguments !== undefined && initialArguments.length > 0) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: initialArguments,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n return events\n}\n\nconst handleOutputItemDone = (\n rawEvent: ResponseOutputItemDoneEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const item = rawEvent.item\n const itemType = item.type\n const outputIndex = rawEvent.output_index\n\n if (itemType === \"tool_search_call\") {\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n toolCallId: item.call_id,\n name: state.toolSearchName,\n events,\n })\n const finalArguments = stringifyToolSearchArguments(item.arguments)\n\n if (!state.blockHasDelta.has(blockIndex) && finalArguments) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: finalArguments,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n state.functionCallStateByOutputIndex.delete(outputIndex)\n return events\n }\n\n if (itemType === \"compaction\") {\n if (!item.id || !item.encrypted_content) {\n return events\n }\n\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n\n if (!state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: \"\",\n },\n })\n }\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"signature_delta\",\n signature: encodeCompactionCarrierSignature({\n id: item.id,\n encrypted_content: item.encrypted_content,\n }),\n },\n })\n state.blockHasDelta.add(blockIndex)\n return events\n }\n\n if (itemType !== \"reasoning\") {\n return events\n }\n\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n const signature = (item.encrypted_content ?? \"\") + \"@\" + item.id\n if (signature) {\n if (\n (!item.summary || item.summary.length === 0)\n && !state.blockHasDelta.has(blockIndex)\n ) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: \"\",\n },\n })\n }\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"signature_delta\",\n signature,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n return events\n}\n\nconst handleFunctionCallArgumentsDelta = (\n rawEvent: ResponseFunctionCallArgumentsDeltaEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const outputIndex = rawEvent.output_index\n const deltaText = rawEvent.delta\n\n if (!deltaText) {\n return events\n }\n\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n events,\n })\n\n const functionCallState =\n state.functionCallStateByOutputIndex.get(outputIndex)\n if (!functionCallState) {\n return handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError(\n \"Received function call arguments delta without an open tool call block.\",\n ),\n state,\n events,\n )\n }\n\n // fix: copolit function call returning infinite line breaks until max_tokens limit\n // \"arguments\": \"{\\\"path\\\":\\\"xxx\\\",\\\"pattern\\\":\\\"**/*.ts\\\",\\\"} }? Wait extra braces. Need correct. I should run? Wait overcame. Need proper JSON with pattern \\\"\\n\\n\\n\\n\\n\\n\\n\\n...\n const { nextCount, exceeded } = updateWhitespaceRunState(\n functionCallState.consecutiveWhitespaceCount,\n deltaText,\n )\n if (exceeded) {\n return handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError(\n \"Received function call arguments delta containing more than 20 consecutive whitespace characters.\",\n ),\n state,\n events,\n )\n }\n functionCallState.consecutiveWhitespaceCount = nextCount\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: deltaText,\n },\n })\n state.blockHasDelta.add(blockIndex)\n\n return events\n}\n\nconst handleFunctionCallArgumentsDone = (\n rawEvent: ResponseFunctionCallArgumentsDoneEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const outputIndex = rawEvent.output_index\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n events,\n })\n\n const finalArguments =\n typeof rawEvent.arguments === \"string\" ? rawEvent.arguments : undefined\n\n if (!state.blockHasDelta.has(blockIndex) && finalArguments) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: finalArguments,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n state.functionCallStateByOutputIndex.delete(outputIndex)\n return events\n}\n\nconst handleOutputTextDelta = (\n rawEvent: ResponseTextDeltaEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const outputIndex = rawEvent.output_index\n const contentIndex = rawEvent.content_index\n const deltaText = rawEvent.delta\n\n if (!deltaText) {\n return events\n }\n\n const blockIndex = openTextBlockIfNeeded(state, {\n outputIndex,\n contentIndex,\n events,\n })\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"text_delta\",\n text: deltaText,\n },\n })\n state.blockHasDelta.add(blockIndex)\n\n return events\n}\n\nconst handleReasoningSummaryTextDelta = (\n rawEvent: ResponseReasoningSummaryTextDeltaEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const outputIndex = rawEvent.output_index\n const summaryIndex = rawEvent.summary_index\n const deltaText = rawEvent.delta\n const events = new Array<AnthropicStreamEventData>()\n\n if (!deltaText) {\n return events\n }\n\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: deltaText,\n },\n })\n state.blockHasDelta.add(blockIndex)\n state.reasoningSummaryHasDelta.add(getBlockKey(outputIndex, summaryIndex))\n\n return events\n}\n\nconst handleReasoningSummaryPartAdded = (\n rawEvent: ResponseReasoningSummaryPartAddedEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const blockIndex = openThinkingBlockIfNeeded(\n state,\n rawEvent.output_index,\n events,\n )\n\n if (rawEvent.summary_index === 0) {\n return events\n }\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: REASONING_SUMMARY_SEPARATOR,\n },\n })\n state.blockHasDelta.add(blockIndex)\n return events\n}\n\nconst handleReasoningSummaryTextDone = (\n rawEvent: ResponseReasoningSummaryTextDoneEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const outputIndex = rawEvent.output_index\n const summaryIndex = rawEvent.summary_index\n const text = rawEvent.text\n const events = new Array<AnthropicStreamEventData>()\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n const summaryKey = getBlockKey(outputIndex, summaryIndex)\n\n if (text && !state.reasoningSummaryHasDelta.has(summaryKey)) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: text,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n return events\n}\n\nconst handleResponseCompleted = (\n rawEvent: ResponseCompletedEvent | ResponseIncompleteEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const response = rawEvent.response\n const events = new Array<AnthropicStreamEventData>()\n\n closeAllOpenBlocks(state, events)\n const anthropic = translateResponsesResultToAnthropic(response, {\n hasToolCall: state.hasToolCall,\n toolSearchName: state.toolSearchName,\n })\n events.push(\n {\n type: \"message_delta\",\n delta: {\n stop_reason: anthropic.stop_reason,\n stop_sequence: anthropic.stop_sequence,\n },\n usage: anthropic.usage,\n },\n { type: \"message_stop\" },\n )\n state.messageCompleted = true\n return events\n}\n\nconst handleResponseFailed = (\n rawEvent: ResponseFailedEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const response = rawEvent.response\n const events = new Array<AnthropicStreamEventData>()\n closeAllOpenBlocks(state, events)\n\n const message =\n response.error?.message ?? \"The response failed due to an unknown error.\"\n\n events.push(buildErrorEvent(message))\n state.messageCompleted = true\n\n return events\n}\n\nconst handleErrorEvent = (\n rawEvent: ResponseErrorEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const message =\n typeof rawEvent.message === \"string\" ?\n rawEvent.message\n : \"An unexpected error occurred during streaming.\"\n\n state.messageCompleted = true\n return [buildErrorEvent(message)]\n}\n\nconst handleFunctionCallArgumentsValidationError = (\n error: FunctionCallArgumentsValidationError,\n state: ResponsesStreamState,\n events: Array<AnthropicStreamEventData> = [],\n): Array<AnthropicStreamEventData> => {\n const reason = error.message\n\n closeAllOpenBlocks(state, events)\n state.messageCompleted = true\n\n events.push(buildErrorEvent(reason))\n\n return events\n}\n\nconst messageStart = (\n state: ResponsesStreamState,\n response: ResponsesResult,\n): Array<AnthropicStreamEventData> => {\n state.messageStartSent = true\n const inputCachedTokens = response.usage?.input_tokens_details?.cached_tokens\n const cacheWriteTokens =\n response.usage?.input_tokens_details?.cache_write_tokens\n const inputTokens =\n (response.usage?.input_tokens ?? 0)\n - (inputCachedTokens ?? 0)\n - (cacheWriteTokens ?? 0)\n return [\n {\n type: \"message_start\",\n message: {\n id: response.id,\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: response.model,\n stop_reason: null,\n stop_sequence: null,\n usage: {\n input_tokens: inputTokens,\n output_tokens: 0,\n cache_read_input_tokens: inputCachedTokens ?? 0,\n ...(cacheWriteTokens !== undefined && {\n cache_creation_input_tokens: cacheWriteTokens,\n }),\n },\n },\n },\n ]\n}\n\nconst openTextBlockIfNeeded = (\n state: ResponsesStreamState,\n params: {\n outputIndex: number\n contentIndex: number\n events: Array<AnthropicStreamEventData>\n },\n): number => {\n const { outputIndex, contentIndex, events } = params\n const key = getBlockKey(outputIndex, contentIndex)\n let blockIndex = state.blockIndexByKey.get(key)\n\n if (blockIndex === undefined) {\n blockIndex = state.nextContentBlockIndex\n state.nextContentBlockIndex += 1\n state.blockIndexByKey.set(key, blockIndex)\n }\n\n if (!state.openBlocks.has(blockIndex)) {\n closeOpenBlocks(state, events)\n events.push({\n type: \"content_block_start\",\n index: blockIndex,\n content_block: {\n type: \"text\",\n text: \"\",\n },\n })\n state.openBlocks.add(blockIndex)\n }\n\n return blockIndex\n}\n\nconst openThinkingBlockIfNeeded = (\n state: ResponsesStreamState,\n outputIndex: number,\n events: Array<AnthropicStreamEventData>,\n): number => {\n //thinking blocks has multiple summary_index, should combine into one block\n const summaryIndex = 0\n const key = getBlockKey(outputIndex, summaryIndex)\n let blockIndex = state.blockIndexByKey.get(key)\n\n if (blockIndex === undefined) {\n blockIndex = state.nextContentBlockIndex\n state.nextContentBlockIndex += 1\n state.blockIndexByKey.set(key, blockIndex)\n }\n\n if (!state.openBlocks.has(blockIndex)) {\n closeOpenBlocks(state, events)\n events.push({\n type: \"content_block_start\",\n index: blockIndex,\n content_block: {\n type: \"thinking\",\n thinking: \"\",\n },\n })\n state.openBlocks.add(blockIndex)\n }\n\n return blockIndex\n}\n\nconst closeBlockIfOpen = (\n state: ResponsesStreamState,\n blockIndex: number,\n events: Array<AnthropicStreamEventData>,\n) => {\n if (!state.openBlocks.has(blockIndex)) {\n return\n }\n\n events.push({ type: \"content_block_stop\", index: blockIndex })\n state.openBlocks.delete(blockIndex)\n state.blockHasDelta.delete(blockIndex)\n}\n\nconst closeOpenBlocks = (\n state: ResponsesStreamState,\n events: Array<AnthropicStreamEventData>,\n) => {\n for (const blockIndex of state.openBlocks) {\n closeBlockIfOpen(state, blockIndex, events)\n }\n}\n\nconst closeAllOpenBlocks = (\n state: ResponsesStreamState,\n events: Array<AnthropicStreamEventData>,\n) => {\n closeOpenBlocks(state, events)\n\n state.functionCallStateByOutputIndex.clear()\n state.reasoningSummaryHasDelta.clear()\n}\n\nexport const buildErrorEvent = (message: string): AnthropicStreamEventData => ({\n type: \"error\",\n error: {\n type: \"api_error\",\n message,\n },\n})\n\nconst getBlockKey = (outputIndex: number, contentIndex: number): string =>\n `${outputIndex}:${contentIndex}`\n\nconst openFunctionCallBlock = (\n state: ResponsesStreamState,\n params: {\n outputIndex: number\n toolCallId?: string\n name?: string\n events: Array<AnthropicStreamEventData>\n },\n): number => {\n const { outputIndex, toolCallId, name, events } = params\n\n state.hasToolCall = true\n\n let functionCallState = state.functionCallStateByOutputIndex.get(outputIndex)\n\n if (!functionCallState) {\n const blockIndex = state.nextContentBlockIndex\n state.nextContentBlockIndex += 1\n\n const resolvedToolCallId = toolCallId ?? `tool_call_${blockIndex}`\n const resolvedName = name ?? \"function\"\n\n functionCallState = {\n blockIndex,\n toolCallId: resolvedToolCallId,\n name: resolvedName,\n consecutiveWhitespaceCount: 0,\n }\n\n state.functionCallStateByOutputIndex.set(outputIndex, functionCallState)\n }\n\n const { blockIndex } = functionCallState\n\n if (!state.openBlocks.has(blockIndex)) {\n closeOpenBlocks(state, events)\n events.push({\n type: \"content_block_start\",\n index: blockIndex,\n content_block: {\n type: \"tool_use\",\n id: functionCallState.toolCallId,\n name: functionCallState.name,\n input: {},\n },\n })\n state.openBlocks.add(blockIndex)\n }\n\n return blockIndex\n}\n\ntype FunctionCallDetails = {\n outputIndex: number\n toolCallId: string\n name: string\n initialArguments?: string\n}\n\nconst extractFunctionCallDetails = (\n rawEvent: ResponseOutputItemAddedEvent,\n state: ResponsesStreamState,\n): FunctionCallDetails | undefined => {\n const item = rawEvent.item\n const itemType = item.type\n if (itemType === \"tool_search_call\") {\n const outputIndex = rawEvent.output_index\n const toolCallId = item.call_id\n const name = state.toolSearchName\n return {\n outputIndex,\n toolCallId,\n name,\n initialArguments: \"\",\n }\n }\n\n if (itemType !== \"function_call\") {\n return undefined\n }\n\n const outputIndex = rawEvent.output_index\n const toolCallId = item.call_id\n const name = resolveToolUseName(item)\n const initialArguments = item.arguments\n return {\n outputIndex,\n toolCallId,\n name,\n initialArguments,\n }\n}\n\nconst stringifyToolSearchArguments = (\n argumentsValue: Record<string, unknown> | string,\n): string | undefined => {\n try {\n return JSON.stringify(formatToolSearchBridgeArguments(argumentsValue))\n } catch {\n return undefined\n }\n}\n","import type { ConsolaInstance } from \"consola\"\n\nimport type {\n CopilotUsage,\n ResponseStreamEvent,\n ResponsesResult,\n ResponsesStream,\n} from \"~/lib/types/responses\"\n\nimport { debugJson } from \"~/lib/logger\"\n\ninterface ResponsesStreamCollection {\n outputItemsByIndex: Map<number, ResponsesResult[\"output\"][number]>\n}\n\nexport const collectResponsesStreamResult = async ({\n errorMessagePrefix = \"Responses stream\",\n parseEvent = parseResponsesStreamEvent,\n upstreamResponse,\n logger,\n}: {\n errorMessagePrefix?: string\n parseEvent?: (data: string) => ResponseStreamEvent | null\n upstreamResponse: ResponsesStream\n logger: ConsolaInstance\n}): Promise<ResponsesResult> => {\n const state = createResponsesStreamCollection()\n\n for await (const chunk of upstreamResponse) {\n const result = collectResponsesStreamChunk({\n chunk,\n errorMessagePrefix,\n logger,\n parseEvent,\n state,\n })\n if (result) {\n return result\n }\n }\n\n throw new Error(`${errorMessagePrefix} ended without a terminal event`)\n}\n\nconst collectResponsesStreamChunk = ({\n chunk,\n errorMessagePrefix,\n logger,\n parseEvent,\n state,\n}: {\n chunk: { data?: string; event?: string }\n errorMessagePrefix: string\n logger: ConsolaInstance\n parseEvent: (data: string) => ResponseStreamEvent | null\n state: ResponsesStreamCollection\n}): ResponsesResult | undefined => {\n debugJson(logger, \"Received responses stream chunk:\", chunk)\n if (chunk.event === \"ping\" || !chunk.data || chunk.data === \"[DONE]\") {\n return\n }\n\n const parsed = parseEvent(chunk.data)\n if (!parsed) {\n return\n }\n\n if (parsed.type === \"error\") {\n throw new Error(\n getStreamErrorMessage(parsed) ?? `${errorMessagePrefix} failed`,\n )\n }\n\n if (parsed.type === \"response.failed\") {\n const response = parsed.response\n if (!response) {\n throw new Error(\"Responses stream ended without a response\")\n }\n throw new Error(response.error?.message ?? `${errorMessagePrefix} failed`)\n }\n\n return collectResponsesStreamEvent(parsed, state)\n}\n\nconst parseResponsesStreamEvent = (\n data: string,\n): ResponseStreamEvent | null => {\n try {\n return JSON.parse(data) as ResponseStreamEvent\n } catch {\n return null\n }\n}\n\nconst createResponsesStreamCollection = (): ResponsesStreamCollection => ({\n outputItemsByIndex: new Map(),\n})\n\nconst collectResponsesStreamEvent = (\n event: ResponseStreamEvent,\n state: ResponsesStreamCollection,\n): ResponsesResult | undefined => {\n switch (event.type) {\n case \"response.completed\":\n case \"response.incomplete\": {\n const response = event.response\n if (!response) {\n throw new Error(\"Responses stream ended without a response\")\n }\n response.copilot_usage ??= event.copilot_usage as CopilotUsage\n const output = [...state.outputItemsByIndex.entries()]\n .sort(([leftIndex], [rightIndex]) => leftIndex - rightIndex)\n .map(([, item]) => item)\n return {\n ...response,\n output: output.length > 0 ? output : response.output,\n }\n }\n case \"response.output_item.done\":\n state.outputItemsByIndex.set(event.output_index, event.item)\n break\n }\n}\n\nconst getStreamErrorMessage = (\n event: Extract<ResponseStreamEvent, { type: \"error\" }>,\n): string | undefined => {\n return event.error?.message ?? event.message ?? undefined\n}\n","import { createHash } from \"node:crypto\"\n\nimport {\n getProviderModelConfig,\n resolveProviderModelsDevId,\n} from \"~/lib/provider-model-catalog\"\nimport { compactTextOnlyGuard } from \"~/lib/compact\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { getModelsDevModelMaxOutputTokens } from \"~/lib/models-dev-cache\"\nimport { getRawProviderConfig } from \"~/lib/provider-config\"\nimport { parseProviderModelAlias } from \"~/lib/provider-model\"\nimport { requestContext } from \"~/lib/request-context\"\nimport type {\n AnthropicAssistantContentBlock,\n AnthropicAssistantMessage,\n AnthropicCacheControl,\n AnthropicDocumentBlock,\n AnthropicImageBlock,\n AnthropicInputMessage,\n AnthropicMessagesPayload,\n AnthropicResponse,\n AnthropicTextBlock,\n AnthropicTool,\n AnthropicToolResultContentBlock,\n AnthropicToolUseBlock,\n AnthropicUserContentBlock,\n AnthropicUserMessage,\n} from \"~/lib/types/anthropic\"\nimport type {\n NamespaceTool,\n ResponseInputAgentMessage,\n ResponseInputItem,\n ResponseInputMessage,\n ResponseInputReasoning,\n ResponseOutputCustomToolCall,\n ResponseOutputFunctionCall,\n ResponseOutputItem,\n Reasoning,\n ResponsesPayload,\n ResponsesResult,\n ResponsesTextFormat,\n ResponseUsage,\n} from \"~/lib/types/responses\"\n\nexport const MESSAGES_COMPACTION_PREFIX = \"copilot-api:messages-compaction:v1:\"\nconst MESSAGES_REASONING_ID_SUFFIX = \"__a1\"\n\nexport const markMessagesReasoningId = (id: string): string =>\n `${id}${MESSAGES_REASONING_ID_SUFFIX}`\n\nexport const isMessagesReasoningId = (id: unknown): boolean =>\n typeof id === \"string\" && id.endsWith(MESSAGES_REASONING_ID_SUFFIX)\n\nexport const MESSAGES_COMPACTION_PROMPT = [\n \"You are performing a CONTEXT CHECKPOINT COMPACTION. Create a handoff summary for another LLM that will resume the task.\",\n \"Do NOT continue the task, make changes, or call any tools. Your only output must be the handoff summary.\",\n \"\",\n \"Include:\",\n \"- Current progress and key decisions made\",\n \"- Important context, constraints, or user preferences\",\n \"- What remains to be done (clear next steps)\",\n \"- Any critical data, examples, or references needed to continue\",\n \"\",\n \"Be concise, structured, and focused on helping the next LLM seamlessly continue the work.\",\n \"\",\n compactTextOnlyGuard,\n].join(\"\\n\")\n\nexport const MESSAGES_TOOL_CALL_TIPS = [\n \"# Tool Call Tips\",\n \"- Do NOT call `exec_command` directly; that tool does not exist. Use `functions.exec` (tool name: `exec`) to run commands instead.\",\n '- The functions.exec tool accepts parameters only as {\"input\":\"...\"}; put the complete executable code inside input, including properly constructed tools.exec_command(...) calls and text(...) output handling.',\n \"- Construct all tools.exec_command(...) arguments strictly according to its tool definition, and use OS/shell-compatible commands for Windows, Linux, and macOS.\",\n \"- Always assign the awaited tools.exec_command(...) call to a variable and forward the full result with text(JSON.stringify(r)); unforwarded output is silently dropped and makes results look empty.\",\n \"- Yielded execution is not truncated output. Resume a running `cell_id` with `functions.wait` (tool name: `wait`), and a live `session_id` with `tools.write_stdin`, until the command reaches a terminal result.\",\n \"- Read files with the OS-native command (Get-Content/Test-Path on Windows PowerShell, cat/ls on POSIX), quote paths containing spaces, and verify the forwarded output is non-empty before concluding a file was read.\",\n \"- For long-running commands, keep the returned `session_id` and poll it with `tools.write_stdin` until the command finishes; do not redirect output to a temp file and read it back in a second call.\",\n \"- If `functions.exec` returns `aborted`, retry at most 3 times. After 3 failures, terminate immediately and inform the user that `functions.exec` is unavailable.\",\n].join(\"\\n\")\n\nconst MESSAGES_BATCH_TOOL_CALL_TIPS = [\n \"- Parallel tool calls are disabled for this request. Batch independent commands in one functions.exec call; keep dependent operations sequential.\",\n 'const results = await Promise.allSettled([tools.exec_command({cmd: \"git status --short\"})]); for (const result of results) text(JSON.stringify(result.status === \"fulfilled\" ? result.value : {error: String(result.reason)}))',\n].join(\"\\n\")\n\nconst JSON_OUTPUT_CONSTRAINT =\n \"Do not wrap the JSON in markdown code fences and do not add any text outside the JSON object.\"\n\nexport const buildOutputFormatInstruction = (\n format: ResponsesTextFormat | null | undefined,\n): string | null => {\n if (!format) return null\n\n if (format.type === \"json_schema\") {\n return [\n `Respond with a single JSON object that strictly matches the \"${format.name}\" JSON schema below.`,\n JSON_OUTPUT_CONSTRAINT,\n \"\",\n \"JSON schema:\",\n JSON.stringify(format.schema, null, 2),\n ].join(\"\\n\")\n }\n\n if (format.type === \"json_object\") {\n return [\"Respond with a single JSON object.\", JSON_OUTPUT_CONSTRAINT].join(\n \"\\n\",\n )\n }\n\n return null\n}\n\nconst COMPACTION_REPLAY_PROMPT =\n \"The previous conversation was compacted. Continue from this handoff summary:\\n\\n\"\nconst MAX_DEVELOPER_PROMPTS = 5\nconst TOOL_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/u\nconst CUSTOM_TOOL_INPUT_SCHEMA: Record<string, unknown> = {\n type: \"object\",\n properties: { input: { type: \"string\" } },\n required: [\"input\"],\n additionalProperties: false,\n}\n\nexport class ResponsesMessagesTranslationError extends Error {\n readonly status: number\n\n constructor(message: string, status = 400) {\n super(message)\n this.name = \"ResponsesMessagesTranslationError\"\n this.status = status\n }\n}\n\nexport interface MessagesToolDescriptor {\n alias: string\n kind: \"custom\" | \"function\"\n name: string\n namespace?: string\n}\n\nexport interface MessagesToolRegistry {\n byAlias: Map<string, MessagesToolDescriptor>\n byOriginal: Map<string, MessagesToolDescriptor>\n tools: Array<AnthropicTool>\n}\n\nexport interface ResponsesToMessagesTranslation {\n compaction: boolean\n messagesPayload: AnthropicMessagesPayload\n originalPayload: ResponsesPayload\n publicModel: string\n registry: MessagesToolRegistry\n}\n\nexport type MessagesResponseTranslationContext = Omit<\n ResponsesToMessagesTranslation,\n \"messagesPayload\"\n>\n\ninterface ToolRegistration {\n description?: string | null\n kind: MessagesToolDescriptor[\"kind\"]\n name: string\n namespace?: string\n parameters?: Record<string, unknown> | null\n}\n\ninterface ResponsesInputNormalization {\n compaction: boolean\n input: string | Array<ResponseInputItem> | undefined\n}\n\nexport function translateResponsesToMessages(\n payload: ResponsesPayload,\n options: { model: string; publicModel?: string; toolCallTips?: boolean },\n): ResponsesToMessagesTranslation {\n removeWebSearchTool(payload)\n const registry = createToolRegistry(payload, options.model)\n const normalized = normalizeResponsesInput(payload.input)\n const outputFormatInstruction = buildOutputFormatInstruction(\n payload.text?.format,\n )\n // The tips describe the code-mode `functions.exec` wrapper, so they are\n // wrong for clients that expose `exec_command` as a real tool.\n const toolCallTips =\n (options.toolCallTips ?? false) && !hasExecCommandTool(payload)\n const { messages, system } = translateInputToAnthropic(\n normalized.input,\n registry,\n payload.instructions,\n payload.input,\n toolCallTips,\n )\n\n if (toolCallTips && payload.parallel_tool_calls === false) {\n appendToolCallTips(system, MESSAGES_BATCH_TOOL_CALL_TIPS)\n }\n\n if (normalized.compaction) {\n messages.push({ role: \"user\", content: MESSAGES_COMPACTION_PROMPT })\n }\n\n if (messages.length === 0) {\n throw new ResponsesMessagesTranslationError(\n \"Responses input must contain at least one translatable message\",\n )\n }\n\n if (outputFormatInstruction) {\n messages.push({ role: \"user\", content: outputFormatInstruction })\n }\n\n applyEphemeralCacheControl(messages, system)\n\n const reasoningEffort = translateReasoningEffort(payload.reasoning?.effort)\n const metadataUserId = resolveMetadataUserId(payload)\n const messagesPayload: AnthropicMessagesPayload = {\n model: options.model,\n messages,\n // Codex does not send the catalog's max_output_tokens; Messages requires\n // an explicit max_tokens value, so resolve the default in the adapter.\n max_tokens: Math.max(\n 1,\n payload.max_output_tokens ?? resolveDefaultMaxOutputTokens(options.model),\n ),\n stream: payload.stream ?? false,\n temperature: payload.temperature ?? undefined,\n top_p: payload.top_p ?? undefined,\n system: system.length > 0 ? system : undefined,\n tools:\n normalized.compaction || registry.tools.length > 0 ?\n registry.tools\n : undefined,\n tool_choice: translateToolChoice(payload.tool_choice, registry),\n ...(reasoningEffort ? { output_config: { effort: reasoningEffort } } : {}),\n ...((\n payload.service_tier === \"auto\"\n || payload.service_tier === \"standard_only\"\n ) ?\n { service_tier: payload.service_tier }\n : {}),\n ...(metadataUserId ? { metadata: { user_id: metadataUserId } } : {}),\n }\n\n if (\n payload.parallel_tool_calls != null\n && registry.tools.length > 0\n && messagesPayload.tool_choice?.type !== \"none\"\n ) {\n messagesPayload.tool_choice = {\n ...(messagesPayload.tool_choice ?? { type: \"auto\" }),\n disable_parallel_tool_use: !payload.parallel_tool_calls,\n }\n }\n\n return {\n compaction: normalized.compaction,\n messagesPayload,\n originalPayload: payload,\n publicModel: options.publicModel ?? payload.model,\n registry,\n }\n}\n\nfunction resolveDefaultMaxOutputTokens(model: string): number {\n const alias = parseProviderModelAlias(model)\n const providerConfig = alias ? getRawProviderConfig(alias.provider) : null\n const catalogMaxOutputTokens =\n alias ?\n getModelsDevModelMaxOutputTokens(\n resolveProviderModelsDevId(alias.provider, providerConfig),\n alias.model,\n )\n : undefined\n const builtinModelConfig =\n alias ?\n getProviderModelConfig(alias.provider, alias.model, providerConfig)\n : undefined\n const tokenLimits =\n alias && (providerConfig || builtinModelConfig || catalogMaxOutputTokens) ?\n [\n providerConfig?.models?.[alias.model]?.maxOutputTokens,\n catalogMaxOutputTokens,\n builtinModelConfig?.maxOutputTokens,\n ]\n : [findEndpointModel(model)?.capabilities.limits.max_output_tokens]\n\n return (\n tokenLimits.find(\n (limit): limit is number =>\n typeof limit === \"number\" && Number.isInteger(limit) && limit > 0,\n ) ?? 32_000\n )\n}\n\nexport function translateAnthropicToResponses(\n response: AnthropicResponse,\n context: MessagesResponseTranslationContext,\n): ResponsesResult {\n const finish = translateStopReason(response.stop_reason)\n const output =\n context.compaction ?\n translateCompactionOutput(response)\n : translateAssistantOutput(response, context.registry)\n const outputText =\n context.compaction ? \"\" : extractAnthropicResponseText(response)\n\n return createMessagesBackedResponsesResult({\n context,\n id: toResponseId(response.id),\n output,\n outputText,\n status: finish.status,\n incompleteReason: finish.incompleteReason,\n usage: translateAnthropicUsage(response.usage),\n copilotUsage: response.copilot_usage,\n })\n}\n\nexport function createMessagesBackedResponsesResult(options: {\n context: MessagesResponseTranslationContext\n createdAt?: number\n error?: ResponsesResult[\"error\"]\n id: string\n incompleteReason?: \"content_filter\" | \"max_output_tokens\"\n output: Array<ResponseOutputItem>\n outputText: string\n status: string\n usage?: ResponseUsage | null\n copilotUsage?: ResponsesResult[\"copilot_usage\"]\n}): ResponsesResult {\n const { context } = options\n return {\n id: options.id,\n object: \"response\",\n created_at: options.createdAt ?? Math.floor(Date.now() / 1000),\n model: context.publicModel,\n output: options.output,\n output_text: options.outputText,\n status: options.status,\n copilot_usage: options.copilotUsage ?? null,\n usage: options.usage ?? null,\n error: options.error ?? null,\n incomplete_details:\n options.incompleteReason ? { reason: options.incompleteReason } : null,\n instructions: context.originalPayload.instructions ?? null,\n metadata: context.originalPayload.metadata ?? null,\n parallel_tool_calls: Boolean(context.originalPayload.parallel_tool_calls),\n temperature: context.originalPayload.temperature ?? null,\n tool_choice: context.originalPayload.tool_choice ?? \"auto\",\n tools: context.originalPayload.tools ?? [],\n top_p: context.originalPayload.top_p ?? null,\n }\n}\n\nexport function translateAnthropicUsage(\n usage: AnthropicResponse[\"usage\"] | undefined,\n): ResponseUsage | null {\n if (!usage) return null\n\n const cachedTokens = usage.cache_read_input_tokens ?? 0\n const cacheWriteTokens = usage.cache_creation_input_tokens ?? 0\n const inputTokens = usage.input_tokens + cachedTokens + cacheWriteTokens\n const outputTokens = usage.output_tokens\n return {\n input_tokens: inputTokens,\n output_tokens: outputTokens,\n total_tokens: inputTokens + outputTokens,\n input_tokens_details: {\n cached_tokens: cachedTokens,\n ...(cacheWriteTokens > 0 ? { cache_write_tokens: cacheWriteTokens } : {}),\n },\n output_tokens_details: { reasoning_tokens: 0 },\n }\n}\n\nexport function encodeMessagesCompaction(summary: string): string {\n const payload = `${MESSAGES_COMPACTION_PREFIX}${Buffer.from(summary, \"utf8\").toString(\"base64url\")}`\n return Buffer.from(payload, \"utf8\").toString(\"base64\")\n}\n\nexport function decodeMessagesCompaction(value: string): string | null {\n let payload = value\n if (!payload.startsWith(MESSAGES_COMPACTION_PREFIX)) {\n const decoded = Buffer.from(value, \"base64\")\n if (decoded.toString(\"base64\") !== value) return null\n payload = decoded.toString(\"utf8\")\n }\n if (!payload.startsWith(MESSAGES_COMPACTION_PREFIX)) return null\n\n try {\n const encoded = payload.slice(MESSAGES_COMPACTION_PREFIX.length)\n if (!encoded) return null\n return Buffer.from(encoded, \"base64url\").toString(\"utf8\")\n } catch {\n return null\n }\n}\n\nexport function resolveToolDescriptor(\n registry: MessagesToolRegistry,\n alias: string,\n): MessagesToolDescriptor {\n return (\n registry.byAlias.get(alias) ?? {\n alias,\n kind: \"function\",\n name: alias,\n }\n )\n}\n\nexport function decodeCustomToolInput(input: unknown): string {\n if (isRecord(input) && typeof input.input === \"string\") {\n return input.input\n }\n return typeof input === \"string\" ? input : JSON.stringify(input ?? {})\n}\n\nexport function toResponseId(messageId: string): string {\n const normalized = messageId.replace(/^msg[-_]?/u, \"\")\n return `resp_${normalized || createStableHash(messageId)}`\n}\n\nfunction normalizeResponsesInput(\n input: ResponsesPayload[\"input\"],\n): ResponsesInputNormalization {\n if (!Array.isArray(input)) {\n return { compaction: false, input }\n }\n\n const triggerIndexes = input.flatMap((item, index) =>\n getItemType(item) === \"compaction_trigger\" ? [index] : [],\n )\n const compaction = triggerIndexes.length > 0\n if (\n triggerIndexes.length > 1\n || (compaction && triggerIndexes[0] !== input.length - 1)\n ) {\n throw new ResponsesMessagesTranslationError(\n \"compaction_trigger must be the final Responses input item\",\n )\n }\n\n const withoutTrigger = compaction ? input.slice(0, -1) : [...input]\n let latestCompactionIndex = -1\n for (let index = withoutTrigger.length - 1; index >= 0; index -= 1) {\n if (getItemType(withoutTrigger[index]) === \"compaction\") {\n latestCompactionIndex = index\n break\n }\n }\n\n if (latestCompactionIndex < 0) {\n return { compaction, input: withoutTrigger }\n }\n\n const carrier = withoutTrigger[latestCompactionIndex]\n const encryptedContent = getStringField(carrier, \"encrypted_content\")\n const summary =\n encryptedContent ? decodeMessagesCompaction(encryptedContent) : null\n if (!summary) {\n throw new ResponsesMessagesTranslationError(\n \"This Messages-backed model cannot replay a compaction created by another Responses backend; start a new conversation or switch back to the original model\",\n )\n }\n\n const replayMessage: ResponseInputMessage = {\n type: \"message\",\n role: \"user\",\n content: `${COMPACTION_REPLAY_PROMPT}${summary}`,\n }\n return {\n compaction,\n input: [replayMessage, ...withoutTrigger.slice(latestCompactionIndex + 1)],\n }\n}\n\nfunction removeWebSearchTool(payload: ResponsesPayload): void {\n if (!Array.isArray(payload.tools) || payload.tools.length === 0) return\n\n payload.tools = payload.tools.filter((tool) => tool.type !== \"web_search\")\n}\n\nfunction createToolRegistry(\n payload: ResponsesPayload,\n model: string,\n): MessagesToolRegistry {\n // Claude-family upstream models skip strict custom tools. Match the upstream\n // model id only, so a provider prefix such as \"claude-relay/\" does not count.\n const upstreamModel = parseProviderModelAlias(model)?.model ?? model\n const strictCustomTools = !upstreamModel.toLowerCase().includes(\"claude\")\n const registry: MessagesToolRegistry = {\n byAlias: new Map(),\n byOriginal: new Map(),\n tools: [],\n }\n\n for (const tool of payload.tools ?? []) {\n registerTool(tool, registry, strictCustomTools)\n }\n\n if (Array.isArray(payload.input)) {\n for (const item of payload.input) {\n const type = getItemType(item)\n if (type !== \"additional_tools\") continue\n for (const tool of getArrayField(item, \"tools\")) {\n registerTool(tool, registry, strictCustomTools)\n }\n break\n }\n }\n\n return registry\n}\n\nconst EXEC_COMMAND_TOOL_NAME = \"exec_command\"\n\n/**\n * Reports whether the request exposes a direct `exec_command` tool, at the top\n * level, inside a namespace, or through `input.additional_tools`. The\n * additional_tools items are scanned in place, so no tool list is copied.\n */\nfunction hasExecCommandTool(payload: ResponsesPayload): boolean {\n if ((payload.tools ?? []).some(isExecCommandTool)) return true\n if (!Array.isArray(payload.input)) return false\n\n for (const item of payload.input) {\n if (getItemType(item) !== \"additional_tools\") continue\n if (getArrayField(item, \"tools\").some(isExecCommandTool)) return true\n break\n }\n return false\n}\n\nfunction isExecCommandTool(tool: unknown): boolean {\n if (getStringField(tool, \"name\") === EXEC_COMMAND_TOOL_NAME) return true\n if (!isNamespaceTool(tool)) return false\n return tool.tools.some(isExecCommandTool)\n}\n\nfunction isNamespaceTool(tool: unknown): tool is NamespaceTool {\n return getStringField(tool, \"type\") === \"namespace\"\n}\n\nfunction registerTool(\n tool: unknown,\n registry: MessagesToolRegistry,\n strictCustomTools: boolean,\n namespaces: Array<string> = [],\n): void {\n if (!isRecord(tool)) {\n throw new ResponsesMessagesTranslationError(\n \"Invalid Responses tool definition\",\n )\n }\n\n const type = getStringField(tool, \"type\")\n if (type === \"namespace\") {\n const namespaceTool = tool as unknown as NamespaceTool\n const namespace = getStringField(namespaceTool, \"name\")\n if (!namespace || !Array.isArray(namespaceTool.tools)) {\n throw new ResponsesMessagesTranslationError(\n \"Responses namespace tools require a name and tools array\",\n )\n }\n for (const child of namespaceTool.tools) {\n registerTool(child, registry, strictCustomTools, [\n ...namespaces,\n namespace,\n ])\n }\n return\n }\n\n if (type !== \"function\" && type !== \"custom\") {\n const suffix = type ? ` '${type}'` : \" without a type\"\n throw new ResponsesMessagesTranslationError(\n `Responses Messages fallback does not support tool${suffix}`,\n )\n }\n\n const name = getStringField(tool, \"name\")\n if (!name) {\n throw new ResponsesMessagesTranslationError(\n `Responses ${type} tools require a non-empty name`,\n )\n }\n\n registerMessagesTool(\n {\n kind: type,\n name,\n namespace: namespaces.length > 0 ? namespaces.join(\".\") : undefined,\n description: getOptionalStringField(tool, \"description\"),\n parameters:\n type === \"function\" && isRecord(tool.parameters) ?\n tool.parameters\n : null,\n },\n registry,\n strictCustomTools,\n )\n}\n\nfunction registerMessagesTool(\n registration: ToolRegistration,\n registry: MessagesToolRegistry,\n strictCustomTools: boolean,\n): MessagesToolDescriptor {\n const originalKey = createOriginalToolKey(registration)\n const existing = registry.byOriginal.get(originalKey)\n if (existing) return existing\n\n const descriptor = createMessagesToolDescriptor(registration, registry)\n registry.byAlias.set(descriptor.alias, descriptor)\n registry.byOriginal.set(originalKey, descriptor)\n registry.tools.push({\n name: descriptor.alias,\n ...(registration.description ?\n { description: registration.description }\n : {}),\n input_schema:\n registration.kind === \"custom\" ?\n CUSTOM_TOOL_INPUT_SCHEMA\n : (registration.parameters ?? { type: \"object\", properties: {} }),\n ...(registration.kind === \"custom\" && strictCustomTools ?\n { strict: true }\n : {}),\n })\n return descriptor\n}\n\nfunction createMessagesToolDescriptor(\n registration: Pick<ToolRegistration, \"kind\" | \"name\" | \"namespace\">,\n registry: MessagesToolRegistry,\n): MessagesToolDescriptor {\n const originalKey = createOriginalToolKey(registration)\n const preferredName =\n registration.namespace && registration.namespace !== \"functions\" ?\n `${registration.namespace.replaceAll(\".\", \"_\")}__${registration.name}`\n : registration.name\n const alias = createToolAlias(preferredName, originalKey, registry)\n return {\n alias,\n kind: registration.kind,\n name: registration.name,\n ...(registration.namespace ? { namespace: registration.namespace } : {}),\n }\n}\n\nfunction translateInputToAnthropic(\n input: string | Array<ResponseInputItem> | undefined,\n registry: MessagesToolRegistry,\n instructions: string | null | undefined,\n originalInput: ResponsesPayload[\"input\"],\n toolCallTips: boolean,\n): {\n messages: Array<AnthropicInputMessage>\n system: Array<AnthropicTextBlock>\n} {\n const messages: Array<AnthropicInputMessage> = []\n const system: Array<AnthropicTextBlock> = []\n if (instructions?.trim()) {\n system.push({ type: \"text\", text: instructions })\n }\n appendDeveloperPrompts(system, originalInput)\n\n if (typeof input === \"string\") {\n messages.push({ role: \"user\", content: input })\n } else if (Array.isArray(input)) {\n translateInputItems(input, messages, system, registry)\n }\n if (toolCallTips) {\n appendToolCallTips(system)\n }\n return { messages, system }\n}\n\nfunction appendToolCallTips(\n system: Array<AnthropicTextBlock>,\n tips = MESSAGES_TOOL_CALL_TIPS,\n): void {\n const lastSystemBlock = system.at(-1)\n if (!lastSystemBlock) {\n system.push({ type: \"text\", text: tips })\n return\n }\n lastSystemBlock.text = `${lastSystemBlock.text}\\n\\n${tips}`\n}\n\nfunction translateInputItems(\n input: Array<ResponseInputItem>,\n messages: Array<AnthropicInputMessage>,\n system: Array<AnthropicTextBlock>,\n registry: MessagesToolRegistry,\n): void {\n let userMessageSeen = false\n for (const item of input) {\n const type = getItemType(item)\n switch (type) {\n case undefined:\n case \"message\": {\n translateInputMessage(item, messages, system, userMessageSeen)\n if (getStringField(item, \"role\") === \"user\") {\n userMessageSeen = true\n }\n break\n }\n case \"agent_message\": {\n translateInputAgentMessage(item as ResponseInputAgentMessage, messages)\n userMessageSeen = true\n break\n }\n case \"reasoning\": {\n translateInputReasoning(item as ResponseInputReasoning, messages)\n break\n }\n case \"function_call\": {\n translateInputToolCall(item, \"function\", messages, registry)\n break\n }\n case \"custom_tool_call\": {\n translateInputToolCall(item, \"custom\", messages, registry)\n break\n }\n case \"function_call_output\":\n case \"custom_tool_call_output\": {\n appendUserBlock(messages, {\n type: \"tool_result\",\n tool_use_id: requireStringField(item, \"call_id\", type),\n content: translateToolResultContent(\n (item as Record<string, unknown>).output,\n `${type}.output`,\n ),\n is_error: getStringField(item, \"status\") === \"incomplete\",\n })\n break\n }\n case \"additional_tools\": {\n break\n }\n default: {\n throw new ResponsesMessagesTranslationError(\n `Responses Messages fallback does not support input item type '${type}'`,\n )\n }\n }\n }\n}\n\nfunction translateInputMessage(\n item: ResponseInputItem,\n messages: Array<AnthropicInputMessage>,\n system: Array<AnthropicTextBlock>,\n userMessageSeen: boolean,\n): void {\n if (!isRecord(item)) {\n throw new ResponsesMessagesTranslationError(\n \"Invalid Responses message item\",\n )\n }\n const role = getStringField(item, \"role\")\n if (\n role !== \"user\"\n && role !== \"assistant\"\n && role !== \"system\"\n && role !== \"developer\"\n ) {\n throw new ResponsesMessagesTranslationError(\n \"Responses message items require a supported role\",\n )\n }\n\n if (role === \"developer\" && !userMessageSeen) return\n\n if (role === \"system\") {\n const text = translateSystemContent(item.content, \"message.content\")\n if (text) system.push({ type: \"text\", text })\n return\n }\n\n if (role === \"assistant\") {\n const blocks = translateAssistantContent(item.content, \"message.content\")\n for (const block of blocks) {\n appendAssistantBlock(messages, block)\n }\n return\n }\n\n const content = translateUserContent(item.content, \"message.content\")\n messages.push({ role: \"user\", content })\n}\n\nfunction translateInputAgentMessage(\n item: ResponseInputAgentMessage,\n messages: Array<AnthropicInputMessage>,\n): void {\n const content = translateUserContent(item.content, \"agent_message.content\")\n messages.push({ role: \"user\", content })\n}\n\nfunction appendDeveloperPrompts(\n system: Array<AnthropicTextBlock>,\n input: ResponsesPayload[\"input\"],\n): void {\n if (!Array.isArray(input)) return\n\n const prompts: Array<string> = []\n for (const item of input) {\n if (prompts.length >= MAX_DEVELOPER_PROMPTS) break\n const type = getItemType(item)\n const role = getStringField(item, \"role\")\n if (type === \"agent_message\") break\n if ((type === undefined || type === \"message\") && role === \"user\") break\n if ((type !== undefined && type !== \"message\") || role !== \"developer\") {\n continue\n }\n prompts.push(\n translateSystemContent(\n isRecord(item) ? item.content : undefined,\n \"message.content\",\n ),\n )\n }\n\n const [firstPrompt, ...remainingPrompts] = prompts\n if (firstPrompt) system.push({ type: \"text\", text: firstPrompt })\n\n const mergedPrompts = remainingPrompts.filter(Boolean).join(\"\\n\\n\")\n if (mergedPrompts) system.push({ type: \"text\", text: mergedPrompts })\n}\n\nfunction translateInputReasoning(\n item: ResponseInputReasoning,\n messages: Array<AnthropicInputMessage>,\n): void {\n const thinking =\n Array.isArray(item.summary) ?\n item.summary\n .map((part) => (typeof part?.text === \"string\" ? part.text : \"\"))\n .filter(Boolean)\n .join(\"\\n\\n\")\n : \"\"\n appendAssistantBlock(messages, {\n type: \"thinking\",\n thinking: thinking || \"\",\n signature: item.encrypted_content ?? \"\",\n })\n}\n\nfunction translateInputToolCall(\n item: ResponseInputItem,\n kind: MessagesToolDescriptor[\"kind\"],\n messages: Array<AnthropicInputMessage>,\n registry: MessagesToolRegistry,\n): void {\n if (!isRecord(item)) {\n throw new ResponsesMessagesTranslationError(\n \"Invalid Responses tool call item\",\n )\n }\n const name = requireStringField(item, \"name\", `${kind}_tool_call`)\n const namespace = getOptionalStringField(item, \"namespace\") ?? undefined\n const toolIdentity = { kind, name, namespace }\n // Historical calls preserve conversation state; they do not define tools.\n const descriptor =\n findOriginalDescriptor(registry, kind, name, namespace)\n ?? createMessagesToolDescriptor(toolIdentity, registry)\n const input =\n kind === \"custom\" ?\n { input: getStringField(item, \"input\") ?? \"\" }\n : parseFunctionArguments(\n getStringField(item, \"arguments\") ?? \"{}\",\n `${kind}_tool_call.arguments`,\n )\n appendAssistantBlock(messages, {\n type: \"tool_use\",\n id: requireStringField(item, \"call_id\", `${kind}_tool_call`),\n name: descriptor.alias,\n input,\n })\n}\n\nfunction translateUserContent(\n value: unknown,\n path: string,\n): string | Array<AnthropicUserContentBlock> {\n if (value === undefined || value === null) return \"\"\n if (typeof value === \"string\") return value\n if (!Array.isArray(value)) {\n throw new ResponsesMessagesTranslationError(\n `${path} must be text or an array`,\n )\n }\n return value.map((part, index) =>\n translateUserContentPart(part, `${path}[${index}]`),\n )\n}\n\nfunction translateAssistantContent(\n value: unknown,\n path: string,\n): Array<AnthropicAssistantContentBlock> {\n if (value === undefined || value === null) return []\n if (typeof value === \"string\") {\n return value ? [{ type: \"text\", text: value }] : []\n }\n if (!Array.isArray(value)) {\n throw new ResponsesMessagesTranslationError(\n `${path} must be text or an array`,\n )\n }\n return value.map((part, index) => {\n if (!isRecord(part)) {\n throw new ResponsesMessagesTranslationError(\n `${path}[${index}] must be an object`,\n )\n }\n const type = getStringField(part, \"type\")\n if (type !== \"input_text\" && type !== \"output_text\" && type !== \"text\") {\n throw new ResponsesMessagesTranslationError(\n `${path}[${index}] has unsupported assistant content type '${type ?? \"unknown\"}'`,\n )\n }\n return {\n type: \"text\" as const,\n text: requireStringField(part, \"text\", `${path}[${index}]`),\n }\n })\n}\n\nfunction translateSystemContent(value: unknown, path: string): string {\n if (value === undefined || value === null) return \"\"\n if (typeof value === \"string\") return value\n if (!Array.isArray(value)) {\n throw new ResponsesMessagesTranslationError(\n `${path} must be text or an array`,\n )\n }\n return value\n .map((part, index) => {\n if (!isRecord(part)) {\n throw new ResponsesMessagesTranslationError(\n `${path}[${index}] must be an object`,\n )\n }\n const type = getStringField(part, \"type\")\n if (type !== \"input_text\" && type !== \"output_text\" && type !== \"text\") {\n throw new ResponsesMessagesTranslationError(\n `${path}[${index}] has unsupported system content type '${type ?? \"unknown\"}'`,\n )\n }\n return requireStringField(part, \"text\", `${path}[${index}]`)\n })\n .join(\"\\n\\n\")\n}\n\nfunction translateUserContentPart(\n part: unknown,\n path: string,\n): AnthropicTextBlock | AnthropicImageBlock | AnthropicDocumentBlock {\n if (!isRecord(part)) {\n throw new ResponsesMessagesTranslationError(`${path} must be an object`)\n }\n const type = getStringField(part, \"type\")\n if (type === \"input_text\" || type === \"output_text\" || type === \"text\") {\n return { type: \"text\", text: requireStringField(part, \"text\", path) }\n }\n if (type === \"encrypted_content\") {\n return {\n type: \"text\",\n text: requireStringField(part, \"encrypted_content\", path),\n }\n }\n if (type === \"input_image\") {\n return translateImagePart(part, path)\n }\n if (type === \"input_file\") {\n return translateFilePart(part, path)\n }\n throw new ResponsesMessagesTranslationError(\n `${path} has unsupported content type '${type ?? \"unknown\"}'`,\n )\n}\n\nfunction translateToolResultContent(\n value: unknown,\n path: string,\n): string | Array<AnthropicToolResultContentBlock> {\n if (value === undefined || value === null) return \"\"\n if (typeof value === \"string\") return value\n if (!Array.isArray(value)) {\n throw new ResponsesMessagesTranslationError(\n `${path} must be text or an array`,\n )\n }\n // Codex Desktop can emit empty input_text parts in tool outputs; Anthropic\n // rejects empty text blocks, so drop them instead of failing translation.\n const blocks = value.flatMap((part, index) =>\n isEmptyTextContentPart(part) ?\n []\n : [translateUserContentPart(part, `${path}[${index}]`)],\n )\n return blocks.length > 0 ? blocks : \"\"\n}\n\nfunction isEmptyTextContentPart(part: unknown): boolean {\n if (!isRecord(part)) return false\n const type = part.type\n return (\n (type === \"input_text\" || type === \"output_text\" || type === \"text\")\n && part.text === \"\"\n )\n}\n\nfunction translateImagePart(\n part: Record<string, unknown>,\n path: string,\n): AnthropicImageBlock {\n const imageUrl = getStringField(part, \"image_url\")\n if (!imageUrl) {\n throw new ResponsesMessagesTranslationError(\n `${path} requires image_url; file_id-only images cannot be sent to Messages`,\n )\n }\n const parsed = parseDataUrl(imageUrl)\n if (\n !parsed\n || (parsed.mediaType !== \"image/jpeg\"\n && parsed.mediaType !== \"image/png\"\n && parsed.mediaType !== \"image/gif\"\n && parsed.mediaType !== \"image/webp\")\n ) {\n throw new ResponsesMessagesTranslationError(\n `${path} requires a base64 JPEG, PNG, GIF, or WebP data URL`,\n )\n }\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: parsed.mediaType,\n data: parsed.data,\n },\n }\n}\n\nfunction translateFilePart(\n part: Record<string, unknown>,\n path: string,\n): AnthropicDocumentBlock {\n const fileData = getStringField(part, \"file_data\")\n if (!fileData) {\n throw new ResponsesMessagesTranslationError(\n `${path} requires file_data; file_id-only files cannot be sent to Messages`,\n )\n }\n const parsed = parseDataUrl(fileData)\n if (parsed?.mediaType !== \"application/pdf\") {\n throw new ResponsesMessagesTranslationError(\n `${path} requires a base64 PDF data URL`,\n )\n }\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: parsed.data,\n },\n title: getOptionalStringField(part, \"filename\") ?? \"document.pdf\",\n }\n}\n\nfunction translateToolChoice(\n toolChoice: ResponsesPayload[\"tool_choice\"],\n registry: MessagesToolRegistry,\n): AnthropicMessagesPayload[\"tool_choice\"] {\n if (!toolChoice || registry.tools.length === 0) return undefined\n if (typeof toolChoice === \"string\") {\n if (toolChoice === \"required\") return { type: \"any\" }\n return { type: toolChoice }\n }\n\n const kind = (toolChoice as { type: string }).type\n if (kind !== \"function\" && kind !== \"custom\") {\n throw new ResponsesMessagesTranslationError(\n `Responses Messages fallback does not support tool_choice type '${String(kind)}'`,\n )\n }\n const rawName = (toolChoice as { name: string }).name\n const namespace = getOptionalStringField(toolChoice, \"namespace\") ?? undefined\n const descriptor = findOriginalDescriptor(registry, kind, rawName, namespace)\n if (!descriptor) {\n throw new ResponsesMessagesTranslationError(\n `tool_choice references unknown ${kind} tool '${rawName}'`,\n )\n }\n return { type: \"tool\", name: descriptor.alias }\n}\n\nfunction translateAssistantOutput(\n response: AnthropicResponse,\n registry: MessagesToolRegistry,\n): Array<ResponseOutputItem> {\n const output: Array<ResponseOutputItem> = []\n for (const [index, block] of response.content.entries()) {\n if (block.type === \"thinking\") {\n output.push({\n id: markMessagesReasoningId(\n `rs_${createStableHash(`${response.id}:${index}:reasoning`)}`,\n ),\n type: \"reasoning\",\n status: \"completed\",\n ...(block.thinking && block.thinking !== \"Thinking...\" ?\n { summary: [{ type: \"summary_text\", text: block.thinking }] }\n : {}),\n ...(block.signature ? { encrypted_content: block.signature } : {}),\n })\n continue\n }\n if (block.type === \"text\") {\n output.push({\n id: `msg_${createStableHash(`${response.id}:${index}:message`)}`,\n type: \"message\",\n role: \"assistant\",\n status: \"completed\",\n content: [\n {\n type: \"output_text\",\n text: block.text,\n annotations: [],\n },\n ],\n })\n continue\n }\n if (block.type === \"tool_use\") {\n output.push(\n translateToolUseOutput(block, registry, `${response.id}:${index}:tool`),\n )\n }\n }\n return output\n}\n\nfunction translateToolUseOutput(\n block: AnthropicToolUseBlock,\n registry: MessagesToolRegistry,\n idSeed: string,\n): ResponseOutputFunctionCall | ResponseOutputCustomToolCall {\n const descriptor = resolveToolDescriptor(registry, block.name)\n const common = {\n call_id: block.id,\n name: descriptor.name,\n status: \"completed\" as const,\n ...(descriptor.namespace ? { namespace: descriptor.namespace } : {}),\n }\n if (descriptor.kind === \"custom\") {\n return {\n ...common,\n id: `ctc_${createStableHash(idSeed)}`,\n type: \"custom_tool_call\",\n input: decodeCustomToolInput(block.input),\n }\n }\n return {\n ...common,\n id: `fc_${createStableHash(idSeed)}`,\n type: \"function_call\",\n arguments: JSON.stringify(block.input),\n }\n}\n\nfunction translateCompactionOutput(\n response: AnthropicResponse,\n): Array<ResponseOutputItem> {\n const hasToolUse = response.content.some((block) => block.type === \"tool_use\")\n if (hasToolUse) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API attempted a tool call during compaction\",\n 502,\n )\n }\n const summary = extractAnthropicResponseText(response).trim()\n if (!summary) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API compaction response did not contain a text summary\",\n 502,\n )\n }\n return [\n {\n id: `cmp_${createStableHash(summary)}`,\n type: \"compaction\",\n encrypted_content: encodeMessagesCompaction(summary),\n },\n ]\n}\n\nfunction extractAnthropicResponseText(response: AnthropicResponse): string {\n return response.content\n .flatMap((block) => (block.type === \"text\" ? [block.text] : []))\n .join(\"\")\n}\n\nfunction translateStopReason(stopReason: AnthropicResponse[\"stop_reason\"]): {\n status: \"completed\" | \"incomplete\"\n incompleteReason?: \"content_filter\" | \"max_output_tokens\"\n} {\n if (stopReason === \"max_tokens\") {\n return { status: \"incomplete\", incompleteReason: \"max_output_tokens\" }\n }\n if (stopReason === \"refusal\") {\n return { status: \"incomplete\", incompleteReason: \"content_filter\" }\n }\n return { status: \"completed\" }\n}\n\nfunction translateReasoningEffort(\n effort: Reasoning[\"effort\"],\n):\n | NonNullable<AnthropicMessagesPayload[\"output_config\"]>[\"effort\"]\n | undefined {\n if (effort === \"minimal\") return \"low\"\n if (\n effort === \"low\"\n || effort === \"medium\"\n || effort === \"high\"\n || effort === \"xhigh\"\n || effort === \"max\"\n ) {\n return effort\n }\n return undefined\n}\n\nfunction resolveMetadataUserId(payload: ResponsesPayload): string | undefined {\n const sessionAffinity = requestContext.getStore()?.sessionAffinity?.trim()\n if (sessionAffinity) return sessionAffinity\n const metadataUserId = payload.metadata?.user_id\n if (metadataUserId?.trim()) return metadataUserId\n if (payload.safety_identifier?.trim()) return payload.safety_identifier\n if (payload.prompt_cache_key?.trim()) return payload.prompt_cache_key\n return undefined\n}\n\nconst EPHEMERAL_CACHE_CONTROL: AnthropicCacheControl = { type: \"ephemeral\" }\n\n// Mark the stable prompt prefix for Anthropic prompt caching: the last system\n// block plus the tail block of the final user message.\nfunction applyEphemeralCacheControl(\n messages: Array<AnthropicInputMessage>,\n system: Array<AnthropicTextBlock>,\n): void {\n const lastSystemBlock = system.at(-1)\n if (lastSystemBlock) {\n lastSystemBlock.cache_control = { ...EPHEMERAL_CACHE_CONTROL }\n }\n\n const lastUserMessage = messages.findLast(\n (message): message is AnthropicUserMessage => message.role === \"user\",\n )\n if (!lastUserMessage) return\n\n if (typeof lastUserMessage.content === \"string\") {\n const textBlock: AnthropicTextBlock = {\n type: \"text\",\n text: lastUserMessage.content,\n cache_control: { ...EPHEMERAL_CACHE_CONTROL },\n }\n lastUserMessage.content = [textBlock]\n return\n }\n\n const lastBlock = lastUserMessage.content.at(-1)\n if (!lastBlock) return\n lastBlock.cache_control = { ...EPHEMERAL_CACHE_CONTROL }\n}\n\nfunction appendAssistantBlock(\n messages: Array<AnthropicInputMessage>,\n block: AnthropicAssistantContentBlock,\n): void {\n const last = messages.at(-1)\n if (last?.role === \"assistant\" && Array.isArray(last.content)) {\n last.content.push(block)\n return\n }\n const message: AnthropicAssistantMessage = {\n role: \"assistant\",\n content: [block],\n }\n messages.push(message)\n}\n\nfunction appendUserBlock(\n messages: Array<AnthropicInputMessage>,\n block: AnthropicUserContentBlock,\n): void {\n const last = messages.at(-1)\n if (last?.role === \"user\" && Array.isArray(last.content)) {\n last.content.push(block)\n return\n }\n const message: AnthropicUserMessage = { role: \"user\", content: [block] }\n messages.push(message)\n}\n\nfunction parseFunctionArguments(\n value: string,\n _path: string,\n): Record<string, unknown> {\n try {\n const parsed = JSON.parse(value) as unknown\n if (isRecord(parsed)) return parsed\n } catch {\n return {}\n }\n return {}\n}\n\nfunction parseDataUrl(\n value: string,\n): { data: string; mediaType: string } | null {\n const match = /^data:([^;,]+);base64,(.*)$/su.exec(value)\n if (!match) return null\n return { mediaType: match[1].toLowerCase(), data: match[2] }\n}\n\nfunction findOriginalDescriptor(\n registry: MessagesToolRegistry,\n kind: MessagesToolDescriptor[\"kind\"],\n name: string,\n namespace?: string,\n): MessagesToolDescriptor | undefined {\n return (\n registry.byOriginal.get(createOriginalToolKey({ kind, name, namespace }))\n ?? (!namespace ?\n registry.byOriginal.get(\n createOriginalToolKey({ kind, name, namespace: \"functions\" }),\n )\n : undefined)\n )\n}\n\nfunction createOriginalToolKey(\n tool: Pick<MessagesToolDescriptor, \"kind\" | \"name\" | \"namespace\">,\n): string {\n return [tool.kind, tool.namespace ?? \"\", tool.name].join(\"\\u0000\")\n}\n\nfunction createToolAlias(\n preferredName: string,\n originalKey: string,\n registry: MessagesToolRegistry,\n): string {\n if (\n TOOL_NAME_PATTERN.test(preferredName)\n && !registry.byAlias.has(preferredName)\n ) {\n return preferredName\n }\n\n const sanitized = preferredName.replace(/[^A-Za-z0-9_-]+/gu, \"_\")\n const hash = createStableHash(originalKey).slice(0, 12)\n const prefix = `tool_${hash}_`\n const alias = `${prefix}${sanitized}`.slice(0, 64)\n if (!registry.byAlias.has(alias)) return alias\n return `tool_${createStableHash(`${originalKey}:collision`)}`.slice(0, 64)\n}\n\nfunction createStableHash(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 24)\n}\n\nfunction getItemType(value: unknown): string | undefined {\n return isRecord(value) && typeof value.type === \"string\" ?\n value.type\n : undefined\n}\n\nfunction getStringField(value: unknown, field: string): string | undefined {\n if (!isRecord(value)) return undefined\n const fieldValue = value[field]\n return typeof fieldValue === \"string\" ? fieldValue : undefined\n}\n\nfunction getOptionalStringField(\n value: unknown,\n field: string,\n): string | null | undefined {\n if (!isRecord(value)) return undefined\n const fieldValue = value[field]\n return typeof fieldValue === \"string\" || fieldValue === null ?\n fieldValue\n : undefined\n}\n\nfunction requireStringField(\n value: unknown,\n field: string,\n path: string,\n): string {\n const result = getStringField(value, field)\n if (!result) {\n throw new ResponsesMessagesTranslationError(`${path}.${field} is required`)\n }\n return result\n}\n\nfunction getArrayField(value: unknown, field: string): Array<unknown> {\n if (!isRecord(value)) return []\n return Array.isArray(value[field]) ? value[field] : []\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n","import type {\n ResponseContextManagementCompactionItem,\n ResponseCustomToolCallOutputItem,\n ResponseFunctionCallOutputItem,\n ResponseInputAgentMessage,\n ResponseInputContent,\n ResponseInputImage,\n ResponseInputItem,\n ResponseInputMessage,\n ResponsesPayload,\n ResponsesTransport,\n} from \"~/lib/types/responses\"\n\nimport { COMPACT_REQUEST, type CompactType } from \"~/lib/compact\"\nimport {\n getModelResponsesApiCompactThreshold as getConfiguredModelResponsesApiCompactThreshold,\n isContextManagementEnabledForMessages as isConfiguredContextManagementEnabledForMessages,\n isContextManagementEnabledForResponses as isConfiguredContextManagementEnabledForResponses,\n isGpt56OrAbove,\n isResponsesApiWebSocketEnabled as isConfiguredResponsesApiWebSocketEnabled,\n} from \"~/lib/config\"\nimport {\n resolveSupportedReasoningEffort,\n type ResponsesReasoningEffort,\n} from \"~/lib/reasoning-effort\"\n\nimport { isMessagesReasoningId } from \"./messages-translation\"\n\nexport const RESPONSES_ENDPOINT = \"/responses\"\nexport const RESPONSES_WS_ENDPOINT = \"ws:/responses\"\nexport const DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO = 0.85\nexport type ResponsesApiContextManagementSource = \"messages\" | \"responses\"\n\nexport const normalizeResponsesReasoningEffort = (\n payload: ResponsesPayload,\n supportedEfforts: Array<string> | undefined,\n): { from: string; to: ResponsesReasoningEffort } | undefined => {\n if (!payload.reasoning || typeof payload.reasoning.effort !== \"string\") {\n return undefined\n }\n\n const resolvedEffort = resolveSupportedReasoningEffort(\n payload.reasoning.effort,\n supportedEfforts,\n )\n if (!resolvedEffort || resolvedEffort === payload.reasoning.effort) {\n return undefined\n }\n\n const requestedEffort = payload.reasoning.effort\n payload.reasoning.effort = resolvedEffort\n return { from: requestedEffort, to: resolvedEffort }\n}\n\nexport const responsesUtilsDependencies = {\n getModelResponsesApiCompactThreshold:\n getConfiguredModelResponsesApiCompactThreshold,\n isContextManagementEnabledForMessages:\n isConfiguredContextManagementEnabledForMessages,\n isContextManagementEnabledForResponses:\n isConfiguredContextManagementEnabledForResponses,\n isGpt56OrAbove,\n isResponsesApiWebSocketEnabled: isConfiguredResponsesApiWebSocketEnabled,\n}\n\nexport const getResponsesRequestOptions = (\n payload: ResponsesPayload,\n): { vision: boolean; initiator: \"agent\" | \"user\" } => {\n const vision = hasVisionInput(payload)\n const initiator = hasAgentInitiator(payload) ? \"agent\" : \"user\"\n\n return { vision, initiator }\n}\n\nexport const getResponsesTransportForModel = (\n selectedModel:\n | {\n supported_endpoints?: Array<string>\n }\n | undefined,\n options: {\n compactType?: CompactType\n } = {},\n): ResponsesTransport | null => {\n const supportedEndpoints = selectedModel?.supported_endpoints ?? []\n const useWebSocket =\n responsesUtilsDependencies.isResponsesApiWebSocketEnabled()\n\n if (\n options.compactType !== COMPACT_REQUEST\n && useWebSocket\n && supportedEndpoints.includes(RESPONSES_WS_ENDPOINT)\n ) {\n return \"websocket\"\n }\n\n if (supportedEndpoints.includes(RESPONSES_ENDPOINT)) {\n return \"http\"\n }\n\n return null\n}\n\nexport const hasAgentInitiator = (payload: ResponsesPayload): boolean => {\n // Refactor `isAgentCall` logic to check only the last message in the history rather than any message. This prevents valid user messages from being incorrectly flagged as agent calls due to previous assistant history, ensuring proper credit consumption for multi-turn conversations.\n const lastItem = getPayloadItems(payload).at(-1)\n if (!lastItem) {\n return false\n }\n if (!(\"role\" in lastItem) || !lastItem.role) {\n return true\n }\n const role =\n typeof lastItem.role === \"string\" ? lastItem.role.toLowerCase() : \"\"\n return role === \"assistant\"\n}\n\nexport const hasVisionInput = (payload: ResponsesPayload): boolean => {\n const values = getPayloadItems(payload)\n return values.some((item) => containsVisionContent(item))\n}\n\nconst DATA_URL_PREFIX = \"data:\"\n// Static 96x32 PNG reading \"Image too large / Redacted\".\nconst REDACTED_IMAGE_PLACEHOLDER_DATA_URL =\n \"data:image/png;base64,\"\n + [\n \"iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAMAAADaHo1mAAADAFBMVEX///8fKTfR1dsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAACae8QWAAAAvElEQVR42u1WixKAIAhj/f9Hdz2BXJiVed3pVSYtpgwsGSo3GaRq6wSd4F8EyIJx\",\n \"ydSUAMB8il51sHT2fiVQu8czguQwXWAyFvswIJhmoS9gmzYlcFiHj1aAgzcJVgCyguYhAhNZmMhYQZs1EJnnIAqKiuHjSrZT\",\n \"ucSQ4s8JkKDDIYr3IuR8vEWgqroKP9b1bYKk2wfgeVmqATQLXdXamsXdEKkz3QXEEeTTuWWImMhW6qci94/+hwSVf99HqVoD\",\n \"OAuj2SEAAAAASUVORK5CYII=\",\n ].join(\"\")\n\nconst COPILOT_UNSUPPORTED_INPUT_ITEM_FIELDS = [\n \"internal_chat_message_metadata_passthrough\",\n] as const\n\nconst isInputAgentMessage = (\n item: ResponseInputItem,\n): item is ResponseInputAgentMessage => item.type === \"agent_message\"\n\nexport const normalizeGuardianAgentMessages = (\n payload: ResponsesPayload,\n): number => {\n if (\n !payload.prompt_cache_key?.startsWith(\"guardia\")\n || payload.text?.format?.type !== \"json_schema\"\n || !Array.isArray(payload.input)\n ) {\n return 0\n }\n\n let normalizedCount = 0\n payload.input = payload.input.map((item: ResponseInputItem) => {\n if (!isInputAgentMessage(item)) return item\n\n const agentMessage = item\n normalizedCount += 1\n return {\n type: \"message\",\n role: \"user\",\n // Discard encrypted blocks to fix Copilot's error:\n // \"Encrypted function output content could not be decrypted or decoded.\"\n content: agentMessage.content.filter(\n (part) => part.type !== \"encrypted_content\",\n ),\n } satisfies ResponseInputMessage\n })\n\n return normalizedCount\n}\n\nexport const sanitizeUnsupportedInputFields = (\n payload: ResponsesPayload,\n): number => {\n if (!Array.isArray(payload.input)) {\n return 0\n }\n\n let removedFieldCount = 0\n for (const item of payload.input) {\n if (typeof item !== \"object\" || item === null) {\n continue\n }\n\n const record = item as Record<string, unknown>\n for (const field of COPILOT_UNSUPPORTED_INPUT_ITEM_FIELDS) {\n if (!Object.hasOwn(record, field)) {\n continue\n }\n\n delete record[field]\n removedFieldCount += 1\n }\n }\n\n return removedFieldCount\n}\n\nexport const sanitizeOversizedInputImages = (\n payload: ResponsesPayload,\n maxPromptImageSize?: number,\n): number => {\n const limit =\n typeof maxPromptImageSize === \"number\" && maxPromptImageSize > 0 ?\n maxPromptImageSize\n : undefined\n\n if (limit === undefined || !Array.isArray(payload.input)) {\n return 0\n }\n\n return sanitizeInputImages(\n payload.input,\n (image) => image.decodedBytes > limit,\n )\n}\n\nexport const sanitizeAllInputImages = (payload: ResponsesPayload): number => {\n if (!Array.isArray(payload.input)) {\n return 0\n }\n\n return sanitizeInputImages(payload.input, () => true)\n}\n\nexport const normalizeInputImageDetails = (\n payload: ResponsesPayload,\n): number => {\n if (!Array.isArray(payload.input)) {\n return 0\n }\n\n let normalizedCount = 0\n for (const image of collectInputImages(payload.input)) {\n if (\n image.detail === undefined\n || VALID_INPUT_IMAGE_DETAILS.has(image.detail)\n ) {\n continue\n }\n\n image.detail = \"auto\"\n normalizedCount += 1\n }\n\n return normalizedCount\n}\n\ninterface InputImageDataUrl {\n decodedBytes: number\n record: ResponseInputImage\n}\n\nconst sanitizeInputImages = (\n input: Array<ResponseInputItem>,\n shouldReplace: (image: InputImageDataUrl) => boolean,\n): number => {\n let count = 0\n for (const record of collectInputImages(input)) {\n const image = getInputImageDataUrl(record)\n if (!image) {\n continue\n }\n\n if (!shouldReplace(image)) {\n continue\n }\n\n replaceInputImageWithPlaceholder(image)\n count += 1\n }\n\n return count\n}\n\nconst collectInputImages = (\n input: Array<ResponseInputItem>,\n images: Array<ResponseInputImage> = [],\n): Array<ResponseInputImage> => {\n for (const item of input) {\n if (isResponseInputMessage(item)) {\n collectContentImages(item.content, images)\n } else if (isResponseFunctionCallOutputItem(item)) {\n collectContentImages(item.output, images)\n }\n }\n\n return images\n}\n\nconst collectContentImages = (\n content: string | Array<ResponseInputContent> | undefined,\n images: Array<ResponseInputImage>,\n): void => {\n if (!Array.isArray(content)) {\n return\n }\n\n for (const block of content) {\n if (isResponseInputImage(block)) {\n images.push(block)\n }\n }\n}\n\nconst getInputImageDataUrl = (\n image: ResponseInputImage,\n): InputImageDataUrl | null => {\n if (typeof image.image_url !== \"string\") {\n return null\n }\n\n const imageUrl = image.image_url\n if (!imageUrl.startsWith(DATA_URL_PREFIX)) {\n return null\n }\n\n const decodedBytes = estimateDataUrlByteLength(imageUrl)\n\n return {\n decodedBytes,\n record: image,\n }\n}\n\nconst estimateDataUrlByteLength = (value: string): number => {\n return Math.max(0, Math.floor((value.length * 3) / 4))\n}\n\nconst replaceInputImageWithPlaceholder = (image: InputImageDataUrl): void => {\n image.record.type = \"input_image\"\n image.record.image_url = REDACTED_IMAGE_PLACEHOLDER_DATA_URL\n image.record.detail = \"low\"\n delete image.record.file_id\n}\n\nconst VALID_INPUT_IMAGE_DETAILS: ReadonlySet<\n NonNullable<ResponseInputImage[\"detail\"]>\n> = new Set([\"auto\", \"high\", \"low\"])\n\nconst isResponseInputMessage = (\n item: ResponseInputItem,\n): item is ResponseInputMessage => {\n return (\n typeof item === \"object\"\n && item !== null\n && \"role\" in item\n && typeof item.role === \"string\"\n )\n}\n\nconst isResponseFunctionCallOutputItem = (\n item: ResponseInputItem,\n): item is\n | ResponseCustomToolCallOutputItem\n | ResponseFunctionCallOutputItem => {\n return (\n typeof item === \"object\"\n && item !== null\n && \"type\" in item\n && (item.type === \"custom_tool_call_output\"\n || item.type === \"function_call_output\")\n )\n}\n\nconst isResponseInputImage = (\n content: ResponseInputContent,\n): content is ResponseInputImage => {\n return (\n typeof content === \"object\"\n && content !== null\n && \"type\" in content\n && content.type === \"input_image\"\n )\n}\n\nexport const resolveResponsesCompactThreshold = (\n maxPromptTokens?: number,\n compactThresholdRatio = DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO,\n): number => {\n if (typeof maxPromptTokens === \"number\" && maxPromptTokens > 0) {\n return Math.floor(maxPromptTokens * compactThresholdRatio)\n }\n\n return 200_000 * compactThresholdRatio\n}\n\nconst getModelResponsesApiCompactThreshold = (\n model: string,\n): number | undefined => {\n const threshold =\n responsesUtilsDependencies.getModelResponsesApiCompactThreshold(model)\n\n if (\n typeof threshold !== \"number\"\n || !Number.isFinite(threshold)\n || threshold <= 0\n ) {\n return undefined\n }\n\n return threshold\n}\n\nconst createCompactionContextManagement = (\n compactThreshold: number,\n): Array<ResponseContextManagementCompactionItem> => [\n {\n type: \"compaction\",\n compact_threshold: compactThreshold,\n },\n]\n\nexport const filterReasoningForTransport = (\n payload: ResponsesPayload,\n useMessagesFallback: boolean,\n): void => {\n if (!Array.isArray(payload.input)) return\n\n payload.input = payload.input.filter((item) => {\n if (item.type !== \"reasoning\") return true\n return isMessagesReasoningId(item.id) === useMessagesFallback\n })\n}\n\nexport const applyResponsesApiContextManagement = (\n payload: ResponsesPayload,\n maxPromptTokens: number | undefined,\n options: {\n compactThresholdRatio?: number\n source: ResponsesApiContextManagementSource\n },\n): boolean => {\n if (!payload.model.startsWith(\"gpt\")) {\n return false\n }\n\n if (responsesUtilsDependencies.isGpt56OrAbove(payload.model)) {\n return false\n }\n\n if (hasTerminalCompactionTrigger(payload)) {\n return isContextManagementEnabledForSource(options.source)\n }\n\n if (payload.context_management !== undefined) {\n return true\n }\n\n if (!isContextManagementEnabledForSource(options.source)) {\n return false\n }\n\n const modelCompactThreshold = getModelResponsesApiCompactThreshold(\n payload.model,\n )\n payload.context_management = createCompactionContextManagement(\n modelCompactThreshold\n ?? resolveResponsesCompactThreshold(\n maxPromptTokens,\n options.compactThresholdRatio\n ?? DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO,\n ),\n )\n return true\n}\n\nconst isContextManagementEnabledForSource = (\n source: ResponsesApiContextManagementSource,\n): boolean => {\n if (source === \"messages\") {\n return responsesUtilsDependencies.isContextManagementEnabledForMessages()\n }\n\n return responsesUtilsDependencies.isContextManagementEnabledForResponses()\n}\n\nconst hasTerminalCompactionTrigger = (payload: ResponsesPayload): boolean => {\n const { input } = payload\n if (!Array.isArray(input) || input.length === 0) {\n return false\n }\n\n return isResponseInputItemType(input.at(-1), \"compaction_trigger\")\n}\n\nexport const compactInputByLatestCompaction = (\n payload: ResponsesPayload,\n): void => {\n if (!Array.isArray(payload.input) || payload.input.length === 0) {\n return\n }\n\n const latestCompactionMessageIndex = getLatestCompactionMessageIndex(\n payload.input,\n )\n\n if (latestCompactionMessageIndex === undefined) {\n return\n }\n\n payload.input = payload.input.slice(latestCompactionMessageIndex)\n}\n\nconst getLatestCompactionMessageIndex = (\n input: Array<ResponseInputItem>,\n): number | undefined => {\n for (let index = input.length - 1; index >= 0; index -= 1) {\n if (isCompactionInputItem(input[index])) {\n return index\n }\n }\n\n return undefined\n}\n\nconst isCompactionInputItem = (value: ResponseInputItem): boolean => {\n return isResponseInputItemType(value, \"compaction\")\n}\n\nconst isResponseInputItemType = (value: unknown, type: string): boolean => {\n return (\n typeof value === \"object\"\n && value !== null\n && \"type\" in value\n && value.type === type\n )\n}\n\nconst getPayloadItems = (\n payload: ResponsesPayload,\n): Array<ResponseInputItem> => {\n const result: Array<ResponseInputItem> = []\n\n const { input } = payload\n\n if (Array.isArray(input)) {\n result.push(...input)\n }\n\n return result\n}\n\nconst containsVisionContent = (value: unknown): boolean => {\n if (!value) return false\n\n if (Array.isArray(value)) {\n return value.some((entry) => containsVisionContent(entry))\n }\n\n if (typeof value !== \"object\") {\n return false\n }\n\n const record = value as Record<string, unknown>\n const type =\n typeof record.type === \"string\" ? record.type.toLowerCase() : undefined\n\n if (type === \"input_image\") {\n return true\n }\n\n if (Array.isArray(record.content)) {\n return record.content.some((entry) => containsVisionContent(entry))\n }\n\n return false\n}\n","import type { ConsolaInstance } from \"consola\"\nimport type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\n\nimport type { CompactType } from \"~/lib/compact\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { Model } from \"~/lib/types/models\"\n\nimport {\n getMessageApiWebSearchModel,\n isResponsesApiWebSearchEnabled,\n} from \"~/lib/config\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { writeSSEIfConnected } from \"~/lib/sse\"\nimport {\n parseProviderModelAlias,\n type ProviderModelAlias,\n} from \"~/lib/provider-model\"\nimport {\n ensureConfiguredProviderModelAlias,\n resolveProviderConfig,\n type ProviderConfigResolver,\n} from \"~/lib/provider-resolver\"\nimport {\n createCopilotTokenUsageRecorder,\n normalizeOptionalToken,\n normalizeResponsesUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport {\n generateRequestIdFromPayload,\n getRootSessionId,\n getUUID,\n parseUserIdMetadata,\n} from \"~/lib/utils\"\nimport type {\n ResponsesPayload,\n ResponsesResult,\n ResponsesStream,\n} from \"~/lib/types/responses\"\nimport { createResponses as createCopilotResponses } from \"~/services/copilot/create-responses\"\n\nimport type {\n AnthropicContentBlockStartEvent,\n AnthropicMessagesPayload,\n AnthropicResponse,\n AnthropicStreamEventData,\n AnthropicTextBlock,\n AnthropicTool,\n AnthropicWebSearchContentBlock,\n AnthropicWebSearchResultItem,\n} from \"~/lib/types/anthropic\"\nimport { normalizeSystemMessages } from \"../preprocess\"\nimport { collectResponsesStreamResult } from \"../responses-stream-collection\"\nimport { translateAnthropicMessagesToResponsesPayload } from \"../responses-translation\"\nimport {\n getResponsesRequestOptions,\n getResponsesTransportForModel,\n} from \"../../responses/utils\"\nimport {\n buildResponsesWebSearchTool,\n extractWebSearchResult,\n type WebSearchExtract,\n type WebSearchToolConfig,\n} from \"./backend\"\nimport { debugJson } from \"~/lib/logger\"\n\nexport const webSearchFlowDependencies = {\n createResponses: createCopilotResponses,\n getMessageApiWebSearchModel,\n resolveProviderConfig,\n createUsageRecorder: (\n payload: AnthropicMessagesPayload,\n sessionId?: string,\n webSearchModel?: string,\n ): ((usage: UsageTokens) => void) =>\n createCopilotTokenUsageRecorder({\n endpoint: \"responses\",\n fallbackSessionId: sessionId,\n model: webSearchModel ?? payload.model,\n sessionId: parseUserIdMetadata(payload.metadata?.user_id).sessionId,\n }),\n}\n\nexport interface WebSearchFlowOptions {\n logger: ConsolaInstance\n subagentMarker?: SubagentMarker | null\n /** GPT (Responses-capable) model the web search request is switched to. */\n webSearchModel: string\n requestId: string\n sessionId?: string\n compactType?: CompactType\n}\n\nconst isWebSearchServerTool = (tool: AnthropicTool): boolean =>\n typeof tool.type === \"string\"\n && tool.type.startsWith(\"web_search\")\n && !tool.input_schema\n\n/** True when the payload carries an Anthropic server-side web_search tool. */\nexport const hasWebSearchServerTool = (\n payload: AnthropicMessagesPayload,\n): boolean =>\n Array.isArray(payload.tools) && payload.tools.some(isWebSearchServerTool)\n\n/**\n * True when web_search is the ONLY tool in the request. Mixing web_search with\n * other tools is intentionally unsupported, so only these requests are switched\n * to the web search model.\n */\nexport const isWebSearchOnlyRequest = (\n payload: AnthropicMessagesPayload,\n): boolean =>\n Array.isArray(payload.tools)\n && payload.tools.length > 0\n && payload.tools.every(isWebSearchServerTool)\n\n/** Removes web_search server tools (used for unsupported mixed-tool requests). */\nexport const stripWebSearchServerTool = (\n payload: AnthropicMessagesPayload,\n): void => {\n if (!Array.isArray(payload.tools)) return\n payload.tools = payload.tools.filter((tool) => !isWebSearchServerTool(tool))\n}\n\n/**\n * Decides how a web-search request should be handled. Pure so the routing is\n * unit-testable (the provider resolver is injectable). Assumes the caller\n * already confirmed a web_search tool exists.\n *\n * - `provider`: messageApiWebSearchModel is a `provider/model` alias whose\n * provider is actually configured and whose message API supports websearch\n * natively — pass the tool straight through.\n * - `responses`: a Copilot GPT model — run it via the /responses web_search.\n * - `strip`: mixing with other tools, no model configured, or web search off —\n * drop the tool and continue normally. An alias pointing at an unconfigured\n * provider also strips: routing it would 404, and the \"provider/model\"\n * string is not a usable Copilot model id for the responses path.\n */\nexport type WebSearchRoute =\n | { kind: \"provider\"; alias: ProviderModelAlias }\n | { kind: \"responses\"; model: string }\n | { kind: \"strip\" }\n\nexport const resolveWebSearchRoute = async (\n payload: AnthropicMessagesPayload,\n options: {\n webSearchModel?: string\n responsesWebSearchEnabled: boolean\n resolveProviderConfig?: ProviderConfigResolver\n },\n): Promise<WebSearchRoute> => {\n const { webSearchModel, responsesWebSearchEnabled } = options\n if (!webSearchModel || !isWebSearchOnlyRequest(payload)) {\n return { kind: \"strip\" }\n }\n const alias = parseProviderModelAlias(webSearchModel)\n if (alias) {\n const configuredAlias = await ensureConfiguredProviderModelAlias(\n alias,\n options.resolveProviderConfig ?? resolveProviderConfig,\n )\n return configuredAlias ?\n { kind: \"provider\", alias: configuredAlias }\n : { kind: \"strip\" }\n }\n if (responsesWebSearchEnabled) {\n return { kind: \"responses\", model: webSearchModel }\n }\n return { kind: \"strip\" }\n}\n\nexport const extractWebSearchConfig = (\n payload: AnthropicMessagesPayload,\n): WebSearchToolConfig => {\n const tool = payload.tools?.find(isWebSearchServerTool)\n return {\n allowedDomains: tool?.allowed_domains,\n blockedDomains: tool?.blocked_domains,\n userLocation: tool?.user_location,\n }\n}\n\nconst buildWebSearchResultBlock = (\n toolUseId: string,\n extract: WebSearchExtract,\n): AnthropicWebSearchContentBlock => {\n const items: Array<AnthropicWebSearchResultItem> = extract.sources.map(\n (source) => ({\n type: \"web_search_result\",\n url: source.url,\n title: source.title,\n page_age: source.page_age ?? null,\n encrypted_content: \"\",\n }),\n )\n return {\n type: \"web_search_tool_result\",\n tool_use_id: toolUseId,\n content: items,\n }\n}\n\n/**\n * Reconstructs a native Anthropic assistant response from the GPT web search\n * result: one server_tool_use + web_search_tool_result pair, then the answer.\n */\nconst buildResponseContent = (\n requestId: string,\n extract: WebSearchExtract,\n): Array<AnthropicTextBlock | AnthropicWebSearchContentBlock> => {\n const blocks: Array<AnthropicTextBlock | AnthropicWebSearchContentBlock> = []\n const query = extract.queries[0] ?? \"\"\n if (extract.sources.length > 0 || query) {\n const toolUseId = `srvtoolu_${getUUID(requestId)}`\n blocks.push(\n {\n type: \"server_tool_use\",\n id: toolUseId,\n name: \"web_search\",\n input: { query },\n },\n buildWebSearchResultBlock(toolUseId, extract),\n )\n }\n blocks.push({ type: \"text\", text: extract.answerText })\n return blocks\n}\n\nexport const prepareWebSearchResponsesPayload = (\n payload: AnthropicMessagesPayload,\n options: {\n model?: string\n } = {},\n): ResponsesPayload => {\n const config = extractWebSearchConfig(payload)\n const switchedPayload: AnthropicMessagesPayload = {\n ...payload,\n model: options.model ?? payload.model,\n tools: [],\n stream: true,\n }\n\n const responsesPayload =\n translateAnthropicMessagesToResponsesPayload(switchedPayload)\n responsesPayload.tools = [\n buildResponsesWebSearchTool({ ...config, searchContextSize: \"low\" }),\n ]\n responsesPayload.tool_choice = undefined\n responsesPayload.reasoning = {\n effort: \"low\",\n summary: \"auto\",\n }\n return responsesPayload\n}\n\nexport const reconstructWebSearchResponse = (\n payload: AnthropicMessagesPayload,\n result: ResponsesResult,\n options: { requestId: string },\n): {\n extract: WebSearchExtract\n response: AnthropicResponse<\n AnthropicTextBlock | AnthropicWebSearchContentBlock\n >\n} => {\n const extract = extractWebSearchResult(result)\n const response: AnthropicResponse<\n AnthropicTextBlock | AnthropicWebSearchContentBlock\n > = {\n id: result.id || getUUID(options.requestId),\n type: \"message\",\n role: \"assistant\",\n content: buildResponseContent(options.requestId, extract),\n model: payload.model,\n stop_reason: \"end_turn\",\n stop_sequence: null,\n usage: {\n input_tokens: result.usage?.input_tokens ?? 0,\n output_tokens: result.usage?.output_tokens ?? 0,\n server_tool_use: {\n web_search_requests: Math.max(extract.queries.length, 1),\n },\n },\n }\n\n return { extract, response }\n}\n\nconst isWebSearchResponsesStream = (\n value: unknown,\n): value is ResponsesStream => {\n return (\n Boolean(value)\n && typeof (value as ResponsesStream)[Symbol.asyncIterator] === \"function\"\n )\n}\n\nconst createUsageRecorder = (\n payload: AnthropicMessagesPayload,\n sessionId?: string,\n webSearchModel?: string,\n): ((usage: UsageTokens) => void) =>\n webSearchFlowDependencies.createUsageRecorder(\n payload,\n sessionId,\n webSearchModel,\n )\n\n/**\n * Entry point for web-search detection and routing on /v1/messages.\n * Called after model mapping but before provider alias resolution and\n * preprocessing. Returns a Response when web search is handled (provider\n * reroute or responses-native), or `null` when no web_search tool is\n * present or the tool was stripped (caller continues normal flow).\n *\n * Uses a callback for provider forwarding to avoid circular imports.\n */\nexport const tryHandleWebSearch = async (\n c: Context,\n payload: AnthropicMessagesPayload,\n options: {\n logger: ConsolaInstance\n forwardToProvider: (\n c: Context,\n payload: AnthropicMessagesPayload,\n provider: string,\n ) => Promise<Response>\n },\n): Promise<Response | null> => {\n if (!hasWebSearchServerTool(payload)) return null\n\n normalizeSystemMessages(payload)\n\n const route = await resolveWebSearchRoute(payload, {\n webSearchModel: webSearchFlowDependencies.getMessageApiWebSearchModel(),\n responsesWebSearchEnabled: isResponsesApiWebSearchEnabled(),\n resolveProviderConfig: webSearchFlowDependencies.resolveProviderConfig,\n })\n\n if (route.kind === \"provider\") {\n payload.model = route.alias.model\n return await options.forwardToProvider(c, payload, route.alias.provider)\n }\n\n if (route.kind === \"responses\") {\n let sessionId = getRootSessionId(payload, c)\n const requestId = generateRequestIdFromPayload(payload, sessionId)\n if (!sessionId) {\n sessionId = getUUID(requestId)\n }\n return await handleWebSearchViaResponses(c, payload, {\n subagentMarker: null,\n webSearchModel: route.model,\n requestId,\n sessionId,\n compactType: 0,\n logger: options.logger,\n })\n }\n\n stripWebSearchServerTool(payload)\n return null\n}\n\n/**\n * Handles a web-search-only Claude (Messages API) request by switching it to a\n * Responses-capable GPT model (`webSearchModel`), running Copilot's native\n * /responses web_search in a single call, and reconstructing native Anthropic\n * server_tool_use + web_search_tool_result blocks. Streaming and non-streaming\n * are both supported (streaming replays the result as a synthetic SSE stream).\n */\nexport const handleWebSearchViaResponses = async (\n c: Context,\n payload: AnthropicMessagesPayload,\n options: WebSearchFlowOptions,\n) => {\n const { logger, webSearchModel } = options\n const wantsStream = Boolean(payload.stream)\n\n // Switch to the GPT web search model and drop the Anthropic server tool so the\n // standard Anthropic -> Responses translation does not choke on it; the\n // Responses web_search tool is attached to the translated payload instead.\n const responsesPayload = prepareWebSearchResponsesPayload(payload, {\n model: webSearchModel,\n })\n\n const selectedModel: Model | undefined = findEndpointModel(webSearchModel)\n const { vision, initiator } = getResponsesRequestOptions(responsesPayload)\n const transport =\n getResponsesTransportForModel(selectedModel, {\n compactType: options.compactType,\n }) ?? \"http\"\n\n debugJson(\n logger,\n `Switching web search request to model: ${webSearchModel}`,\n responsesPayload,\n )\n\n const upstreamResult = await webSearchFlowDependencies.createResponses(\n responsesPayload,\n {\n vision,\n initiator,\n transport,\n subagentMarker: options.subagentMarker,\n requestId: options.requestId,\n sessionId: options.sessionId,\n clientSignal: c.req?.raw?.signal,\n compactType: options.compactType,\n },\n )\n\n const result =\n isWebSearchResponsesStream(upstreamResult) ?\n await collectResponsesStreamResult({\n errorMessagePrefix: \"Web search responses stream\",\n upstreamResponse: upstreamResult,\n logger,\n })\n : upstreamResult\n\n const { extract, response } = reconstructWebSearchResponse(payload, result, {\n requestId: options.requestId,\n })\n\n debugJson(\n logger,\n `Web search via responses: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`,\n result,\n )\n\n const recordUsage = createUsageRecorder(\n payload,\n options.sessionId,\n webSearchModel,\n )\n recordUsage({\n ...normalizeResponsesUsage(result.usage),\n total_nano_aiu: normalizeOptionalToken(\n result.copilot_usage?.total_nano_aiu,\n ),\n })\n\n if (!wantsStream) {\n return c.json(response)\n }\n\n return streamSSE(c, async (stream) => {\n for (const event of buildSyntheticStreamEvents(response)) {\n const data = JSON.stringify(event)\n logger.debug(`Web search stream event`, data)\n await writeSSEIfConnected(stream, {\n event: event.type,\n data: data,\n })\n }\n })\n}\n\nconst blockToStreamEvents = (\n block: AnthropicTextBlock | AnthropicWebSearchContentBlock,\n index: number,\n): Array<AnthropicStreamEventData> => {\n const start = (\n contentBlock: AnthropicContentBlockStartEvent[\"content_block\"],\n ): AnthropicContentBlockStartEvent => ({\n type: \"content_block_start\",\n index,\n content_block: contentBlock,\n })\n const stop: AnthropicStreamEventData = {\n type: \"content_block_stop\",\n index,\n }\n\n switch (block.type) {\n case \"text\": {\n return [\n start({ type: \"text\", text: \"\" }),\n {\n type: \"content_block_delta\",\n index,\n delta: { type: \"text_delta\", text: block.text },\n },\n stop,\n ]\n }\n case \"server_tool_use\": {\n return [\n start({\n type: \"server_tool_use\",\n id: block.id,\n name: block.name,\n input: {},\n }),\n {\n type: \"content_block_delta\",\n index,\n delta: {\n type: \"input_json_delta\",\n partial_json: JSON.stringify(block.input),\n },\n },\n stop,\n ]\n }\n case \"web_search_tool_result\": {\n // Full block delivered in content_block_start (Anthropic convention).\n return [start(block), stop]\n }\n default: {\n return [start(block), stop]\n }\n }\n}\n\nexport const buildSyntheticStreamEvents = (\n response: AnthropicResponse<\n AnthropicTextBlock | AnthropicWebSearchContentBlock\n >,\n): Array<AnthropicStreamEventData> => {\n const events: Array<AnthropicStreamEventData> = []\n\n events.push({\n type: \"message_start\",\n message: {\n id: response.id,\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: response.model,\n stop_reason: null,\n stop_sequence: null,\n usage: { ...response.usage, output_tokens: 0 },\n },\n })\n\n response.content.forEach((block, index) => {\n events.push(...blockToStreamEvents(block, index))\n })\n\n events.push(\n {\n type: \"message_delta\",\n delta: {\n stop_reason: response.stop_reason,\n stop_sequence: response.stop_sequence,\n },\n usage: { output_tokens: response.usage.output_tokens },\n },\n { type: \"message_stop\" },\n )\n\n return events\n}\n","import type { Model, ModelsResponse } from \"~/lib/types/models\"\nimport {\n buildCodexRequestHeaders,\n CODEX_API_BASE_URL,\n} from \"~/services/codex/create-responses\"\n\ninterface CodexModelDefinition {\n contextWindow: number\n id: string\n input: Array<\"text\" | \"image\">\n maxTokens: number\n name: string\n reasoningEfforts: Array<string>\n}\n\nconst CODEX_MODELS: Array<CodexModelDefinition> = [\n {\n contextWindow: 872_000,\n id: \"gpt-5.6-sol\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.6 Sol\",\n reasoningEfforts: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n {\n contextWindow: 872_000,\n id: \"gpt-5.6-terra\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.6 Terra\",\n reasoningEfforts: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n {\n contextWindow: 872_000,\n id: \"gpt-5.6-luna\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.6 Luna\",\n reasoningEfforts: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n {\n contextWindow: 872_000,\n id: \"gpt-6-astra\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-6 Astra\",\n reasoningEfforts: [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n {\n contextWindow: 872_000,\n id: \"gpt-6-luna\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-6 Luna\",\n reasoningEfforts: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n {\n contextWindow: 872_000,\n id: \"gpt-6-sol\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-6 Sol\",\n reasoningEfforts: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n {\n contextWindow: 872_000,\n id: \"gpt-6.1-sol\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-6.1 Sol\",\n reasoningEfforts: [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n {\n contextWindow: 872_000,\n id: \"gpt-6.1-terra\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-6.1 Terra\",\n reasoningEfforts: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n ...[\"codex-auto-review\", \"gpt-reserve\"].map((id) => ({\n contextWindow: 872_000,\n id,\n input: [\"text\", \"image\"] as Array<\"text\" | \"image\">,\n maxTokens: 128_000,\n name: id,\n reasoningEfforts: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n })),\n]\n\nconst CODEX_MODELS_URL = `${CODEX_API_BASE_URL}/codex/models`\nconst CODEX_MODELS_TIMEOUT_MS = 3_000\n\nexport function resolveCodexModelsUrl(requestUrl: string): string {\n const upstreamUrl = new URL(CODEX_MODELS_URL)\n upstreamUrl.search = new URL(requestUrl, \"http://localhost\").search\n return upstreamUrl.toString()\n}\n\nexport async function forwardCodexModels(\n requestUrl: string,\n requestHeaders: Headers,\n): Promise<Response> {\n const headers = buildCodexRequestHeaders(requestHeaders)\n if (!headers.has(\"accept\")) {\n headers.set(\"accept\", \"application/json\")\n }\n\n return await fetch(resolveCodexModelsUrl(requestUrl), {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(CODEX_MODELS_TIMEOUT_MS),\n })\n}\n\nfunction normalizeCodexModel(model: CodexModelDefinition): Model {\n const supportsVision = model.input.includes(\"image\")\n\n return {\n capabilities: {\n family: \"gpt\",\n limits: {\n max_context_window_tokens: model.contextWindow,\n max_output_tokens: model.maxTokens,\n max_prompt_tokens: model.contextWindow,\n },\n object: \"model_capabilities\",\n supports: {\n adaptive_thinking: true,\n parallel_tool_calls: true,\n reasoning_effort: model.reasoningEfforts,\n streaming: true,\n tool_calls: true,\n vision: supportsVision,\n },\n tokenizer: \"o200k_base\",\n type: \"chat\",\n },\n id: model.id,\n model_picker_enabled: true,\n name: model.name,\n object: \"model\",\n preview: false,\n supported_endpoints: [\"/v1/messages\", \"/v1/responses\"],\n vendor: \"openai\",\n version: \"chatgpt-codex\",\n }\n}\n\nexport function getModels(): ModelsResponse {\n return {\n object: \"list\",\n data: CODEX_MODELS.map((model) => normalizeCodexModel(model)),\n }\n}\n","import type { AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\nimport type { GoogleThinkingConfig } from \"~/lib/types/google\"\n\n// Gateway-owned thinking controls target Gemini 3.8 Flash and Gemini 4.0+\n// text models. Other identifiers retain upstream defaults.\nfunction supportsThinkingControls(modelId: string): boolean {\n const model = modelId.replace(/^models\\//u, \"\").toLowerCase()\n if (/(?:^|-)(?:tts|live|image)(?:-|$)/u.test(model)) return false\n if (/^gemini-3\\.8-flash(?:-|$)/u.test(model)) return true\n const major = /^gemini-(\\d+)(?:\\.\\d+)?(?:-|$)/u.exec(model)?.[1]\n return major !== undefined && Number(major) >= 4\n}\n\n// https://ai.google.dev/gemini-api/docs/generate-content/thinking\nexport function translateGoogleThinking(\n payload: AnthropicMessagesPayload,\n): GoogleThinkingConfig | undefined {\n const thinking = payload.thinking\n const effort = payload.output_config?.effort\n if ((!thinking && !effort) || !supportsThinkingControls(payload.model))\n return undefined\n const config: GoogleThinkingConfig = {\n includeThoughts: thinking?.type !== \"disabled\",\n }\n\n // These models use LOW/MEDIUM/HIGH and cannot turn thinking off. Explicit\n // disabled takes precedence over an Anthropic budget or effort setting.\n if (thinking?.type === \"disabled\") return { ...config, thinkingLevel: \"LOW\" }\n\n const requestedBudget = thinking?.budget_tokens\n if (requestedBudget !== undefined) {\n // Interpret an Anthropic budget as a relative tier, never as a native\n // Google thinkingBudget. -1 keeps Google's dynamic default.\n if (requestedBudget !== -1) {\n config.thinkingLevel =\n requestedBudget <= 2048 ? \"LOW\"\n : requestedBudget <= 8192 ? \"MEDIUM\"\n : \"HIGH\"\n }\n return config\n }\n\n if (effort)\n config.thinkingLevel =\n effort === \"low\" ? \"LOW\"\n : effort === \"medium\" ? \"MEDIUM\"\n : \"HIGH\"\n return config\n}\n","import { createHash, randomUUID } from \"node:crypto\"\n\nimport { HTTPError } from \"~/lib/error\"\nimport type {\n AnthropicAssistantContentBlock,\n AnthropicMessagesPayload,\n AnthropicResponse,\n AnthropicThinkingBlock,\n AnthropicToolResultBlock,\n AnthropicUsage,\n} from \"~/lib/types/anthropic\"\nimport type {\n GoogleGenerateContentPayload,\n GoogleGenerateContentResponse,\n GooglePart,\n GoogleUsageMetadata,\n} from \"~/lib/types/google\"\n\nimport { translateGoogleThinking } from \"./google-thinking\"\n\n// Anthropic has a standard opaque signature field only on thinking blocks.\n// Tool signatures are bound by tool_use ID so they can precede the call.\n// \"previous\" remains supported for text signatures and existing histories.\nconst GOOGLE_SIGNATURE_PREFIX = \"google:\"\ntype GoogleSignatureTarget = \"thinking\" | \"previous\" | { toolUseId: string }\n\nexport function encodeGoogleSignature(\n signature: string,\n target: GoogleSignatureTarget,\n): string {\n return (\n GOOGLE_SIGNATURE_PREFIX\n + Buffer.from(JSON.stringify({ signature, target })).toString(\"base64url\")\n )\n}\n\nfunction decodeGoogleSignature(\n value: string,\n): { signature: string; target: GoogleSignatureTarget } | undefined {\n if (!value.startsWith(GOOGLE_SIGNATURE_PREFIX)) return undefined\n try {\n const decoded: unknown = JSON.parse(\n Buffer.from(\n value.slice(GOOGLE_SIGNATURE_PREFIX.length),\n \"base64url\",\n ).toString(),\n )\n if (typeof decoded !== \"object\" || decoded === null) return undefined\n const { signature, target } = decoded as Record<string, unknown>\n if (typeof signature !== \"string\") return undefined\n if (target === \"thinking\" || target === \"previous\") {\n return { signature, target }\n }\n if (\n typeof target === \"object\"\n && target !== null\n && \"toolUseId\" in target\n && typeof target.toolUseId === \"string\"\n && target.toolUseId.length > 0\n ) {\n return { signature, target: { toolUseId: target.toolUseId } }\n }\n } catch {\n // A foreign or malformed signature must never be sent to Google.\n }\n return undefined\n}\n\nfunction translateThinkingBlock(\n block: AnthropicThinkingBlock,\n parts: Array<GooglePart>,\n toolSignatures: Map<string, string>,\n): void {\n const decoded = decodeGoogleSignature(block.signature)\n if (decoded?.target === \"previous\") {\n const previous = parts.at(-1)\n if (previous) previous.thoughtSignature = decoded.signature\n } else if (decoded && typeof decoded.target === \"object\") {\n toolSignatures.set(decoded.target.toolUseId, decoded.signature)\n }\n if (block.thinking || decoded?.target === \"thinking\") {\n parts.push({\n text: block.thinking,\n thought: true,\n ...(decoded?.target === \"thinking\" && {\n thoughtSignature: decoded.signature,\n }),\n })\n }\n}\n\nfunction invalidRequest(message: string): never {\n throw new HTTPError(\n message,\n Response.json(\n { error: { type: \"invalid_request_error\", message } },\n { status: 400 },\n ),\n )\n}\n\nfunction translateToolResult(\n block: AnthropicToolResultBlock,\n toolNames: Map<string, string>,\n): GooglePart {\n const name = toolNames.get(block.tool_use_id)\n if (!name)\n invalidRequest(\n `Google tool result has no matching tool_use: ${block.tool_use_id}`,\n )\n const text: Array<string> = []\n const media: Array<Pick<GooglePart, \"inlineData\">> = []\n const references: Array<{ $ref: string }> = []\n const mediaPrefix = createHash(\"sha256\")\n .update(block.tool_use_id)\n .digest(\"hex\")\n .slice(0, 16)\n if (typeof block.content === \"string\") {\n text.push(block.content)\n } else {\n for (const item of block.content) {\n if (item.type === \"text\") text.push(item.text)\n else if (item.type === \"tool_reference\") text.push(item.tool_name)\n else {\n const displayName = `tool-result-${mediaPrefix}-${media.length}`\n media.push({\n inlineData: {\n mimeType: item.source.media_type,\n data: item.source.data,\n displayName,\n },\n })\n references.push({ $ref: displayName })\n }\n }\n }\n return {\n functionResponse: {\n id: block.tool_use_id,\n name,\n response: {\n [block.is_error ? \"error\" : \"output\"]:\n media.length > 0 ?\n { text: text.join(\"\\n\"), media: references }\n : text.join(\"\\n\"),\n },\n ...(media.length > 0 && { parts: media }),\n },\n }\n}\n\nexport function translateAnthropicToGoogle(\n payload: AnthropicMessagesPayload,\n): GoogleGenerateContentPayload {\n const result: GoogleGenerateContentPayload = {\n contents: [],\n generationConfig: {\n candidateCount: 1,\n maxOutputTokens: payload.max_tokens,\n temperature: payload.temperature,\n topP: payload.top_p,\n topK: payload.top_k,\n stopSequences: payload.stop_sequences,\n },\n }\n const systemParts: Array<GooglePart> =\n typeof payload.system === \"string\" ?\n [{ text: payload.system }]\n : (payload.system ?? []).map((block) => ({ text: block.text }))\n const toolNames = new Map<string, string>()\n const toolSignatures = new Map<string, string>()\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n systemParts.push(\n ...(typeof message.content === \"string\" ?\n [{ text: message.content }]\n : message.content.map((block) => ({ text: block.text }))),\n )\n continue\n }\n const parts: Array<GooglePart> = []\n if (typeof message.content === \"string\") {\n if (message.content) parts.push({ text: message.content })\n } else {\n for (const block of message.content) {\n switch (block.type) {\n case \"text\":\n if (block.text) parts.push({ text: block.text })\n break\n case \"image\":\n case \"document\":\n parts.push({\n inlineData: {\n mimeType: block.source.media_type,\n data: block.source.data,\n },\n })\n break\n case \"tool_use\":\n toolNames.set(block.id, block.name)\n parts.push({\n functionCall: {\n id: block.id,\n name: block.name,\n args: block.input,\n },\n })\n break\n case \"tool_result\":\n parts.push(translateToolResult(block, toolNames))\n break\n case \"thinking\":\n translateThinkingBlock(block, parts, toolSignatures)\n break\n }\n }\n }\n if (!parts.length) continue\n const role = message.role === \"assistant\" ? \"model\" : \"user\"\n const previous = result.contents.at(-1)\n if (previous?.role === role) previous.parts.push(...parts)\n else result.contents.push({ role, parts })\n }\n for (const content of result.contents) {\n for (const part of content.parts) {\n const id = part.functionCall?.id\n const signature = id ? toolSignatures.get(id) : undefined\n if (signature !== undefined) part.thoughtSignature = signature\n }\n }\n if (systemParts.length) result.systemInstruction = { parts: systemParts }\n\n if (payload.tools?.length) {\n result.tools = [\n {\n functionDeclarations: payload.tools.map((tool) => {\n if (tool.type && tool.type !== \"custom\")\n invalidRequest(\n `Google does not support Anthropic server tool '${tool.type}'`,\n )\n return {\n name: tool.name,\n description: tool.description,\n parametersJsonSchema: tool.input_schema,\n }\n }),\n },\n ]\n }\n if (payload.tool_choice) {\n const choice = payload.tool_choice\n result.toolConfig = {\n functionCallingConfig: {\n mode:\n choice.type === \"none\" ? \"NONE\"\n : choice.type === \"auto\" ? \"AUTO\"\n : \"ANY\",\n ...(choice.type === \"tool\"\n && choice.name && { allowedFunctionNames: [choice.name] }),\n },\n }\n }\n if (payload.output_config?.format) {\n result.generationConfig.responseMimeType = \"application/json\"\n result.generationConfig.responseJsonSchema =\n payload.output_config.format.schema\n }\n const thinkingConfig = translateGoogleThinking(payload)\n if (thinkingConfig) result.generationConfig.thinkingConfig = thinkingConfig\n return result\n}\n\nexport function translateGoogleUsage(\n usage: GoogleUsageMetadata = {},\n): AnthropicUsage {\n const cached = usage.cachedContentTokenCount ?? 0\n return {\n input_tokens: Math.max(0, (usage.promptTokenCount ?? 0) - cached),\n output_tokens:\n (usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0),\n cache_read_input_tokens: cached,\n }\n}\n\nexport function getGoogleStopReason(\n finishReason: string | undefined,\n hasTools: boolean,\n blocked?: string,\n): AnthropicResponse[\"stop_reason\"] {\n if (\n blocked\n || [\n \"SAFETY\",\n \"RECITATION\",\n \"BLOCKLIST\",\n \"PROHIBITED_CONTENT\",\n \"SPII\",\n \"IMAGE_SAFETY\",\n ].includes(finishReason ?? \"\")\n )\n return \"refusal\"\n if (finishReason === \"MAX_TOKENS\") return \"max_tokens\"\n if (finishReason === \"STOP\") return hasTools ? \"tool_use\" : \"end_turn\"\n throw new Error(\n `Google generation ended without a successful finish reason (${finishReason ?? \"missing\"})`,\n )\n}\n\nexport function googleSignatureBlock(\n signature: string,\n toolUseId?: string,\n): AnthropicThinkingBlock {\n return {\n type: \"thinking\",\n thinking: \"\",\n signature: encodeGoogleSignature(\n signature,\n toolUseId ? { toolUseId } : \"previous\",\n ),\n }\n}\n\nexport function translateGoogleToAnthropic(\n response: GoogleGenerateContentResponse,\n model: string,\n): AnthropicResponse {\n if (response.error)\n throw new Error(response.error.message ?? \"Google generation failed\")\n const candidate = response.candidates?.[0]\n const content: Array<AnthropicAssistantContentBlock> = []\n for (const part of candidate?.content?.parts ?? []) {\n if (part.functionCall) {\n const call = part.functionCall\n const id = call.id || `toolu_${randomUUID()}`\n if (part.thoughtSignature) {\n const previous = content.at(-1)\n const signature = googleSignatureBlock(part.thoughtSignature, id)\n if (previous?.type === \"thinking\" && !previous.signature) {\n previous.signature = signature.signature\n } else content.push(signature)\n }\n content.push({\n type: \"tool_use\",\n id,\n name: call.name,\n input: call.args ?? {},\n })\n continue\n } else if (part.thought) {\n content.push({\n type: \"thinking\",\n thinking: part.text ?? \"\",\n signature:\n part.thoughtSignature ?\n encodeGoogleSignature(part.thoughtSignature, \"thinking\")\n : \"\",\n })\n continue\n } else if (part.text !== undefined) {\n content.push({ type: \"text\", text: part.text })\n }\n if (part.thoughtSignature)\n content.push(googleSignatureBlock(part.thoughtSignature))\n }\n return {\n id: response.responseId || `msg_${randomUUID()}`,\n type: \"message\",\n role: \"assistant\",\n model,\n content,\n stop_reason: getGoogleStopReason(\n candidate?.finishReason,\n content.some((block) => block.type === \"tool_use\"),\n response.promptFeedback?.blockReason,\n ),\n stop_sequence: null,\n usage: translateGoogleUsage(response.usageMetadata),\n }\n}\n","import { randomUUID } from \"node:crypto\"\n\nimport type { AnthropicStreamEventData } from \"~/lib/types/anthropic\"\nimport type {\n GoogleGenerateContentResponse,\n GooglePart,\n GoogleUsageMetadata,\n} from \"~/lib/types/google\"\n\nimport {\n encodeGoogleSignature,\n getGoogleStopReason,\n translateGoogleUsage,\n} from \"./google-translation\"\n\nexport class GoogleMessagesStreamTranslator {\n private started = false\n private nextIndex = 0\n private block?: { index: number; type: \"text\" | \"thinking\"; signed: boolean }\n private hasTools = false\n private finishReason?: string\n private blocked?: string\n private usageMetadata: GoogleUsageMetadata = {}\n\n private readonly model: string\n\n constructor(model: string) {\n this.model = model\n }\n\n get usage() {\n return translateGoogleUsage(this.usageMetadata)\n }\n\n push(\n response: GoogleGenerateContentResponse,\n ): Array<AnthropicStreamEventData> {\n if (response.error)\n throw new Error(response.error.message ?? \"Google stream failed\")\n this.usageMetadata = { ...this.usageMetadata, ...response.usageMetadata }\n const events: Array<AnthropicStreamEventData> = []\n if (!this.started) {\n this.started = true\n events.push({\n type: \"message_start\",\n message: {\n id: response.responseId || `msg_${randomUUID()}`,\n type: \"message\",\n role: \"assistant\",\n model: this.model,\n content: [],\n stop_reason: null,\n stop_sequence: null,\n usage: { ...this.usage, output_tokens: 0 },\n },\n })\n }\n const candidate = response.candidates?.[0]\n for (const part of candidate?.content?.parts ?? [])\n this.addPart(part, events)\n this.finishReason = candidate?.finishReason ?? this.finishReason\n this.blocked = response.promptFeedback?.blockReason ?? this.blocked\n return events\n }\n\n finish(): Array<AnthropicStreamEventData> {\n const stopReason = getGoogleStopReason(\n this.finishReason,\n this.hasTools,\n this.blocked,\n )\n const events: Array<AnthropicStreamEventData> = []\n this.closeBlock(events)\n events.push(\n {\n type: \"message_delta\",\n delta: { stop_reason: stopReason, stop_sequence: null },\n usage: this.usage,\n },\n { type: \"message_stop\" },\n )\n return events\n }\n\n private addPart(\n part: GooglePart,\n events: Array<AnthropicStreamEventData>,\n ): void {\n if (part.functionCall) {\n const call = part.functionCall\n const id = call.id || `toolu_${randomUUID()}`\n if (part.thoughtSignature)\n this.addSignature(part.thoughtSignature, events, id)\n this.closeBlock(events)\n const index = this.nextIndex++\n this.hasTools = true\n events.push(\n {\n type: \"content_block_start\",\n index,\n content_block: {\n type: \"tool_use\",\n id,\n name: call.name,\n input: {},\n },\n },\n {\n type: \"content_block_delta\",\n index,\n delta: {\n type: \"input_json_delta\",\n partial_json: JSON.stringify(call.args ?? {}),\n },\n },\n { type: \"content_block_stop\", index },\n )\n return\n }\n if (part.text || part.thought) {\n const type = part.thought ? \"thinking\" : \"text\"\n if (this.block?.type !== type) this.closeBlock(events)\n if (!this.block) {\n const index = this.nextIndex++\n this.block = { index, type, signed: false }\n events.push({\n type: \"content_block_start\",\n index,\n content_block:\n type === \"thinking\" ? { type, thinking: \"\" } : { type, text: \"\" },\n })\n }\n events.push({\n type: \"content_block_delta\",\n index: this.block.index,\n delta:\n type === \"thinking\" ?\n { type: \"thinking_delta\", thinking: part.text ?? \"\" }\n : { type: \"text_delta\", text: part.text ?? \"\" },\n })\n }\n if (part.thoughtSignature) this.addSignature(part.thoughtSignature, events)\n }\n\n private addSignature(\n signature: string,\n events: Array<AnthropicStreamEventData>,\n toolUseId?: string,\n ): void {\n if (this.block?.type === \"thinking\") {\n this.block.signed = true\n events.push({\n type: \"content_block_delta\",\n index: this.block.index,\n delta: {\n type: \"signature_delta\",\n signature: encodeGoogleSignature(\n signature,\n toolUseId ? { toolUseId } : \"thinking\",\n ),\n },\n })\n this.closeBlock(events)\n return\n }\n this.closeBlock(events)\n const index = this.nextIndex++\n events.push(\n {\n type: \"content_block_start\",\n index,\n content_block: { type: \"thinking\", thinking: \"\" },\n },\n {\n type: \"content_block_delta\",\n index,\n delta: {\n type: \"signature_delta\",\n signature: encodeGoogleSignature(\n signature,\n toolUseId ? { toolUseId } : \"previous\",\n ),\n },\n },\n { type: \"content_block_stop\", index },\n )\n }\n\n private closeBlock(events: Array<AnthropicStreamEventData>): void {\n if (!this.block) return\n if (this.block.type === \"thinking\" && !this.block.signed) {\n events.push({\n type: \"content_block_delta\",\n index: this.block.index,\n delta: { type: \"signature_delta\", signature: \"\" },\n })\n }\n events.push({ type: \"content_block_stop\", index: this.block.index })\n this.block = undefined\n }\n}\n","import {\n getUpstreamTransportConfig,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport type { GoogleGenerateContentPayload } from \"~/lib/types/google\"\nimport { setPluginRequestActualModel } from \"~/lib/request-context\"\nimport { fetchUpstreamWithLifecycle } from \"~/services/upstream-http\"\n\nimport {\n applyOpencodeSessionHeader,\n buildProviderUpstreamHeaders,\n resolveProviderEndpointUrl,\n} from \"./provider-proxy\"\n\nexport async function forwardGoogleGenerateContent(\n provider: ResolvedProviderConfig,\n model: string,\n payload: GoogleGenerateContentPayload,\n requestHeaders: Headers,\n options: { stream: boolean; clientSignal: AbortSignal; sessionId?: string },\n): Promise<Response> {\n const modelId = encodeURIComponent(model.replace(/^models\\//u, \"\"))\n const method = options.stream ? \"streamGenerateContent\" : \"generateContent\"\n const url = new URL(\n resolveProviderEndpointUrl(provider, `models/${modelId}:${method}`),\n )\n if (options.stream) url.searchParams.set(\"alt\", \"sse\")\n const headers = buildProviderUpstreamHeaders(provider, requestHeaders)\n applyOpencodeSessionHeader(provider, headers, options.sessionId)\n headers.accept = options.stream ? \"text/event-stream\" : \"application/json\"\n const transport = getUpstreamTransportConfig()\n setPluginRequestActualModel(model.replace(/^models\\//u, \"\"))\n return await fetchUpstreamWithLifecycle(\n url,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n },\n {\n clientSignal: options.clientSignal,\n headersTimeoutMs: transport.headersTimeoutMs,\n streamInactivityTimeoutMs: transport.streamInactivityTimeoutMs,\n },\n )\n}\n","import type { Context } from \"hono\"\n\nimport { events } from \"fetch-event-stream\"\nimport { streamSSE } from \"hono/streaming\"\n\nimport type { ResolvedProviderConfig } from \"~/lib/config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { recordGoogleFirstToken } from \"~/lib/first-token\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { writeSSEIfConnected } from \"~/lib/sse\"\nimport {\n createProviderTokenUsageRecorder,\n normalizeAnthropicUsage,\n type TokenUsageEndpoint,\n} from \"~/lib/token-usage\"\nimport type {\n AnthropicMessagesPayload,\n AnthropicStreamEventData,\n} from \"~/lib/types/anthropic\"\nimport type { GoogleGenerateContentResponse } from \"~/lib/types/google\"\nimport { parseUserIdMetadata } from \"~/lib/utils\"\nimport { GoogleMessagesStreamTranslator } from \"~/routes/messages/google-stream-translation\"\nimport {\n translateAnthropicToGoogle,\n translateGoogleToAnthropic,\n} from \"~/routes/messages/google-translation\"\nimport { applyMissingExtraBody } from \"~/routes/provider/utils\"\nimport { forwardGoogleGenerateContent } from \"~/services/providers/google\"\nimport { resolveOpencodeMessagesSession } from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"provider-google-messages\")\n\nexport async function handleGoogleProviderMessages(\n c: Context,\n payload: AnthropicMessagesPayload,\n provider: ResolvedProviderConfig,\n usageEndpoint?: TokenUsageEndpoint,\n): Promise<Response> {\n debugJson(logger, \"provider.messages.google.original_request\", payload)\n const translated = translateAnthropicToGoogle(payload)\n const modelConfig = provider.models?.[payload.model]\n const extraGenerationConfig = modelConfig?.extraBody?.generationConfig\n if (\n extraGenerationConfig\n && typeof extraGenerationConfig === \"object\"\n && !Array.isArray(extraGenerationConfig)\n ) {\n const generationConfig = translated.generationConfig as unknown as Record<\n string,\n unknown\n >\n for (const [key, value] of Object.entries(extraGenerationConfig)) {\n if (generationConfig[key] === undefined) generationConfig[key] = value\n }\n }\n applyMissingExtraBody(translated as unknown as Record<string, unknown>, {\n extraBody: modelConfig?.extraBody,\n })\n debugJson(logger, \"provider.messages.google.request\", translated)\n const controller = new AbortController()\n const signal = AbortSignal.any([controller.signal, c.req.raw.signal])\n const upstream = await forwardGoogleGenerateContent(\n provider,\n payload.model,\n translated,\n c.req.raw.headers,\n {\n stream: payload.stream === true,\n clientSignal: signal,\n sessionId: resolveOpencodeMessagesSession(payload),\n },\n )\n if (!upstream.ok)\n throw new HTTPError(\"Failed to create Google response\", upstream)\n const recordUsage = createProviderTokenUsageRecorder({\n endpoint: usageEndpoint ?? \"provider_messages\",\n model: payload.model,\n providerName: provider.name,\n pricing: modelConfig?.pricing,\n pricingCurrency: provider.pricingCurrency,\n sessionId: parseUserIdMetadata(payload.metadata?.user_id).sessionId,\n })\n if (!payload.stream) {\n const response = translateGoogleToAnthropic(\n (await upstream.json()) as GoogleGenerateContentResponse,\n payload.model,\n )\n recordUsage(normalizeAnthropicUsage(response.usage))\n return c.json(response)\n }\n return streamSSE(c, async (stream) => {\n const translator = new GoogleMessagesStreamTranslator(payload.model)\n stream.onAbort(() => controller.abort())\n const writeEvents = async (items: Array<AnthropicStreamEventData>) => {\n for (const item of items) {\n debugJson(logger, \"provider.messages.google.translated_event:\", item)\n await writeSSEIfConnected(stream, {\n event: item.type,\n data: JSON.stringify(item),\n })\n }\n }\n try {\n // fetch-event-stream checks aborts between events. An abortable pipe also\n // cancels a pending body read when Google stops sending new events.\n const response = new Response(\n upstream.body?.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>(),\n { signal },\n ),\n { headers: upstream.headers },\n )\n if (response.headers.get(\"content-type\")?.includes(\"text/event-stream\")) {\n for await (const event of events(response, signal)) {\n if (!event.data || event.data === \"[DONE]\") continue\n const response = JSON.parse(\n event.data,\n ) as GoogleGenerateContentResponse\n recordGoogleFirstToken(response)\n debugJson(\n logger,\n \"provider.messages.google.raw_stream_event:\",\n response,\n )\n await writeEvents(translator.push(response))\n }\n } else {\n await writeEvents(\n translator.push(\n (await response.json()) as GoogleGenerateContentResponse,\n ),\n )\n }\n if (!signal.aborted) await writeEvents(translator.finish())\n } catch (error) {\n if (!signal.aborted) {\n logger.warn(\"provider.messages.google.stream_interrupted\", error)\n await writeEvents([\n {\n type: \"error\",\n error: {\n type: \"api_error\",\n message:\n error instanceof Error ?\n error.message\n : \"Google stream interrupted\",\n },\n },\n ])\n }\n } finally {\n controller.abort()\n recordUsage(normalizeAnthropicUsage(translator.usage))\n }\n })\n}\n","import type { Context, Env } from \"hono\"\n\nimport { events } from \"fetch-event-stream\"\nimport { streamSSE } from \"hono/streaming\"\n\nimport type {\n AnthropicMessagesPayload,\n AnthropicResponse,\n AnthropicStreamEventData,\n AnthropicStreamState,\n} from \"~/lib/types/anthropic\"\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n} from \"~/lib/types/chat-completions\"\nimport type {\n ResponsesResult,\n ResponseStreamEvent,\n ResponsesStream,\n} from \"~/lib/types/responses\"\n\nimport {\n type ModelConfig,\n type ResolvedProviderConfig,\n getClaudeAutoModel,\n resolveProviderConfigForModel,\n} from \"~/lib/config\"\nimport { getProviderModelConfig } from \"~/lib/provider-model-catalog\"\nimport { fromClaudeDiscoveryModelId } from \"~/lib/claude-models\"\nimport { logCodexRateLimitsEvent } from \"~/lib/codex-rate-limit\"\nimport {\n applyDashScopePreserveThinkingDefault,\n applyOpenAICompatibleContextCache,\n isDashScopeAliyunProvider,\n} from \"~/lib/dashscope\"\nimport { HTTPError } from \"~/lib/error\"\nimport {\n recordAnthropicFirstToken,\n recordChatCompletionFirstToken,\n recordResponsesFirstToken,\n} from \"~/lib/first-token\"\nimport { createHandlerLogger, debugJson, debugLazy } from \"~/lib/logger\"\nimport { getProviderModelPdfSupport } from \"~/lib/model-pdf-support\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { writeSSEIfConnected } from \"~/lib/sse\"\nimport { resolveBridgeToolSearchName } from \"~/lib/tool-search\"\nimport {\n createProviderTokenUsageRecorder,\n mergeAnthropicUsage,\n normalizeAnthropicUsage,\n normalizeOpenAIUsage,\n normalizeResponsesUsage,\n type TokenUsageEndpoint,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { isResponsesStream, parseUserIdMetadata } from \"~/lib/utils\"\nimport { setPluginRequestModel } from \"~/lib/request-events\"\nimport {\n translateToAnthropic,\n translateToOpenAI,\n} from \"~/routes/messages/completions-translation\"\nimport {\n flushPendingAnthropicStreamEvents,\n translateChunkToAnthropicEvents,\n translateErrorToAnthropicErrorEvent,\n} from \"~/routes/messages/completions-stream-translation\"\nimport {\n buildErrorEvent,\n createResponsesStreamState,\n translateResponsesStreamEvent,\n} from \"~/routes/messages/responses-stream-translation\"\nimport { collectResponsesStreamResult } from \"~/routes/messages/responses-stream-collection\"\nimport {\n translateAnthropicMessagesToResponsesPayload,\n translateResponsesResultToAnthropic,\n} from \"~/routes/messages/responses-translation\"\nimport {\n buildSyntheticStreamEvents,\n hasWebSearchServerTool,\n isWebSearchOnlyRequest,\n prepareWebSearchResponsesPayload,\n reconstructWebSearchResponse,\n stripWebSearchServerTool,\n} from \"~/routes/messages/web-search/fulfill\"\nimport {\n appendClaudeContinuationMessage,\n applyClaudeNoToolsEffort,\n isClaudeAutoModelRequest,\n normalizeSystemMessages,\n} from \"~/routes/messages/preprocess\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n} from \"~/routes/responses/utils\"\nimport { getModels as getCodexModels } from \"~/services/codex/get-models\"\nimport { forwardCodexResponses } from \"~/services/codex/create-responses\"\nimport {\n forwardProviderChatCompletions,\n forwardProviderMessages,\n forwardProviderResponses,\n} from \"~/services/providers/provider-proxy\"\nimport { createResponsesHttpEventStream } from \"~/services/responses-http\"\nimport { createResponsesSafeStream } from \"~/services/responses-websocket-helpers\"\nimport {\n applyMissingExtraBody,\n applyModelDefaults,\n normalizeProviderResponsesReasoningEffort,\n} from \"~/routes/provider/utils\"\nimport consola from \"consola\"\nimport { handleGoogleProviderMessages } from \"./google-handler\"\n\nconst logger = createHandlerLogger(\"provider-messages-handler\")\n\nexport const providerMessagesHandlerDependencies = {\n resolveProviderConfig,\n}\n\nexport async function handleProviderMessages(\n c: Context<Env, \"/:provider\">,\n): Promise<Response> {\n const provider = c.req.param(\"provider\")\n const payload = await c.req.json<AnthropicMessagesPayload>()\n setPluginRequestModel(payload.model)\n payload.model = fromClaudeDiscoveryModelId(payload.model)\n applyClaudeNoToolsEffort(payload, c.req.header(\"user-agent\"))\n\n const claudeAutoModel = getClaudeAutoModel()\n if (claudeAutoModel && isClaudeAutoModelRequest(payload)) {\n consola.debug(\n `Claude auto model override (${provider}): ${payload.model} -> ${claudeAutoModel}`,\n )\n payload.model = claudeAutoModel\n }\n\n return await handleProviderMessagesForProvider(c, {\n payload,\n provider,\n })\n}\n\nexport async function handleProviderMessagesForProvider(\n c: Context,\n options: {\n payload: AnthropicMessagesPayload\n provider: string\n usageEndpoint?: TokenUsageEndpoint\n },\n): Promise<Response> {\n const { payload, provider, usageEndpoint } = options\n const configuredProvider =\n await providerMessagesHandlerDependencies.resolveProviderConfig(provider)\n if (!configuredProvider) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n try {\n const providerConfig = resolveProviderConfigForModel(\n configuredProvider,\n payload.model,\n )\n const modelConfig = providerConfig.models?.[payload.model]\n const effectiveType = providerConfig.type\n debugJson(logger, \"provider.messages.request\", { payload, provider })\n\n normalizeSystemMessages(payload)\n\n applyModelDefaults(payload, modelConfig)\n appendClaudeContinuationMessage(payload)\n\n if (effectiveType === \"google\") {\n stripWebSearchServerTool(payload)\n return await handleGoogleProviderMessages(\n c,\n payload,\n providerConfig,\n usageEndpoint,\n )\n }\n\n if (effectiveType === \"openai-responses\") {\n if (hasWebSearchServerTool(payload)) {\n if (isWebSearchOnlyRequest(payload)) {\n return await handleOpenAIResponsesProviderWebSearchMessages(c, {\n modelConfig,\n payload,\n provider,\n providerConfig,\n usageEndpoint,\n })\n }\n\n stripWebSearchServerTool(payload)\n }\n\n return await handleOpenAIResponsesProviderMessages(c, {\n modelConfig,\n payload,\n provider,\n providerConfig,\n usageEndpoint,\n })\n }\n\n if (effectiveType === \"openai-compatible\") {\n stripWebSearchServerTool(payload)\n\n return await handleOpenAICompatibleProviderMessages(c, {\n modelConfig,\n payload,\n provider,\n providerConfig,\n usageEndpoint,\n })\n }\n\n applyMissingExtraBody(payload as unknown as Record<string, unknown>, {\n extraBody: modelConfig?.extraBody,\n })\n\n debugJson(logger, \"Translated provider.messages.request\", {\n payload,\n provider,\n })\n const upstreamResponse = await forwardProviderMessages(\n providerConfig,\n payload,\n c.req.raw.headers,\n { clientSignal: c.req.raw.signal },\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\"Failed to create responses\", upstreamResponse)\n throw new HTTPError(\"Failed to create responses\", upstreamResponse)\n }\n\n const contentType = upstreamResponse.headers.get(\"content-type\") ?? \"\"\n const isStreamingResponse =\n Boolean(payload.stream) && contentType.includes(\"text/event-stream\")\n\n if (isStreamingResponse) {\n return streamProviderMessages({\n c,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n upstreamResponse,\n usageEndpoint,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as AnthropicResponse\n return respondProviderMessagesJson(c, {\n body: jsonBody,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n } catch (error) {\n logger.error(\"provider.messages.error\", {\n provider,\n error,\n })\n throw error\n }\n}\n\nconst handleOpenAIResponsesProviderWebSearchMessages = async (\n c: Context,\n options: {\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n usageEndpoint?: TokenUsageEndpoint\n },\n): Promise<Response> => {\n const { modelConfig, payload, provider, providerConfig, usageEndpoint } =\n options\n const responsesPayload = prepareWebSearchResponsesPayload(payload)\n const normalizedReasoningEffort = normalizeProviderResponsesReasoningEffort(\n responsesPayload,\n providerConfig,\n )\n if (normalizedReasoningEffort) {\n logger.debug(\n `Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the provider model configuration`,\n )\n }\n\n debugJson(logger, \"provider.messages.responses.web_search.request\", {\n payload: responsesPayload,\n provider,\n })\n\n if (providerConfig.name === \"codex\") {\n const upstreamResponse = await forwardCodexResponses(\n responsesPayload,\n c.req.raw.headers,\n providerConfig.baseUrl,\n { clientSignal: c.req.raw.signal },\n )\n\n if (isResponsesStream(upstreamResponse)) {\n const body = await collectResponsesStreamResult({\n errorMessagePrefix: `${provider} web search responses stream`,\n parseEvent: (data) =>\n parseResponsesProviderStreamChunk(data, providerConfig),\n upstreamResponse,\n logger,\n })\n return respondWebSearchProviderMessagesJson(c, {\n body,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n }\n\n return respondWebSearchProviderMessagesJson(c, {\n body: upstreamResponse,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n }\n\n const upstreamResponse = await forwardProviderResponses(\n providerConfig,\n responsesPayload,\n c.req.raw.headers,\n { clientSignal: c.req.raw.signal },\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\"Failed to create provider web search responses\", {\n provider,\n upstreamResponse,\n })\n throw new HTTPError(\n \"Failed to create provider web search responses\",\n upstreamResponse,\n )\n }\n\n const contentType = upstreamResponse.headers.get(\"content-type\") ?? \"\"\n if (contentType.includes(\"text/event-stream\")) {\n const body = await collectResponsesStreamResult({\n errorMessagePrefix: `${provider} web search responses stream`,\n parseEvent: (data) =>\n parseResponsesProviderStreamChunk(data, providerConfig),\n upstreamResponse: createResponsesHttpEventStream(upstreamResponse),\n logger,\n })\n return respondWebSearchProviderMessagesJson(c, {\n body,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as ResponsesResult\n return respondWebSearchProviderMessagesJson(c, {\n body: jsonBody,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n}\n\nconst handleOpenAIResponsesProviderMessages = async (\n c: Context,\n options: {\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n usageEndpoint?: TokenUsageEndpoint\n },\n): Promise<Response> => {\n const { modelConfig, payload, provider, providerConfig, usageEndpoint } =\n options\n const selectedModel =\n providerConfig.name === \"codex\" ?\n getCodexModels().data.find((model) => model.id === payload.model)\n : undefined\n const wantsStream = payload.stream === true\n const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload)\n const normalizedMessagesReasoningEffort =\n normalizeProviderResponsesReasoningEffort(responsesPayload, providerConfig)\n if (normalizedMessagesReasoningEffort) {\n logger.debug(\n `Normalized reasoning effort from ${normalizedMessagesReasoningEffort.from} to ${normalizedMessagesReasoningEffort.to} based on the provider model configuration`,\n )\n }\n\n if (providerConfig.name === \"codex\" && !wantsStream) {\n responsesPayload.stream = true\n }\n\n const shouldCompactInput = applyResponsesApiContextManagement(\n responsesPayload,\n selectedModel?.capabilities.limits.max_prompt_tokens,\n {\n source: \"messages\",\n },\n )\n if (shouldCompactInput) {\n compactInputByLatestCompaction(responsesPayload)\n }\n\n debugJson(logger, \"provider.messages.responses.request\", {\n payload: responsesPayload,\n provider,\n })\n\n if (providerConfig.name === \"codex\") {\n const upstreamResponse = await forwardCodexResponses(\n responsesPayload,\n c.req.raw.headers,\n providerConfig.baseUrl,\n { clientSignal: c.req.raw.signal },\n )\n\n if (isResponsesStream(upstreamResponse)) {\n if (wantsStream) {\n return streamResponsesProviderMessages({\n c,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n providerConfig,\n upstreamResponse,\n usageEndpoint,\n })\n }\n\n const body = await collectResponsesStreamResult({\n errorMessagePrefix: `${provider} messages responses stream`,\n parseEvent: (data) =>\n parseResponsesProviderStreamChunk(data, providerConfig),\n upstreamResponse,\n logger,\n })\n return respondResponsesProviderMessagesJson(c, {\n body,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n providerConfig,\n usageEndpoint,\n })\n }\n\n return respondResponsesProviderMessagesJson(c, {\n body: upstreamResponse,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n providerConfig,\n usageEndpoint,\n })\n }\n\n const upstreamResponse = await forwardProviderResponses(\n providerConfig,\n responsesPayload,\n c.req.raw.headers,\n { clientSignal: c.req.raw.signal },\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\"Failed to create provider responses\", upstreamResponse)\n throw new HTTPError(\"Failed to create provider responses\", upstreamResponse)\n }\n\n if (responsesPayload.stream) {\n return streamResponsesProviderMessages({\n c,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n providerConfig,\n upstreamResponse: createResponsesSafeStream(\n createResponsesHttpEventStream(upstreamResponse),\n ),\n usageEndpoint,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as ResponsesResult\n return respondResponsesProviderMessagesJson(c, {\n body: jsonBody,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n providerConfig,\n usageEndpoint,\n })\n}\n\nconst getRequestThinkingBudget = (\n payload: AnthropicMessagesPayload,\n): number | undefined => {\n const budget = payload.thinking?.budget_tokens\n if (typeof budget !== \"number\" || !Number.isFinite(budget)) {\n return undefined\n }\n return budget\n}\n\nconst applyOpenAICompatibleThinkingBudget = (\n payload: ChatCompletionsPayload,\n source: AnthropicMessagesPayload,\n): void => {\n const thinkingBudget = getRequestThinkingBudget(source)\n if (thinkingBudget !== undefined) {\n payload.thinking_budget = thinkingBudget\n return\n }\n\n if (payload.thinking_budget === undefined) {\n delete payload.thinking_budget\n }\n}\n\nconst applyOpenAICompatibleExtraBodyThinkingBudget = (\n payload: ChatCompletionsPayload,\n options: { extraBody: Record<string, unknown> | undefined },\n): void => {\n const { extraBody } = options\n if (!extraBody || !Object.hasOwn(extraBody, \"thinking_budget\")) {\n return\n }\n\n const rawPayload = payload as Record<string, unknown>\n rawPayload.thinking_budget = extraBody.thinking_budget\n}\n\nconst handleOpenAICompatibleProviderMessages = async (\n c: Context,\n options: {\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n usageEndpoint?: TokenUsageEndpoint\n },\n): Promise<Response> => {\n const { modelConfig, payload, provider, providerConfig, usageEndpoint } =\n options\n const openAIPayload = createOpenAICompatiblePayload(\n payload,\n modelConfig,\n providerConfig,\n )\n debugJson(logger, \"provider.messages.openai_compatible.request\", {\n payload: openAIPayload,\n provider,\n })\n\n const upstreamResponse = await forwardProviderChatCompletions(\n providerConfig,\n openAIPayload,\n c.req.raw.headers,\n { clientSignal: c.req.raw.signal },\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\n \"Failed to create openai-compatible responses\",\n upstreamResponse,\n )\n throw new HTTPError(\n \"Failed to create openai-compatible responses\",\n upstreamResponse,\n )\n }\n\n const contentType = upstreamResponse.headers.get(\"content-type\") ?? \"\"\n const isStreamingResponse =\n Boolean(openAIPayload.stream) && contentType.includes(\"text/event-stream\")\n\n if (isStreamingResponse) {\n return streamOpenAICompatibleProviderMessages({\n c,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n upstreamResponse,\n usageEndpoint,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as ChatCompletionResponse\n return respondOpenAICompatibleProviderMessagesJson(c, {\n body: jsonBody,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n}\n\nconst createOpenAICompatiblePayload = (\n payload: AnthropicMessagesPayload,\n modelConfig: ModelConfig | undefined,\n providerConfig: ResolvedProviderConfig,\n): ChatCompletionsPayload => {\n const openAIPayload = translateToOpenAI(payload, {\n supportPdf: getProviderModelPdfSupport(payload.model, providerConfig),\n toolContentSupportType: modelConfig?.toolContentSupportType ?? [],\n })\n\n const isDashScopeProvider = isDashScopeAliyunProvider(providerConfig)\n\n if (isDashScopeProvider) {\n applyOpenAICompatibleThinkingBudget(openAIPayload, payload)\n } else {\n delete openAIPayload.thinking_budget\n }\n\n if (payload.top_k !== undefined) {\n openAIPayload.top_k = payload.top_k\n }\n\n if (openAIPayload.stream) {\n openAIPayload.stream_options = {\n include_usage: true,\n }\n }\n\n normalizeOpenAICompatibleReasoningContent(openAIPayload, {\n modelConfig,\n providerConfig,\n })\n\n applyOpenAICompatibleRequestOverrides(openAIPayload, {\n extraBody: modelConfig?.extraBody,\n source: payload as unknown as Record<string, unknown>,\n })\n\n applyMissingExtraBody(openAIPayload, {\n extraBody: modelConfig?.extraBody,\n })\n\n applyOpenAICompatibleExtraBodyThinkingBudget(openAIPayload, {\n extraBody: modelConfig?.extraBody,\n })\n\n applyMiMoThinking(openAIPayload, payload)\n\n applyDashScopePreserveThinkingDefault(\n openAIPayload as unknown as Record<string, unknown>,\n providerConfig,\n )\n\n if (!Object.hasOwn(openAIPayload, \"parallel_tool_calls\")) {\n openAIPayload.parallel_tool_calls = true\n }\n\n const contextCacheEnabled = modelConfig?.contextCache ?? isDashScopeProvider\n if (contextCacheEnabled) {\n applyOpenAICompatibleContextCache(openAIPayload)\n }\n\n return openAIPayload\n}\n\nconst applyMiMoThinking = (\n payload: ChatCompletionsPayload,\n source: AnthropicMessagesPayload,\n): void => {\n if (!/(?:^|\\/)mimo(?:[-_.]|$)/i.test(payload.model)) {\n return\n }\n\n const sourceThinkingType = source.thinking?.type\n const shouldEnableThinking = Boolean(\n payload.reasoning_effort || sourceThinkingType,\n )\n delete payload.reasoning_effort\n\n if (sourceThinkingType === \"disabled\") {\n payload.thinking = { type: \"disabled\" }\n delete payload.thinking_budget\n return\n }\n\n if (shouldEnableThinking) {\n payload.thinking = { type: \"enabled\" }\n }\n}\n\nconst normalizeOpenAICompatibleReasoningContent = (\n payload: ChatCompletionsPayload,\n options: {\n modelConfig: ModelConfig | undefined\n providerConfig: ResolvedProviderConfig\n },\n): void => {\n // Some models (e.g. opencode-go hy3/hy4) follow the OpenRouter convention\n // and expect the reasoning text in the \"reasoning\" field of assistant\n // history messages instead of the default \"reasoning_content\" field\n const reasoningField =\n options.modelConfig?.reasoningField\n ?? getProviderModelConfig(\n options.providerConfig.name,\n payload.model,\n options.providerConfig,\n )?.reasoningField\n ?? \"reasoning_content\"\n\n for (const message of payload.messages) {\n if (message.role !== \"assistant\") {\n continue\n }\n\n const reasoningText =\n message.reasoning_text ?? message.reasoning_content ?? message.reasoning\n if (reasoningText && reasoningText.length > 0) {\n if (reasoningField === \"reasoning\") {\n message.reasoning ??= reasoningText\n } else {\n message.reasoning_content ??= reasoningText\n }\n }\n\n // Send exactly one reasoning field upstream, even when the history\n // message carries an empty value in the field this model does not use\n if (reasoningField === \"reasoning\") {\n delete message.reasoning_content\n } else {\n delete message.reasoning\n }\n\n delete message.reasoning_text\n delete message.reasoning_opaque\n }\n}\n\nconst applyOpenAICompatibleRequestOverrides = (\n payload: ChatCompletionsPayload,\n options: {\n extraBody: Record<string, unknown> | undefined\n source: Record<string, unknown>\n },\n): void => {\n const allowedKeys = new Set(Object.keys(options.extraBody ?? {}))\n for (const key of allowedKeys) {\n if (Object.hasOwn(options.source, key)) {\n payload[key] = options.source[key]\n }\n }\n}\n\nconst streamProviderMessages = ({\n c,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n upstreamResponse,\n usageEndpoint,\n}: {\n c: Context\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n upstreamResponse: Response\n usageEndpoint?: TokenUsageEndpoint\n}): Response => {\n logger.debug(\"provider.messages.streaming\")\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n let messageStopSeen = false\n let errorSeen = false\n const openRouterThinkingState: OpenRouterThinkingStreamState = {\n signedThinkingBlockIndexes: new Set<number>(),\n thinkingBlockIndexes: new Set<number>(),\n }\n\n try {\n for await (const chunk of events(upstreamResponse)) {\n logger.debug(\"provider.messages.raw_stream_event:\", chunk.data)\n const eventName = chunk.event\n if (eventName === \"ping\") {\n await writeSSEIfConnected(stream, {\n event: \"ping\",\n data: '{\"type\":\"ping\"}',\n })\n continue\n }\n\n let data = chunk.data\n if (!data) {\n continue\n }\n\n if (chunk.data === \"[DONE]\") {\n break\n }\n\n const parsed = parseProviderStreamEvent(data)\n if (parsed) {\n usage = mergeAnthropicUsage(usage, parsed.usage)\n data = parsed.data\n if (parsed.type === \"message_stop\") {\n messageStopSeen = true\n } else if (parsed.type === \"error\") {\n errorSeen = true\n }\n }\n\n const streamEvents =\n provider === \"openrouter\" ?\n normalizeOpenRouterStreamEvents(\n eventName,\n data,\n openRouterThinkingState,\n )\n : [{ data, event: eventName }]\n for (const streamEvent of streamEvents) {\n await writeSSEIfConnected(stream, {\n event: streamEvent.event,\n data: streamEvent.data,\n })\n }\n }\n } catch (error) {\n logger.warn(\"provider.messages.stream_interrupted:\", { error, provider })\n }\n\n if (!messageStopSeen && !errorSeen) {\n logger.warn(\"provider.messages.stream_incomplete:\", { provider })\n const errorEvent = translateErrorToAnthropicErrorEvent()\n await writeSSEIfConnected(stream, {\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n}\n\nconst streamOpenAICompatibleProviderMessages = ({\n c,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n upstreamResponse,\n usageEndpoint,\n}: {\n c: Context\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n upstreamResponse: Response\n usageEndpoint?: TokenUsageEndpoint\n}): Response => {\n logger.debug(\"provider.messages.openai_compatible.streaming\")\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n const streamState: AnthropicStreamState = {\n messageStartSent: false,\n messageCompleted: false,\n contentBlockIndex: 0,\n contentBlockOpen: false,\n toolCalls: {},\n thinkingBlockOpen: false,\n }\n\n try {\n for await (const chunk of events(upstreamResponse)) {\n logger.debug(\n \"provider.messages.openai_compatible.raw_stream_event:\",\n chunk.data,\n )\n const eventName = chunk.event\n if (eventName === \"ping\") {\n await writeSSEIfConnected(stream, {\n event: \"ping\",\n data: '{\"type\":\"ping\"}',\n })\n continue\n }\n\n if (!chunk.data || chunk.data === \"[DONE]\") {\n if (chunk.data === \"[DONE]\") {\n break\n }\n continue\n }\n\n const parsed = parseOpenAICompatibleStreamChunk(chunk.data)\n recordChatCompletionFirstToken(parsed)\n if (!parsed) {\n continue\n }\n\n if (parsed.usage) {\n usage = normalizeOpenAIUsage(parsed.usage)\n }\n\n const events = translateChunkToAnthropicEvents(parsed, streamState)\n for (const event of events) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\n \"provider.messages.openai_compatible.translated_event:\",\n eventData,\n ])\n await writeSSEIfConnected(stream, {\n event: event.type,\n data: eventData,\n })\n }\n }\n } catch (error) {\n logger.warn(\"provider.messages.openai_compatible.stream_interrupted:\", {\n error,\n provider,\n })\n }\n\n for (const event of flushPendingAnthropicStreamEvents(streamState)) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\n \"provider.messages.openai_compatible.translated_event:\",\n eventData,\n ])\n await writeSSEIfConnected(stream, {\n event: event.type,\n data: eventData,\n })\n }\n\n if (!streamState.messageCompleted) {\n logger.warn(\"provider.messages.openai_compatible.stream_incomplete:\", {\n provider,\n })\n const errorEvent = translateErrorToAnthropicErrorEvent()\n await writeSSEIfConnected(stream, {\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n}\n\nconst streamResponsesProviderMessages = ({\n c,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n providerConfig,\n upstreamResponse,\n usageEndpoint,\n}: {\n c: Context\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n providerConfig: ResolvedProviderConfig\n upstreamResponse: ResponsesStream\n usageEndpoint?: TokenUsageEndpoint\n}): Response => {\n logger.debug(\"provider.messages.responses.streaming\", {\n provider,\n })\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n const streamState = createResponsesStreamState({\n toolSearchName: resolveBridgeToolSearchName(payload.tools),\n })\n\n for await (const chunk of upstreamResponse) {\n logger.debug(\"provider.messages.responses.raw_stream_event:\", chunk.data)\n const eventName = chunk.event\n if (eventName === \"ping\") {\n await writeSSEIfConnected(stream, {\n event: \"ping\",\n data: '{\"type\":\"ping\"}',\n })\n continue\n }\n\n if (!chunk.data || chunk.data === \"[DONE]\") {\n if (chunk.data === \"[DONE]\") {\n break\n }\n continue\n }\n\n const parsed = parseResponsesProviderStreamChunk(\n chunk.data,\n providerConfig,\n )\n recordResponsesFirstToken(parsed)\n if (!parsed) {\n continue\n }\n\n if (\n parsed.type === \"response.completed\"\n || parsed.type === \"response.failed\"\n || parsed.type === \"response.incomplete\"\n ) {\n usage = normalizeResponsesUsage(parsed.response.usage)\n }\n\n const events = translateResponsesStreamEvent(parsed, streamState)\n for (const event of events) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\n \"provider.messages.responses.translated_event:\",\n eventData,\n ])\n await writeSSEIfConnected(stream, {\n event: event.type,\n data: eventData,\n })\n }\n }\n\n if (!streamState.messageCompleted) {\n const errorEvent = buildErrorEvent(\n `${provider} stream ended without a completion event, retry your request.`,\n )\n await writeSSEIfConnected(stream, {\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n}\n\nconst parseOpenAICompatibleStreamChunk = (\n data: string,\n): ChatCompletionChunk | null => {\n try {\n return JSON.parse(data) as ChatCompletionChunk\n } catch (error) {\n logger.error(\"provider.messages.openai_compatible.parse_chunk_error\", {\n data,\n error,\n })\n return null\n }\n}\n\nconst parseResponsesProviderStreamChunk = (\n data: string,\n providerConfig: ResolvedProviderConfig,\n): ResponseStreamEvent | null => {\n try {\n const parsed = JSON.parse(data) as ResponseStreamEvent\n if (providerConfig.name === \"codex\") {\n logCodexRateLimitsEvent(parsed)\n }\n\n return parsed\n } catch (error) {\n logger.error(\"provider.messages.responses.parse_chunk_error\", {\n provider: providerConfig.name,\n data,\n error,\n })\n return null\n }\n}\n\nconst parseProviderStreamEvent = (\n data: string,\n): {\n data: string\n model?: string\n type: AnthropicStreamEventData[\"type\"]\n usage: UsageTokens\n} | null => {\n try {\n const parsed = JSON.parse(data) as AnthropicStreamEventData\n recordAnthropicFirstToken(parsed)\n if (parsed.type === \"message_start\") {\n return {\n data: JSON.stringify(parsed),\n model: parsed.message.model,\n type: parsed.type,\n usage: normalizeAnthropicUsage(parsed.message.usage),\n }\n }\n if (parsed.type === \"message_delta\") {\n return {\n data: JSON.stringify(parsed),\n type: parsed.type,\n usage: normalizeAnthropicUsage(parsed.usage),\n }\n }\n return { data: JSON.stringify(parsed), type: parsed.type, usage: {} }\n } catch (error) {\n logger.error(\"provider.messages.streaming.adjust_tokens_error\", {\n error,\n originalData: data,\n })\n return null\n }\n}\n\nconst normalizeOpenRouterThinkingSignatures = (\n body: AnthropicResponse,\n): void => {\n for (const block of body.content) {\n if (block.type === \"thinking\") {\n block.signature ??= \"\"\n }\n }\n}\n\ntype OpenRouterThinkingStreamState = {\n signedThinkingBlockIndexes: Set<number>\n thinkingBlockIndexes: Set<number>\n}\n\ntype ProviderStreamEvent = {\n data: string\n event: string | undefined\n}\n\nconst normalizeOpenRouterStreamEvents = (\n eventName: string | undefined,\n data: string,\n state: OpenRouterThinkingStreamState,\n): Array<ProviderStreamEvent> => {\n let event: AnthropicStreamEventData\n try {\n event = JSON.parse(data) as typeof event\n } catch {\n return [{ data, event: eventName }]\n }\n\n if (\n event.type === \"content_block_start\"\n && event.content_block.type === \"thinking\"\n ) {\n const { index } = event\n state.thinkingBlockIndexes.add(index)\n state.signedThinkingBlockIndexes.delete(index)\n }\n\n if (\n event.type === \"content_block_delta\"\n && event.delta.type === \"signature_delta\"\n ) {\n const { index } = event\n state.signedThinkingBlockIndexes.add(index)\n }\n\n if (event.type === \"content_block_stop\") {\n const { index } = event\n if (!state.thinkingBlockIndexes.has(index)) {\n return [{ data, event: eventName }]\n }\n\n const hasSignature = state.signedThinkingBlockIndexes.has(index)\n state.thinkingBlockIndexes.delete(index)\n state.signedThinkingBlockIndexes.delete(index)\n\n if (!hasSignature) {\n return [\n {\n data: JSON.stringify({\n delta: { signature: \"\", type: \"signature_delta\" },\n index,\n type: \"content_block_delta\",\n }),\n event: \"content_block_delta\",\n },\n { data, event: eventName },\n ]\n }\n }\n\n return [{ data, event: eventName }]\n}\n\nconst respondProviderMessagesJson = (\n c: Context,\n options: {\n body: AnthropicResponse\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n usageEndpoint?: TokenUsageEndpoint\n },\n): Response => {\n const {\n body,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n usageEndpoint,\n } = options\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n recordUsage(normalizeAnthropicUsage(body.usage))\n\n if (provider === \"openrouter\") {\n normalizeOpenRouterThinkingSignatures(body)\n }\n\n debugJson(logger, \"provider.messages.no_stream result:\", body)\n return c.json(body)\n}\n\nconst respondOpenAICompatibleProviderMessagesJson = (\n c: Context,\n options: {\n body: ChatCompletionResponse\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n usageEndpoint?: TokenUsageEndpoint\n },\n): Response => {\n const {\n body,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n usageEndpoint,\n } = options\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n recordUsage(normalizeOpenAIUsage(body.usage))\n\n const anthropicResponse = translateToAnthropic(body)\n debugJson(\n logger,\n \"provider.messages.openai_compatible.no_stream result:\",\n anthropicResponse,\n )\n return c.json(anthropicResponse)\n}\n\nconst respondResponsesProviderMessagesJson = (\n c: Context,\n options: {\n body: ResponsesResult\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n providerConfig: ResolvedProviderConfig\n usageEndpoint?: TokenUsageEndpoint\n },\n): Response => {\n const {\n body,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n providerConfig,\n usageEndpoint,\n } = options\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n recordUsage(normalizeResponsesUsage(body.usage))\n\n const anthropicResponse = translateResponsesResultToAnthropic(body, {\n toolSearchName: resolveBridgeToolSearchName(payload.tools),\n })\n debugJson(\n logger,\n \"provider.messages.responses.no_stream result:\",\n anthropicResponse,\n )\n\n if (providerConfig.name === \"codex\") {\n logger.debug(\"provider.messages.codex.no_stream.result\")\n }\n return c.json(anthropicResponse)\n}\n\nconst respondWebSearchProviderMessagesJson = (\n c: Context,\n options: {\n body: ResponsesResult\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n usageEndpoint?: TokenUsageEndpoint\n },\n): Response => {\n const {\n body,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n usageEndpoint,\n } = options\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n recordUsage(normalizeResponsesUsage(body.usage))\n\n const { extract, response } = reconstructWebSearchResponse(payload, body, {\n requestId: body.id || `${provider}:${payload.model}`,\n })\n\n debugJson(\n logger,\n `Web search via responses: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`,\n body,\n )\n\n if (!payload.stream) {\n return c.json(response)\n }\n\n return streamSSE(c, async (stream) => {\n for (const event of buildSyntheticStreamEvents(response)) {\n const data = JSON.stringify(event)\n logger.debug(`Web search stream event`, data)\n await writeSSEIfConnected(stream, {\n event: event.type,\n data: data,\n })\n }\n })\n}\n\nconst createProviderMessagesUsageRecorder = (\n payload: AnthropicMessagesPayload,\n provider: string,\n modelConfig: ModelConfig | undefined,\n pricingCurrency: string | undefined,\n endpoint: TokenUsageEndpoint = \"provider_messages\",\n) =>\n createProviderTokenUsageRecorder({\n endpoint,\n model: payload.model,\n pricing: modelConfig?.pricing,\n pricingCurrency,\n providerName: provider,\n sessionId: parseUserIdMetadata(payload.metadata?.user_id).sessionId,\n })\n","import consola from \"consola\"\nimport { events } from \"fetch-event-stream\"\n\nimport type { CompactType } from \"~/lib/compact\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type {\n AnthropicMessagesPayload,\n AnthropicResponse,\n} from \"~/lib/types/anthropic\"\n\nimport {\n copilotBaseUrl,\n copilotHeaders,\n isOpencodeOauthApp,\n prepareForCompact,\n prepareInteractionHeaders,\n prepareMessageProxyHeaders,\n} from \"~/lib/api-config\"\nimport { getUpstreamTransportConfig } from \"~/lib/config\"\nimport { logCopilotRateLimits } from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { setPluginRequestActualModel } from \"~/lib/request-context\"\nimport { state } from \"~/lib/state\"\nimport { parseUserIdMetadata } from \"~/lib/utils\"\nimport { fetchUpstreamWithLifecycle } from \"~/services/upstream-http\"\n\nexport type MessagesStream = ReturnType<typeof events>\nexport type CreateMessagesReturn = AnthropicResponse | MessagesStream\n\nconst INTERLEAVED_THINKING_BETA = \"interleaved-thinking-2025-05-14\"\nconst ADVANCED_TOOL_USE_BETA = \"advanced-tool-use-2025-11-20\"\nconst EXTENDED_CACHE_TTL_BETA = \"extended-cache-ttl-2025-04-11\"\nconst allowedAnthropicBetas = new Set([\n INTERLEAVED_THINKING_BETA,\n \"context-management-2025-06-27\",\n ADVANCED_TOOL_USE_BETA,\n EXTENDED_CACHE_TTL_BETA,\n \"mid-conversation-output-config-2026-07-01\",\n \"per-turn-control-2026-07-01\",\n])\n\nexport const buildAnthropicBetaHeader = (\n anthropicBetaHeader: string | undefined,\n thinking: AnthropicMessagesPayload[\"thinking\"],\n _model: string,\n): string | undefined => {\n const isAdaptiveThinking = thinking?.type === \"adaptive\"\n\n if (anthropicBetaHeader) {\n const filteredBeta = anthropicBetaHeader\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n .filter((item) => allowedAnthropicBetas.has(item))\n\n // in vscode copilot extension, advanced-tool-use is enabled by default\n // align header with vscode copilot extension\n const uniqueFilteredBetas = [...filteredBeta]\n if (uniqueFilteredBetas.length > 0) {\n return uniqueFilteredBetas.join(\",\")\n }\n\n return undefined\n }\n\n if (thinking?.budget_tokens && !isAdaptiveThinking) {\n return INTERLEAVED_THINKING_BETA\n }\n\n return undefined\n}\n\nexport const createMessages = async (\n payload: AnthropicMessagesPayload,\n anthropicBetaHeader: string | undefined,\n options: {\n anthropicVersionHeader?: string\n clientSignal?: AbortSignal\n subagentMarker?: SubagentMarker | null\n requestId: string\n sessionId?: string\n compactType?: CompactType\n },\n): Promise<CreateMessagesReturn> => {\n if (!state.copilotToken) throw new Error(\"Copilot token not found\")\n\n const enableVision = payload.messages.some((message) => {\n if (!Array.isArray(message.content)) return false\n return message.content.some(\n (block) =>\n block.type === \"image\"\n || (block.type === \"tool_result\"\n && Array.isArray(block.content)\n && block.content.some((inner) => inner.type === \"image\")),\n )\n })\n\n let isInitiateRequest = false\n const lastMessage = payload.messages.at(-1)\n if (lastMessage?.role === \"user\") {\n isInitiateRequest =\n Array.isArray(lastMessage.content) ?\n lastMessage.content.some((block) => block.type !== \"tool_result\")\n : true\n }\n\n const headers: Record<string, string> = {\n ...copilotHeaders(state, options.requestId, enableVision),\n \"x-initiator\": isInitiateRequest ? \"user\" : \"agent\",\n }\n\n prepareInteractionHeaders(\n options.sessionId,\n Boolean(options.subagentMarker),\n headers,\n )\n\n prepareForCompact(headers, options.compactType)\n\n const { safetyIdentifier, sessionId } = parseUserIdMetadata(\n payload.metadata?.user_id,\n )\n if (safetyIdentifier && sessionId && !isOpencodeOauthApp()) {\n headers[\"anthropic-version\"] =\n options.anthropicVersionHeader ?? \"2023-06-01\"\n prepareMessageProxyHeaders(headers, state)\n }\n\n // align with vscode copilot extension anthropic-beta\n const anthropicBeta = buildAnthropicBetaHeader(\n anthropicBetaHeader,\n payload.thinking,\n payload.model,\n )\n if (anthropicBeta) {\n headers[\"anthropic-beta\"] = anthropicBeta\n }\n\n consola.log(`<-- model: ${payload.model}`)\n\n const transportConfig = getUpstreamTransportConfig()\n setPluginRequestActualModel(payload.model)\n const response = await fetchUpstreamWithLifecycle(\n `${copilotBaseUrl(state)}/v1/messages`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n },\n {\n clientSignal: options.clientSignal,\n headersTimeoutMs: transportConfig.headersTimeoutMs,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n },\n )\n\n logCopilotRateLimits(response.headers)\n\n if (!response.ok) {\n consola.error(\"Failed to create messages\", response)\n throw new HTTPError(\"Failed to create messages\", response)\n }\n\n if (payload.stream) {\n return events(response)\n }\n\n return (await response.json()) as AnthropicResponse\n}\n","import type { ConsolaInstance } from \"consola\"\nimport type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\n\nimport type { CompactType } from \"~/lib/compact\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { Model } from \"~/lib/types/models\"\n\nimport { getRawProviderConfig } from \"~/lib/config\"\nimport {\n recordAnthropicFirstToken,\n recordChatCompletionFirstToken,\n recordResponsesFirstToken,\n} from \"~/lib/first-token\"\nimport { GITHUB_COPILOT_PROVIDER } from \"~/lib/github-copilot-provider\"\nimport { debugJson, debugJsonTail, debugLazy } from \"~/lib/logger\"\nimport { getProviderModelPdfSupport } from \"~/lib/model-pdf-support\"\nimport { writeSSEIfConnected } from \"~/lib/sse\"\nimport { resolveBridgeToolSearchName } from \"~/lib/tool-search\"\nimport {\n createCopilotTokenUsageRecorder,\n mergeAnthropicUsage,\n normalizeAnthropicUsage,\n normalizeOpenAIUsage,\n normalizeOptionalToken,\n normalizeResponsesUsage,\n type TokenUsageEndpoint,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { isAsyncIterable, parseUserIdMetadata } from \"~/lib/utils\"\nimport {\n buildErrorEvent,\n createResponsesStreamState,\n translateResponsesStreamEvent,\n} from \"~/routes/messages/responses-stream-translation\"\nimport {\n translateAnthropicMessagesToResponsesPayload,\n translateResponsesResultToAnthropic,\n} from \"~/routes/messages/responses-translation\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n getResponsesTransportForModel,\n getResponsesRequestOptions,\n} from \"~/routes/responses/utils\"\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n Message,\n} from \"~/lib/types/chat-completions\"\nimport type {\n ResponsesResult,\n ResponseStreamEvent,\n} from \"~/lib/types/responses\"\nimport { createChatCompletions as createCopilotChatCompletions } from \"~/services/copilot/create-chat-completions\"\nimport { createMessages as createCopilotMessages } from \"~/services/copilot/create-messages\"\nimport { createResponses as createCopilotResponses } from \"~/services/copilot/create-responses\"\n\nimport {\n type AnthropicMessagesPayload,\n type AnthropicStreamEventData,\n type AnthropicStreamState,\n type CopilotUsage,\n} from \"~/lib/types/anthropic\"\nimport {\n translateToAnthropic,\n translateToOpenAI,\n} from \"./completions-translation\"\nimport { prepareMessagesApiPayload } from \"./preprocess\"\nimport {\n flushPendingAnthropicStreamEvents,\n translateChunkToAnthropicEvents,\n translateErrorToAnthropicErrorEvent,\n} from \"./completions-stream-translation\"\n\nconst COPILOT_CONTEXT_CACHE_SYSTEM_MARKER_LIMIT = 2\nconst COPILOT_CONTEXT_CACHE_NON_SYSTEM_MARKER_LIMIT = 1\nconst COPILOT_CONTEXT_CACHE_CONTROL = {\n type: \"ephemeral\",\n} as const\n\nexport const messagesApiFlowDependencies = {\n createChatCompletions: createCopilotChatCompletions,\n createMessages: createCopilotMessages,\n createResponses: createCopilotResponses,\n}\n\nexport interface FlowBaseOptions {\n logger: ConsolaInstance\n subagentMarker?: SubagentMarker | null\n requestId: string\n sessionId?: string\n compactType?: CompactType\n usageEndpoint?: TokenUsageEndpoint\n}\n\ninterface ResponsesFlowOptions extends FlowBaseOptions {\n selectedModel?: Model\n}\n\ninterface MessagesFlowOptions extends FlowBaseOptions {\n anthropicBetaHeader?: string\n selectedModel?: Model\n}\n\ninterface ChatCompletionsFlowOptions extends FlowBaseOptions {\n selectedModel?: Model\n}\n\nexport const handleWithChatCompletions = async (\n c: Context,\n anthropicPayload: AnthropicMessagesPayload,\n options: ChatCompletionsFlowOptions,\n) => {\n const {\n logger,\n selectedModel,\n subagentMarker,\n requestId,\n sessionId,\n compactType,\n } = options\n const openAIPayload = translateToOpenAI(anthropicPayload, {\n supportPdf: getProviderModelPdfSupport(\n anthropicPayload.model,\n {\n ...getRawProviderConfig(GITHUB_COPILOT_PROVIDER),\n name: GITHUB_COPILOT_PROVIDER,\n },\n selectedModel,\n ),\n validateReasoningEffort: true,\n reasoningEffortSupport:\n selectedModel?.capabilities.supports.reasoning_effort,\n })\n prepareCopilotChatCompletionsPayload(openAIPayload)\n const recordUsage = createCopilotUsageRecorder({\n endpoint: options.usageEndpoint ?? \"chat_completions\",\n fallbackSessionId: sessionId,\n model: openAIPayload.model,\n payload: anthropicPayload,\n })\n debugJson(logger, \"Translated OpenAI request payload:\", openAIPayload)\n\n const response = await messagesApiFlowDependencies.createChatCompletions(\n openAIPayload,\n {\n clientSignal: c.req?.raw?.signal,\n subagentMarker,\n requestId,\n sessionId,\n compactType,\n },\n )\n\n if (isNonStreaming(response)) {\n debugJson(logger, \"Non-streaming response from Copilot:\", response)\n recordUsage({\n ...normalizeOpenAIUsage(response.usage),\n total_nano_aiu: normalizeOptionalToken(\n response.copilot_usage?.total_nano_aiu,\n ),\n })\n const anthropicResponse = translateToAnthropic(response)\n debugJson(logger, \"Translated Anthropic response:\", anthropicResponse)\n return c.json(anthropicResponse)\n }\n\n logger.debug(\"Streaming response from Copilot\")\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n const streamState: AnthropicStreamState = {\n messageStartSent: false,\n messageCompleted: false,\n contentBlockIndex: 0,\n contentBlockOpen: false,\n toolCalls: {},\n thinkingBlockOpen: false,\n }\n\n try {\n for await (const rawEvent of response) {\n debugJson(logger, \"Copilot raw stream event:\", rawEvent)\n if (rawEvent.data === \"[DONE]\") {\n break\n }\n\n if (!rawEvent.data) {\n continue\n }\n\n const chunk = JSON.parse(rawEvent.data) as ChatCompletionChunk\n recordChatCompletionFirstToken(chunk)\n if (chunk.usage || chunk.copilot_usage) {\n usage = {\n ...normalizeOpenAIUsage(chunk.usage),\n total_nano_aiu: normalizeOptionalToken(\n chunk.copilot_usage?.total_nano_aiu,\n ),\n }\n }\n const events = translateChunkToAnthropicEvents(chunk, streamState)\n\n for (const event of events) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\"Translated Anthropic event:\", eventData])\n await writeSSEIfConnected(stream, {\n event: event.type,\n data: eventData,\n })\n }\n }\n } catch (error) {\n logger.warn(\"Chat completions stream interrupted:\", error)\n }\n\n for (const event of flushPendingAnthropicStreamEvents(streamState)) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\"Translated Anthropic event:\", eventData])\n await writeSSEIfConnected(stream, {\n event: event.type,\n data: eventData,\n })\n }\n\n if (!streamState.messageCompleted) {\n logger.warn(\n \"Chat completions stream ended without completion; sending error event\",\n )\n const errorEvent = translateErrorToAnthropicErrorEvent()\n await writeSSEIfConnected(stream, {\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n}\n\nexport const handleWithResponsesApi = async (\n c: Context,\n anthropicPayload: AnthropicMessagesPayload,\n options: ResponsesFlowOptions,\n) => {\n const { logger, selectedModel, ...requestOptions } = options\n\n const responsesPayload =\n translateAnthropicMessagesToResponsesPayload(anthropicPayload)\n const recordUsage = createCopilotUsageRecorder({\n endpoint: options.usageEndpoint ?? \"responses\",\n fallbackSessionId: requestOptions.sessionId,\n model: responsesPayload.model,\n payload: anthropicPayload,\n })\n\n const shouldCompactInput = applyResponsesApiContextManagement(\n responsesPayload,\n selectedModel?.capabilities.limits.max_prompt_tokens,\n {\n source: \"messages\",\n },\n )\n\n if (shouldCompactInput) {\n compactInputByLatestCompaction(responsesPayload)\n }\n\n debugJson(logger, \"Translated Responses payload:\", responsesPayload)\n\n const { vision, initiator } = getResponsesRequestOptions(responsesPayload)\n const transport =\n getResponsesTransportForModel(selectedModel, {\n compactType: requestOptions.compactType,\n }) ?? \"http\"\n const response = await messagesApiFlowDependencies.createResponses(\n responsesPayload,\n {\n vision,\n initiator,\n clientSignal: c.req?.raw?.signal,\n transport,\n ...requestOptions,\n },\n )\n\n if (responsesPayload.stream && isAsyncIterable(response)) {\n logger.debug(\"Streaming response from Copilot (Responses API)\")\n return streamSSE(c, async (stream) => {\n const streamState = createResponsesStreamState({\n toolSearchName: resolveBridgeToolSearchName(anthropicPayload.tools),\n })\n let usage: UsageTokens = {}\n\n for await (const chunk of response) {\n const eventName = chunk.event\n if (eventName === \"ping\") {\n await writeSSEIfConnected(stream, {\n event: \"ping\",\n data: '{\"type\":\"ping\"}',\n })\n continue\n }\n\n const data = chunk.data\n if (!data) {\n continue\n }\n\n debugLazy(logger, () => [\"Responses raw stream event:\", data])\n\n const responseEvent = JSON.parse(data) as ResponseStreamEvent\n recordResponsesFirstToken(responseEvent)\n if (\n responseEvent.type === \"response.completed\"\n || responseEvent.type === \"response.failed\"\n || responseEvent.type === \"response.incomplete\"\n ) {\n usage = {\n ...normalizeResponsesUsage(responseEvent.response.usage),\n total_nano_aiu: normalizeOptionalToken(\n responseEvent.copilot_usage?.total_nano_aiu,\n ),\n }\n }\n\n const events = translateResponsesStreamEvent(responseEvent, streamState)\n for (const event of events) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\"Translated Anthropic event:\", eventData])\n await writeSSEIfConnected(stream, {\n event: event.type,\n data: eventData,\n })\n }\n\n if (streamState.messageCompleted) {\n logger.debug(\"Message completed, ending stream\")\n break\n }\n }\n\n if (!streamState.messageCompleted) {\n logger.warn(\n \"Responses stream ended without completion; sending error event\",\n )\n const errorEvent = buildErrorEvent(\n \"Responses stream ended without completion, retry your request.\",\n )\n await writeSSEIfConnected(stream, {\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n }\n\n debugJson(logger, \"Non-streaming Responses result:\", response)\n const anthropicResponse = translateResponsesResultToAnthropic(\n response as ResponsesResult,\n {\n toolSearchName: resolveBridgeToolSearchName(anthropicPayload.tools),\n },\n )\n const responsesResult = response as ResponsesResult\n recordUsage({\n ...normalizeResponsesUsage(responsesResult.usage),\n total_nano_aiu: normalizeOptionalToken(\n responsesResult.copilot_usage?.total_nano_aiu,\n ),\n })\n debugJson(logger, \"Translated Anthropic response:\", anthropicResponse)\n return c.json(anthropicResponse)\n}\n\nexport const handleWithMessagesApi = async (\n c: Context,\n anthropicPayload: AnthropicMessagesPayload,\n options: MessagesFlowOptions,\n) => {\n const {\n logger,\n anthropicBetaHeader,\n subagentMarker,\n selectedModel,\n requestId,\n sessionId,\n compactType,\n } = options\n\n prepareMessagesApiPayload(anthropicPayload, selectedModel)\n const recordUsage = createCopilotUsageRecorder({\n endpoint: options.usageEndpoint ?? \"messages\",\n fallbackSessionId: sessionId,\n model: anthropicPayload.model,\n payload: anthropicPayload,\n })\n\n debugJson(logger, \"Translated Messages payload:\", anthropicPayload)\n\n const response = await messagesApiFlowDependencies.createMessages(\n anthropicPayload,\n anthropicBetaHeader,\n {\n anthropicVersionHeader: c.req?.header(\"anthropic-version\"),\n clientSignal: c.req?.raw?.signal,\n subagentMarker,\n requestId,\n sessionId,\n compactType,\n },\n )\n\n if (isAsyncIterable(response)) {\n logger.debug(\"Streaming response from Copilot (Messages API)\")\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n let messageStopSeen = false\n let errorSeen = false\n\n try {\n for await (const event of response) {\n const eventName = event.event\n const data = event.data ?? \"\"\n if (data === \"[DONE]\") {\n break\n }\n if (!data) {\n continue\n }\n debugLazy(logger, () => [\"Messages raw stream event:\", data])\n const parsedEvent = parseAnthropicStreamEvent(data)\n recordAnthropicFirstToken(parsedEvent)\n if (parsedEvent?.type === \"message_start\") {\n usage = mergeAnthropicUsage(usage, {\n ...normalizeAnthropicUsage(parsedEvent.message.usage),\n ...normalizeCopilotUsage(parsedEvent.message.copilot_usage),\n })\n } else if (parsedEvent?.type === \"message_delta\") {\n usage = mergeAnthropicUsage(usage, {\n ...normalizeAnthropicUsage(parsedEvent.usage),\n ...normalizeCopilotUsage(parsedEvent.copilot_usage),\n })\n }\n if (\n parsedEvent?.type === \"message_stop\"\n || eventName === \"message_stop\"\n ) {\n messageStopSeen = true\n } else if (parsedEvent?.type === \"error\" || eventName === \"error\") {\n errorSeen = true\n }\n await writeSSEIfConnected(stream, {\n event: eventName,\n data,\n })\n }\n } catch (error) {\n logger.warn(\"Messages stream interrupted:\", error)\n }\n\n if (!messageStopSeen && !errorSeen) {\n logger.warn(\n \"Messages stream ended without completion; sending error event\",\n )\n const errorEvent = translateErrorToAnthropicErrorEvent()\n await writeSSEIfConnected(stream, {\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n }\n\n debugJsonTail(logger, \"Non-streaming Messages result:\", {\n value: response,\n tailLength: 400,\n })\n recordUsage({\n ...normalizeAnthropicUsage(response.usage),\n ...normalizeCopilotUsage(response.copilot_usage),\n })\n return c.json(response)\n}\n\nexport const prepareCopilotChatCompletionsPayload = (\n payload: ChatCompletionsPayload,\n): void => {\n applyCopilotContextCache(payload)\n}\n\nconst applyCopilotContextCache = (payload: ChatCompletionsPayload): void => {\n const messageIndexes = selectCopilotContextCacheMessageIndexes(\n payload.messages,\n )\n for (const messageIndex of messageIndexes) {\n const message = payload.messages[messageIndex]\n message.copilot_cache_control = { ...COPILOT_CONTEXT_CACHE_CONTROL }\n }\n}\n\nconst selectCopilotContextCacheMessageIndexes = (\n messages: Array<Message>,\n): Array<number> => {\n const systemIndexes = messages\n .flatMap((message, index) =>\n message.role === \"system\" && isCopilotContextCacheEligible(message) ?\n [index]\n : [],\n )\n .slice(0, COPILOT_CONTEXT_CACHE_SYSTEM_MARKER_LIMIT)\n const reverseNonSystemIndexes = messages\n .flatMap((message, index) =>\n message.role !== \"system\" && isCopilotContextCacheEligible(message) ?\n [index]\n : [],\n )\n .reverse()\n .slice(0, COPILOT_CONTEXT_CACHE_NON_SYSTEM_MARKER_LIMIT)\n\n return uniqueIndexes([...systemIndexes, ...reverseNonSystemIndexes]).sort(\n (a, b) => a - b,\n )\n}\n\nconst isCopilotContextCacheEligible = (message: Message): boolean => {\n if (typeof message.content === \"string\") {\n return message.content.length > 0\n }\n\n return Array.isArray(message.content) && message.content.length > 0\n}\n\nconst uniqueIndexes = (indexes: Array<number>): Array<number> => [\n ...new Set(indexes),\n]\n\nconst isNonStreaming = (\n response: Awaited<ReturnType<typeof createCopilotChatCompletions>>,\n): response is ChatCompletionResponse => Object.hasOwn(response, \"choices\")\n\nconst createCopilotUsageRecorder = (options: {\n endpoint: TokenUsageEndpoint\n fallbackSessionId?: string\n model: string\n payload: AnthropicMessagesPayload\n}): ((usage: UsageTokens) => void) =>\n createCopilotTokenUsageRecorder({\n endpoint: options.endpoint,\n fallbackSessionId: options.fallbackSessionId,\n model: options.model,\n sessionId: getMetadataSessionId(options.payload),\n })\n\nconst getMetadataSessionId = (\n payload: AnthropicMessagesPayload,\n): string | null => parseUserIdMetadata(payload.metadata?.user_id).sessionId\n\nconst normalizeCopilotUsage = (\n copilotUsage: CopilotUsage | null | undefined,\n): UsageTokens => ({\n total_nano_aiu: normalizeOptionalToken(copilotUsage?.total_nano_aiu),\n})\n\nconst parseAnthropicStreamEvent = (\n data: string,\n): AnthropicStreamEventData | null => {\n try {\n return JSON.parse(data) as AnthropicStreamEventData\n } catch {\n return null\n }\n}\n","export const subagentMarkerPrefix = \"__SUBAGENT_MARKER__\"\n\nexport interface SubagentMarker {\n session_id: string\n agent_id: string\n agent_type: string\n}\n","import { subagentMarkerPrefix, type SubagentMarker } from \"~/lib/subagent\"\n\nimport type { AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\n\nexport const parseSubagentMarkerFromFirstUser = (\n payload: AnthropicMessagesPayload,\n): SubagentMarker | null => {\n const firstUserMessage = payload.messages.find(\n (msg) => msg.role === \"user\" && Array.isArray(msg.content),\n )\n if (!firstUserMessage || !Array.isArray(firstUserMessage.content)) {\n return null\n }\n\n for (const block of firstUserMessage.content) {\n if (block.type !== \"text\") {\n continue\n }\n\n const marker = parseSubagentMarkerFromSystemReminder(block.text)\n if (marker) {\n return marker\n }\n }\n\n return null\n}\n\nconst parseSubagentMarkerFromSystemReminder = (\n text: string,\n): SubagentMarker | null => {\n const startTag = \"<system-reminder>\"\n const endTag = \"</system-reminder>\"\n let searchFrom = 0\n\n while (true) {\n const reminderStart = text.indexOf(startTag, searchFrom)\n if (reminderStart === -1) {\n break\n }\n\n const contentStart = reminderStart + startTag.length\n const reminderEnd = text.indexOf(endTag, contentStart)\n if (reminderEnd === -1) {\n break\n }\n\n const reminderContent = text.slice(contentStart, reminderEnd)\n const markerIndex = reminderContent.indexOf(subagentMarkerPrefix)\n if (markerIndex === -1) {\n searchFrom = reminderEnd + endTag.length\n continue\n }\n\n const markerJson = reminderContent\n .slice(markerIndex + subagentMarkerPrefix.length)\n .trim()\n\n try {\n const parsed = JSON.parse(markerJson) as SubagentMarker\n if (!parsed.session_id || !parsed.agent_id || !parsed.agent_type) {\n searchFrom = reminderEnd + endTag.length\n continue\n }\n\n return parsed\n } catch {\n searchFrom = reminderEnd + endTag.length\n continue\n }\n }\n\n return null\n}\n","import type { Context } from \"hono\"\n\nimport type { Model } from \"~/lib/types/models\"\n\nimport { COMPACT_REQUEST } from \"~/lib/compact\"\nimport { setPluginRequestModel } from \"~/lib/request-events\"\nimport {\n getClaudeAutoModel,\n getSmallModel,\n isMessagesApiEnabled,\n resolveMappedModel,\n} from \"~/lib/config\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { fromClaudeDiscoveryModelId } from \"~/lib/claude-models\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { resolveConfiguredProviderModelAlias } from \"~/lib/provider-resolver\"\nimport { state } from \"~/lib/state\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { TokenUsageEndpoint } from \"~/lib/token-usage\"\nimport {\n generateRequestIdFromPayload,\n getRootSessionId,\n getUUID,\n} from \"~/lib/utils\"\nimport {\n handleProviderMessagesForProvider,\n providerMessagesHandlerDependencies,\n} from \"~/routes/provider/messages/handler\"\nimport { getResponsesTransportForModel } from \"~/routes/responses/utils\"\n\nimport type { AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\nimport {\n handleWithChatCompletions,\n handleWithMessagesApi,\n handleWithResponsesApi,\n} from \"./api-flows\"\nimport {\n appendClaudeContinuationMessage,\n applyClaudeNoToolsEffort,\n applyLastMessageCacheControl,\n getCompactType,\n getLastMessageContentCacheControl,\n isClaudeAutoModelRequest,\n mergeToolResultForClaude,\n normalizeSystemMessages,\n sanitizeIdeTools,\n stripToolReferenceTurnBoundary,\n} from \"./preprocess\"\nimport { parseSubagentMarkerFromFirstUser } from \"./subagent-marker\"\nimport { tryHandleWebSearch } from \"./web-search/fulfill\"\nimport consola from \"consola\"\n\nconst logger = createHandlerLogger(\"messages-handler\")\n\nexport const messagesFlowHandlers = {\n handleWithChatCompletions,\n handleWithMessagesApi,\n handleWithResponsesApi,\n}\n\nexport async function handleCompletion(c: Context) {\n const anthropicPayload = await c.req.json<AnthropicMessagesPayload>()\n setPluginRequestModel(anthropicPayload.model)\n anthropicPayload.model = fromClaudeDiscoveryModelId(anthropicPayload.model)\n applyClaudeNoToolsEffort(anthropicPayload, c.req.header(\"user-agent\"))\n\n return await handleCompletionPayload(c, anthropicPayload)\n}\n\nexport interface CompletionPayloadOptions {\n compactType?: ReturnType<typeof getCompactType>\n skipClaudeAutoModel?: boolean\n skipModelMapping?: boolean\n skipWebSearch?: boolean\n usageEndpoint?: TokenUsageEndpoint\n subagentMarker?: SubagentMarker | null\n sessionId?: string\n requestId?: string\n}\n\nexport async function handleCompletionPayload(\n c: Context,\n anthropicPayload: AnthropicMessagesPayload,\n dispatchOptions: CompletionPayloadOptions = {},\n) {\n const requestedModel = anthropicPayload.model\n if (!dispatchOptions.skipModelMapping) {\n anthropicPayload.model = resolveMappedModel(anthropicPayload.model)\n }\n if (anthropicPayload.model !== requestedModel) {\n consola.debug(\n `Resolved model mapping: ${requestedModel} -> ${anthropicPayload.model}`,\n )\n }\n\n if (!dispatchOptions.skipWebSearch) {\n const webSearchResult = await tryHandleWebSearch(c, anthropicPayload, {\n logger,\n forwardToProvider: (ctx, payload, provider) =>\n handleProviderMessagesForProvider(ctx, { payload, provider }),\n })\n if (webSearchResult) return webSearchResult\n }\n\n const claudeAutoModel = getClaudeAutoModel(true)\n const shouldUseClaudeAutoModel = Boolean(\n !dispatchOptions.skipClaudeAutoModel\n && claudeAutoModel\n && isClaudeAutoModelRequest(anthropicPayload),\n )\n if (claudeAutoModel && shouldUseClaudeAutoModel) {\n const resolvedClaudeAutoModel =\n dispatchOptions.skipModelMapping ? claudeAutoModel : (\n resolveMappedModel(claudeAutoModel)\n )\n consola.debug(\n `Claude auto model override: ${anthropicPayload.model} -> ${resolvedClaudeAutoModel}`,\n )\n anthropicPayload.model = resolvedClaudeAutoModel\n }\n\n const providerModelAlias = await resolveConfiguredProviderModelAlias(\n anthropicPayload.model,\n providerMessagesHandlerDependencies.resolveProviderConfig,\n )\n if (providerModelAlias) {\n anthropicPayload.model = providerModelAlias.model\n return await handleProviderMessagesForProvider(c, {\n payload: anthropicPayload,\n provider: providerModelAlias.provider,\n usageEndpoint: dispatchOptions.usageEndpoint,\n })\n }\n\n debugJson(logger, \"Anthropic request payload:\", anthropicPayload)\n\n normalizeSystemMessages(anthropicPayload)\n\n sanitizeIdeTools(anthropicPayload)\n\n const subagentMarker =\n dispatchOptions.subagentMarker\n ?? parseSubagentMarkerFromFirstUser(anthropicPayload)\n if (subagentMarker) {\n debugJson(logger, \"Detected Subagent marker:\", subagentMarker)\n }\n\n let sessionId =\n dispatchOptions.sessionId ?? getRootSessionId(anthropicPayload, c)\n\n // claude code and opencode compact / auto-continue detection\n const compactType =\n dispatchOptions.compactType ?? getCompactType(anthropicPayload)\n\n // fix claude code 2.0.28+ warmup request consume premium request, forcing small model if no tools are used\n // set \"CLAUDE_CODE_SUBAGENT_MODEL\": \"you small model\" also can avoid this\n const anthropicBeta = c.req.header(\"anthropic-beta\")\n logger.debug(\"Anthropic Beta header:\", anthropicBeta)\n if (!state.tokenBasedBilling && !shouldUseClaudeAutoModel) {\n const tools = anthropicPayload.tools\n const noTools = !tools || tools.length === 0\n if (anthropicBeta && noTools && compactType === 0) {\n const smallModel = getSmallModel()\n consola.debug(\n `Claude Code warmup small model: ${anthropicPayload.model} -> ${smallModel}`,\n )\n anthropicPayload.model = smallModel\n }\n }\n\n if (compactType) {\n logger.debug(\"Compact request type:\", compactType)\n }\n\n if (!state.tokenBasedBilling) {\n const lastMessageCacheControl = getLastMessageContentCacheControl(\n anthropicPayload.messages.at(-1),\n )\n\n stripToolReferenceTurnBoundary(anthropicPayload)\n\n // Merge tool_result and text blocks into tool_result to avoid consuming premium requests\n // (caused by skill invocations, edit hooks, plan or to do reminders)\n // e.g. {\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"content\":\"Launching skill: xxx\"},{\"type\":\"text\",\"text\":\"xxx\"}]}\n // not only for claude, but also for opencode\n // compact requests still run this processing, except for the final compact message itself\n mergeToolResultForClaude(anthropicPayload, {\n skipLastMessage: compactType === COMPACT_REQUEST,\n })\n\n applyLastMessageCacheControl(anthropicPayload, lastMessageCacheControl)\n }\n\n const requestId =\n dispatchOptions.requestId\n ?? generateRequestIdFromPayload(anthropicPayload, sessionId)\n logger.debug(\"Generated request ID:\", requestId)\n\n if (!sessionId) {\n sessionId = getUUID(requestId)\n }\n logger.debug(\"Extracted session ID:\", sessionId)\n\n const selectedModel = findEndpointModel(anthropicPayload.model)\n anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model\n appendClaudeContinuationMessage(anthropicPayload)\n\n if (shouldUseMessagesApi(selectedModel)) {\n return await messagesFlowHandlers.handleWithMessagesApi(\n c,\n anthropicPayload,\n {\n anthropicBetaHeader: anthropicBeta,\n subagentMarker,\n selectedModel,\n requestId,\n sessionId,\n compactType,\n logger,\n usageEndpoint: dispatchOptions.usageEndpoint,\n },\n )\n }\n\n if (shouldUseResponsesApi(selectedModel, compactType)) {\n return await messagesFlowHandlers.handleWithResponsesApi(\n c,\n anthropicPayload,\n {\n subagentMarker,\n selectedModel,\n requestId,\n sessionId,\n compactType,\n logger,\n usageEndpoint: dispatchOptions.usageEndpoint,\n },\n )\n }\n\n return await messagesFlowHandlers.handleWithChatCompletions(\n c,\n anthropicPayload,\n {\n subagentMarker,\n selectedModel,\n requestId,\n sessionId,\n compactType,\n logger,\n usageEndpoint: dispatchOptions.usageEndpoint,\n },\n )\n}\n\nconst MESSAGES_ENDPOINT = \"/v1/messages\"\n\nconst shouldUseResponsesApi = (\n selectedModel: Model | undefined,\n compactType: ReturnType<typeof getCompactType>,\n): boolean => {\n return Boolean(getResponsesTransportForModel(selectedModel, { compactType }))\n}\n\nconst shouldUseMessagesApi = (selectedModel: Model | undefined): boolean => {\n const useMessagesApi = isMessagesApiEnabled()\n if (!useMessagesApi) {\n return false\n }\n return (\n selectedModel?.supported_endpoints?.includes(MESSAGES_ENDPOINT) ?? false\n )\n}\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\n\nimport { handleCountTokens } from \"./count-tokens-handler\"\nimport { handleCompletion } from \"./handler\"\n\nexport const messageRoutes = new Hono()\n\nmessageRoutes.post(\"/\", async (c) => {\n try {\n return await handleCompletion(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n\nmessageRoutes.post(\"/count_tokens\", async (c) => {\n try {\n return await handleCountTokens(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","/** Keep upstream labels as the base and identify their gateway provider. */\nexport function withModelDisplayName<T>(model: T, provider?: string): T {\n if (typeof model !== \"object\" || model === null || Array.isArray(model)) {\n return model\n }\n const fields = model as {\n display_name?: unknown\n name?: unknown\n id?: unknown\n }\n const hasDisplayName = Object.hasOwn(model, \"display_name\")\n let displayName =\n hasDisplayName ? fields.display_name\n : typeof fields.name === \"string\" && fields.name.trim() ? fields.name\n : fields.id\n const providerName = provider?.trim()\n if (\n providerName\n && typeof displayName === \"string\"\n && displayName.trim()\n && !displayName.startsWith(`${providerName} `)\n && !displayName.endsWith(` (${providerName})`)\n ) {\n displayName = `${displayName} (${providerName})`\n }\n if (hasDisplayName && displayName === fields.display_name) return model\n return { ...model, display_name: displayName }\n}\n","import type { Context } from \"hono\"\n\nimport { getBuiltinProviderModelRecords } from \"~/lib/builtin-provider-models\"\nimport {\n getRawProviderConfig,\n listEnabledProviders,\n type ProviderConfig,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport {\n GITHUB_COPILOT_PROVIDER,\n isGitHubCopilotEnabled,\n} from \"~/lib/github-copilot-provider\"\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { withModelDisplayName } from \"~/lib/model-display-name\"\nimport { toClientModelId } from \"~/lib/models\"\nimport {\n getLocalProviderModelRecords,\n isProviderModelVisible,\n} from \"~/lib/provider-model-catalog\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { getProviderAgentModels } from \"~/lib/provider-management\"\nimport { state } from \"~/lib/state\"\nimport type { Model } from \"~/lib/types/models\"\nimport { getModels as getCodexModels } from \"~/services/codex/get-models\"\nimport { forwardProviderModels } from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"models-handler\")\nconst EPOCH_ISO = new Date(0).toISOString()\n\nexport type ClientModel = Record<string, unknown> & {\n id: string\n object: string\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nexport function firstPositiveInteger(\n ...values: Array<unknown>\n): number | undefined {\n for (const value of values) {\n if (typeof value === \"number\" && Number.isFinite(value) && value >= 1) {\n return Math.floor(value)\n }\n }\n return undefined\n}\n\nfunction normalizeModelCapabilities<T extends { capabilities?: unknown }>(\n model: T,\n) {\n if (!isRecord(model.capabilities)) return model\n const limits = getRecordField(model.capabilities, \"limits\")\n const supports = getRecordField(model.capabilities, \"supports\")\n return {\n context_window: firstPositiveInteger(\n limits?.max_context_window_tokens,\n limits?.max_prompt_tokens,\n ),\n max_output_tokens: limits?.max_output_tokens,\n input_limit: limits?.max_prompt_tokens,\n input_modalities:\n typeof supports?.vision === \"boolean\" ?\n [\"text\", ...(supports.vision ? [\"image\"] : [])]\n : undefined,\n reasoning_efforts: supports?.reasoning_effort,\n ...model,\n }\n}\n\nexport function normalizeCopilotModel(model: Model): ClientModel {\n const clientId = toClientModelId(model.id)\n return {\n claude_model_id: `${clientId}[1m]`,\n ...withModelDisplayName(\n normalizeModelCapabilities(model),\n GITHUB_COPILOT_PROVIDER,\n ),\n id: clientId,\n object: \"model\",\n type: \"model\",\n created: 0,\n created_at: EPOCH_ISO,\n owned_by: model.vendor,\n }\n}\n\nexport function getStringField(\n model: Record<string, unknown>,\n field: string,\n): string | undefined {\n const value = model[field]\n return typeof value === \"string\" && value.trim() ? value : undefined\n}\n\nexport function getRecordField(\n model: Record<string, unknown> | undefined,\n field: string,\n): Record<string, unknown> | undefined {\n const value = model?.[field]\n return isRecord(value) ? value : undefined\n}\n\nexport function getStringList(value: unknown): Array<string> | undefined {\n if (!Array.isArray(value)) return undefined\n const strings = [\n ...new Set(\n value.filter((item): item is string => typeof item === \"string\"),\n ),\n ]\n return strings.length > 0 ? strings : undefined\n}\n\ntype ProviderModelsFallbackReason = \"error\" | \"invalid_body\" | \"non_ok\"\n\nfunction getFallbackProviderModelRecords(\n provider: string,\n reason: ProviderModelsFallbackReason,\n details: Record<string, unknown> = {},\n): Array<Record<string, unknown>> {\n const fallbackModels =\n getLocalProviderModelRecords(provider, getRawProviderConfig(provider))\n ?? getBuiltinProviderModelRecords(provider)\n logger.warn(`models.provider.fallback_${reason}`, {\n provider,\n ...details,\n fallbackModelCount: fallbackModels.length,\n })\n return fallbackModels\n}\n\nfunction normalizeProviderModel(\n provider: string,\n model: unknown,\n config?: ProviderConfig | null,\n): ClientModel | null {\n if (!isRecord(model)) {\n return null\n }\n\n const rawId = getStringField(model, \"id\")\n if (!rawId || !isProviderModelVisible(provider, rawId, config)) {\n return null\n }\n\n const id = `${provider}/${rawId}`\n const ownedBy =\n getStringField(model, \"owned_by\")\n ?? getStringField(model, \"vendor\")\n ?? provider\n\n return {\n ...withModelDisplayName(model, provider),\n id,\n object: getStringField(model, \"object\") ?? \"model\",\n type: getStringField(model, \"type\") ?? \"model\",\n created: typeof model.created === \"number\" ? model.created : 0,\n created_at: getStringField(model, \"created_at\") ?? EPOCH_ISO,\n owned_by: ownedBy,\n }\n}\n\nfunction normalizeProviderModels(\n provider: string,\n models: Array<unknown>,\n config?: ProviderConfig | null,\n): Array<ClientModel> {\n return models\n .map((model) => normalizeProviderModel(provider, model, config))\n .filter((model): model is ClientModel => model !== null)\n}\n\nexport async function getProviderModelRecords(\n providerConfig: ResolvedProviderConfig,\n requestHeaders: Headers,\n): Promise<Array<Record<string, unknown>>> {\n const localModels = getLocalProviderModelRecords(\n providerConfig.name,\n providerConfig,\n )\n if (localModels !== undefined) return localModels\n\n try {\n const response = await forwardProviderModels(providerConfig, requestHeaders)\n if (!response.ok) {\n return getFallbackProviderModelRecords(providerConfig.name, \"non_ok\", {\n statusCode: response.status,\n })\n }\n\n const body: unknown = await response.json()\n if (!isRecord(body) || !Array.isArray(body.data)) {\n return getFallbackProviderModelRecords(\n providerConfig.name,\n \"invalid_body\",\n )\n }\n\n return body.data.filter(isRecord).map(normalizeModelCapabilities)\n } catch (error) {\n return getFallbackProviderModelRecords(providerConfig.name, \"error\", {\n error,\n })\n }\n}\n\ntype ProviderModelSelector = (\n providerConfig: ProviderConfig | null,\n models: Array<unknown>,\n) => Array<unknown>\n\ninterface ModelSelectors {\n selectCopilotModels?: (models: Array<Model>) => Array<Model>\n selectProviderModels?: ProviderModelSelector\n}\n\nexport function getCopilotModelRecords(): Array<Model> {\n return isGitHubCopilotEnabled() ? (state.models?.data ?? []) : []\n}\n\nexport function getModelsById(\n models: Array<unknown>,\n): Map<string, Record<string, unknown>> {\n return new Map(\n models.flatMap((model) => {\n if (!isRecord(model)) return []\n const id = getStringField(model, \"id\")\n return id ? [[id, model] as const] : []\n }),\n )\n}\n\nexport function deduplicateModels<T>(\n models: Array<T>,\n getId: (model: T) => string,\n): Array<T> {\n const seen = new Set<string>()\n return models.filter((model) => {\n const id = getId(model)\n if (seen.has(id)) return false\n seen.add(id)\n return true\n })\n}\n\nasync function getProviderModels(\n provider: string,\n requestHeaders: Headers,\n selectModels?: ProviderModelSelector,\n): Promise<Array<ClientModel>> {\n try {\n const providerConfig = await resolveProviderConfig(provider)\n if (!providerConfig) return []\n\n const models =\n providerConfig.name === \"codex\" ?\n getCodexModels().data.map(normalizeModelCapabilities)\n : await getProviderModelRecords(providerConfig, requestHeaders)\n return normalizeProviderModels(\n providerConfig.name,\n selectModels?.(providerConfig, models) ?? models,\n providerConfig,\n )\n } catch (error) {\n if (provider === \"codex\") {\n logger.warn(\"models.provider.skip_error\", { provider, error })\n return []\n }\n\n const fallbackModels = getFallbackProviderModelRecords(provider, \"error\", {\n error,\n })\n const providerConfig = getRawProviderConfig(provider)\n return normalizeProviderModels(\n provider,\n selectModels?.(providerConfig, fallbackModels) ?? fallbackModels,\n providerConfig,\n )\n }\n}\n\nexport async function getAggregatedModels(\n requestHeaders: Headers,\n selectors: ModelSelectors = {},\n): Promise<Array<ClientModel>> {\n const rawCopilotModels = getCopilotModelRecords()\n const copilotModels = (\n selectors.selectCopilotModels?.(rawCopilotModels) ?? rawCopilotModels\n ).map(normalizeCopilotModel)\n const providerModelsByProvider = await Promise.all(\n listEnabledProviders().map((provider) =>\n getProviderModels(\n provider,\n requestHeaders,\n selectors.selectProviderModels,\n ),\n ),\n )\n\n return deduplicateModels(\n [...copilotModels, ...providerModelsByProvider.flat()],\n (model) => model.id,\n )\n}\n\nfunction selectAgentCopilotModels(models: Array<Model>): Array<Model> {\n const selection = getProviderAgentModels(\n getRawProviderConfig(GITHUB_COPILOT_PROVIDER),\n )\n if (selection === undefined) return models\n return models.filter(\n (model) =>\n selection.includes(model.id)\n || selection.includes(toClientModelId(model.id)),\n )\n}\n\nfunction selectAgentProviderModels(\n providerConfig: ProviderConfig | null,\n models: Array<unknown>,\n): Array<unknown> {\n const selection = getProviderAgentModels(providerConfig)\n if (selection === undefined) return models\n const modelsById = getModelsById(models)\n return selection.map((id) => modelsById.get(id) ?? { id })\n}\n\nexport async function getAgentModels(\n requestHeaders: Headers,\n): Promise<Array<ClientModel>> {\n return getAggregatedModels(requestHeaders, {\n selectCopilotModels: selectAgentCopilotModels,\n selectProviderModels: selectAgentProviderModels,\n })\n}\n\nexport function createModelListResponse(\n c: Context,\n models: Array<{ id: string }>,\n): Response {\n return c.json({\n object: \"list\",\n data: models,\n has_more: false,\n })\n}\n","import type { Context } from \"hono\"\n\nimport { toClaudeDiscoveryModelId } from \"~/lib/claude-models\"\nimport { stripInternalRequestHeaders } from \"~/lib/internal-headers\"\nimport {\n createModelListResponse,\n getAgentModels,\n} from \"~/routes/models/model-discovery\"\n\nexport async function handleClaudeModels(c: Context): Promise<Response> {\n const models = await getAgentModels(\n stripInternalRequestHeaders(c.req.raw.headers),\n )\n return createModelListResponse(\n c,\n models.map((model) => ({\n ...model,\n id: toClaudeDiscoveryModelId(model.id),\n ...(typeof model.claude_model_id === \"string\" ?\n { claude_model_id: toClaudeDiscoveryModelId(model.claude_model_id) }\n : {}),\n })),\n )\n}\n","import type {\n CodexModel,\n CodexModelMessages,\n CodexModelsResponse,\n} from \"~/routes/models/codex-models-types\"\n\nimport { FULL_MODEL_CATALOG_HEADER } from \"./internal-headers\"\n\nexport const CODEX_MODEL_CATALOG_MAX_BYTES = 1024 * 1024\nconst DEFAULT_EXCLUSION_THRESHOLD = 20\nconst DEFAULT_EXCLUDED_MODELS = new Set([\n \"gpt-5.6-sol\",\n \"gpt-5.6-terra\",\n \"gpt-5.6-luna\",\n \"gpt-5.5\",\n \"claude-sonnet-5\",\n \"gemini-3.5-flash\",\n \"gemini-3.6-flash\",\n \"gemini-3.7-flash\",\n \"gpt-5.3-codex\",\n \"gpt-5.4-mini\",\n \"gpt-5.4\",\n \"grok-4.5\",\n \"gpt-5-mini\",\n \"mai-code-1.1-flash\",\n])\n\nexport function isModernCodexClient(url: string, headers: Headers): boolean {\n const versions = [\n new URL(url).searchParams.get(\"client_version\"),\n headers.get(\"version\"),\n headers.get(\"user-agent\")?.match(/\\bcodex[^/\\s]*\\/(\\d+\\.\\d+\\.\\d+)/iu)?.[1],\n ]\n for (const version of versions) {\n const match = version?.match(/^(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/u)\n if (!match) continue\n return Number(match[1]) > 0 || Number(match[2]) >= 160\n }\n return false\n}\n\nexport function normalizeCodexInstructions(\n model: CodexModel,\n modern: boolean,\n fallback: CodexModelMessages,\n): CodexModel {\n if (!modern) return model\n const { base_instructions: legacy, ...normalized } = model\n const messages = model.model_messages\n if (typeof messages?.instructions_template !== \"string\") {\n normalized.model_messages = {\n ...(messages ?? fallback),\n instructions_template:\n typeof legacy === \"string\" ? legacy : fallback.instructions_template,\n }\n }\n return normalized\n}\n\nexport function serializeCodexModelCatalog(\n response: CodexModelsResponse,\n options: {\n headers: Headers\n modern: boolean\n explicitSlugs: ReadonlySet<string>\n fallback: CodexModelMessages\n },\n): string | null {\n const models = response.models.map((model) =>\n normalizeCodexInstructions(model, options.modern, options.fallback),\n )\n if (\n options.headers.get(FULL_MODEL_CATALOG_HEADER)?.trim().toLowerCase()\n === \"true\"\n ) {\n return JSON.stringify({ ...response, models })\n }\n // Measure the exact JSON envelope, including unknown upstream metadata.\n const envelope = JSON.stringify({ ...response, models: [] })\n let bytes = Buffer.byteLength(envelope, \"utf8\")\n if (bytes > CODEX_MODEL_CATALOG_MAX_BYTES) return null\n const selected = new Set<CodexModel>()\n const eligibleModels =\n models.length > DEFAULT_EXCLUSION_THRESHOLD ?\n models.filter(\n (model) =>\n options.explicitSlugs.has(model.slug)\n || !DEFAULT_EXCLUDED_MODELS.has(\n model.slug.split(\"/\").at(-1) ?? model.slug,\n ),\n )\n : models\n const ordered = [...eligibleModels].sort(\n (a, b) =>\n Number(options.explicitSlugs.has(b.slug))\n - Number(options.explicitSlugs.has(a.slug)),\n )\n for (const model of ordered) {\n const additionalBytes =\n Buffer.byteLength(JSON.stringify(model), \"utf8\")\n + (selected.size > 0 ? 1 : 0)\n if (bytes + additionalBytes > CODEX_MODEL_CATALOG_MAX_BYTES) continue\n selected.add(model)\n bytes += additionalBytes\n }\n return JSON.stringify({\n ...response,\n models: models.filter((model) => selected.has(model)),\n })\n}\n","import type { CodexReasoningEffort, ProviderConfig } from \"~/lib/config\"\nimport { getModelsDevModel } from \"~/lib/models-dev-cache\"\nimport {\n getProviderModelConfig,\n resolveProviderModelsDevId,\n} from \"~/lib/provider-model-catalog\"\nimport {\n firstPositiveInteger,\n getRecordField,\n getStringField,\n getStringList,\n} from \"~/routes/models/model-discovery\"\n\nfunction normalizeMetadata(fields?: {\n contextWindow?: unknown\n maxOutputTokens?: unknown\n inputModalities?: unknown\n reasoningEfforts?: unknown\n defaultReasoningEffort?: CodexReasoningEffort\n}) {\n const contextWindow = firstPositiveInteger(fields?.contextWindow)\n const maxOutputTokens = firstPositiveInteger(fields?.maxOutputTokens)\n const inputModalities = getStringList(fields?.inputModalities)\n const reasoningEfforts = getStringList(fields?.reasoningEfforts)\n return {\n ...(contextWindow && { contextWindow }),\n ...(maxOutputTokens && { maxOutputTokens }),\n ...(inputModalities && { inputModalities }),\n ...(reasoningEfforts && { reasoningEfforts }),\n ...(fields?.defaultReasoningEffort && {\n defaultReasoningEffort: fields.defaultReasoningEffort,\n }),\n }\n}\n\nexport function getModelMetadata(\n provider: string,\n modelId: string,\n model: Record<string, unknown>,\n config: ProviderConfig | null,\n) {\n const clientId = getStringField(model, \"id\") ?? modelId\n const modelConfig = config?.models?.[modelId] ?? config?.models?.[clientId]\n const catalogProvider = resolveProviderModelsDevId(provider, config)\n const catalog =\n getModelsDevModel(catalogProvider, modelId)\n ?? getModelsDevModel(catalogProvider, clientId)\n const defaults =\n getProviderModelConfig(provider, modelId, config)\n ?? getProviderModelConfig(provider, clientId, config)\n const capabilities = getRecordField(model, \"capabilities\")\n const supports = getRecordField(capabilities, \"supports\")\n const limits = getRecordField(capabilities, \"limits\")\n const metadata = {\n ...defaults,\n ...normalizeMetadata({\n contextWindow: model.context_window,\n maxOutputTokens: model.max_output_tokens,\n inputModalities: model.input_modalities,\n reasoningEfforts: model.reasoning_efforts,\n }),\n ...normalizeMetadata(modelConfig),\n }\n\n return {\n modelConfig,\n catalog,\n defaults,\n capabilities,\n supports,\n limits,\n ...metadata,\n inputLimit: firstPositiveInteger(model.input_limit, catalog?.limit?.input),\n inputModalities: metadata.inputModalities ?? [\"text\"],\n reasoningEfforts: metadata.reasoningEfforts ?? [],\n }\n}\n","import {\n resolveEffectiveProviderType,\n type CodexReasoningEffort,\n type ProviderType,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { toClientModelId } from \"~/lib/models\"\nimport { isProviderModelVisible } from \"~/lib/provider-model-catalog\"\nimport { getProviderAgentModels } from \"~/lib/provider-management\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport type { Model } from \"~/lib/types/models\"\nimport type { SyntheticCodexModelCandidate } from \"~/routes/models/codex-models-types\"\nimport {\n deduplicateModels,\n getCopilotModelRecords,\n getModelsById,\n getProviderModelRecords,\n getStringField,\n} from \"~/routes/models/model-discovery\"\nimport { getModelMetadata } from \"~/routes/models/model-metadata\"\n\nconst logger = createHandlerLogger(\"models-handler\")\nconst RESPONSES_ENDPOINTS = new Set([\"/responses\", \"ws:/responses\"])\nconst MESSAGES_ENDPOINT = \"/v1/messages\"\nconst CHAT_COMPLETIONS_ENDPOINT = \"/chat/completions\"\n\nconst CODEX_REASONING_EFFORTS = new Set<CodexReasoningEffort>([\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n \"ultra\",\n])\n\nexport async function getSyntheticCodexModels(\n requestHeaders: Headers,\n providers: Array<string>,\n): Promise<Array<SyntheticCodexModelCandidate>> {\n const copilotModels = getCopilotCodexCandidates()\n const providerResults = await Promise.allSettled(\n providers.map((provider) =>\n getProviderCodexCandidates(provider, requestHeaders),\n ),\n )\n const providerModels = providerResults.flatMap((result) =>\n result.status === \"fulfilled\" ? result.value : [],\n )\n\n return deduplicateModels(\n [...copilotModels, ...providerModels],\n (candidate) => candidate.slug,\n )\n}\n\nfunction getCopilotCodexCandidates(): Array<SyntheticCodexModelCandidate> {\n const candidates: Array<SyntheticCodexModelCandidate> = []\n for (const model of getCopilotModelRecords()) {\n try {\n if (isCopilotCodexCandidate(model)) {\n candidates.push(createCopilotCodexCandidate(model))\n }\n } catch (error) {\n logger.warn(\"models.codex.copilot_skip_error\", {\n modelId: model.id,\n error,\n })\n }\n }\n return candidates\n}\n\nfunction isCopilotCodexCandidate(model: Model): boolean {\n const endpoints = model.supported_endpoints ?? []\n return (\n endpoints.some(\n (endpoint) =>\n endpoint === MESSAGES_ENDPOINT\n || endpoint === CHAT_COMPLETIONS_ENDPOINT\n || RESPONSES_ENDPOINTS.has(endpoint),\n ) && model.capabilities.supports.tool_calls !== false\n )\n}\n\nfunction createCopilotCodexCandidate(\n model: Model,\n): SyntheticCodexModelCandidate {\n const reasoningEfforts = normalizeReasoningEfforts(\n model.capabilities.supports.reasoning_effort,\n )\n return {\n slug: toClientModelId(model.id),\n catalogSlug: model.id,\n displayName: model.name,\n description: model.name,\n contextWindow: positiveNumber(\n model.capabilities.limits.max_prompt_tokens,\n 256_000,\n ),\n maxOutputTokens: positiveNumber(\n model.capabilities.limits.max_output_tokens,\n 32_000,\n ),\n inputModalities:\n model.capabilities.supports.vision ? [\"text\", \"image\"] : [\"text\"],\n reasoningEfforts,\n defaultReasoningEffort: selectDefaultReasoningEffort(reasoningEfforts),\n }\n}\n\nasync function getProviderCodexCandidates(\n provider: string,\n requestHeaders: Headers,\n): Promise<Array<SyntheticCodexModelCandidate>> {\n if (provider === \"codex\") return []\n\n try {\n const providerConfig = await resolveProviderConfig(provider)\n if (!providerConfig || providerConfig.name === \"codex\") return []\n\n const providerModels = await getProviderModelRecords(\n providerConfig,\n requestHeaders,\n )\n const modelsById = getModelsById(providerModels)\n const modelIds = new Set([\n ...modelsById.keys(),\n ...Object.keys(providerConfig.models ?? {}),\n ...(getProviderAgentModels(providerConfig) ?? []),\n ])\n\n const candidates: Array<SyntheticCodexModelCandidate> = []\n for (const modelId of modelIds) {\n if (!isProviderModelVisible(provider, modelId, providerConfig)) continue\n const effectiveType = resolveEffectiveProviderType(\n providerConfig,\n modelId,\n )\n const usesMessagesFallback = isMessagesFallbackProviderType(effectiveType)\n if (!usesMessagesFallback && effectiveType !== \"openai-responses\") {\n continue\n }\n candidates.push(\n createProviderCodexCandidate(\n providerConfig,\n modelId,\n modelsById.get(modelId),\n effectiveType,\n ),\n )\n }\n return candidates\n } catch (error) {\n logger.warn(\"models.codex.provider_skip_error\", { provider, error })\n return []\n }\n}\n\nfunction isMessagesFallbackProviderType(type: ProviderType): boolean {\n return (\n type === \"anthropic\" || type === \"openai-compatible\" || type === \"google\"\n )\n}\n\nfunction createProviderCodexCandidate(\n providerConfig: ResolvedProviderConfig,\n modelId: string,\n remoteModel: Record<string, unknown> | undefined,\n effectiveType: ProviderType,\n): SyntheticCodexModelCandidate {\n const metadata = getModelMetadata(\n providerConfig.name,\n modelId,\n remoteModel ?? {},\n providerConfig,\n )\n const reasoningEfforts = normalizeReasoningEfforts(metadata.reasoningEfforts)\n const displayName =\n getStringField(remoteModel ?? {}, \"display_name\")\n ?? getStringField(remoteModel ?? {}, \"name\")\n ?? modelId\n // Codex clients only drive gpt-* models through the native Responses API;\n // other Responses-capable models fall back to the Messages adapter (see\n // shouldFallbackToMessages), so only gpt-* models require upstream catalog\n // metadata and the rest can be synthesized like Messages-fallback models.\n const requiresCatalogMatch =\n effectiveType === \"openai-responses\" && modelId.startsWith(\"gpt\")\n\n return {\n slug: `${providerConfig.name}/${modelId}`,\n catalogSlug: modelId,\n catalogMatchRequired: requiresCatalogMatch,\n providerName: providerConfig.name,\n displayName: `${displayName} (${providerConfig.name})`,\n description: displayName,\n contextWindow: metadata.contextWindow ?? 256_000,\n maxOutputTokens: metadata.maxOutputTokens ?? 32_000,\n inputModalities: normalizeInputModalities(metadata.inputModalities),\n reasoningEfforts,\n defaultReasoningEffort: selectDefaultReasoningEffort(\n reasoningEfforts,\n metadata.defaultReasoningEffort,\n ),\n }\n}\n\nfunction normalizeReasoningEfforts(\n value: unknown,\n): Array<CodexReasoningEffort> {\n if (!Array.isArray(value)) return []\n return [\n ...new Set(\n value.filter(\n (effort): effort is CodexReasoningEffort =>\n typeof effort === \"string\"\n && CODEX_REASONING_EFFORTS.has(effort as CodexReasoningEffort),\n ),\n ),\n ]\n}\n\nfunction normalizeInputModalities(\n value: Array<string>,\n): Array<\"text\" | \"image\"> {\n const modalities = [\n ...new Set(\n value.filter(\n (modality): modality is \"text\" | \"image\" =>\n modality === \"text\" || modality === \"image\",\n ),\n ),\n ]\n return modalities.length > 0 ? modalities : [\"text\"]\n}\n\nfunction selectDefaultReasoningEffort(\n efforts: Array<CodexReasoningEffort>,\n configured?: CodexReasoningEffort,\n): CodexReasoningEffort {\n if (configured && efforts.includes(configured)) return configured\n if (efforts.includes(\"max\")) return \"max\"\n return efforts[0] ?? \"max\"\n}\n\nfunction positiveNumber(value: unknown, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ?\n Math.floor(value)\n : fallback\n}\n","","import type { Context } from \"hono\"\n\nimport {\n getModelMappings,\n getRawProviderConfig,\n listEnabledProviders,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport {\n isModernCodexClient,\n serializeCodexModelCatalog,\n} from \"~/lib/codex-model-catalog\"\nimport {\n getProviderAgentModels,\n isProviderAgentModelVisible,\n} from \"~/lib/provider-management\"\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { stripInternalRequestHeaders } from \"~/lib/internal-headers\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { getSyntheticCodexModels } from \"~/routes/models/codex-model-candidates\"\nimport type {\n CodexModel,\n CodexModelsResponse,\n CodexReasoningEffort,\n SyntheticCodexModelCandidate,\n} from \"~/routes/models/codex-models-types\"\nimport { isRecord } from \"~/routes/models/model-discovery\"\nimport fallbackCodexCatalogJson from \"~/routes/models/models.json\"\nimport { forwardCodexModels } from \"~/services/codex/get-models\"\nimport { createProviderProxyResponse } from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"codex-models-handler\")\nconst CODEX_USER_AGENT_PATTERN = /^codex/iu\n\nconst DEFAULT_REASONING_EFFORTS: Array<CodexReasoningEffort> = [\n \"high\",\n \"xhigh\",\n \"max\",\n \"ultra\",\n]\n\nconst addUltraReasoningEffort = (\n efforts: Array<CodexReasoningEffort>,\n): Array<CodexReasoningEffort> => {\n if (efforts.includes(\"ultra\")) return efforts\n return [...efforts, \"ultra\"]\n}\n\n// Codex clients sort models by the `priority` field. The group bases keep the\n// merged list ordered as: upstream catalog, codex provider aliases, copilot\n// models, opencode-go models, then models from other providers.\nconst CODEX_ALIAS_PRIORITY_BASE = 1_000\nconst COPILOT_PRIORITY_BASE = 2_000\nconst OPENCODE_GO_PRIORITY_BASE = 3_000\nconst PROVIDER_PRIORITY_BASE = 4_000\n\n// Bundled copy of the upstream Codex models catalog, downloaded from\n// https://github.com/openai/codex/blob/main/codex-rs/models-manager/models.json\n// Used when the upstream catalog is unavailable.\nconst FALLBACK_CODEX_MODELS = (\n fallbackCodexCatalogJson as unknown as CodexModelsResponse\n).models\nconst FALLBACK_BASE_INSTRUCTIONS =\n FALLBACK_CODEX_MODELS.find((model) => model.base_instructions?.trim())\n ?.base_instructions\n ?? FALLBACK_CODEX_MODELS.find((model) =>\n model.model_messages?.instructions_template?.trim(),\n )?.model_messages.instructions_template\n ?? \"\"\n\ninterface MergedCodexModelsOptions {\n includeCodexProviderAliases?: boolean\n codexProviderName?: string\n}\n\ninterface CodexCatalogResult {\n catalog: CodexModelsResponse\n}\n\nexport function isCodexUserAgent(userAgent: string | undefined): boolean {\n return CODEX_USER_AGENT_PATTERN.test(userAgent?.trim() ?? \"\")\n}\n\n/**\n * Proxies a models request to the fixed Codex upstream models endpoint.\n * Returns a 404 JSON response when the codex provider is unavailable.\n * Falls back to the bundled catalog when the upstream request or body times out.\n * Pass `resolvedProviderConfig` when the caller already resolved the codex\n * provider to avoid a second resolve.\n */\nexport async function handleCodexModelsProxy(\n c: Context,\n resolvedProviderConfig?: ResolvedProviderConfig,\n): Promise<Response> {\n const codexProviderConfig =\n resolvedProviderConfig ?? (await resolveProviderConfig(\"codex\"))\n if (!codexProviderConfig) {\n return c.json(\n {\n error: {\n message: \"Provider 'codex' not found or disabled\",\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n let catalog: unknown\n try {\n const upstreamResponse = await forwardCodexModels(\n c.req.url,\n c.req.raw.headers,\n )\n if (!upstreamResponse.ok)\n return createProviderProxyResponse(upstreamResponse)\n catalog = await upstreamResponse.json().catch((error: unknown) => {\n if (isCodexCatalogTimeout(error)) throw error\n return null\n })\n } catch (error) {\n if (!isCodexCatalogTimeout(error)) throw error\n logger.warn(\"models.codex.catalog_timeout\", { error })\n catalog = { models: FALLBACK_CODEX_MODELS }\n }\n if (!isCodexModelsResponse(catalog)) {\n return c.json(\n { error: { message: \"Invalid Codex model catalog\", type: \"api_error\" } },\n 502,\n )\n }\n const providerConfig = getRawProviderConfig(\"codex\")\n return createCodexCatalogResponse(\n c,\n {\n ...catalog,\n models: catalog.models.filter((model) =>\n isProviderAgentModelVisible(providerConfig, model.slug),\n ),\n },\n new Set(getProviderAgentModels(providerConfig)),\n FALLBACK_CODEX_MODELS[0].model_messages,\n )\n}\n\nexport async function handleCodexModels(c: Context): Promise<Response> {\n const enabledProviders = listEnabledProviders()\n const codexProviderName = enabledProviders.find(\n (provider) => provider === \"codex\",\n )\n return await handleMergedCodexModels(\n c,\n getSyntheticCodexModels(\n stripInternalRequestHeaders(c.req.raw.headers),\n enabledProviders,\n ),\n {\n includeCodexProviderAliases: codexProviderName !== undefined,\n codexProviderName,\n },\n )\n}\n\nexport async function handleMergedCodexModels(\n c: Context,\n candidatesRequest:\n | Array<SyntheticCodexModelCandidate>\n | Promise<Array<SyntheticCodexModelCandidate>>,\n options: MergedCodexModelsOptions = {},\n): Promise<Response> {\n const [upstreamCatalogResult, candidates] = await Promise.all([\n tryGetCodexCatalog(c),\n Promise.resolve(candidatesRequest).catch((error: unknown) => {\n logger.warn(\"models.codex.candidates_error\", { error })\n return []\n }),\n ])\n const upstreamCatalog = upstreamCatalogResult?.catalog\n const upstreamModels = upstreamCatalog?.models ?? FALLBACK_CODEX_MODELS\n const template = selectTemplate(upstreamModels)\n const catalogModelsBySlug = new Map(\n upstreamModels.map((model) => [model.slug, model]),\n )\n const codexConfig = getRawProviderConfig(\"codex\")\n const copilotConfig = getRawProviderConfig(\"github-copilot\")\n const visibleUpstreamModels = upstreamModels.filter(\n (model) =>\n isProviderAgentModelVisible(codexConfig, model.slug)\n && (upstreamCatalog !== undefined\n || codexConfig !== null\n || isProviderAgentModelVisible(copilotConfig, model.slug)),\n )\n const explicitSlugs = new Set<string>()\n const codexSelection = getProviderAgentModels(codexConfig)\n for (const model of visibleUpstreamModels) {\n if (codexSelection?.includes(model.slug)) {\n explicitSlugs.add(model.slug)\n explicitSlugs.add(`codex/${model.slug}`)\n }\n }\n const visibleCandidates = candidates.filter((candidate) => {\n const providerName = candidate.providerName ?? \"github-copilot\"\n const modelId =\n candidate.catalogSlug\n ?? (candidate.providerName ?\n candidate.slug.slice(providerName.length + 1)\n : candidate.slug)\n const config = getRawProviderConfig(providerName)\n const selectedModels = getProviderAgentModels(config)\n const selectionId =\n (\n providerName === \"github-copilot\"\n && selectedModels?.includes(candidate.slug)\n ) ?\n candidate.slug\n : modelId\n if (!isProviderAgentModelVisible(config, selectionId)) return false\n if (selectedModels?.includes(selectionId)) {\n explicitSlugs.add(candidate.slug)\n }\n return true\n })\n const seenSlugs = new Set(visibleUpstreamModels.map((model) => model.slug))\n const modelMappings = getModelMappings()\n const codexProviderAliases =\n options.includeCodexProviderAliases ?\n visibleUpstreamModels.flatMap((model, index) => {\n const slug = `codex/${model.slug}`\n if (seenSlugs.has(slug) || modelMappings[model.slug] === slug) return []\n seenSlugs.add(slug)\n return [\n {\n ...createCatalogAlias(model, slug, options.codexProviderName),\n priority: CODEX_ALIAS_PRIORITY_BASE + index,\n },\n ]\n })\n : []\n const syntheticModels = visibleCandidates\n .filter((candidate) => !seenSlugs.has(candidate.slug))\n .flatMap((candidate, index) => {\n const priorityBase = getCandidatePriorityBase(candidate)\n const catalogModel =\n candidate.catalogSlug ?\n catalogModelsBySlug.get(candidate.catalogSlug)\n : undefined\n if (catalogModel) {\n return [\n {\n ...createCatalogAlias(\n catalogModel,\n candidate.slug,\n candidate.providerName,\n ),\n priority: priorityBase + index,\n },\n ]\n }\n if (candidate.catalogMatchRequired) return []\n\n return [\n createSyntheticCodexModel(candidate, template, priorityBase + index),\n ]\n })\n\n const models = [\n ...visibleUpstreamModels,\n ...codexProviderAliases,\n ...syntheticModels,\n ].sort((a, b) => getModelPriority(a) - getModelPriority(b))\n\n const response: CodexModelsResponse = {\n ...(upstreamCatalog ?? {}),\n models,\n }\n return createCodexCatalogResponse(\n c,\n response,\n explicitSlugs,\n template.model_messages ?? FALLBACK_CODEX_MODELS[0].model_messages,\n )\n}\n\nfunction createCodexCatalogResponse(\n c: Context,\n response: CodexModelsResponse,\n explicitSlugs: ReadonlySet<string>,\n fallback: CodexModel[\"model_messages\"],\n): Response {\n const body = serializeCodexModelCatalog(response, {\n headers: c.req.raw.headers,\n modern: isModernCodexClient(c.req.url, c.req.raw.headers),\n explicitSlugs,\n fallback,\n })\n if (body === null) {\n return c.json(\n {\n error: {\n message: \"Codex model catalog metadata exceeds 1 MiB\",\n type: \"api_error\",\n },\n },\n 502,\n )\n }\n return c.body(body, 200, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"private, no-store\",\n })\n}\n\nfunction createCatalogAlias(\n model: CodexModel,\n slug: string,\n providerName: string | undefined,\n): CodexModel {\n const provider = providerName?.trim()\n const shouldSuffix =\n provider\n && typeof model.display_name === \"string\"\n && !model.display_name.endsWith(` (${provider})`)\n\n return {\n ...model,\n slug,\n ...(shouldSuffix && {\n display_name: `${model.display_name} (${provider})`,\n }),\n }\n}\n\nexport function createSyntheticCodexModel(\n candidate: SyntheticCodexModelCandidate,\n template: CodexModel,\n priority: number,\n): CodexModel {\n const reasoningEfforts =\n candidate.reasoningEfforts.length > 0 ?\n addUltraReasoningEffort(candidate.reasoningEfforts)\n : DEFAULT_REASONING_EFFORTS\n const defaultReasoningEffort =\n reasoningEfforts.includes(candidate.defaultReasoningEffort) ?\n candidate.defaultReasoningEffort\n : reasoningEfforts[0]\n const supportsReasoning = reasoningEfforts.some((effort) => effort !== \"none\")\n const inputModalities = [...new Set(candidate.inputModalities)]\n\n return {\n ...template,\n slug: candidate.slug,\n display_name: candidate.displayName,\n description: candidate.description,\n priority,\n visibility: \"list\",\n supported_in_api: true,\n minimal_client_version: \"0.0.0\",\n prefer_websockets: false,\n support_verbosity: false,\n default_verbosity: \"medium\",\n apply_patch_tool_type: \"freeform\",\n web_search_tool_type: \"text_and_image\",\n supports_search_tool: false,\n use_responses_lite: true,\n tool_mode: \"code_mode_only\",\n multi_agent_version: \"v2\",\n multi_agent_reasoning_effort: null,\n shell_type: template.shell_type,\n experimental_supported_tools: [],\n input_modalities: inputModalities,\n supports_image_detail_original: false,\n supports_parallel_tool_calls: true,\n context_window: candidate.contextWindow,\n max_context_window: candidate.contextWindow,\n max_output_tokens: candidate.maxOutputTokens,\n auto_compact_token_limit: null,\n comp_hash: null,\n effective_context_window_percent: 95,\n default_reasoning_level: defaultReasoningEffort,\n supported_reasoning_levels: reasoningEfforts.map((effort) => ({\n effort,\n description: `${effort} reasoning effort`,\n })),\n supports_reasoning_summary_parameter: supportsReasoning,\n supports_reasoning_summaries: supportsReasoning,\n default_reasoning_summary: supportsReasoning ? \"auto\" : \"none\",\n reasoning_summary_format: \"experimental\",\n availability_nux: null,\n upgrade: null,\n available_in_plans: template.available_in_plans,\n model_messages: template.model_messages,\n auto_review_model_override: null,\n default_service_tier: null,\n service_tiers: [],\n additional_speed_tiers: [],\n include_skills_usage_instructions: false,\n truncation_policy: { mode: \"tokens\", limit: 10_000 },\n base_instructions:\n template.base_instructions?.trim() ?\n template.base_instructions\n : FALLBACK_BASE_INSTRUCTIONS,\n }\n}\n\nfunction isCodexCatalogTimeout(error: unknown): boolean {\n return (\n error instanceof Error\n && (error.name === \"TimeoutError\" || error.name === \"AbortError\")\n )\n}\n\nasync function tryGetCodexCatalog(\n c: Context,\n): Promise<CodexCatalogResult | null> {\n try {\n const providerConfig = await resolveProviderConfig(\"codex\")\n if (!providerConfig) return null\n\n const response = await forwardCodexModels(c.req.url, c.req.raw.headers)\n if (!response.ok) {\n logger.warn(\"models.codex.catalog_fallback\", {\n statusCode: response.status,\n })\n return null\n }\n\n const body = await response.json()\n if (!isCodexModelsResponse(body)) {\n logger.warn(\"models.codex.catalog_invalid\")\n return null\n }\n return {\n catalog: body,\n }\n } catch (error) {\n logger.warn(\"models.codex.catalog_error\", { error })\n return null\n }\n}\n\nfunction selectTemplate(models: Array<CodexModel>): CodexModel {\n const candidates = models.length > 0 ? models : FALLBACK_CODEX_MODELS\n return (\n candidates.find(\n (model) =>\n model.visibility === \"list\" && model.supported_in_api !== false,\n ) ?? candidates[0]\n )\n}\n\nfunction getModelPriority(model: CodexModel): number {\n return typeof model.priority === \"number\" && Number.isFinite(model.priority) ?\n model.priority\n : 0\n}\n\nfunction getCandidatePriorityBase(\n candidate: SyntheticCodexModelCandidate,\n): number {\n if (!candidate.providerName) return COPILOT_PRIORITY_BASE\n if (candidate.providerName === \"opencode-go\") return OPENCODE_GO_PRIORITY_BASE\n return PROVIDER_PRIORITY_BASE\n}\n\nfunction isCodexModelsResponse(value: unknown): value is CodexModelsResponse {\n if (!isRecord(value) || !Array.isArray(value.models)) return false\n return value.models.every(\n (model: unknown) => isRecord(model) && typeof model.slug === \"string\",\n )\n}\n","import type { Context } from \"hono\"\n\nimport { stripInternalRequestHeaders } from \"~/lib/internal-headers\"\nimport {\n createModelListResponse,\n getAgentModels,\n getAggregatedModels,\n} from \"~/routes/models/model-discovery\"\n\nexport async function handleDefaultModels(c: Context): Promise<Response> {\n const getModels =\n c.req.header(\"user-agent\")?.toLowerCase().startsWith(\"deepseek\") ?\n getAgentModels\n : getAggregatedModels\n const models = await getModels(stripInternalRequestHeaders(c.req.raw.headers))\n return createModelListResponse(c, models)\n}\n","import type { Cost, CostTier, Limit, ModelCost } from \"@opencode-ai/models\"\nimport type { Context } from \"hono\"\n\nimport { builtinProviderModelRegistry } from \"~/lib/builtin-provider-models\"\nimport { getRawProviderConfig } from \"~/lib/config\"\nimport { getOpencodeModelContextWindow } from \"~/lib/config-store\"\nimport { GITHUB_COPILOT_PROVIDER } from \"~/lib/github-copilot-provider\"\nimport { stripInternalRequestHeaders } from \"~/lib/internal-headers\"\nimport { resolveModelPdfSupport } from \"~/lib/model-pdf-support\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport type { Reasoning } from \"~/lib/types/responses\"\nimport {\n resolveProviderCurrency,\n type TokenUsagePricingConfig,\n} from \"~/lib/token-usage/pricing\"\nimport {\n createModelListResponse,\n getAgentModels,\n getRecordField,\n getStringField,\n getStringList,\n type ClientModel,\n} from \"~/routes/models/model-discovery\"\nimport { getModelMetadata } from \"~/routes/models/model-metadata\"\n\nconst RESPONSES_PACKAGE = \"@opencode/ai/providers/openai/responses\"\n// OpenCode's cost schema is USD per million tokens. Configured CNY prices\n// are converted with this fixed rate; other currencies are not returned as USD.\nconst CNY_PER_USD = 6.7\nconst COST_DECIMALS = 6\n\n// OpenCode's v2 branch: packages/schema/src/model.ts (Model.Info).\nexport interface OpencodeModel {\n id: string\n modelID: string\n providerID: string\n name: string\n family?: string\n package: typeof RESPONSES_PACKAGE\n capabilities: { tools: boolean; input: Array<string>; output: Array<string> }\n variants: Array<{ id: string; body: Record<string, unknown> }>\n time: { released: number }\n cost: Array<OpencodeModelCost>\n status: \"active\" | \"alpha\" | \"beta\" | \"deprecated\"\n enabled: boolean\n limit: Limit\n}\n\ntype OpencodeModelCost = Pick<Cost, \"input\" | \"output\"> & {\n cache: { read: number; write: number }\n tier?: CostTier[\"tier\"]\n}\n\nexport function isOpencodeUserAgent(userAgent: string | undefined): boolean {\n return /opencode/iu.test(userAgent ?? \"\")\n}\n\n// OpenCode only understands USD; convert the provider's currency into a\n// multiplier applied to every mapped price. Unsupported currencies return\n// undefined so the USD catalog can be used instead.\nfunction resolveUsdRate(currency: string | null): number | undefined {\n if (currency === \"USD\") return 1\n if (currency === \"CNY\") return 1 / CNY_PER_USD\n return undefined\n}\n\n// Converted prices are rounded to six decimals.\nfunction roundCost(value: number): number {\n const factor = 10 ** COST_DECIMALS\n return Math.round(value * factor) / factor\n}\n\nfunction mapCost(\n value: Cost,\n rate: number,\n tier?: CostTier[\"tier\"],\n): OpencodeModelCost {\n return {\n input: roundCost(value.input * rate),\n output: roundCost(value.output * rate),\n cache: {\n read: roundCost((value.cache_read ?? 0) * rate),\n write: roundCost((value.cache_write ?? 0) * rate),\n },\n ...(tier && { tier }),\n }\n}\n\nfunction mapCatalogCost(cost: ModelCost | undefined): Array<OpencodeModelCost> {\n if (!cost) return []\n // models.dev is external data; ignore a malformed `tiers` field instead of\n // failing model discovery.\n const tiers = Array.isArray(cost.tiers) ? cost.tiers : []\n return [\n mapCost(cost, 1),\n ...tiers.map((tier) => mapCost(tier, 1, tier.tier)),\n ...(tiers.length === 0 && cost.context_over_200k ?\n [mapCost(cost.context_over_200k, 1, { type: \"context\", size: 200_001 })]\n : []),\n ]\n}\n\nfunction mapConfiguredCost(\n pricing: TokenUsagePricingConfig,\n rate: number,\n): Array<OpencodeModelCost> {\n const tiers = [...(pricing.tiers?.length ? pricing.tiers : [pricing])].sort(\n (a, b) => (a.maxInputTokens ?? Infinity) - (b.maxInputTokens ?? Infinity),\n )\n return tiers.map((tier, index) =>\n mapCost(\n {\n input: tier.input ?? pricing.input ?? 0,\n output: tier.output ?? pricing.output ?? 0,\n cache_read: tier.cachedInput ?? pricing.cachedInput,\n cache_write: tier.cacheCreationInput ?? pricing.cacheCreationInput,\n },\n rate,\n index > 0 ?\n { type: \"context\", size: (tiers[index - 1].maxInputTokens ?? 0) + 1 }\n : undefined,\n ),\n )\n}\n\n// Variant bodies go to the gateway's Responses endpoint. Keep its supported\n// reasoning.effort values and drop unknown catalog values such as \"default\".\nconst RESPONSES_EFFORTS = new Set<string>([\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n] satisfies Array<NonNullable<Reasoning[\"effort\"]>>)\n\nfunction normalizeEffortValues(\n values: Array<string> | undefined,\n): Array<string> {\n const efforts = (values ?? []).filter((value) => RESPONSES_EFFORTS.has(value))\n return [...new Set(efforts)]\n}\n\nfunction toOpencodeModel(\n model: ClientModel,\n contextWindow: number,\n): OpencodeModel {\n const separator = model.id.indexOf(\"/\")\n const provider =\n separator < 0 ? GITHUB_COPILOT_PROVIDER : model.id.slice(0, separator)\n const rawId =\n separator < 0 ?\n (findEndpointModel(model.id)?.id ?? model.id)\n : model.id.slice(separator + 1)\n const config = getRawProviderConfig(provider)\n const metadata = getModelMetadata(provider, rawId, model, config)\n const { modelConfig, defaults, catalog, capabilities, supports, limits } =\n metadata\n const context = metadata.contextWindow ?? 256_000\n const inputLimit = metadata.inputLimit ?? 0\n const supportedMediaTypes = getStringList(\n getRecordField(limits, \"vision\")?.supported_media_types,\n )\n const supportPdf = resolveModelPdfSupport(provider, {\n supportPdf: modelConfig?.supportPdf,\n supportedMediaTypes,\n catalogInputModalities: catalog?.modalities?.input,\n builtinSupportPdf:\n defaults?.supportPdf\n ?? builtinProviderModelRegistry.getProviderDefaults(provider)?.supportPdf,\n })\n const input = metadata.inputModalities.filter(\n (modality) => modality !== \"pdf\" || supportPdf,\n )\n if (supportPdf && !input.includes(\"pdf\")) input.push(\"pdf\")\n const efforts = normalizeEffortValues(metadata.reasoningEfforts)\n // OpenCode's cost schema is USD-only; CNY prices are converted at the fixed\n // CNY_PER_USD rate, while unsupported currencies fall through to the USD\n // models.dev catalog.\n const configuredRate = resolveUsdRate(\n resolveProviderCurrency(provider, config?.pricingCurrency),\n )\n const builtinRate = resolveUsdRate(\n resolveProviderCurrency(provider, undefined),\n )\n const cost =\n modelConfig?.pricing && configuredRate !== undefined ?\n mapConfiguredCost(modelConfig.pricing, configuredRate)\n : catalog?.cost ? mapCatalogCost(catalog.cost)\n : defaults?.pricing && builtinRate !== undefined ?\n mapConfiguredCost(defaults.pricing, builtinRate)\n : []\n const released = Date.parse(catalog?.release_date ?? \"\")\n return {\n id: model.id,\n modelID: model.id,\n providerID: \"local\",\n name: getStringField(model, \"display_name\") ?? catalog?.name ?? model.id,\n family: catalog?.family ?? getStringField(capabilities ?? {}, \"family\"),\n package: RESPONSES_PACKAGE,\n capabilities: {\n tools:\n typeof supports?.tool_calls === \"boolean\" ?\n supports.tool_calls\n : (catalog?.tool_call ?? true),\n input: [...input],\n output: [...(catalog?.modalities?.output ?? [\"text\"])],\n },\n variants: efforts.map((effort) => ({\n id: effort,\n body: { reasoning: { effort } },\n })),\n time: { released: Number.isFinite(released) ? released : 0 },\n cost,\n status: catalog?.status ?? (model.preview ? \"beta\" : \"active\"),\n enabled: true,\n limit: {\n context: Math.min(context, contextWindow),\n ...(inputLimit > 0 && {\n input: Math.min(inputLimit, context, contextWindow),\n }),\n output: Math.min(context, metadata.maxOutputTokens ?? 32_000),\n },\n }\n}\n\nexport async function handleOpencodeModels(c: Context): Promise<Response> {\n const models = await getAgentModels(\n stripInternalRequestHeaders(c.req.raw.headers),\n )\n const contextWindow = getOpencodeModelContextWindow()\n c.header(\"Cache-Control\", \"private, no-store\")\n c.header(\"Vary\", \"User-Agent\")\n return createModelListResponse(\n c,\n models.map((model) => toOpencodeModel(model, contextWindow)),\n )\n}\n","import { Hono } from \"hono\"\n\nimport { isClaudeUserAgent } from \"~/lib/claude-models\"\nimport { forwardError } from \"~/lib/error\"\nimport { handleClaudeModels } from \"~/routes/models/claude-models\"\nimport {\n handleCodexModels,\n isCodexUserAgent,\n} from \"~/routes/models/codex-models\"\nimport { handleDefaultModels } from \"~/routes/models/default-models\"\nimport {\n handleOpencodeModels,\n isOpencodeUserAgent,\n} from \"~/routes/models/opencode-models\"\n\nexport const modelRoutes = new Hono()\n\nmodelRoutes.get(\"/\", async (c) => {\n try {\n const userAgent = c.req.header(\"user-agent\")\n if (isOpencodeUserAgent(userAgent)) return await handleOpencodeModels(c)\n if (isCodexUserAgent(userAgent)) return await handleCodexModels(c)\n if (isClaudeUserAgent(userAgent)) return await handleClaudeModels(c)\n return await handleDefaultModels(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJsonAsync } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { handleAlphaSearchRequest } from \"~/routes/alpha-search/route\"\nimport {\n createProviderProxyResponse,\n forwardProviderAlphaSearch,\n} from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"provider-alpha-search-handler\")\n\nexport const providerAlphaSearchRoutes = new Hono()\n\nexport const providerAlphaSearchRouteDependencies = {\n createProviderProxyResponse,\n forwardProviderAlphaSearch,\n handleAlphaSearchRequest,\n resolveProviderConfig,\n}\n\nproviderAlphaSearchRoutes.post(\"/\", async (c) => {\n const provider = c.req.param(\"provider\") ?? \"\"\n\n try {\n const providerConfig =\n await providerAlphaSearchRouteDependencies.resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (providerConfig.name === \"codex\") {\n return await providerAlphaSearchRouteDependencies.handleAlphaSearchRequest(\n c,\n providerConfig,\n )\n }\n\n await debugJsonAsync(logger, \"provider.alpha_search.request\", async () => ({\n body: await c.req.raw.clone().text(),\n provider,\n }))\n\n const upstreamResponse =\n await providerAlphaSearchRouteDependencies.forwardProviderAlphaSearch(\n providerConfig,\n c.req.raw,\n { clientSignal: c.req.raw.signal },\n )\n\n await debugJsonAsync(\n logger,\n \"provider.alpha_search.response\",\n async () => ({\n body: await upstreamResponse.clone().text(),\n provider,\n statusCode: upstreamResponse.status,\n }),\n )\n\n return providerAlphaSearchRouteDependencies.createProviderProxyResponse(\n upstreamResponse,\n )\n } catch (error) {\n logger.error(\"provider.alpha_search.error\", { provider, error })\n return await forwardError(c, error)\n }\n})\n","import { Hono, type Context } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { handleCodexImages } from \"~/routes/images/route\"\nimport { imageEditContentTypeErrorResponse } from \"~/routes/images/shared\"\nimport type { CodexImagesOperation } from \"~/services/codex/images\"\nimport { forwardProviderImagesWithLogging } from \"~/routes/images/forward-provider-images\"\n\nconst logger = createHandlerLogger(\"provider-images-handler\")\n\nexport const providerImageRoutes = new Hono()\n\nasync function handleProviderImages(\n c: Context,\n operation: CodexImagesOperation,\n): Promise<Response> {\n const provider = c.req.param(\"provider\") ?? \"\"\n\n try {\n const providerConfig = await resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (providerConfig.name === \"codex\") {\n if (operation === \"edits\") {\n const contentTypeError = imageEditContentTypeErrorResponse(c)\n if (contentTypeError) return contentTypeError\n }\n return await handleCodexImages(c, operation, providerConfig)\n }\n\n return await forwardProviderImagesWithLogging(\n providerConfig,\n c.req.raw,\n operation,\n { logger, provider },\n )\n } catch (error) {\n logger.error(`provider.images.${operation}.error`, { provider, error })\n return await forwardError(c, error)\n }\n}\n\nproviderImageRoutes.post(\"/generations\", (c) =>\n handleProviderImages(c, \"generations\"),\n)\nproviderImageRoutes.post(\"/edits\", (c) => handleProviderImages(c, \"edits\"))\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\n\nimport { handleProviderCountTokens } from \"./count-tokens-handler\"\nimport { handleProviderMessages } from \"./handler\"\n\nexport const providerMessageRoutes = new Hono()\n\nproviderMessageRoutes.post(\"/\", async (c) => {\n try {\n return await handleProviderMessages(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n\nproviderMessageRoutes.post(\"/count_tokens\", async (c) => {\n try {\n return await handleProviderCountTokens(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { withModelDisplayName } from \"~/lib/model-display-name\"\nimport { getLocalProviderModelRecords } from \"~/lib/provider-model-catalog\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport {\n handleCodexModelsProxy,\n isCodexUserAgent,\n} from \"~/routes/models/codex-models\"\nimport { getModels as getCodexModels } from \"~/services/codex/get-models\"\nimport {\n createProviderProxyResponse,\n createProviderProxyResponseHeaders,\n forwardProviderModels,\n} from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"provider-models-handler\")\n\nexport const providerModelRoutes = new Hono()\n\nproviderModelRoutes.get(\"/\", async (c) => {\n const provider = c.req.param(\"provider\") ?? \"\"\n\n try {\n const providerConfig = await resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (providerConfig.name === \"codex\") {\n if (isCodexUserAgent(c.req.header(\"user-agent\"))) {\n return await handleCodexModelsProxy(c, providerConfig)\n }\n\n const models = getCodexModels()\n return c.json({\n object: \"list\",\n data: models.data.map((model) =>\n withModelDisplayName(model, providerConfig.name),\n ),\n has_more: false,\n })\n }\n\n const localModels = getLocalProviderModelRecords(\n providerConfig.name,\n providerConfig,\n )\n if (localModels !== undefined) {\n if (localModels.length === 0) {\n return c.json(\n {\n error: {\n message: `${providerConfig.name} model catalog is unavailable`,\n type: \"service_unavailable\",\n },\n },\n 503,\n )\n }\n return c.json({\n object: \"list\",\n data: localModels.map((model) =>\n withModelDisplayName(model, providerConfig.name),\n ),\n has_more: false,\n })\n }\n\n const upstreamResponse = await forwardProviderModels(\n providerConfig,\n c.req.raw.headers,\n )\n\n logger.debug(\"provider.models.response\", {\n provider,\n statusCode: upstreamResponse.status,\n })\n\n if (upstreamResponse.ok) {\n const body: unknown = await upstreamResponse\n .clone()\n .json()\n .catch(() => null)\n if (\n typeof body === \"object\"\n && body !== null\n && \"data\" in body\n && Array.isArray(body.data)\n ) {\n const upstreamModels = body.data\n const data = upstreamModels.map((model: unknown) =>\n withModelDisplayName(model, providerConfig.name),\n )\n if (data.every((model, index) => model === upstreamModels[index])) {\n return createProviderProxyResponse(upstreamResponse)\n }\n const headers = createProviderProxyResponseHeaders(\n upstreamResponse.headers,\n )\n headers.delete(\"etag\")\n return Response.json(\n { ...body, data },\n { status: upstreamResponse.status, headers },\n )\n }\n }\n return createProviderProxyResponse(upstreamResponse)\n } catch (error) {\n logger.error(\"provider.models.error\", {\n provider,\n error,\n })\n return await forwardError(c, error)\n }\n})\n","import type { MiddlewareHandler } from \"hono\"\n\nimport { decompress as decompressFallback } from \"fzstd\"\n\ntype BinaryData = ArrayBuffer | ArrayBufferView\n\ntype BunRuntime = {\n zstdDecompress?: (input: Uint8Array) => BinaryData | Promise<BinaryData>\n}\n\ntype NodeZlibModule = {\n zstdDecompress?: (\n input: Uint8Array,\n callback: (error: Error | null, result: Uint8Array) => void,\n ) => void\n}\n\nconst ZSTD_CONTENT_ENCODING = \"zstd\"\nconst INVALID_BODY_STATUS = 400\n\nlet nodeZlibPromise: Promise<NodeZlibModule | null> | null = null\n\nexport const zstdDecompressionMiddleware: MiddlewareHandler = async (\n c,\n next,\n) => {\n const contentEncoding = c.req.header(\"content-encoding\")?.trim().toLowerCase()\n if (contentEncoding !== ZSTD_CONTENT_ENCODING) {\n return next()\n }\n\n try {\n const compressedBody = new Uint8Array(await c.req.raw.arrayBuffer())\n const decompressedBody = await decompressZstd(compressedBody)\n const headers = new Headers(c.req.raw.headers)\n headers.delete(\"content-encoding\")\n headers.delete(\"content-length\")\n\n c.req.raw = new Request(c.req.raw.url, {\n body: decompressedBody,\n headers,\n method: c.req.raw.method,\n signal: c.req.raw.signal,\n })\n c.req.bodyCache = {}\n } catch {\n return c.json(\n {\n error: {\n message: \"Failed to decompress zstd request body.\",\n type: \"invalid_request_error\",\n },\n },\n INVALID_BODY_STATUS,\n )\n }\n\n return next()\n}\n\nconst decompressZstd = async (input: Uint8Array): Promise<Uint8Array> => {\n const bun = getBunRuntime()\n if (bun?.zstdDecompress) {\n return toUint8Array(await bun.zstdDecompress(input))\n }\n\n const nodeZlib = await getNodeZlib()\n if (nodeZlib?.zstdDecompress) {\n return new Promise((resolve, reject) => {\n nodeZlib.zstdDecompress?.(input, (error, result) => {\n if (error) {\n reject(error)\n return\n }\n\n resolve(toUint8Array(result))\n })\n })\n }\n\n return decompressFallback(input)\n}\n\nconst getBunRuntime = (): BunRuntime | undefined =>\n (globalThis as { Bun?: BunRuntime }).Bun\n\nconst getNodeZlib = async (): Promise<NodeZlibModule | null> => {\n nodeZlibPromise ??= import(\"node:zlib\")\n .then((module) => module as NodeZlibModule)\n .catch(() => null)\n\n return nodeZlibPromise\n}\n\nconst toUint8Array = (data: BinaryData): Uint8Array => {\n if (data instanceof Uint8Array) {\n return data\n }\n\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data)\n }\n\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n}\n","import { ResponsesMessagesTranslationError } from \"./messages-translation\"\n\nconst CUSTOM_TOOL_INPUT_PREFIX_TOKENS = [\"{\", '\"input\"', \":\", '\"'] as const\n\ntype DecoderState = \"prefix\" | \"input\" | \"suffix\" | \"trailing\" | \"done\"\ntype EscapeState = \"plain\" | \"escaped\" | \"unicode\"\n\nexport class CustomToolInputStreamDecoder {\n private readonly inputParts = new Array<string>()\n private encodedInput = \"\"\n private escapeState: EscapeState = \"plain\"\n private failed = false\n private finished = false\n private offset = 0\n private prefixCharOffset = 0\n private prefixTokenOffset = 0\n private safeInputLength = 0\n private state: DecoderState = \"prefix\"\n private trailingDepth = 0\n private trailingEscaped = false\n private trailingInString = false\n private unicodeDigitsRemaining = 0\n\n append(partialJson: string): string {\n if (this.failed) return this.fail(\"decoder is already in a failed state\")\n if (this.finished) return this.fail(\"data arrived after the input was done\")\n\n const deltaParts = new Array<string>()\n for (const char of partialJson) {\n this.offset += char.length\n this.consume(char, deltaParts)\n }\n this.flushSafeInput(deltaParts)\n\n const delta = deltaParts.join(\"\")\n if (delta) this.inputParts.push(delta)\n return delta\n }\n\n finish(): string {\n if (this.failed) return this.fail(\"decoder is already in a failed state\")\n if (this.finished) return this.fail(\"input was already completed\")\n if (\n this.state !== \"done\"\n || this.escapeState !== \"plain\"\n || this.encodedInput\n ) {\n return this.fail(\"input ended before the wrapper was complete\")\n }\n\n this.finished = true\n return this.inputParts.join(\"\")\n }\n\n private consume(char: string, deltaParts: Array<string>): void {\n switch (this.state) {\n case \"prefix\":\n return this.consumePrefix(char)\n case \"suffix\":\n return this.consumeSuffix(char)\n case \"trailing\":\n return this.consumeTrailing(char)\n case \"done\":\n return this.consumeDone(char)\n default:\n return this.consumeInput(char, deltaParts)\n }\n }\n\n private consumePrefix(char: string): void {\n const token = CUSTOM_TOOL_INPUT_PREFIX_TOKENS[this.prefixTokenOffset]\n if (this.prefixCharOffset === 0 && isJsonWhitespace(char)) return\n if (char !== token?.[this.prefixCharOffset]) {\n return this.fail(\"unexpected custom tool input prefix\")\n }\n this.prefixCharOffset += 1\n if (this.prefixCharOffset < token.length) return\n\n this.prefixTokenOffset += 1\n this.prefixCharOffset = 0\n if (this.prefixTokenOffset === CUSTOM_TOOL_INPUT_PREFIX_TOKENS.length) {\n this.state = \"input\"\n }\n }\n\n private consumeSuffix(char: string): void {\n if (isJsonWhitespace(char)) return\n if (char === \"}\") {\n this.state = \"done\"\n return\n }\n if (char === \",\") {\n // Tolerate extra properties after the input string; skip them until\n // the wrapper object closes.\n this.state = \"trailing\"\n this.trailingDepth = 1\n return\n }\n return this.fail('expected \"}\" or \",\" after the input string')\n }\n\n private consumeTrailing(char: string): void {\n if (this.trailingInString) return this.consumeTrailingString(char)\n\n if (char === '\"') {\n this.trailingInString = true\n return\n }\n if (char === \"{\" || char === \"[\") {\n this.trailingDepth += 1\n return\n }\n if (char === \"}\" || char === \"]\") {\n this.trailingDepth -= 1\n if (this.trailingDepth === 0) this.state = \"done\"\n }\n }\n\n private consumeTrailingString(char: string): void {\n if (this.trailingEscaped) {\n this.trailingEscaped = false\n return\n }\n if (char === \"\\\\\") {\n this.trailingEscaped = true\n return\n }\n if (char === '\"') this.trailingInString = false\n }\n\n private consumeDone(char: string): void {\n if (!isJsonWhitespace(char)) {\n return this.fail(\"unexpected data after the input wrapper\")\n }\n }\n\n private consumeInput(char: string, deltaParts: Array<string>): void {\n if (this.escapeState === \"unicode\") return this.consumeUnicodeEscape(char)\n if (this.escapeState === \"escaped\") return this.consumeEscape(char)\n\n if (char === \"\\\\\") {\n this.encodedInput += char\n this.escapeState = \"escaped\"\n return\n }\n if (char === '\"') {\n this.flushSafeInput(deltaParts)\n this.state = \"suffix\"\n return\n }\n if ((char.codePointAt(0) ?? 0) < 0x20) {\n return this.fail(\"unescaped control character in custom tool input\")\n }\n\n this.encodedInput += char\n this.safeInputLength = this.encodedInput.length\n }\n\n private consumeUnicodeEscape(char: string): void {\n if (!/^[0-9A-Fa-f]$/u.test(char)) {\n return this.fail(\"invalid Unicode escape\")\n }\n this.encodedInput += char\n this.unicodeDigitsRemaining -= 1\n if (this.unicodeDigitsRemaining === 0) {\n this.escapeState = \"plain\"\n this.safeInputLength = this.encodedInput.length\n }\n }\n\n private consumeEscape(char: string): void {\n if (!String.raw`\"\\/bfnrtu`.includes(char)) {\n return this.fail(\"invalid JSON escape\")\n }\n this.encodedInput += char\n if (char === \"u\") {\n this.escapeState = \"unicode\"\n this.unicodeDigitsRemaining = 4\n } else {\n this.escapeState = \"plain\"\n this.safeInputLength = this.encodedInput.length\n }\n }\n\n private flushSafeInput(deltaParts: Array<string>): void {\n if (this.safeInputLength === 0) return\n\n const encoded = this.encodedInput.slice(0, this.safeInputLength)\n const decoded = JSON.parse(`\"${encoded}\"`) as string\n\n if (decoded) deltaParts.push(decoded)\n this.encodedInput = this.encodedInput.slice(this.safeInputLength)\n this.safeInputLength = 0\n }\n\n private fail(_reason: string): never {\n this.failed = true\n throw new ResponsesMessagesTranslationError(\n `Invalid tool input JSON. Expected format: {\"input\":\"...\"}`,\n 502,\n )\n }\n}\n\nfunction isJsonWhitespace(char: string): boolean {\n return char === \" \" || char === \"\\t\" || char === \"\\r\" || char === \"\\n\"\n}\n","import type {\n AnthropicResponse,\n AnthropicStreamEventData,\n AnthropicUsage,\n} from \"~/lib/types/anthropic\"\nimport type {\n ResponseOutputCustomToolCall,\n ResponseOutputFunctionCall,\n ResponseOutputItem,\n ResponseOutputMessage,\n ResponseOutputReasoning,\n ResponsesResult,\n ResponseStreamEvent,\n} from \"~/lib/types/responses\"\n\nimport { CustomToolInputStreamDecoder } from \"./custom-tool-input-stream-decoder\"\nimport {\n createMessagesBackedResponsesResult,\n encodeMessagesCompaction,\n markMessagesReasoningId,\n resolveToolDescriptor,\n ResponsesMessagesTranslationError,\n toResponseId,\n translateAnthropicUsage,\n type MessagesResponseTranslationContext,\n} from \"./messages-translation\"\n\nconst EMPTY_SIGNATURE_ENCRYPTED_CONTENT = \"\"\n\ninterface MessagesStreamChunk {\n data?: string\n event?: string\n}\n\ninterface StreamOutputState<T extends ResponseOutputItem> {\n done: boolean\n item: T\n outputIndex: number\n}\n\ninterface StreamReasoningState\n extends StreamOutputState<ResponseOutputReasoning> {\n signature: string\n summaryStarted: boolean\n text: string\n type: \"reasoning\"\n}\n\ninterface StreamMessageState extends StreamOutputState<ResponseOutputMessage> {\n text: string\n type: \"message\"\n}\n\ninterface StreamFunctionToolState\n extends StreamOutputState<ResponseOutputFunctionCall> {\n type: \"function_tool\"\n}\n\ninterface StreamCustomToolState\n extends StreamOutputState<ResponseOutputCustomToolCall> {\n decoder: CustomToolInputStreamDecoder\n type: \"custom_tool\"\n}\n\ntype StreamBlockState =\n | StreamCustomToolState\n | StreamFunctionToolState\n | StreamMessageState\n | StreamReasoningState\n\ninterface TranslationState {\n blocks: Map<number, StreamBlockState>\n compactionText: string\n compactionToolCall: boolean\n context: MessagesResponseTranslationContext\n copilotUsage: ResponsesResult[\"copilot_usage\"]\n createdAt: number\n initialized: boolean\n messageStopped: boolean\n model: string\n nextOutputIndex: number\n outputText: string\n responseId: string\n sequence: number\n stopReason: AnthropicResponse[\"stop_reason\"]\n usage: AnthropicUsage\n}\n\nexport async function* translateMessagesStream(\n chunks: AsyncIterable<MessagesStreamChunk>,\n context: MessagesResponseTranslationContext,\n): AsyncGenerator<ResponseStreamEvent> {\n const state = createTranslationState(context)\n\n try {\n for await (const chunk of chunks) {\n if (!chunk.data || chunk.data === \"[DONE]\") continue\n\n const event = parseAnthropicEvent(chunk.data)\n if (event.type === \"ping\") continue\n if (event.type === \"error\") {\n throw new ResponsesMessagesTranslationError(event.error.message, 502)\n }\n\n if (!state.initialized) {\n initializeState(state, event)\n yield createLifecycleEvent(state, \"response.created\")\n yield createLifecycleEvent(state, \"response.in_progress\")\n }\n\n for (const translated of translateEvent(state, event)) {\n yield translated\n }\n if (state.messageStopped) break\n }\n\n if (!state.initialized) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API returned an empty stream\",\n 502,\n )\n }\n\n if (!state.messageStopped) {\n // The upstream messages stream ended without a message_stop event,\n // which means it was interrupted. Surface a failure instead of\n // synthesizing a completed response.\n throw new ResponsesMessagesTranslationError(\n \"Messages stream ended without a message_stop event\",\n 502,\n )\n }\n } catch (error) {\n if (!state.initialized) {\n // No lifecycle events reached the client yet. Emit response.created and\n // response.in_progress before the failure so clients tracking the\n // lifecycle receive a protocol-valid stream instead of a silent close.\n yield createLifecycleEvent(state, \"response.created\")\n yield createLifecycleEvent(state, \"response.in_progress\")\n }\n yield createErrorEvent(state, error)\n yield createFailedEvent(state, error)\n }\n}\n\nexport function responsesResultToStreamEvents(\n result: ResponsesResult,\n): Array<ResponseStreamEvent> {\n let sequence = 0\n const next = (value: Record<string, unknown>): ResponseStreamEvent =>\n ({ ...value, sequence_number: sequence++ }) as ResponseStreamEvent\n const inProgress = {\n ...result,\n output: [],\n output_text: \"\",\n status: \"in_progress\",\n usage: null,\n }\n const events: Array<ResponseStreamEvent> = [\n next({ type: \"response.created\", response: inProgress }),\n next({ type: \"response.in_progress\", response: inProgress }),\n ]\n\n for (const [outputIndex, item] of result.output.entries()) {\n events.push(\n next({\n type: \"response.output_item.added\",\n output_index: outputIndex,\n item: { ...structuredClone(item), status: \"in_progress\" },\n }),\n )\n\n if (item.type === \"message\") {\n const textPart = item.content?.find((part) => part.type === \"output_text\")\n if (textPart?.type === \"output_text\") {\n events.push(\n next({\n type: \"response.content_part.added\",\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: \"\", annotations: [] },\n }),\n next({\n type: \"response.output_text.delta\",\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n delta: textPart.text,\n }),\n next({\n type: \"response.output_text.done\",\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n text: textPart.text,\n }),\n next({\n type: \"response.content_part.done\",\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n part: textPart,\n }),\n )\n }\n } else if (item.type === \"reasoning\") {\n const text = item.summary?.[0]?.text\n if (text) {\n const part = { type: \"summary_text\", text }\n events.push(\n next({\n type: \"response.reasoning_summary_part.added\",\n item_id: item.id,\n output_index: outputIndex,\n summary_index: 0,\n part: { type: \"summary_text\", text: \"\" },\n }),\n next({\n type: \"response.reasoning_summary_text.delta\",\n item_id: item.id,\n output_index: outputIndex,\n summary_index: 0,\n delta: text,\n }),\n next({\n type: \"response.reasoning_summary_text.done\",\n item_id: item.id,\n output_index: outputIndex,\n summary_index: 0,\n text,\n }),\n next({\n type: \"response.reasoning_summary_part.done\",\n item_id: item.id,\n output_index: outputIndex,\n summary_index: 0,\n part,\n }),\n )\n }\n } else if (item.type === \"function_call\") {\n if (item.arguments) {\n events.push(\n next({\n type: \"response.function_call_arguments.delta\",\n item_id: item.id,\n output_index: outputIndex,\n delta: item.arguments,\n }),\n )\n }\n events.push(\n next({\n type: \"response.function_call_arguments.done\",\n item_id: item.id,\n output_index: outputIndex,\n name: item.name,\n arguments: item.arguments,\n }),\n )\n } else if (item.type === \"custom_tool_call\") {\n if (item.input) {\n events.push(\n next({\n type: \"response.custom_tool_call_input.delta\",\n item_id: item.id,\n output_index: outputIndex,\n delta: item.input,\n }),\n )\n }\n events.push(\n next({\n type: \"response.custom_tool_call_input.done\",\n item_id: item.id,\n output_index: outputIndex,\n name: item.name,\n input: item.input,\n }),\n )\n }\n\n events.push(\n next({\n type: \"response.output_item.done\",\n output_index: outputIndex,\n item,\n }),\n )\n }\n\n events.push(\n next({\n type:\n result.status === \"incomplete\" ? \"response.incomplete\"\n : result.status === \"failed\" ? \"response.failed\"\n : \"response.completed\",\n response: { ...result, output: [] },\n copilot_usage: result.copilot_usage,\n }),\n )\n return events\n}\n\nfunction createTranslationState(\n context: MessagesResponseTranslationContext,\n): TranslationState {\n return {\n blocks: new Map(),\n compactionText: \"\",\n compactionToolCall: false,\n context,\n copilotUsage: null,\n createdAt: Math.floor(Date.now() / 1000),\n initialized: false,\n messageStopped: false,\n model: context.publicModel,\n nextOutputIndex: 0,\n outputText: \"\",\n responseId: `resp_${Date.now().toString(36)}`,\n sequence: 0,\n stopReason: null,\n usage: { input_tokens: 0, output_tokens: 0 },\n }\n}\n\nfunction initializeState(\n state: TranslationState,\n event: Exclude<AnthropicStreamEventData, { type: \"error\" | \"ping\" }>,\n): void {\n if (event.type === \"message_start\") {\n state.responseId = toResponseId(event.message.id)\n state.model = event.message.model\n state.usage = { ...event.message.usage }\n state.copilotUsage = event.message.copilot_usage ?? null\n }\n state.initialized = true\n}\n\nfunction* translateEvent(\n state: TranslationState,\n event: Exclude<AnthropicStreamEventData, { type: \"error\" | \"ping\" }>,\n): Generator<ResponseStreamEvent> {\n switch (event.type) {\n case \"message_start\": {\n state.usage = mergeUsage(state.usage, event.message.usage)\n state.copilotUsage = event.message.copilot_usage ?? state.copilotUsage\n break\n }\n case \"content_block_start\": {\n for (const translated of startContentBlock(state, event)) {\n yield translated\n }\n break\n }\n case \"content_block_delta\": {\n for (const translated of translateContentDelta(state, event)) {\n yield translated\n }\n break\n }\n case \"content_block_stop\": {\n for (const translated of closeContentBlock(state, event.index)) {\n yield translated\n }\n break\n }\n case \"message_delta\": {\n if (event.delta.stop_reason !== undefined) {\n state.stopReason = event.delta.stop_reason\n }\n if (event.usage) state.usage = mergeUsage(state.usage, event.usage)\n state.copilotUsage = event.copilot_usage ?? state.copilotUsage\n break\n }\n case \"message_stop\": {\n for (const translated of closeAllBlocks(state)) yield translated\n for (const translated of finishCompaction(state)) yield translated\n state.messageStopped = true\n yield createTerminalEvent(state)\n break\n }\n }\n}\n\nfunction* startContentBlock(\n state: TranslationState,\n event: Extract<AnthropicStreamEventData, { type: \"content_block_start\" }>,\n): Generator<ResponseStreamEvent> {\n const block = event.content_block\n if (state.context.compaction) {\n if (block.type === \"text\") {\n state.compactionText += block.text\n }\n if (block.type === \"tool_use\" || block.type === \"server_tool_use\") {\n state.compactionToolCall = true\n }\n return\n }\n\n if (block.type === \"text\") {\n const item: ResponseOutputMessage = {\n id: `msg_${state.responseId.slice(-18)}_${event.index}`,\n type: \"message\",\n role: \"assistant\",\n status: \"in_progress\",\n content: [{ type: \"output_text\", text: block.text, annotations: [] }],\n }\n const output = addOutput(state, item)\n state.blocks.set(event.index, {\n ...output,\n type: \"message\",\n text: block.text,\n done: false,\n })\n state.outputText += block.text\n yield createEvent(state, {\n type: \"response.output_item.added\",\n output_index: output.outputIndex,\n item: structuredClone(item),\n })\n yield createEvent(state, {\n type: \"response.content_part.added\",\n item_id: item.id,\n output_index: output.outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: \"\", annotations: [] },\n })\n if (block.text) {\n yield createEvent(state, {\n type: \"response.output_text.delta\",\n item_id: item.id,\n output_index: output.outputIndex,\n content_index: 0,\n delta: block.text,\n })\n }\n return\n }\n\n if (block.type === \"thinking\") {\n const item: ResponseOutputReasoning = {\n id: markMessagesReasoningId(\n `rs_${state.responseId.slice(-18)}_${event.index}`,\n ),\n type: \"reasoning\",\n status: \"in_progress\",\n summary: [],\n encrypted_content: EMPTY_SIGNATURE_ENCRYPTED_CONTENT,\n }\n const output = addOutput(state, item)\n const reasoning: StreamReasoningState = {\n ...output,\n type: \"reasoning\",\n signature: \"\",\n summaryStarted: false,\n text: \"\",\n done: false,\n }\n state.blocks.set(event.index, reasoning)\n yield createEvent(state, {\n type: \"response.output_item.added\",\n output_index: output.outputIndex,\n item: structuredClone(item),\n })\n if (block.thinking) {\n for (const translated of appendReasoningText(\n state,\n reasoning,\n block.thinking,\n )) {\n yield translated\n }\n }\n return\n }\n\n if (block.type === \"tool_use\") {\n const descriptor = resolveToolDescriptor(state.context.registry, block.name)\n const common = {\n call_id: block.id,\n name: descriptor.name,\n status: \"in_progress\" as const,\n ...(descriptor.namespace ? { namespace: descriptor.namespace } : {}),\n }\n if (descriptor.kind === \"custom\") {\n const item: ResponseOutputCustomToolCall = {\n ...common,\n id: `ctc_${state.responseId.slice(-18)}_${event.index}`,\n type: \"custom_tool_call\",\n input: \"\",\n }\n const output = addOutput(state, item)\n const decoder = new CustomToolInputStreamDecoder()\n state.blocks.set(event.index, {\n ...output,\n type: \"custom_tool\",\n decoder,\n done: false,\n })\n yield createEvent(state, {\n type: \"response.output_item.added\",\n output_index: output.outputIndex,\n item: structuredClone(item),\n })\n if (Object.keys(block.input).length > 0) {\n const delta = decoder.append(JSON.stringify(block.input))\n if (delta) {\n yield createEvent(state, {\n type: \"response.custom_tool_call_input.delta\",\n item_id: item.id,\n output_index: output.outputIndex,\n delta,\n })\n }\n }\n return\n }\n\n const item: ResponseOutputFunctionCall = {\n ...common,\n id: `fc_${state.responseId.slice(-18)}_${event.index}`,\n type: \"function_call\",\n arguments: \"\",\n }\n const output = addOutput(state, item)\n const initialInput =\n Object.keys(block.input).length > 0 ? JSON.stringify(block.input) : \"\"\n state.blocks.set(event.index, {\n ...output,\n type: \"function_tool\",\n done: false,\n })\n yield createEvent(state, {\n type: \"response.output_item.added\",\n output_index: output.outputIndex,\n item: structuredClone(item),\n })\n if (initialInput) {\n item.arguments = initialInput\n yield createEvent(state, {\n type: \"response.function_call_arguments.delta\",\n item_id: item.id,\n output_index: output.outputIndex,\n delta: initialInput,\n })\n }\n }\n}\n\nfunction* translateContentDelta(\n state: TranslationState,\n event: Extract<AnthropicStreamEventData, { type: \"content_block_delta\" }>,\n): Generator<ResponseStreamEvent> {\n if (state.context.compaction) {\n if (event.delta.type === \"text_delta\") {\n state.compactionText += event.delta.text\n }\n return\n }\n\n const block = state.blocks.get(event.index)\n if (!block) return\n\n if (event.delta.type === \"text_delta\" && block.type === \"message\") {\n block.text += event.delta.text\n const part = block.item.content?.[0]\n if (part?.type === \"output_text\") part.text = block.text\n state.outputText += event.delta.text\n yield createEvent(state, {\n type: \"response.output_text.delta\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n content_index: 0,\n delta: event.delta.text,\n })\n return\n }\n\n if (event.delta.type === \"thinking_delta\" && block.type === \"reasoning\") {\n for (const translated of appendReasoningText(\n state,\n block,\n event.delta.thinking,\n )) {\n yield translated\n }\n return\n }\n\n if (event.delta.type === \"signature_delta\" && block.type === \"reasoning\") {\n block.signature += event.delta.signature\n block.item.encrypted_content =\n block.signature || EMPTY_SIGNATURE_ENCRYPTED_CONTENT\n return\n }\n\n if (\n event.delta.type === \"input_json_delta\"\n && block.type === \"function_tool\"\n ) {\n block.item.arguments += event.delta.partial_json\n yield createEvent(state, {\n type: \"response.function_call_arguments.delta\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n delta: event.delta.partial_json,\n })\n return\n }\n\n if (event.delta.type === \"input_json_delta\" && block.type === \"custom_tool\") {\n const delta = block.decoder.append(event.delta.partial_json)\n if (delta) {\n yield createEvent(state, {\n type: \"response.custom_tool_call_input.delta\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n delta,\n })\n }\n }\n}\n\nfunction* appendReasoningText(\n state: TranslationState,\n block: StreamReasoningState,\n text: string,\n): Generator<ResponseStreamEvent> {\n if (!text) return\n if (!block.summaryStarted) {\n block.summaryStarted = true\n yield createEvent(state, {\n type: \"response.reasoning_summary_part.added\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n summary_index: 0,\n part: { type: \"summary_text\", text: \"\" },\n })\n }\n block.text += text\n block.item.summary = [{ type: \"summary_text\", text: block.text }]\n yield createEvent(state, {\n type: \"response.reasoning_summary_text.delta\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n summary_index: 0,\n delta: text,\n })\n}\n\nfunction* closeContentBlock(\n state: TranslationState,\n index: number,\n): Generator<ResponseStreamEvent> {\n const block = state.blocks.get(index)\n if (!block || block.done) return\n\n if (block.type === \"message\") {\n yield createEvent(state, {\n type: \"response.output_text.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n content_index: 0,\n text: block.text,\n })\n const part = block.item.content?.[0]\n if (part) {\n yield createEvent(state, {\n type: \"response.content_part.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n content_index: 0,\n part: structuredClone(part),\n })\n }\n } else if (block.type === \"reasoning\") {\n if (block.text) {\n const part = { type: \"summary_text\", text: block.text }\n yield createEvent(state, {\n type: \"response.reasoning_summary_text.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n summary_index: 0,\n text: block.text,\n })\n yield createEvent(state, {\n type: \"response.reasoning_summary_part.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n summary_index: 0,\n part,\n })\n }\n block.item.encrypted_content =\n block.signature || EMPTY_SIGNATURE_ENCRYPTED_CONTENT\n } else if (block.type === \"custom_tool\") {\n const input = block.decoder.finish()\n block.item.input = input\n yield createEvent(state, {\n type: \"response.custom_tool_call_input.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n name: block.item.name,\n input,\n })\n } else {\n yield createEvent(state, {\n type: \"response.function_call_arguments.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n name: block.item.name,\n arguments: block.item.arguments,\n })\n }\n\n block.item.status = \"completed\"\n block.done = true\n yield createEvent(state, {\n type: \"response.output_item.done\",\n output_index: block.outputIndex,\n item: structuredClone(block.item),\n })\n state.blocks.delete(index)\n}\n\nfunction* closeAllBlocks(\n state: TranslationState,\n): Generator<ResponseStreamEvent> {\n for (const index of [...state.blocks.keys()].sort(\n (left, right) => left - right,\n )) {\n for (const translated of closeContentBlock(state, index)) yield translated\n }\n}\n\nfunction* finishCompaction(\n state: TranslationState,\n): Generator<ResponseStreamEvent> {\n if (!state.context.compaction) return\n if (state.compactionToolCall) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API attempted a tool call during compaction\",\n 502,\n )\n }\n const summary = state.compactionText.trim()\n if (!summary) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API compaction stream did not contain a text summary\",\n 502,\n )\n }\n const item: ResponseOutputItem = {\n id: `cmp_${state.responseId.slice(-24)}`,\n type: \"compaction\",\n encrypted_content: encodeMessagesCompaction(summary),\n }\n const output = addOutput(state, item)\n yield createEvent(state, {\n type: \"response.output_item.added\",\n output_index: output.outputIndex,\n item,\n })\n yield createEvent(state, {\n type: \"response.output_item.done\",\n output_index: output.outputIndex,\n item,\n })\n}\n\nfunction addOutput<T extends ResponseOutputItem>(\n state: TranslationState,\n item: T,\n): StreamOutputState<T> {\n const outputIndex = state.nextOutputIndex\n state.nextOutputIndex += 1\n return { item, outputIndex, done: false }\n}\n\nfunction createLifecycleEvent(\n state: TranslationState,\n type: \"response.created\" | \"response.in_progress\",\n): ResponseStreamEvent {\n return createEvent(state, {\n type,\n response: createMessagesBackedResponsesResult({\n context: state.context,\n createdAt: state.createdAt,\n id: state.responseId,\n output: [],\n outputText: \"\",\n status: \"in_progress\",\n usage: null,\n }),\n })\n}\n\nfunction createTerminalEvent(state: TranslationState): ResponseStreamEvent {\n const finish = resolveFinish(state.stopReason)\n const response = createMessagesBackedResponsesResult({\n context: state.context,\n createdAt: state.createdAt,\n id: state.responseId,\n output: [],\n outputText: state.context.compaction ? \"\" : state.outputText,\n status: finish.status,\n incompleteReason: finish.incompleteReason,\n usage: translateAnthropicUsage(state.usage),\n copilotUsage: state.copilotUsage,\n })\n return createEvent(state, {\n type:\n finish.status === \"incomplete\" ?\n \"response.incomplete\"\n : \"response.completed\",\n response,\n copilot_usage: state.copilotUsage,\n })\n}\n\nfunction createErrorEvent(\n state: TranslationState,\n error: unknown,\n): ResponseStreamEvent {\n const message = error instanceof Error ? error.message : String(error)\n return createEvent(state, {\n type: \"error\",\n code: \"messages_translation_error\",\n message,\n param: null,\n error: {\n type: \"api_error\",\n code: \"messages_translation_error\",\n message,\n },\n })\n}\n\nfunction createFailedEvent(\n state: TranslationState,\n error: unknown,\n): ResponseStreamEvent {\n const message = error instanceof Error ? error.message : String(error)\n return createEvent(state, {\n type: \"response.failed\",\n response: createMessagesBackedResponsesResult({\n context: state.context,\n createdAt: state.createdAt,\n id: state.responseId,\n output: [],\n outputText: state.outputText,\n status: \"failed\",\n usage: translateAnthropicUsage(state.usage),\n copilotUsage: state.copilotUsage,\n error: {\n code: \"messages_translation_error\",\n message,\n },\n }),\n copilot_usage: state.copilotUsage,\n })\n}\n\nfunction createEvent(\n state: TranslationState,\n value: Record<string, unknown>,\n): ResponseStreamEvent {\n return {\n ...value,\n sequence_number: state.sequence++,\n } as ResponseStreamEvent\n}\n\nfunction resolveFinish(stopReason: AnthropicResponse[\"stop_reason\"]): {\n status: \"completed\" | \"incomplete\"\n incompleteReason?: \"content_filter\" | \"max_output_tokens\"\n} {\n if (stopReason === \"max_tokens\") {\n return { status: \"incomplete\", incompleteReason: \"max_output_tokens\" }\n }\n if (stopReason === \"refusal\") {\n return { status: \"incomplete\", incompleteReason: \"content_filter\" }\n }\n return { status: \"completed\" }\n}\n\nfunction mergeUsage(\n current: AnthropicUsage,\n incoming: Partial<AnthropicUsage>,\n): AnthropicUsage {\n return {\n ...current,\n ...incoming,\n input_tokens: incoming.input_tokens ?? current.input_tokens,\n output_tokens: incoming.output_tokens ?? current.output_tokens,\n }\n}\n\nfunction parseAnthropicEvent(data: string): AnthropicStreamEventData {\n try {\n const parsed = JSON.parse(data) as unknown\n if (\n typeof parsed === \"object\"\n && parsed !== null\n && \"type\" in parsed\n && typeof parsed.type === \"string\"\n ) {\n return parsed as AnthropicStreamEventData\n }\n } catch {\n // The request error below contains the stable public message.\n }\n throw new ResponsesMessagesTranslationError(\n \"Messages API returned malformed streaming JSON\",\n 502,\n )\n}\n","import { events } from \"fetch-event-stream\"\nimport type { Context } from \"hono\"\nimport { streamSSE } from \"hono/streaming\"\n\nimport { COMPACT_REQUEST } from \"~/lib/compact\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { writeSSEIfConnected } from \"~/lib/sse\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { AnthropicResponse } from \"~/lib/types/anthropic\"\nimport type { ResponsesPayload } from \"~/lib/types/responses\"\nimport { handleCompletionPayload } from \"~/routes/messages/handler\"\nimport { isCodexUserAgent } from \"~/routes/models/codex-models\"\n\nimport {\n responsesResultToStreamEvents,\n translateMessagesStream,\n} from \"./messages-stream-translation\"\nimport {\n ResponsesMessagesTranslationError,\n translateAnthropicToResponses,\n translateResponsesToMessages,\n type MessagesResponseTranslationContext,\n} from \"./messages-translation\"\n\nconst logger = createHandlerLogger(\"responses-messages-handler\")\n\nexport const responsesMessagesDependencies = {\n handleCompletionPayload,\n}\n\nexport async function handleResponsesViaMessages(\n c: Context,\n options: {\n payload: ResponsesPayload\n publicModel: string\n targetModel: string\n subagentMarker?: SubagentMarker | null\n requestId?: string\n sessionId?: string\n },\n): Promise<Response> {\n try {\n if (\n isCodexUserAgent(c.req.header(\"user-agent\"))\n && options.targetModel.toLowerCase().includes(\"mimo-v2.6\")\n ) {\n throw new ResponsesMessagesTranslationError(\n \"MiMo v2.6 cannot return valid Codex custom tool responses. Please switch models.\",\n )\n }\n\n const translation = translateResponsesToMessages(\n { ...options.payload, model: options.publicModel },\n {\n model: options.targetModel,\n publicModel: options.publicModel,\n toolCallTips: isCodexUserAgent(c.req.header(\"user-agent\")),\n },\n )\n const context: MessagesResponseTranslationContext = translation\n\n debugJson(logger, \"Translated Messages request:\", {\n payload: translation.messagesPayload,\n publicModel: options.publicModel,\n targetModel: options.targetModel,\n userAgent: c.req.header(\"user-agent\") ?? \"\",\n })\n\n const messagesResponse =\n await responsesMessagesDependencies.handleCompletionPayload(\n c,\n translation.messagesPayload,\n {\n compactType: translation.compaction ? COMPACT_REQUEST : undefined,\n skipClaudeAutoModel: true,\n skipModelMapping: true,\n skipWebSearch: true,\n usageEndpoint: \"responses\",\n subagentMarker: options.subagentMarker,\n requestId: options.requestId,\n sessionId: options.sessionId,\n },\n )\n\n if (!messagesResponse.ok) {\n return messagesResponse\n }\n\n const contentType = messagesResponse.headers.get(\"content-type\") ?? \"\"\n if (contentType.includes(\"text/event-stream\")) {\n if (!translation.messagesPayload.stream) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API returned a stream for a non-streaming Responses request\",\n 502,\n )\n }\n return streamTranslatedMessagesEvents(c, messagesResponse, context)\n }\n\n const body = await messagesResponse.json()\n if (!isAnthropicResponse(body)) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API returned an invalid response body\",\n 502,\n )\n }\n const result = translateAnthropicToResponses(body, context)\n debugJson(logger, \"Translated Responses result:\", result)\n\n if (!translation.messagesPayload.stream) {\n return c.json(result)\n }\n return streamSSE(c, async (stream) => {\n for (const event of responsesResultToStreamEvents(result)) {\n await writeSSEIfConnected(stream, {\n event: event.type,\n data: JSON.stringify(event),\n })\n }\n })\n } catch (error) {\n if (error instanceof ResponsesMessagesTranslationError) {\n return c.json(\n {\n error: {\n message: error.message,\n type: \"invalid_request_error\",\n },\n },\n error.status as 400 | 502,\n )\n }\n throw error\n }\n}\n\nfunction streamTranslatedMessagesEvents(\n c: Context,\n response: Response,\n context: MessagesResponseTranslationContext,\n): Response {\n return streamSSE(c, async (stream) => {\n for await (const event of translateMessagesStream(\n events(response),\n context,\n )) {\n debugJson(logger, \"Translated Responses stream event:\", event)\n await writeSSEIfConnected(stream, {\n event: event.type,\n data: JSON.stringify(event),\n })\n }\n })\n}\n\nfunction isAnthropicResponse(value: unknown): value is AnthropicResponse {\n return (\n typeof value === \"object\"\n && value !== null\n && \"type\" in value\n && value.type === \"message\"\n && \"content\" in value\n && Array.isArray(value.content)\n )\n}\n","import { getSmallModelForProvider } from \"~/lib/config\"\nimport type {\n ResponseInputMessage,\n ResponsesPayload,\n} from \"~/lib/types/responses\"\nimport { isCodexUserAgent } from \"~/routes/models/codex-models\"\nimport consola from \"consola\"\n\nconst TASK_TITLE_PROMPT_PREFIX =\n \"Generate a concise, single-line task title of at most 36 characters and under five words where possible.\"\n\nexport const taskTitleDependencies = { getSmallModelForProvider }\n\nexport const getCodexTaskTitleModel = (\n userAgent: string | undefined,\n input: ResponsesPayload[\"input\"],\n provider: string,\n): string | undefined => {\n if (!isCodexUserAgent(userAgent) || !Array.isArray(input)) return undefined\n\n const isTaskTitleRequest = input.slice(-2).some((item) => {\n const message = item as ResponseInputMessage\n return (\n message?.role === \"user\"\n && Array.isArray(message.content)\n && message.content.some(\n (part) =>\n part?.type === \"input_text\"\n && typeof part.text === \"string\"\n && part.text.startsWith(TASK_TITLE_PROMPT_PREFIX),\n )\n )\n })\n\n if (!isTaskTitleRequest) return undefined\n\n const model = taskTitleDependencies.getSmallModelForProvider(provider)\n if (model) {\n consola.debug(`Codex task title small model: ${provider} -> ${model}`)\n }\n return model\n}\n","import type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\n\nimport { logCodexRateLimitsEvent } from \"~/lib/codex-rate-limit\"\nimport {\n type ModelConfig,\n type ProviderType,\n resolveProviderConfigForModel,\n} from \"~/lib/config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { recordResponsesFirstToken } from \"~/lib/first-token\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { requestContext } from \"~/lib/request-context\"\nimport { writeSSEIfConnected } from \"~/lib/sse\"\nimport {\n createProviderTokenUsageRecorder,\n normalizeResponsesUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { isResponsesStream } from \"~/lib/utils\"\nimport { isCodexUserAgent } from \"~/routes/models/codex-models\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n filterReasoningForTransport,\n} from \"~/routes/responses/utils\"\nimport { handleResponsesViaMessages } from \"~/routes/responses/messages-handler\"\nimport { getCodexTaskTitleModel } from \"~/routes/responses/task-title\"\nimport {\n forwardProviderResponseHeaders,\n normalizeProviderResponsesReasoningEffort,\n} from \"~/routes/provider/utils\"\n\nimport type {\n ResponsesPayload,\n ResponsesResult,\n ResponseStreamEvent,\n ResponsesStream,\n} from \"~/lib/types/responses\"\nimport { forwardCodexResponses } from \"~/services/codex/create-responses\"\nimport { getModels as getCodexModels } from \"~/services/codex/get-models\"\nimport { createResponsesSafeStream } from \"~/services/responses-websocket-helpers\"\nimport { createResponsesHttpEventStream } from \"~/services/responses-http\"\nimport {\n createProviderProxyResponse,\n forwardProviderResponses,\n} from \"~/services/providers/provider-proxy\"\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\"\n\nconst logger = createHandlerLogger(\"provider-responses-handler\")\n\nexport const providerResponsesHandlerDependencies = {\n resolveProviderConfig,\n}\n\nexport async function handleProviderResponsesForProvider(\n c: Context,\n options: {\n payload: ResponsesPayload\n provider: string\n publicModel?: string\n },\n): Promise<Response> {\n const { payload, provider } = options\n const taskTitleModel = getCodexTaskTitleModel(\n c.req.header(\"user-agent\"),\n payload.input,\n provider,\n )\n if (taskTitleModel) payload.model = taskTitleModel\n const publicModel = taskTitleModel ?? options.publicModel ?? payload.model\n\n debugJson(logger, \"Responses request payload:\", {\n payload,\n provider,\n })\n\n const configuredProvider =\n await providerResponsesHandlerDependencies.resolveProviderConfig(provider)\n const providerConfig =\n configuredProvider\n && resolveProviderConfigForModel(configuredProvider, payload.model)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' does not support the /v1/responses endpoint`,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n const effectiveType = providerConfig.type\n const normalizedReasoningEffort = normalizeProviderResponsesReasoningEffort(\n payload,\n providerConfig,\n )\n if (normalizedReasoningEffort) {\n logger.debug(\n `Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the provider model configuration`,\n )\n }\n\n if (shouldFallbackToMessages(c, payload.model, effectiveType)) {\n filterReasoningForTransport(payload, true)\n return await handleResponsesViaMessages(c, {\n payload,\n publicModel,\n targetModel: `${provider}/${payload.model}`,\n })\n }\n\n if (effectiveType !== \"openai-responses\") {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' does not support the /v1/responses endpoint`,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n filterReasoningForTransport(payload, false)\n\n const model =\n providerConfig.name === \"codex\" ?\n getCodexModels().data.find((model) => model.id === payload.model)\n : undefined\n\n // Smaller than the client compaction threshold, use server-side compaction to maintain cache hit rate.\n const shouldCompactInput = applyResponsesApiContextManagement(\n payload,\n model?.capabilities.limits.max_prompt_tokens,\n {\n compactThresholdRatio: 0.8,\n source: \"responses\",\n },\n )\n if (shouldCompactInput) {\n compactInputByLatestCompaction(payload)\n }\n\n debugJson(logger, \"Translated Responses request payload:\", {\n contextManagement: payload.context_management,\n provider,\n })\n\n const modelConfig = providerConfig.models?.[payload.model]\n\n if (providerConfig.name === \"codex\") {\n const upstreamResponse = await forwardCodexResponses(\n payload,\n c.req.raw.headers,\n providerConfig.baseUrl,\n {\n clientSignal: c.req.raw.signal,\n onResponseHeaders: (headers) =>\n forwardProviderResponseHeaders(c, headers),\n },\n )\n const recordUsage = createProviderResponsesUsageRecorder(\n payload,\n provider,\n modelConfig,\n providerConfig.pricingCurrency,\n )\n\n if (payload.stream && isResponsesStream(upstreamResponse)) {\n return streamProviderResponses(c, upstreamResponse, {\n normalizeCodex: true,\n provider,\n recordUsage,\n })\n }\n\n const responseBody = upstreamResponse as ResponsesResult\n recordUsage(normalizeResponsesUsage(responseBody.usage))\n return c.json(responseBody)\n }\n\n const upstreamResponse = await forwardProviderResponses(\n providerConfig,\n payload,\n c.req.raw.headers,\n { clientSignal: c.req.raw.signal },\n )\n\n if (!upstreamResponse.ok) {\n throw new HTTPError(\n `Failed to create ${provider} responses`,\n upstreamResponse,\n )\n }\n\n const recordUsage = createProviderResponsesUsageRecorder(\n payload,\n provider,\n modelConfig,\n providerConfig.pricingCurrency,\n )\n\n if (payload.stream) {\n return streamProviderResponses(c, getResponsesEvents(upstreamResponse), {\n normalizeCodex: false,\n provider,\n recordUsage,\n })\n }\n\n const responseBody = (await upstreamResponse\n .clone()\n .json()) as ResponsesResult\n recordUsage(normalizeResponsesUsage(responseBody.usage))\n\n return createProviderProxyResponse(upstreamResponse)\n}\n\nconst shouldFallbackToMessages = (\n c: Context,\n modelId: string,\n effectiveType: ProviderType,\n): boolean => {\n if (\n effectiveType === \"anthropic\"\n || effectiveType === \"openai-compatible\"\n || effectiveType === \"google\"\n ) {\n return true\n }\n\n if (isCodexUserAgent(c.req.header(\"user-agent\"))) {\n return !(modelId.startsWith(\"gpt\") || modelId.startsWith(\"codex\"))\n }\n\n return false\n}\n\nconst createProviderResponsesUsageRecorder = (\n payload: ResponsesPayload,\n provider: string,\n modelConfig: ModelConfig | undefined,\n pricingCurrency: string | undefined,\n): ((usage: UsageTokens) => void) => {\n const sessionAffinity =\n requestContext.getStore()?.sessionAffinity?.trim() || null\n\n return createProviderTokenUsageRecorder({\n endpoint: \"responses\",\n model: payload.model,\n pricing: modelConfig?.pricing,\n pricingCurrency,\n providerName: provider,\n serviceTier: payload.service_tier,\n sessionId: sessionAffinity ?? \"\",\n })\n}\n\nconst streamProviderResponses = async (\n c: Context,\n upstreamResponse: ResponsesStream,\n options: {\n normalizeCodex: boolean\n provider: string\n recordUsage: (usage: UsageTokens) => void\n },\n): Promise<Response> => {\n const iterator = upstreamResponse[Symbol.asyncIterator]()\n const firstResult = await iterator.next()\n if (firstResult.done) {\n await iterator.return?.()\n throw new HTTPError(\n `Empty stream from ${options.provider} responses`,\n new Response(\"\", { status: 502 }),\n )\n }\n\n const firstChunk = firstResult.value\n if (firstChunk.data && firstChunk.data !== \"[DONE]\") {\n const event = parseProviderResponsesStreamEvent(firstChunk.data, {\n normalizeCodex: false,\n provider: options.provider,\n })\n if (event?.type === \"error\") {\n const errorEvent = event\n const statusCode = errorEvent.status_code ?? 500\n await iterator.return?.()\n return c.json(\n {\n error: {\n message: errorEvent.message,\n ...errorEvent.error,\n },\n },\n statusCode as ContentfulStatusCode,\n errorEvent.headers ?? undefined,\n )\n }\n }\n\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n\n const writeChunk = async (chunk: typeof firstChunk) => {\n debugJson(logger, \"Responses stream chunk:\", chunk)\n let responseChunk = chunk\n let event: ResponseStreamEvent | null = null\n\n if (chunk.data && chunk.data !== \"[DONE]\") {\n event = parseProviderResponsesStreamEvent(chunk.data, {\n normalizeCodex: options.normalizeCodex,\n provider: options.provider,\n })\n if (event && options.normalizeCodex && chunk.event !== event.type) {\n // The Codex normalizer observes rate limits but does not modify\n // the event body. Keep the original JSON instead of re-encoding it.\n responseChunk = { ...chunk, event: event.type }\n }\n }\n\n recordResponsesFirstToken(event)\n if (event) {\n const nextUsage = getResponsesStreamEventUsage(event)\n if (nextUsage) {\n usage = nextUsage\n }\n }\n\n await writeSSEIfConnected(stream, {\n data: responseChunk.data ?? \"\",\n event: responseChunk.event,\n })\n }\n\n try {\n await writeChunk(firstChunk)\n\n for await (const chunk of {\n [Symbol.asyncIterator]: () => iterator,\n }) {\n await writeChunk(chunk)\n }\n } finally {\n await iterator.return?.()\n options.recordUsage(usage)\n }\n })\n}\n\nconst parseProviderResponsesStreamEvent = (\n data: string,\n options: {\n normalizeCodex: boolean\n provider: string\n },\n): ResponseStreamEvent | null => {\n try {\n const parsed = JSON.parse(data) as ResponseStreamEvent\n if (options.normalizeCodex) {\n logCodexRateLimitsEvent(parsed)\n }\n return parsed\n } catch (error) {\n logger.error(\"provider.responses.parse_chunk_error\", {\n provider: options.provider,\n data,\n error,\n })\n return null\n }\n}\n\nconst getResponsesStreamEventUsage = (\n event: ResponseStreamEvent,\n): UsageTokens | null => {\n if (\n event.type === \"response.completed\"\n || event.type === \"response.failed\"\n || event.type === \"response.incomplete\"\n ) {\n return normalizeResponsesUsage(event.response.usage)\n }\n\n return null\n}\n\nconst getResponsesEvents = (response: Response): ResponsesStream =>\n createResponsesSafeStream(createResponsesHttpEventStream(response))\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { setPluginRequestModel } from \"~/lib/request-events\"\nimport type { ResponsesPayload } from \"~/lib/types/responses\"\nimport { zstdDecompressionMiddleware } from \"~/lib/zstd-request\"\n\nimport { handleProviderResponsesForProvider } from \"./handler\"\n\nexport const providerResponsesRoutes = new Hono()\n\nproviderResponsesRoutes.use(zstdDecompressionMiddleware)\n\nproviderResponsesRoutes.post(\"/\", async (c) => {\n try {\n const provider = c.req.param(\"provider\") ?? \"\"\n const payload = await c.req.json<ResponsesPayload>()\n setPluginRequestModel(payload.model)\n return await handleProviderResponsesForProvider(c, { payload, provider })\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","/**\n * Stream ID Synchronization for @ai-sdk/openai compatibility\n *\n * Problem: GitHub Copilot's Responses API returns different IDs for the same\n * item in 'added' vs 'done' events. This breaks @ai-sdk/openai which expects\n * consistent IDs across the stream lifecycle.\n *\n * Errors without this fix:\n * - \"activeReasoningPart.summaryParts\" undefined\n * - \"text part not found\"\n *\n * Use case: OpenCode (AI coding assistant) using Codex models (gpt-5.2-codex)\n * via @ai-sdk/openai provider requires the Responses API endpoint.\n */\n\nimport type {\n ResponseOutputItemAddedEvent,\n ResponseOutputItemDoneEvent,\n ResponseStreamEvent,\n} from \"~/lib/types/responses\"\n\ninterface StreamIdTracker {\n outputItems: Map<number, string>\n}\n\nexport const createStreamIdTracker = (): StreamIdTracker => ({\n outputItems: new Map(),\n})\n\nexport const fixStreamIds = (\n data: string,\n event: string | undefined,\n tracker: StreamIdTracker,\n): string => {\n if (!data) return data\n const parsed = JSON.parse(data) as ResponseStreamEvent\n switch (event) {\n case \"response.output_item.added\": {\n return handleOutputItemAdded(\n parsed as ResponseOutputItemAddedEvent,\n tracker,\n )\n }\n case \"response.output_item.done\": {\n return handleOutputItemDone(\n parsed as ResponseOutputItemDoneEvent,\n tracker,\n )\n }\n default: {\n return handleItemId(parsed, tracker)\n }\n }\n}\n\nconst handleOutputItemAdded = (\n parsed: ResponseOutputItemAddedEvent,\n tracker: StreamIdTracker,\n): string => {\n if (!parsed.item.id) {\n let randomSuffix = \"\"\n while (randomSuffix.length < 16) {\n randomSuffix += Math.random().toString(36).slice(2)\n }\n parsed.item.id = `oi_${parsed.output_index}_${randomSuffix.slice(0, 16)}`\n }\n\n const outputIndex = parsed.output_index\n tracker.outputItems.set(outputIndex, parsed.item.id)\n return JSON.stringify(parsed)\n}\n\nconst handleOutputItemDone = (\n parsed: ResponseOutputItemDoneEvent,\n tracker: StreamIdTracker,\n): string => {\n const outputIndex = parsed.output_index\n const originalId = tracker.outputItems.get(outputIndex)\n if (originalId) {\n parsed.item.id = originalId\n }\n return JSON.stringify(parsed)\n}\n\nconst handleItemId = (\n parsed: ResponseStreamEvent & { output_index?: number; item_id?: string },\n tracker: StreamIdTracker,\n): string => {\n const outputIndex = parsed.output_index\n if (outputIndex !== undefined) {\n const itemId = tracker.outputItems.get(outputIndex)\n if (itemId) {\n parsed.item_id = itemId\n }\n }\n return JSON.stringify(parsed)\n}\n","import type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\n\nimport {\n isResponsesApiWebSearchEnabled as isConfiguredResponsesApiWebSearchEnabled,\n resolveMappedModel,\n} from \"~/lib/config\"\nimport { createHandlerLogger, debugJson, debugJsonTail } from \"~/lib/logger\"\nimport { recordResponsesFirstToken } from \"~/lib/first-token\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { resolveConfiguredProviderModelAlias } from \"~/lib/provider-resolver\"\nimport { requestContext } from \"~/lib/request-context\"\nimport { setPluginRequestModel } from \"~/lib/request-events\"\nimport { writeSSEIfConnected } from \"~/lib/sse\"\nimport { isCodexUserAgent } from \"~/routes/models/codex-models\"\nimport {\n handleProviderResponsesForProvider,\n providerResponsesHandlerDependencies,\n} from \"~/routes/provider/responses/handler\"\nimport {\n createCopilotTokenUsageRecorder,\n normalizeOptionalToken,\n normalizeResponsesUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport {\n generateRequestIdFromPayload,\n getUUID,\n isAsyncIterable,\n} from \"~/lib/utils\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type {\n ResponsesPayload,\n ResponsesResult,\n ResponsesTransport,\n ResponseStreamEvent,\n} from \"~/lib/types/responses\"\nimport { createResponses as createCopilotResponses } from \"~/services/copilot/create-responses\"\n\nimport { handleResponsesViaMessages } from \"./messages-handler\"\nimport { createStreamIdTracker, fixStreamIds } from \"./stream-id-sync\"\nimport { getCodexTaskTitleModel } from \"./task-title\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n filterReasoningForTransport,\n getResponsesTransportForModel,\n getResponsesRequestOptions,\n normalizeGuardianAgentMessages,\n normalizeInputImageDetails,\n normalizeResponsesReasoningEffort,\n sanitizeOversizedInputImages,\n sanitizeUnsupportedInputFields,\n} from \"./utils\"\nimport consola from \"consola\"\n\nconst logger = createHandlerLogger(\"responses-handler\")\n\nexport const responsesHandlerDependencies = {\n createResponses: createCopilotResponses,\n findEndpointModel,\n isResponsesApiWebSearchEnabled: isConfiguredResponsesApiWebSearchEnabled,\n resolveMappedModel,\n}\n\nexport const handleResponses = async (c: Context) => {\n const payload = await c.req.json<ResponsesPayload>()\n setPluginRequestModel(payload.model)\n const requestedModel = payload.model\n payload.model = responsesHandlerDependencies.resolveMappedModel(payload.model)\n if (payload.model !== requestedModel) {\n consola.debug(\n `Resolved model mapping: ${requestedModel} -> ${payload.model}`,\n )\n }\n\n const providerModelAlias = await resolveConfiguredProviderModelAlias(\n payload.model,\n providerResponsesHandlerDependencies.resolveProviderConfig,\n )\n if (providerModelAlias) {\n payload.model = providerModelAlias.model\n return await handleProviderResponsesForProvider(c, {\n payload,\n provider: providerModelAlias.provider,\n publicModel: requestedModel,\n })\n }\n\n const taskTitleModel = getCodexTaskTitleModel(\n c.req.header(\"user-agent\"),\n payload.input,\n \"copilot\",\n )\n if (taskTitleModel) payload.model = taskTitleModel\n const publicModel = taskTitleModel ?? requestedModel\n\n debugJson(logger, \"Responses request payload:\", payload)\n\n const store = requestContext.getStore()\n const rootSessionId = store?.rootSessionId\n const sessionAffinity = store?.sessionAffinity\n\n const subagentMarker = getCodexResponsesSubagentMarker(c, {\n rootSessionId,\n sessionAffinity,\n })\n if (subagentMarker) {\n debugJson(logger, \"Detected Codex subagent headers:\", subagentMarker)\n }\n\n const sessionId = rootSessionId ? getUUID(rootSessionId) : undefined\n const requestId =\n sessionAffinity ?\n getUUID(sessionAffinity + \"_\")\n : generateRequestIdFromPayload({ messages: payload.input }, sessionId)\n logger.debug(\"Generated request ID:\", requestId)\n\n const fallbackSessionId = sessionId ?? getUUID(requestId)\n logger.debug(\"Extracted session ID:\", fallbackSessionId)\n const selectedModel = responsesHandlerDependencies.findEndpointModel(\n payload.model,\n )\n payload.model = selectedModel?.id ?? payload.model\n const normalizedReasoningEffort = normalizeResponsesReasoningEffort(\n payload,\n selectedModel?.capabilities?.supports?.reasoning_effort,\n )\n if (normalizedReasoningEffort) {\n logger.debug(\n `Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the selected model capabilities`,\n )\n }\n const responsesTransport = getResponsesTransportForModel(selectedModel)\n\n const useMessagesFallback = shouldFallbackToMessages(\n c,\n payload.model,\n selectedModel,\n responsesTransport,\n )\n if (useMessagesFallback) {\n filterReasoningForTransport(payload, true)\n return await handleResponsesViaMessages(c, {\n payload,\n publicModel,\n targetModel: payload.model,\n subagentMarker,\n requestId,\n sessionId: fallbackSessionId,\n })\n }\n\n if (!responsesTransport) {\n return c.json(\n {\n error: {\n message:\n \"This model does not support the responses endpoint. Please choose a different model.\",\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n filterReasoningForTransport(payload, false)\n\n const recordUsage = createCopilotTokenUsageRecorder({\n endpoint: \"responses\",\n fallbackSessionId,\n model: payload.model,\n })\n\n const normalizedAgentMessageCount = normalizeGuardianAgentMessages(payload)\n if (normalizedAgentMessageCount > 0) {\n logger.debug(\n `Translated ${normalizedAgentMessageCount} Guardian agent message(s) to user messages before forwarding to Copilot Responses`,\n )\n }\n\n const sanitizedUnsupportedFieldCount = sanitizeUnsupportedInputFields(payload)\n if (sanitizedUnsupportedFieldCount > 0) {\n logger.debug(\n `Removed ${sanitizedUnsupportedFieldCount} unsupported input field(s) before forwarding to Copilot Responses`,\n )\n }\n\n const normalizedImageDetailCount = normalizeInputImageDetails(payload)\n if (normalizedImageDetailCount > 0) {\n logger.debug(\n `Normalized ${normalizedImageDetailCount} unsupported input image detail value(s) before forwarding to Copilot Responses`,\n )\n }\n\n removeUnsupportedTools(payload)\n fillEmptyNamespaceToolDescriptions(payload)\n\n if (!responsesHandlerDependencies.isResponsesApiWebSearchEnabled()) {\n removeWebSearchTool(payload)\n }\n\n const sanitizedImageCount = sanitizeOversizedInputImages(\n payload,\n selectedModel?.capabilities.limits.vision?.max_prompt_image_size,\n )\n if (sanitizedImageCount > 0) {\n logger.warn(\n `Omitted ${sanitizedImageCount} oversized input image(s) before forwarding to Copilot Responses`,\n )\n }\n\n // Smaller than the client compaction threshold, use server-side compaction to maintain cache hit rate\n const maxPromptTokens = selectedModel?.capabilities.limits.max_prompt_tokens\n const shouldCompactInput = applyResponsesApiContextManagement(\n payload,\n maxPromptTokens,\n {\n compactThresholdRatio: 0.8,\n source: \"responses\",\n },\n )\n if (shouldCompactInput) {\n compactInputByLatestCompaction(payload)\n }\n\n debugJson(logger, \"Translated Responses payload:\", payload)\n\n const { vision, initiator: inferredInitiator } =\n getResponsesRequestOptions(payload)\n const initiator = subagentMarker ? \"agent\" : inferredInitiator\n\n const response = await responsesHandlerDependencies.createResponses(payload, {\n vision,\n initiator,\n subagentMarker,\n requestId,\n sessionId: fallbackSessionId,\n clientSignal: c.req.raw.signal,\n transport: responsesTransport,\n })\n\n if (isStreamingRequested(payload) && isAsyncIterable(response)) {\n logger.debug(\"Forwarding native Responses stream\")\n return streamSSE(c, async (stream) => {\n const idTracker = createStreamIdTracker()\n let usage: UsageTokens = {}\n const iterator = response[Symbol.asyncIterator]()\n\n try {\n for await (const chunk of {\n [Symbol.asyncIterator]: () => iterator,\n }) {\n debugJson(logger, \"Responses stream chunk:\", chunk)\n const parsedEvent = parseResponsesStreamEvent(chunk)\n recordResponsesFirstToken(parsedEvent)\n if (\n parsedEvent?.type === \"response.completed\"\n || parsedEvent?.type === \"response.failed\"\n || parsedEvent?.type === \"response.incomplete\"\n ) {\n usage = {\n ...normalizeResponsesUsage(parsedEvent.response.usage),\n total_nano_aiu: normalizeOptionalToken(\n parsedEvent.copilot_usage?.total_nano_aiu,\n ),\n }\n }\n\n const processedData = fixStreamIds(\n (chunk as { data?: string }).data ?? \"\",\n (chunk as { event?: string }).event,\n idTracker,\n )\n\n await writeSSEIfConnected(stream, {\n id: (chunk as { id?: string }).id,\n event: (chunk as { event?: string }).event,\n data: processedData,\n })\n }\n } finally {\n await iterator.return?.()\n recordUsage(usage)\n }\n })\n }\n\n debugJsonTail(logger, \"Forwarding native Responses result:\", {\n value: response,\n tailLength: 400,\n })\n const result = response as ResponsesResult\n recordUsage({\n ...normalizeResponsesUsage(result.usage),\n total_nano_aiu: normalizeOptionalToken(\n result.copilot_usage?.total_nano_aiu,\n ),\n })\n return c.json(result)\n}\n\nconst isStreamingRequested = (payload: ResponsesPayload): boolean =>\n Boolean(payload.stream)\n\nconst shouldFallbackToMessages = (\n c: Context,\n modelId: string,\n selectedModel: { supported_endpoints?: Array<string> } | undefined,\n responsesTransport: ResponsesTransport | null,\n): boolean => {\n if (isCodexUserAgent(c.req.header(\"user-agent\"))) {\n return !(modelId.startsWith(\"gpt\") || modelId.startsWith(\"codex\"))\n }\n\n if (responsesTransport) {\n return false\n }\n\n const supportedEndpoints = selectedModel?.supported_endpoints ?? []\n return (\n supportedEndpoints.includes(\"/v1/messages\")\n || supportedEndpoints.includes(\"/chat/completions\")\n )\n}\n\nconst parseResponsesStreamEvent = (\n chunk: unknown,\n): ResponseStreamEvent | null => {\n const data = (chunk as { data?: string }).data\n if (!data || data === \"[DONE]\") {\n return null\n }\n\n try {\n return JSON.parse(data) as ResponseStreamEvent\n } catch {\n return null\n }\n}\n\nconst removeWebSearchTool = (payload: ResponsesPayload): void => {\n if (!Array.isArray(payload.tools) || payload.tools.length === 0) return\n\n payload.tools = payload.tools.filter((t) => {\n return t.type !== \"web_search\"\n })\n}\n\nconst COPILOT_UNSUPPORTED_TOOL_TYPES = new Set([\"image_generation\"])\nconst COPILOT_UNSUPPORTED_TOOL_NAMESPACES = new Set([\"image_gen\"])\n\nexport const removeUnsupportedTools = (payload: ResponsesPayload): void => {\n if (!Array.isArray(payload.tools) || payload.tools.length === 0) return\n\n const dropped: Array<string> = []\n payload.tools = payload.tools.filter((t) => {\n const type = t.type as string\n const name = \"name\" in t && typeof t.name === \"string\" ? t.name : undefined\n const isUnsupportedNamespace =\n type === \"namespace\"\n && name !== undefined\n && COPILOT_UNSUPPORTED_TOOL_NAMESPACES.has(name)\n if (COPILOT_UNSUPPORTED_TOOL_TYPES.has(type) || isUnsupportedNamespace) {\n dropped.push(isUnsupportedNamespace ? `${type}:${name}` : type)\n return false\n }\n return true\n })\n if (dropped.length > 0) {\n logger.debug(\"Removed unsupported tools:\", dropped)\n }\n}\n\nexport const fillEmptyNamespaceToolDescriptions = (\n payload: ResponsesPayload,\n): void => {\n fillEmptyNamespaceDescriptions(payload.tools)\n\n if (!Array.isArray(payload.input)) return\n\n for (const item of payload.input) {\n if (!item || typeof item !== \"object\") continue\n fillEmptyNamespaceDescriptions((item as Record<string, unknown>).tools)\n }\n}\n\nconst fillEmptyNamespaceDescriptions = (tools: unknown): void => {\n if (!Array.isArray(tools)) return\n\n for (const tool of tools) {\n if (!tool || typeof tool !== \"object\") continue\n\n const namespaceTool = tool as Record<string, unknown>\n if (\n namespaceTool.type === \"namespace\"\n && namespaceTool.description === \"\"\n && typeof namespaceTool.name === \"string\"\n ) {\n namespaceTool.description = namespaceTool.name\n }\n }\n}\n\nconst codexSubagentHeaderValues = new Set([\n \"collab_spawn\",\n \"compact\",\n \"memory_consolidation\",\n \"review\",\n])\n\nconst getCodexResponsesSubagentMarker = (\n c: Context,\n session: { rootSessionId?: string; sessionAffinity?: string },\n): SubagentMarker | null => {\n const agentType = getTrimmedHeader(c, \"x-openai-subagent\")\n if (!agentType || !codexSubagentHeaderValues.has(agentType)) {\n return null\n }\n\n const { rootSessionId, sessionAffinity } = session\n if (!sessionAffinity) {\n return null\n }\n\n return {\n agent_id: sessionAffinity,\n agent_type: agentType,\n session_id: rootSessionId ?? sessionAffinity,\n }\n}\n\nconst getTrimmedHeader = (c: Context, name: string): string | undefined => {\n const value = c.req.header(name)?.trim()\n return value || undefined\n}\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { zstdDecompressionMiddleware } from \"~/lib/zstd-request\"\n\nimport { handleResponses } from \"./handler\"\n\nexport const responsesRoutes = new Hono()\n\nresponsesRoutes.use(zstdDecompressionMiddleware)\n\nresponsesRoutes.post(\"/\", async (c) => {\n try {\n return await handleResponses(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { Hono, type Context } from \"hono\"\n\nimport {\n getTokenUsageDailySummary,\n getTokenUsageEventsPage,\n getTokenUsageSessionsPage,\n getTokenUsageSummary,\n type TokenUsagePeriod,\n} from \"~/lib/token-usage\"\n\nexport const tokenUsageRoute = new Hono()\n\nconst periods = new Set<TokenUsagePeriod>([\n \"today\",\n \"this_week\",\n \"last_7_days\",\n \"this_month\",\n \"last_30_days\",\n \"lifetime\",\n])\nconst DEFAULT_EVENTS_PAGE_SIZE = 20\n\nconst legacyPeriods: Record<string, TokenUsagePeriod> = {\n day: \"today\",\n week: \"last_7_days\",\n month: \"last_30_days\",\n}\n\nfunction parsePeriod(value: string | undefined): TokenUsagePeriod {\n if (periods.has(value as TokenUsagePeriod)) {\n return value as TokenUsagePeriod\n }\n\n return (value ? legacyPeriods[value] : undefined) ?? \"today\"\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n const parsed = Number.parseInt(value ?? \"\", 10)\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback\n}\n\ntokenUsageRoute.get(\"/\", async (c) => {\n const period = parsePeriod(c.req.query(\"period\"))\n const summary = await getTokenUsageSummary(period)\n return c.json(summary)\n})\n\ntokenUsageRoute.get(\"/daily\", async (c) => {\n const period = parsePeriod(c.req.query(\"period\"))\n const summary = await getTokenUsageDailySummary(period)\n return c.json(summary)\n})\n\nfunction parsePageQuery(c: Context) {\n return {\n period: parsePeriod(c.req.query(\"period\")),\n page: parsePositiveInt(c.req.query(\"page\"), 1),\n pageSize: parsePositiveInt(\n c.req.query(\"page_size\"),\n DEFAULT_EVENTS_PAGE_SIZE,\n ),\n }\n}\n\ntokenUsageRoute.get(\"/events\", async (c) =>\n c.json(await getTokenUsageEventsPage(parsePageQuery(c))),\n)\n\ntokenUsageRoute.get(\"/sessions\", async (c) =>\n c.json(await getTokenUsageSessionsPage(parsePageQuery(c))),\n)\n","import { z } from \"zod\"\nimport os from \"node:os\"\n\nimport { getGrokBuildVersion } from \"~/lib/grok-build\"\nimport { XAI_API_BASE_URL } from \"~/lib/oauth/xai\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { readXaiCredentials } from \"~/lib/xai-token\"\nimport { isGitHubCopilotEnabled } from \"~/lib/github-copilot-provider\"\nimport { getCopilotUsage } from \"~/services/github/get-copilot-usage\"\nimport { resolveProviderEndpointUrl } from \"~/services/providers/provider-proxy\"\nimport type {\n SubscriptionProvider,\n SubscriptionQuotaWindow,\n SubscriptionUsage,\n} from \"~/lib/types/subscription-usage\"\nimport {\n buildCodexRequestHeaders,\n CODEX_API_BASE_URL,\n} from \"~/services/codex/create-responses\"\n\n// Published @openai/codex stable version, checked on 2026-10-25.\nconst CODEX_CLI_VERSION = \"0.164.0\"\n\nconst amount = z\n .union([\n z.number().finite(),\n z\n .string()\n .trim()\n .min(1)\n .refine((value) => Number.isFinite(Number(value))),\n ])\n .transform(Number)\nconst number = z.number().finite()\nconst codexWindow = z.object({\n used_percent: number,\n limit_window_seconds: number.nullish(),\n reset_at: number.nullish(),\n reset_after_seconds: number.nullish(),\n})\nconst codexRateLimit = z.object({\n allowed: z.boolean().nullish(),\n limit_reached: z.boolean().nullish(),\n primary_window: codexWindow.nullish(),\n secondary_window: codexWindow.nullish(),\n})\n// Source: openai/codex codex-rs/codex-backend-openapi-models/src/models/.\nconst codexUsage = z.object({\n plan_type: z.string(),\n rate_limit: codexRateLimit.nullish(),\n additional_rate_limits: z\n .array(\n z.object({\n limit_name: z.string(),\n metered_feature: z.string(),\n rate_limit: codexRateLimit.nullish(),\n }),\n )\n .nullish(),\n credits: z\n .object({\n has_credits: z.boolean(),\n unlimited: z.boolean(),\n balance: amount.nullish(),\n })\n .nullish(),\n spend_control: z\n .object({\n reached: z.boolean(),\n individual_limit: z\n .object({\n limit: amount,\n used: amount,\n used_percent: number,\n reset_at: number.nullish(),\n reset_after_seconds: number.nullish(),\n })\n .nullish(),\n })\n .nullish(),\n rate_limit_reached_type: z.object({ type: z.string() }).nullish(),\n})\n\n// Grok Build extensions/billing.rs: proto3 JSON encodes zero cents as {}.\nconst cents = z.object({ val: amount.default(0) }).nullish()\nconst xaiUsage = z.object({\n config: z\n .object({\n creditUsagePercent: number.nullish(),\n currentPeriod: z\n .object({\n type: z.string().nullish(),\n end: z.string().nullish(),\n })\n .nullish(),\n monthlyLimit: cents,\n used: cents,\n onDemandCap: cents,\n onDemandUsed: cents,\n prepaidBalance: cents,\n billingPeriodEnd: z.string().nullish(),\n })\n .nullish(),\n subscription_tier: z.string().nullish(),\n})\n\nconst copilotQuota = z.object({\n entitlement: number.nullish(),\n remaining: number.nullish(),\n quota_remaining: number.nullish(),\n percent_remaining: number.nullish(),\n unlimited: z.boolean().nullish(),\n})\nconst copilotUsage = z.object({\n copilot_plan: z.string().nullish(),\n quota_reset_date: z.string().nullish(),\n quota_snapshots: z\n .object({\n premium_interactions: copilotQuota.nullish(),\n chat: copilotQuota.nullish(),\n completions: copilotQuota.nullish(),\n })\n .nullish(),\n})\n\n// OpenCode's Go usage API reports percentages and ISO reset times, not dollars.\n// Source: anomalyco/opencode packages/core/src/usage-limits.ts (GoUsage).\nconst opencodeGoWindow = z.object({\n status: z.enum([\"ok\", \"rate-limited\"]),\n percent: number,\n resetsAt: z.string().nullish(),\n})\nconst opencodeGoUsage = z.object({\n usage: z.object({\n rolling: opencodeGoWindow.nullish(),\n weekly: opencodeGoWindow.nullish(),\n monthly: opencodeGoWindow.nullish(),\n }),\n})\n\nexport function normalizeOpencodeGoUsage(value: unknown): SubscriptionUsage {\n const { usage } = opencodeGoUsage.parse(value)\n const windows: Array<SubscriptionQuotaWindow> = []\n for (const scope of [\"rolling\", \"weekly\", \"monthly\"] as const) {\n const window = usage[scope]\n if (!window) continue\n windows.push({\n id: `opencode-go:${scope}`,\n kind: \"usage\",\n windowSeconds: scope === \"rolling\" ? 18000 : undefined,\n period: scope === \"rolling\" ? undefined : scope,\n usedPercent: window.percent,\n resetAt: parseResetDate(window.resetsAt),\n limitReached: window.status === \"rate-limited\" || window.percent >= 100,\n })\n }\n return {\n provider: \"opencode-go\",\n windows,\n limitReached: windows.some((window) => window.limitReached),\n }\n}\n\nexport function normalizeCopilotUsage(value: unknown): SubscriptionUsage {\n const usage = copilotUsage.parse(value)\n const windows: Array<SubscriptionQuotaWindow> = []\n const labels = {\n premium_interactions: \"Premium\",\n chat: \"Chat\",\n completions: \"Completions\",\n }\n for (const id of [\"premium_interactions\", \"chat\", \"completions\"] as const) {\n const quota = usage.quota_snapshots?.[id]\n if (!quota) continue\n const remaining = quota.remaining ?? quota.quota_remaining\n const limit = quota.entitlement ?? undefined\n const remainingPercent =\n quota.percent_remaining\n ?? (limit !== undefined && limit > 0 && remaining != null ?\n (remaining / limit) * 100\n : undefined)\n if (\n !quota.unlimited\n && remainingPercent == null\n && remaining == null\n && limit === undefined\n )\n continue\n windows.push({\n id: `copilot:${id}`,\n kind: \"usage\",\n name: labels[id],\n unlimited: quota.unlimited ?? false,\n usedPercent:\n quota.unlimited || remainingPercent == null ?\n undefined\n : 100 - remainingPercent,\n used:\n limit !== undefined && remaining != null ?\n Math.max(0, limit - remaining)\n : undefined,\n limit,\n unit: \"requests\",\n resetDate: usage.quota_reset_date ?? undefined,\n limitReached:\n !quota.unlimited && remainingPercent != null && remainingPercent <= 0,\n })\n }\n return {\n provider: \"github-copilot\",\n planType: usage.copilot_plan ?? undefined,\n windows,\n limitReached: windows.some((window) => window.limitReached),\n }\n}\n\nfunction resetAt(\n window: { reset_at?: number | null; reset_after_seconds?: number | null },\n now: number,\n): number | undefined {\n return (\n window.reset_at\n ?? (window.reset_after_seconds == null ?\n undefined\n : Math.floor(now / 1000) + window.reset_after_seconds)\n )\n}\n\nexport function normalizeCodexUsage(\n value: unknown,\n now = Date.now(),\n): SubscriptionUsage {\n const usage = codexUsage.parse(value)\n const windows: Array<SubscriptionQuotaWindow> = []\n const addWindows = (\n id: string,\n limits: z.infer<typeof codexRateLimit> | null | undefined,\n name?: string,\n ) => {\n for (const scope of [\"primary_window\", \"secondary_window\"] as const) {\n const window = limits?.[scope]\n if (!window) continue\n windows.push({\n id: `${id}:${scope}`,\n kind: \"usage\",\n name,\n usedPercent: window.used_percent,\n windowSeconds: window.limit_window_seconds ?? undefined,\n resetAt: resetAt(window, now),\n limitReached:\n limits?.limit_reached === true || limits?.allowed === false,\n })\n }\n }\n addWindows(\"codex\", usage.rate_limit)\n for (const [index, limit] of (usage.additional_rate_limits ?? []).entries()) {\n addWindows(\n `${limit.metered_feature}:${index}`,\n limit.rate_limit,\n limit.limit_name,\n )\n }\n const spend = usage.spend_control?.individual_limit\n if (spend) {\n windows.push({\n id: \"individual-limit\",\n kind: \"spend\",\n period: \"monthly\",\n usedPercent: spend.used_percent,\n used: spend.used,\n limit: spend.limit,\n unit: \"credits\",\n resetAt: resetAt(spend, now),\n limitReached: usage.spend_control?.reached,\n })\n }\n return {\n provider: \"codex\",\n planType: usage.plan_type,\n windows,\n credits:\n usage.credits ?\n {\n balance: usage.credits.balance ?? undefined,\n unlimited: usage.credits.unlimited,\n hasCredits: usage.credits.has_credits,\n unit: \"credits\",\n }\n : undefined,\n limitReached:\n usage.rate_limit?.limit_reached === true\n || usage.rate_limit?.allowed === false\n || usage.spend_control?.reached === true\n || (usage.rate_limit_reached_type != null\n && usage.rate_limit_reached_type.type !== \"unknown\"),\n limitReason: usage.rate_limit_reached_type?.type,\n }\n}\n\nfunction parseResetDate(value: string | null | undefined): number | undefined {\n const milliseconds = value ? Date.parse(value) : NaN\n return Number.isFinite(milliseconds) ? milliseconds / 1000 : undefined\n}\n\nexport function normalizeXaiUsage(value: unknown): SubscriptionUsage {\n const usage = xaiUsage.parse(value)\n const config = usage.config\n const windows: Array<SubscriptionQuotaWindow> = []\n if (config) {\n const limit = config.monthlyLimit?.val\n const used = config.used?.val\n const usedPercent =\n config.creditUsagePercent\n ?? (limit !== undefined && limit > 0 && used !== undefined ?\n (used / limit) * 100\n : undefined)\n if (usedPercent != null || limit !== undefined || used !== undefined) {\n windows.push({\n id: \"included\",\n kind: \"usage\",\n period:\n config.currentPeriod?.type === \"USAGE_PERIOD_TYPE_WEEKLY\" ? \"weekly\"\n : (\n config.currentPeriod?.type === \"USAGE_PERIOD_TYPE_MONTHLY\"\n || config.monthlyLimit\n ) ?\n \"monthly\"\n : undefined,\n usedPercent,\n // New credits-config percentages supersede the deprecated dollar budget.\n used:\n config.creditUsagePercent == null && used !== undefined ?\n used / 100\n : undefined,\n limit:\n config.creditUsagePercent == null && limit !== undefined ?\n limit / 100\n : undefined,\n unit: \"USD\",\n resetAt: parseResetDate(\n config.currentPeriod?.end ?? config.billingPeriodEnd,\n ),\n })\n }\n if (config.onDemandCap || config.onDemandUsed) {\n const cap = Math.abs(config.onDemandCap?.val ?? 0)\n const spent = Math.abs(config.onDemandUsed?.val ?? 0)\n windows.push({\n id: \"on-demand\",\n kind: \"on-demand\",\n period: \"monthly\",\n unit: \"USD\",\n used: spent / 100,\n limit: cap / 100,\n usedPercent: cap > 0 ? (spent / cap) * 100 : undefined,\n })\n }\n }\n return {\n provider: \"xai\",\n planType: usage.subscription_tier ?? undefined,\n windows,\n credits:\n config?.prepaidBalance ?\n {\n balance: Math.abs(config.prepaidBalance.val) / 100,\n unlimited: false,\n hasCredits: config.prepaidBalance.val !== 0,\n unit: \"USD\",\n }\n : undefined,\n limitReached:\n (windows.find((window) => window.id === \"included\")?.usedPercent ?? 0)\n >= 100,\n }\n}\n\nexport async function getSubscriptionUsage(\n provider: SubscriptionProvider,\n signal?: AbortSignal,\n): Promise<SubscriptionUsage | null> {\n if (provider === \"github-copilot\") {\n if (!isGitHubCopilotEnabled()) return null\n const timeout = AbortSignal.timeout(15_000)\n const usage = await getCopilotUsage(\n undefined,\n signal ? AbortSignal.any([signal, timeout]) : timeout,\n )\n return usage ? normalizeCopilotUsage(usage) : null\n }\n const config = await resolveProviderConfig(provider)\n if (!config) return null\n if (provider !== \"opencode-go\" && config.authType !== \"oauth2\") return null\n\n let headers: Headers\n let url: string\n if (provider === \"opencode-go\") {\n url = resolveProviderEndpointUrl(config, \"usage\")\n headers = new Headers({\n Authorization: `Bearer ${config.apiKey}`,\n Accept: \"application/json\",\n })\n } else if (provider === \"codex\") {\n // Match codex-login's default_client UA format and backend account scoping.\n const platform =\n process.platform === \"win32\" ? \"Windows\"\n : process.platform === \"darwin\" ? \"Mac OS\"\n : os.type()\n const arch =\n process.arch === \"x64\" ? \"x86_64\"\n : process.arch === \"arm64\" ? \"aarch64\"\n : process.arch\n headers = buildCodexRequestHeaders(\n new Headers({\n \"user-agent\": `codex_cli_rs/${CODEX_CLI_VERSION} (${platform} ${os.release()}; ${arch}) unknown`,\n originator: \"codex_cli_rs\",\n accept: \"application/json\",\n }),\n )\n url = `${CODEX_API_BASE_URL}/wham/usage`\n } else {\n const credentials = await readXaiCredentials()\n if (!credentials) return null\n if (credentials.accessToken !== config.apiKey) {\n throw new Error(\"Subscription account changed during the usage query\")\n }\n const version = await getGrokBuildVersion()\n const platform =\n process.platform === \"win32\" ? \"windows\"\n : process.platform === \"darwin\" ? \"macos\"\n : process.platform\n const arch =\n process.arch === \"x64\" ? \"x86_64\"\n : process.arch === \"arm64\" ? \"aarch64\"\n : process.arch\n headers = new Headers({\n Authorization: `Bearer ${config.apiKey}`,\n \"X-XAI-Token-Auth\": \"xai-grok-cli\",\n \"x-userid\": credentials.accountId,\n \"x-grok-client-version\": version,\n \"x-grok-client-mode\": \"headless\",\n \"User-Agent\": `grok-shell/${version} (${platform}; ${arch})`,\n Accept: \"application/json\",\n })\n url = `${XAI_API_BASE_URL}/v1/billing?format=credits`\n }\n const timeout = AbortSignal.timeout(15_000)\n const response = await fetch(url, {\n headers,\n signal: signal ? AbortSignal.any([signal, timeout]) : timeout,\n redirect: \"error\",\n })\n // OpenCode's usage client treats 403 as a workspace without a Go allowance.\n if (provider === \"opencode-go\" && response.status === 403) {\n await response.body?.cancel()\n return null\n }\n if (!response.ok) {\n await response.body?.cancel()\n // Never expose the upstream body: it can contain account details.\n throw new Error(\n `Subscription usage request failed (HTTP ${response.status})`,\n )\n }\n const value: unknown = await response.json()\n if (provider === \"opencode-go\") return normalizeOpencodeGoUsage(value)\n return provider === \"codex\" ?\n normalizeCodexUsage(value)\n : normalizeXaiUsage(value)\n}\n","import { Hono } from \"hono\"\n\nimport { getCopilotUsage } from \"~/services/github/get-copilot-usage\"\nimport { getSubscriptionUsage } from \"~/services/subscription-usage\"\n\nexport const usageRoute = new Hono()\n\nusageRoute.get(\"/:provider\", async (c) => {\n const provider = c.req.param(\"provider\")\n c.header(\"Cache-Control\", \"no-store\")\n if (\n provider !== \"codex\"\n && provider !== \"xai\"\n && provider !== \"github-copilot\"\n && provider !== \"opencode-go\"\n ) {\n return c.json({ error: \"Unsupported subscription provider\" }, 404)\n }\n try {\n const usage = await getSubscriptionUsage(provider, c.req.raw.signal)\n return usage ?\n c.json(usage)\n : c.json({ error: \"Subscription account is not available\" }, 404)\n } catch {\n return c.json({ error: \"Failed to fetch subscription usage\" }, 502)\n }\n})\n\nusageRoute.get(\"/\", async (c) => {\n try {\n const usage = await getCopilotUsage()\n return c.json(usage)\n } catch (error) {\n console.error(\"Error fetching Copilot usage:\", error)\n return c.json({ error: \"Failed to fetch Copilot usage\" }, 500)\n }\n})\n","import {\n getUpstreamTransportConfig,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport {\n buildProviderUpstreamHeaders,\n resolveProviderEndpointUrl,\n} from \"~/services/providers/provider-proxy\"\nimport { fetchUpstreamWithLifecycle } from \"~/services/upstream-http\"\n\nexport class XaiVideosRequestError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"XaiVideosRequestError\"\n }\n}\n\nexport type XaiVideoRequest =\n | {\n operation: \"generations\"\n payload: Record<string, unknown> & { model: string }\n }\n | { operation: \"result\"; requestId: string }\n\nfunction encodeRequestId(requestId: string): string {\n if (\n !requestId.trim()\n || requestId === \".\"\n || requestId === \"..\"\n || /[/\\\\]/u.test(requestId)\n ) {\n throw new XaiVideosRequestError(\"request_id must be a single path segment\")\n }\n return encodeURIComponent(requestId)\n}\n\n/** Submits or queries a native xAI video job without polling or retrying. */\nexport async function forwardXaiVideos(\n providerConfig: ResolvedProviderConfig,\n request: Request,\n videoRequest: XaiVideoRequest,\n): Promise<Response> {\n const endpoint =\n videoRequest.operation === \"generations\" ?\n \"videos/generations\"\n : `videos/${encodeRequestId(videoRequest.requestId)}`\n const upstreamUrl = new URL(\n resolveProviderEndpointUrl(providerConfig, endpoint),\n )\n upstreamUrl.search = new URL(request.url).search\n\n const headers = buildProviderUpstreamHeaders(providerConfig, request.headers)\n const transport = getUpstreamTransportConfig()\n\n return await fetchUpstreamWithLifecycle(\n upstreamUrl,\n {\n method: videoRequest.operation === \"generations\" ? \"POST\" : \"GET\",\n headers,\n body:\n videoRequest.operation === \"generations\" ?\n JSON.stringify(videoRequest.payload)\n : undefined,\n },\n {\n clientSignal: request.signal,\n headersTimeoutMs: transport.headersTimeoutMs,\n streamInactivityTimeoutMs: transport.streamInactivityTimeoutMs,\n },\n )\n}\n","import { Hono, type Context } from \"hono\"\n\nimport { resolveMappedModel } from \"~/lib/config\"\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { parseProviderModelAlias } from \"~/lib/provider-model\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { createProviderProxyResponse } from \"~/services/providers/provider-proxy\"\nimport {\n forwardXaiVideos,\n type XaiVideoRequest,\n XaiVideosRequestError,\n} from \"~/services/xai/videos\"\n\nconst logger = createHandlerLogger(\"videos-handler\")\nconst SUPPORTED_VIDEO_MODEL = \"grok-imagine-video-1.5\"\n\nexport const videoRouteDependencies = {\n resolveMappedModel,\n resolveProviderConfig,\n}\n\nexport const videoRoutes = new Hono()\n\nasync function parseGenerationRequest(\n request: Request,\n): Promise<XaiVideoRequest> {\n let payload: unknown\n try {\n payload = await request.json()\n } catch {\n throw new XaiVideosRequestError(\"Video generation body must be JSON\")\n }\n\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n throw new XaiVideosRequestError(\n \"Video generation body must be a JSON object\",\n )\n }\n if (\n !(\"model\" in payload)\n || typeof payload.model !== \"string\"\n || !payload.model.trim()\n ) {\n throw new XaiVideosRequestError(\"model is required and must be a string\")\n }\n\n const mappedModel = videoRouteDependencies.resolveMappedModel(payload.model)\n const alias = parseProviderModelAlias(mappedModel)\n if (\n alias?.provider.toLowerCase() !== \"xai\"\n || alias.model !== SUPPORTED_VIDEO_MODEL\n ) {\n throw new XaiVideosRequestError(\n `Video generation only supports xai/${SUPPORTED_VIDEO_MODEL}`,\n )\n }\n\n return {\n operation: \"generations\",\n payload: { ...payload, model: alias.model },\n }\n}\n\nasync function handleVideos(\n c: Context,\n operation: XaiVideoRequest[\"operation\"],\n): Promise<Response> {\n try {\n c.req.raw.signal.throwIfAborted()\n const videoRequest: XaiVideoRequest =\n operation === \"generations\" ?\n await parseGenerationRequest(c.req.raw)\n : { operation: \"result\", requestId: c.req.param(\"request_id\") ?? \"\" }\n const providerConfig =\n await videoRouteDependencies.resolveProviderConfig(\"xai\")\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: \"Provider 'xai' not found or disabled\",\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n const upstreamResponse = await forwardXaiVideos(\n providerConfig,\n c.req.raw,\n videoRequest,\n )\n debugJson(logger, `videos.${operation}.response`, {\n statusCode: upstreamResponse.status,\n })\n return createProviderProxyResponse(upstreamResponse)\n } catch (error) {\n if (error instanceof XaiVideosRequestError && !c.req.raw.signal.aborted) {\n return c.json(\n { error: { message: error.message, type: \"invalid_request_error\" } },\n 400,\n )\n }\n logger.error(`videos.${operation}.error`, { error })\n return await forwardError(c, error)\n }\n}\n\nvideoRoutes.post(\"/generations\", (c) => handleVideos(c, \"generations\"))\nvideoRoutes.get(\"/:request_id\", (c) => handleVideos(c, \"result\"))\n","import { Hono, type Context } from \"hono\"\nimport { cors } from \"hono/cors\"\nimport { logger } from \"hono/logger\"\nimport { readFileSync } from \"node:fs\"\n\nimport {\n createAuthMiddleware,\n getConfiguredAdminApiKeys,\n} from \"./lib/request-auth\"\nimport { traceIdMiddleware } from \"./lib/trace\"\nimport type { GatewayPlugins } from \"./lib/gateway-plugins\"\nimport { requestEventsMiddleware } from \"./lib/request-events\"\nimport { alphaSearchRoutes } from \"./routes/alpha-search/route\"\nimport { completionRoutes } from \"./routes/chat-completions/route\"\nimport { configRoutes } from \"./routes/admin/config/route\"\nimport { embeddingRoutes } from \"./routes/embeddings/route\"\nimport { imageRoutes } from \"./routes/images/route\"\nimport { messageRoutes } from \"./routes/messages/route\"\nimport { modelRoutes } from \"./routes/models/route\"\nimport { providerAlphaSearchRoutes } from \"./routes/provider/alpha-search/route\"\nimport { providerImageRoutes } from \"./routes/provider/images/route\"\nimport { providerMessageRoutes } from \"./routes/provider/messages/route\"\nimport { providerModelRoutes } from \"./routes/provider/models/route\"\nimport { providerResponsesRoutes } from \"./routes/provider/responses/route\"\nimport { responsesRoutes } from \"./routes/responses/route\"\nimport { tokenUsageRoute } from \"./routes/token-usage/route\"\nimport { usageRoute } from \"./routes/usage/route\"\nimport { videoRoutes } from \"./routes/videos/route\"\nexport interface CreateServerOptions {\n networkExposed?: boolean\n getApiKeys?: () => Array<string>\n port?: number\n plugins?: GatewayPlugins\n}\n\nfunction resolveSameOriginCorsOrigin(\n origin: string,\n context: Context,\n): string | null {\n if (!origin) {\n return null\n }\n\n try {\n return origin === new URL(context.req.url).origin ? origin : null\n } catch {\n return null\n }\n}\n\nexport function createServer(options: CreateServerOptions = {}): Hono {\n const server = new Hono()\n const networkExposed = options.networkExposed ?? false\n\n server.use(traceIdMiddleware)\n server.use(logger())\n server.use(\n networkExposed ? cors({ origin: resolveSameOriginCorsOrigin }) : cors(),\n )\n server.use(\n \"*\",\n createAuthMiddleware({\n getApiKeys: options.getApiKeys,\n allowUnauthenticatedPaths: [\"/\", \"/usage-viewer\", \"/usage-viewer/\"],\n shouldSkipPath: (path) => path.startsWith(\"/admin/\"),\n allowWhenNoApiKeys: !networkExposed,\n }),\n )\n server.use(\n \"/admin/*\",\n createAuthMiddleware({\n getApiKeys: getConfiguredAdminApiKeys,\n allowUnauthenticatedPaths: [],\n allowWhenNoApiKeys: false,\n }),\n )\n\n server.use(\n \"*\",\n requestEventsMiddleware(options.plugins, options.port ?? 4141),\n )\n\n server.get(\"/\", (c) => c.text(\"Server running\"))\n server.get(\"/usage-viewer\", (c) => {\n const usageViewerFileUrl = new URL(\"../pages/index.html\", import.meta.url)\n return c.html(readFileSync(usageViewerFileUrl, \"utf8\"))\n })\n server.get(\"/usage-viewer/\", (c) => c.redirect(\"/usage-viewer\", 301))\n\n server.route(\"/chat/completions\", completionRoutes)\n server.route(\"/admin/config\", configRoutes)\n server.route(\"/models\", modelRoutes)\n server.route(\"/embeddings\", embeddingRoutes)\n server.route(\"/usage\", usageRoute)\n server.route(\"/token-usage\", tokenUsageRoute)\n server.route(\"/responses\", responsesRoutes)\n server.route(\"/alpha/search\", alphaSearchRoutes)\n server.route(\"/images\", imageRoutes)\n server.route(\"/videos\", videoRoutes)\n\n // Compatibility with tools that expect v1/ prefix\n server.route(\"/v1/chat/completions\", completionRoutes)\n server.route(\"/v1/models\", modelRoutes)\n server.route(\"/v1/embeddings\", embeddingRoutes)\n server.route(\"/v1/responses\", responsesRoutes)\n server.route(\"/v1/alpha/search\", alphaSearchRoutes)\n server.route(\"/v1/images\", imageRoutes)\n server.route(\"/v1/videos\", videoRoutes)\n\n // Anthropic compatible endpoints\n server.route(\"/v1/messages\", messageRoutes)\n\n // Provider scoped endpoints\n server.route(\"/:provider/v1/messages\", providerMessageRoutes)\n server.route(\"/:provider/v1/models\", providerModelRoutes)\n server.route(\"/:provider/v1/responses\", providerResponsesRoutes)\n server.route(\"/:provider/v1/alpha/search\", providerAlphaSearchRoutes)\n server.route(\"/:provider/v1/images\", providerImageRoutes)\n\n server.route(\"/:provider/models\", providerModelRoutes)\n server.route(\"/:provider/responses\", providerResponsesRoutes)\n server.route(\"/:provider/alpha/search\", providerAlphaSearchRoutes)\n server.route(\"/:provider/images\", providerImageRoutes)\n\n return server\n}\n\nexport const server = createServer()\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}