@jeffreycao/copilot-api 1.10.25 → 1.10.27

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-BjfSGNZV.js","names":["resolveTraceId","runtimeInitialized","fs","getHeaderValue","logger","handleCompletion","isNonStreaming","handleCompletion","THINKING_TEXT","logger","THINKING_TEXT","handleOutputItemAdded","handleOutputItemDone","isConfiguredResponsesApiContextManagementEnabled","isConfiguredResponsesApiWebSocketEnabled","logger","getCodexModels","isResponsesStream","uniqueIndexes","createCopilotChatCompletions","createCopilotMessages","createCopilotResponses","isAsyncIterable","logger","logger","getCodexModels","logger","getCodexModels","logger","checkConfiguredRateLimit","createCopilotResponses","isConfiguredResponsesApiWebSearchEnabled"],"sources":["../src/lib/request-auth.ts","../src/lib/trace.ts","../src/lib/approval.ts","../src/lib/process-cleanup.ts","../src/lib/logger.ts","../src/lib/rate-limit.ts","../src/lib/event-bus.ts","../src/lib/sqlite.ts","../src/lib/token-usage/store.ts","../src/lib/token-usage/index.ts","../src/lib/copilot-rate-limit.ts","../src/services/copilot/create-chat-completions.ts","../src/routes/chat-completions/handler.ts","../src/routes/chat-completions/route.ts","../src/routes/admin/config/route.ts","../src/services/copilot/create-embeddings.ts","../src/routes/embeddings/route.ts","../src/lib/provider-model.ts","../src/lib/tokenizer.ts","../src/lib/provider-resolver.ts","../src/routes/messages/utils.ts","../src/routes/messages/non-stream-translation.ts","../src/lib/models.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/stream-translation.ts","../src/services/copilot/create-responses.ts","../src/routes/messages/responses-translation.ts","../src/routes/messages/responses-stream-translation.ts","../src/routes/responses/utils.ts","../src/services/codex/get-models.ts","../src/services/providers/provider-proxy.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/routes/models/route.ts","../src/routes/provider/messages/route.ts","../src/routes/provider/models/route.ts","../src/routes/provider/responses/handler.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/routes/token/route.ts","../src/routes/usage/route.ts","../src/server.ts"],"sourcesContent":["import type { Context, MiddlewareHandler } from \"hono\"\n\nimport consola from \"consola\"\n\nimport { getConfig } from \"./config\"\n\ninterface AuthMiddlewareOptions {\n getApiKeys?: () => Array<string>\n allowUnauthenticatedPaths?: Array<string>\n allowOptionsBypass?: boolean\n allowWhenNoApiKeys?: boolean\n shouldSkipPath?: (path: string) => boolean\n}\n\nexport function normalizeApiKeys(apiKeys: unknown): Array<string> {\n if (!Array.isArray(apiKeys)) {\n if (apiKeys !== undefined) {\n consola.warn(\"Invalid auth.apiKeys config. Expected an array of strings.\")\n }\n return []\n }\n\n const normalizedKeys = apiKeys\n .filter((key): key is string => typeof key === \"string\")\n .map((key) => key.trim())\n .filter((key) => key.length > 0)\n\n if (normalizedKeys.length !== apiKeys.length) {\n consola.warn(\n \"Invalid auth.apiKeys entries found. Only non-empty strings are allowed.\",\n )\n }\n\n return [...new Set(normalizedKeys)]\n}\n\nexport function getConfiguredApiKeys(): Array<string> {\n const config = getConfig()\n return normalizeApiKeys(config.auth?.apiKeys)\n}\n\nfunction normalizeApiKey(apiKey: unknown): string | null {\n if (typeof apiKey !== \"string\") {\n return null\n }\n\n const normalizedApiKey = apiKey.trim()\n return normalizedApiKey || null\n}\n\nexport function getConfiguredAdminApiKeys(): Array<string> {\n const config = getConfig()\n const adminApiKey = normalizeApiKey(config.auth?.adminApiKey)\n return adminApiKey ? [adminApiKey] : []\n}\n\nexport function extractRequestApiKey(c: Context): string | null {\n const xApiKey = c.req.header(\"x-api-key\")?.trim()\n if (xApiKey) {\n return xApiKey\n }\n\n const authorization = c.req.header(\"authorization\")\n if (!authorization) {\n return null\n }\n\n const [scheme, ...rest] = authorization.trim().split(/\\s+/)\n if (scheme.toLowerCase() !== \"bearer\") {\n return null\n }\n\n const bearerToken = rest.join(\" \").trim()\n return bearerToken || null\n}\n\nfunction createUnauthorizedResponse(c: Context): Response {\n c.header(\"WWW-Authenticate\", 'Bearer realm=\"copilot-api\"')\n return c.json(\n {\n error: {\n message: \"Unauthorized\",\n type: \"authentication_error\",\n },\n },\n 401,\n )\n}\n\nexport function createAuthMiddleware(\n options: AuthMiddlewareOptions = {},\n): MiddlewareHandler {\n const getApiKeys = options.getApiKeys ?? getConfiguredApiKeys\n const allowUnauthenticatedPaths = options.allowUnauthenticatedPaths ?? [\"/\"]\n const allowOptionsBypass = options.allowOptionsBypass ?? true\n const allowWhenNoApiKeys = options.allowWhenNoApiKeys ?? true\n const shouldSkipPath = options.shouldSkipPath ?? (() => false)\n\n return async (c, next) => {\n if (allowOptionsBypass && c.req.method === \"OPTIONS\") {\n return next()\n }\n\n if (shouldSkipPath(c.req.path)) {\n return next()\n }\n\n if (allowUnauthenticatedPaths.includes(c.req.path)) {\n return next()\n }\n\n const apiKeys = getApiKeys()\n if (apiKeys.length === 0) {\n return allowWhenNoApiKeys ? next() : createUnauthorizedResponse(c)\n }\n\n const requestApiKey = extractRequestApiKey(c)\n if (!requestApiKey || !apiKeys.includes(requestApiKey)) {\n return createUnauthorizedResponse(c)\n }\n\n return next()\n }\n}\n","import type { MiddlewareHandler } from \"hono\"\n\nimport { requestContext, resolveTraceId } from \"./request-context\"\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:\n c.req.header(\"x-session-affinity\") ?? c.req.header(\"x-client-request-id\"),\n parentSessionId: c.req.header(\"x-parent-session-id\"),\n }\n\n await requestContext.run(context, async () => {\n await next()\n })\n}\n","import consola from \"consola\"\n\nimport { HTTPError } from \"./error\"\n\nexport const awaitApproval = async () => {\n const response = await consola.prompt(`Accept incoming request?`, {\n type: \"confirm\",\n })\n\n if (!response)\n throw new HTTPError(\n \"Request rejected\",\n Response.json({ message: \"Request rejected\" }, { status: 403 }),\n )\n}\n","type CleanupHandler = () => void | Promise<void>\n\nconst cleanupHandlers = new Set<CleanupHandler>()\n\nlet cleanupPromise: Promise<void> | null = null\nlet cleanupState: \"idle\" | \"running\" | \"done\" = \"idle\"\nlet runtimeInitialized = false\n\nfunction initializeProcessCleanupRuntime(): void {\n if (runtimeInitialized) {\n return\n }\n\n runtimeInitialized = true\n\n process.once(\"beforeExit\", () => {\n void runProcessCleanups()\n })\n process.once(\"exit\", runProcessCleanupsSync)\n process.once(\"SIGINT\", () => {\n void shutdownProcess(0)\n })\n process.once(\"SIGTERM\", () => {\n void shutdownProcess(0)\n })\n}\n\nfunction runProcessCleanupsSync(): void {\n if (cleanupState !== \"idle\") {\n return\n }\n\n cleanupState = \"done\"\n for (const handler of Array.from(cleanupHandlers)) {\n try {\n void handler()\n } catch {\n // Ignore best-effort cleanup failures during process exit.\n }\n }\n}\n\nasync function runProcessCleanups(): Promise<void> {\n if (cleanupPromise) {\n return cleanupPromise\n }\n\n if (cleanupState === \"done\") {\n return\n }\n\n cleanupState = \"running\"\n cleanupPromise = (async () => {\n for (const handler of Array.from(cleanupHandlers)) {\n await handler()\n }\n cleanupState = \"done\"\n })()\n\n return cleanupPromise\n}\n\nasync function shutdownProcess(exitCode: number): Promise<void> {\n try {\n await runProcessCleanups()\n } finally {\n process.exit(exitCode)\n }\n}\n\nexport function registerProcessCleanup(handler: CleanupHandler): () => void {\n initializeProcessCleanupRuntime()\n cleanupHandlers.add(handler)\n\n return () => {\n cleanupHandlers.delete(handler)\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 = path.join(PATHS.APP_DIR, \"logs\")\nconst FLUSH_INTERVAL_MS = 1000\nconst MAX_BUFFER_SIZE = 100\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\n\nconst ensureLogDirectory = () => {\n if (!fs.existsSync(LOG_DIR)) {\n fs.mkdirSync(LOG_DIR, { recursive: true })\n }\n}\n\nconst cleanupOldLogs = () => {\n if (!fs.existsSync(LOG_DIR)) {\n return\n }\n\n const now = Date.now()\n\n for (const entry of fs.readdirSync(LOG_DIR)) {\n const filePath = path.join(LOG_DIR, entry)\n\n let stats: fs.Stats\n try {\n stats = fs.statSync(filePath)\n } catch {\n continue\n }\n\n if (!stats.isFile()) {\n continue\n }\n\n if (now - stats.mtimeMs > LOG_RETENTION_MS) {\n try {\n fs.rmSync(filePath)\n } catch {\n continue\n }\n }\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 || 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 logBuffers.set(filePath, [])\n}\n\nconst flushAllBuffers = () => {\n for (const filePath of logBuffers.keys()) {\n flushBuffer(filePath)\n }\n}\n\nconst cleanup = () => {\n if (flushInterval) {\n clearInterval(flushInterval)\n flushInterval = undefined\n }\n if (cleanupInterval) {\n clearInterval(cleanupInterval)\n cleanupInterval = undefined\n }\n\n flushAllBuffers()\n for (const stream of logStreams.values()) {\n stream.end()\n }\n logStreams.clear()\n logBuffers.clear()\n}\n\nconst initializeLoggerRuntime = () => {\n if (runtimeInitialized) {\n return\n }\n\n runtimeInitialized = true\n\n ensureLogDirectory()\n cleanupOldLogs()\n\n flushInterval = setInterval(flushAllBuffers, FLUSH_INTERVAL_MS)\n maybeUnref(flushInterval)\n\n cleanupInterval = setInterval(cleanupOldLogs, CLEANUP_INTERVAL_MS)\n maybeUnref(cleanupInterval)\n\n registerProcessCleanup(cleanup)\n}\n\nconst getLogStream = (filePath: string): fs.WriteStream => {\n initializeLoggerRuntime()\n\n let stream = logStreams.get(filePath)\n if (!stream || stream.destroyed) {\n stream = fs.createWriteStream(filePath, { flags: \"a\" })\n logStreams.set(filePath, stream)\n\n stream.on(\"error\", (error: unknown) => {\n console.warn(\"Log stream error\", error)\n logStreams.delete(filePath)\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\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 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(LOG_DIR, `${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 appendLine(filePath, line)\n },\n })\n\n return instance\n}\n","import consola from \"consola\"\n\nimport type { State } from \"./state\"\n\nimport { HTTPError } from \"./error\"\nimport { sleep } from \"./utils\"\n\nexport async function checkRateLimit(state: State) {\n if (state.rateLimitSeconds === undefined) return\n\n const now = Date.now()\n\n if (!state.lastRequestTimestamp) {\n state.lastRequestTimestamp = now\n return\n }\n\n const elapsedSeconds = (now - state.lastRequestTimestamp) / 1000\n\n if (elapsedSeconds > state.rateLimitSeconds) {\n state.lastRequestTimestamp = now\n return\n }\n\n const waitTimeSeconds = Math.ceil(state.rateLimitSeconds - elapsedSeconds)\n\n if (!state.rateLimitWait) {\n consola.warn(\n `Rate limit exceeded. Need to wait ${waitTimeSeconds} more seconds.`,\n )\n throw new HTTPError(\n \"Rate limit exceeded\",\n Response.json({ message: \"Rate limit exceeded\" }, { status: 429 }),\n )\n }\n\n const waitTimeMs = waitTimeSeconds * 1000\n consola.warn(\n `Rate limit reached. Waiting ${waitTimeSeconds} seconds before proceeding...`,\n )\n await sleep(waitTimeMs)\n // eslint-disable-next-line require-atomic-updates\n state.lastRequestTimestamp = now\n consola.info(\"Rate limit wait completed, proceeding with request\")\n return\n}\n","export type EventBusHandler<Event> = (event: Event) => void\n\nexport class EventBus<Events extends object> {\n private readonly handlers = new Map<\n keyof Events,\n Set<EventBusHandler<Events[keyof Events]>>\n >()\n\n publish<Name extends keyof Events>(name: Name, event: Events[Name]): void {\n const handlers = this.handlers.get(name)\n if (!handlers) {\n return\n }\n\n for (const handler of Array.from(handlers)) {\n handler(event)\n }\n }\n\n subscribe<Name extends keyof Events>(\n name: Name,\n handler: EventBusHandler<Events[Name]>,\n ): () => void {\n let handlers = this.handlers.get(name)\n if (!handlers) {\n handlers = new Set<EventBusHandler<Events[keyof Events]>>()\n this.handlers.set(name, handlers)\n }\n\n const registeredHandler = handler as EventBusHandler<Events[keyof Events]>\n handlers.add(registeredHandler)\n\n return () => {\n handlers.delete(registeredHandler)\n if (handlers.size === 0) {\n this.handlers.delete(name)\n }\n }\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 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 }\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 { 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 = \"day\" | \"week\" | \"month\"\n\nexport interface UsageTokens {\n cache_creation_input_tokens?: number | null\n cache_read_input_tokens?: number | null\n input_tokens?: number | null\n output_tokens?: number | null\n total_tokens?: number | null\n}\n\nexport interface PersistedTokenUsageEvent {\n cache_creation_input_tokens: number\n cache_read_input_tokens: number\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_tokens: number\n trace_id: string\n user_id: string\n}\n\nexport interface TokenUsageTotals {\n cache_creation_input_tokens: number\n cache_read_input_tokens: number\n input_tokens: number\n output_tokens: number\n request_count: number\n total_tokens: number\n}\n\nexport interface TokenUsageModelSummary extends TokenUsageTotals {\n model: string\n}\n\nexport interface TokenUsageEventRecord {\n cache_creation_input_tokens: number\n cache_read_input_tokens: number\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_tokens: number\n trace_id: 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\nexport interface TokenUsageEventsPage {\n items: Array<TokenUsageEventRecord>\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\nconst DB_PATH_ENV = \"COPILOT_API_SQLITE_DB_PATH\"\nconst DEFAULT_DB_FILENAME = \"copilot-api.sqlite\"\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 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 )\n `)\n ensureColumn(db, \"user_id\", \"TEXT NOT NULL DEFAULT ''\")\n ensureColumn(db, \"total_tokens\", \"INTEGER NOT NULL DEFAULT 0\")\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 )\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 ) 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 )\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\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 start = new Date(now)\n start.setHours(0, 0, 0, 0)\n\n switch (period) {\n case \"day\": {\n break\n }\n case \"week\": {\n start.setDate(start.getDate() - 6)\n break\n }\n case \"month\": {\n start.setDate(start.getDate() - 29)\n break\n }\n default: {\n break\n }\n }\n\n const end = new Date(start)\n switch (period) {\n case \"day\": {\n end.setDate(end.getDate() + 1)\n break\n }\n case \"week\": {\n end.setDate(end.getDate() + 7)\n break\n }\n case \"month\": {\n end.setDate(end.getDate() + 30)\n break\n }\n default: {\n break\n }\n }\n\n return {\n endMs: end.getTime(),\n startMs: start.getTime(),\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\n while (cursor.getTime() < range.endMs) {\n const startMs = cursor.getTime()\n const next = new Date(cursor)\n next.setDate(next.getDate() + 1)\n const endMs = Math.min(next.getTime(), range.endMs)\n intervals.push({\n date: formatLocalDate(cursor),\n endMs,\n startMs,\n })\n cursor.setTime(endMs)\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 input_tokens: 0,\n output_tokens: 0,\n request_count: 0,\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.input_tokens += next.input_tokens\n target.output_tokens += next.output_tokens\n target.request_count += next.request_count\n target.total_tokens += next.total_tokens\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 totalsFromRow(\n row: Record<string, unknown> | undefined,\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 input_tokens: numberFromRow(row, \"input_tokens\"),\n output_tokens: numberFromRow(row, \"output_tokens\"),\n request_count: numberFromRow(row, \"request_count\"),\n total_tokens: numberFromRow(row, \"total_tokens\"),\n }\n}\n\nfunction modelSummaryFromRow(\n row: Record<string, unknown>,\n): TokenUsageModelSummary {\n return {\n ...totalsFromRow(row),\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 usageEventFromRow(\n row: Record<string, unknown>,\n): TokenUsageEventRecord {\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 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_tokens: numberFromRow(row, \"total_tokens\"),\n trace_id: stringFromRow(row, \"trace_id\"),\n user_id: stringFromRow(row, \"user_id\"),\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 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 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 createDailyBucket(\n interval: { date: string; endMs: number; startMs: number },\n rows: Array<Record<string, unknown>>,\n): TokenUsageDailyBucket {\n const byModel = rows.map((row) => modelSummaryFromRow(row))\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 range = getPeriodRange(period)\n const db = await getDb()\n const totalsRow = getTotalsRow(db, range)\n const byModelRows = getModelRows(db, range)\n\n return {\n byModel: byModelRows.map((row) => modelSummaryFromRow(row)),\n period,\n range: rangePayload(range),\n totals: totalsFromRow(totalsRow),\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 range = getPeriodRange(period)\n const db = await getDb()\n const intervals = createDailyIntervals(range)\n\n return {\n byModel: getModelRows(db, range).map((row) => modelSummaryFromRow(row)),\n days: intervals.map((interval) =>\n createDailyBucket(interval, getModelRows(db, interval)),\n ),\n period,\n range: rangePayload(range),\n totals: totalsFromRow(getTotalsRow(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 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 const offset = (page - 1) * pageSize\n const db = await getDb()\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_tokens\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 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 { requestContext, generateTraceId } from \"~/lib/request-context\"\nimport { state } from \"~/lib/state\"\n\nimport { EventBus } from \"../event-bus\"\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 getTokenUsageSummary,\n} from \"./store\"\n\nexport type {\n TokenUsageDailyBucket,\n TokenUsageDailySummary,\n TokenUsageEndpoint,\n TokenUsageEventRecord,\n TokenUsageEventsPage,\n TokenUsageModelSummary,\n TokenUsagePeriod,\n TokenUsageSource,\n TokenUsageSummary,\n TokenUsageTotals,\n UsageTokens,\n} from \"./store\"\n\nexport interface TokenUsageEventInput extends UsageTokens {\n endpoint: TokenUsageEndpoint\n fallbackSessionId?: string | null\n model: string\n providerName?: string | null\n sessionId?: string | null\n source: TokenUsageSource\n traceId?: string | null\n}\n\ninterface TokenUsageRecorderOptions {\n endpoint: TokenUsageEndpoint\n fallbackSessionId?: string | null\n model: string\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>()\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 return {\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 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_tokens: resolveTotalTokens(input),\n trace_id: resolveTraceId(input.traceId),\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 tokenUsageEventBus.publish(\"token_usage.recorded\", event)\n}\n\nexport function createTokenUsageRecorder(\n options: TokenUsageRecorderOptions,\n): (usage: UsageTokens) => void {\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_tokens_details?: {\n cache_creation_input_tokens?: number\n cached_tokens?: number\n }\n }\n | null\n | undefined,\n): UsageTokens {\n const cachedTokens = normalizeToken(\n usage?.prompt_tokens_details?.cached_tokens,\n )\n const cacheCreationTokens = normalizeToken(\n usage?.prompt_tokens_details?.cache_creation_input_tokens,\n )\n const promptTokens = normalizeToken(usage?.prompt_tokens)\n return {\n cache_creation_input_tokens: cacheCreationTokens,\n cache_read_input_tokens: cachedTokens,\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 input_tokens?: number\n input_tokens_details?: {\n cached_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 inputTokens = normalizeToken(usage?.input_tokens)\n return {\n cache_read_input_tokens: cachedTokens,\n input_tokens: Math.max(0, inputTokens - cachedTokens),\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 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 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 input_tokens: next.input_tokens ?? current.input_tokens,\n output_tokens: next.output_tokens ?? current.output_tokens,\n total_tokens: next.total_tokens ?? current.total_tokens,\n }\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 { events } from \"fetch-event-stream\"\n\nimport type { CompactType } from \"~/lib/compact\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\n\nimport {\n copilotBaseUrl,\n copilotHeaders,\n prepareForCompact,\n prepareInteractionHeaders,\n} from \"~/lib/api-config\"\nimport { logCopilotRateLimits } from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\n\nexport const createChatCompletions = async (\n payload: ChatCompletionsPayload,\n options: {\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 response = await fetch(`${copilotBaseUrl(state)}/chat/completions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\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\n// Streaming types\n\nexport interface ChatCompletionChunk {\n id: string\n object: \"chat.completion.chunk\"\n created: number\n model: string\n choices: Array<Choice>\n system_fingerprint?: string\n usage?: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n prompt_tokens_details?: {\n cache_creation_input_tokens?: number\n cached_tokens?: number\n }\n completion_tokens_details?: {\n accepted_prediction_tokens: number\n rejected_prediction_tokens: number\n }\n }\n}\n\nexport interface Delta {\n content?: string | null\n role?: \"user\" | \"assistant\" | \"system\" | \"tool\"\n tool_calls?: Array<{\n index: number\n id?: string\n type?: \"function\"\n function?: {\n name?: string\n arguments?: string\n }\n }>\n reasoning_text?: string | null\n reasoning_content?: string | null\n reasoning_opaque?: string | null\n}\n\nexport interface Choice {\n index: number\n delta: Delta\n finish_reason: \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\" | null\n logprobs: object | null\n}\n\n// Non-streaming types\n\nexport interface ChatCompletionResponse {\n id: string\n object: \"chat.completion\"\n created: number\n model: string\n choices: Array<ChoiceNonStreaming>\n system_fingerprint?: string\n usage?: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n prompt_tokens_details?: {\n cache_creation_input_tokens?: number\n cached_tokens?: number\n }\n }\n}\n\ninterface ResponseMessage {\n role: \"assistant\"\n content: string | null\n reasoning_text?: string | null\n reasoning_content?: string | null\n reasoning_opaque?: string | null\n tool_calls?: Array<ToolCall>\n}\n\ninterface ChoiceNonStreaming {\n index: number\n message: ResponseMessage\n logprobs: object | null\n finish_reason: \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\"\n}\n\n// Payload types\n\nexport interface ChatCompletionsPayload {\n [key: string]: unknown\n\n messages: Array<Message>\n model: string\n temperature?: number | null\n top_p?: number | null\n max_tokens?: number | null\n stop?: string | Array<string> | null\n n?: number | null\n stream?: boolean | null\n\n frequency_penalty?: number | null\n presence_penalty?: number | null\n logit_bias?: Record<string, number> | null\n logprobs?: boolean | null\n response_format?: { type: \"json_object\" } | null\n seed?: number | null\n tools?: Array<Tool> | null\n tool_choice?:\n | \"none\"\n | \"auto\"\n | \"required\"\n | { type: \"function\"; function: { name: string } }\n | null\n user?: string | null\n stream_options?: {\n include_usage?: boolean | null\n } | null\n thinking_budget?: number\n top_k?: number | null\n parallel_tool_calls?: boolean | null\n}\n\nexport interface Tool {\n type: \"function\"\n function: {\n name: string\n description?: string\n parameters: Record<string, unknown>\n }\n}\n\nexport interface Message {\n role: \"user\" | \"assistant\" | \"system\" | \"tool\" | \"developer\"\n content: string | Array<ContentPart> | null\n\n name?: string\n tool_calls?: Array<ToolCall>\n tool_call_id?: string\n reasoning_content?: string | null\n reasoning_text?: string | null\n reasoning_opaque?: string | null\n copilot_cache_control?: CopilotCacheControl\n}\n\nexport interface ToolCall {\n id: string\n type: \"function\"\n function: {\n name: string\n arguments: string\n }\n}\n\nexport type ContentPart = TextPart | ImagePart | FilePart\n\nexport interface CacheControl {\n type: \"ephemeral\"\n}\n\nexport interface CopilotCacheControl {\n type: \"ephemeral\"\n}\n\nexport interface TextPart {\n type: \"text\"\n text: string\n cache_control?: CacheControl\n}\n\nexport interface ImagePart {\n type: \"image_url\"\n image_url: {\n url: string\n detail?: \"low\" | \"high\" | \"auto\"\n }\n cache_control?: CacheControl\n}\n\nexport interface FilePart {\n type: \"file\"\n file: {\n file_data: string\n filename?: string\n }\n cache_control?: CacheControl\n}\n","import type { Context } from \"hono\"\n\nimport { streamSSE, type SSEMessage } from \"hono/streaming\"\n\nimport { awaitApproval } from \"~/lib/approval\"\nimport { resolveMappedModel } from \"~/lib/config\"\nimport { createHandlerLogger, debugJson, debugJsonTail } from \"~/lib/logger\"\nimport { checkRateLimit } from \"~/lib/rate-limit\"\nimport { state } from \"~/lib/state\"\nimport {\n createCopilotTokenUsageRecorder,\n normalizeOpenAIUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { generateRequestIdFromPayload, getUUID, isNullish } from \"~/lib/utils\"\nimport {\n createChatCompletions,\n type ChatCompletionChunk,\n type ChatCompletionResponse,\n type ChatCompletionsPayload,\n} 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 const requestedModel = payload.model\n payload.model = resolveMappedModel(payload.model)\n if (payload.model !== requestedModel) {\n logger.debug(\n `Resolved model mapping: ${requestedModel} -> ${payload.model}`,\n )\n }\n\n await checkRateLimit(state)\n\n debugJsonTail(logger, \"Request payload:\", { value: payload, tailLength: 400 })\n\n // Find the selected model\n const selectedModel = state.models?.data.find(\n (model) => model.id === payload.model,\n )\n\n if (selectedModel?.id === \"gpt-5.4\") {\n return c.json(\n {\n error: {\n message: \"Please use `/v1/responses` or `/v1/messages` API\",\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n if (state.manualApprove) await awaitApproval()\n\n if (isNullish(payload.max_tokens)) {\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 // 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 requestId,\n sessionId,\n })\n\n if (isNonStreaming(response)) {\n debugJson(logger, \"Non-streaming response:\", response)\n recordUsage(normalizeOpenAIUsage(response.usage))\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 if (parsedChunk?.usage) {\n usage = normalizeOpenAIUsage(parsedChunk.usage)\n }\n await stream.writeSSE(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 { Hono } from \"hono\"\nimport { z } from \"zod\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { getModelMappings, setModelMappings } from \"~/lib/config\"\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.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: string | 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 type { Model } from \"~/services/copilot/get-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 type {\n ChatCompletionsPayload,\n ContentPart,\n Message,\n Tool,\n ToolCall,\n} from \"~/services/copilot/create-chat-completions\"\nimport type { Model } from \"~/services/copilot/get-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 {\n getRawProviderConfig,\n getProviderConfig,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport { state } from \"~/lib/state\"\nimport { setupCodexToken } from \"~/lib/token\"\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): 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 return getProviderConfig(normalizedProviderName)\n}\n","import { type AnthropicResponse } from \"./anthropic-types\"\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 \"~/services/copilot/get-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 \"~/services/copilot/create-chat-completions\"\n\nimport {\n type AnthropicAssistantContentBlock,\n type AnthropicAssistantMessage,\n type AnthropicDocumentBlock,\n type AnthropicMessage,\n type AnthropicMessagesPayload,\n type AnthropicResponse,\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 \"./anthropic-types\"\nimport { mapOpenAIStopReasonToAnthropic } from \"./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.\"\nconst COPILOT_TOOL_CONTENT_SUPPORT_TYPE: Array<ToolContentSupportType> = [\n \"array\",\n \"image\",\n]\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}\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 capabilities = {\n supportPdf: options.supportPdf ?? false,\n toolContentSupportType:\n options.toolContentSupportType ?? COPILOT_TOOL_CONTENT_SUPPORT_TYPE,\n }\n return {\n model: modelId,\n messages: translateAnthropicMessagesToOpenAI(\n payload,\n modelId,\n capabilities,\n ),\n max_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: translateAnthropicToolsToOpenAI(payload.tools),\n tool_choice: translateAnthropicToolChoiceToOpenAI(payload.tool_choice),\n thinking_budget: thinkingBudget,\n }\n}\n\nfunction getThinkingBudget(\n payload: AnthropicMessagesPayload,\n model: Model | undefined,\n): number | undefined {\n const thinking = payload.thinking\n if (model && thinking) {\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 as Array<AnthropicMessage>).flatMap(\n (message) =>\n message.role === \"user\" ?\n handleUserMessage(message, capabilities)\n : 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 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 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 thinkingBlocks = thinkingBlocks.filter(\n (b) =>\n b.thinking\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 return toolUseBlocks.length > 0 ?\n [\n {\n role: \"assistant\",\n content: mapContent(message.content, {\n supportPdf: capabilities.supportPdf,\n }),\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: mapContent(message.content, {\n supportPdf: capabilities.supportPdf,\n }),\n reasoning_text: allThinkingContent,\n reasoning_opaque: signature,\n },\n ]\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 },\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\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}): string | null | undefined {\n return message.reasoning_text ?? message.reasoning_content\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: THINKING_TEXT, // Compatible with opencode, it will filter out blocks where the thinking text is empty, so we add a default thinking text here\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 \"~/services/copilot/get-models\"\n\nimport { state } from \"~/lib/state\"\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 \"~/services/copilot/get-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 { 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 \"./anthropic-types\"\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\"\n\nconst IDE_EXECUTE_CODE_TOOL = \"mcp__ide__executeCode\"\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:\"\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.map((block) =>\n block.text.startsWith(SYSTEM_REMINDER_START) ?\n block\n : {\n ...block,\n text: ensureSystemReminderText(block.text),\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\nexport const normalizeSystemMessages = (\n payload: AnthropicMessagesPayload,\n): void => {\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\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_EXECUTE_CODE_TOOL && !tool.defer_loading) {\n return []\n }\n\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// 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 return (\n block.thinking\n && block.thinking !== \"Thinking...\"\n && block.signature\n && !block.signature.includes(\"@\")\n )\n })\n }\n }\n}\n\nexport const prepareMessagesApiPayload = (\n payload: AnthropicMessagesPayload,\n selectedModel?: Model,\n): void => {\n stripCacheControl(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 = 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 \"low\" | \"medium\" | \"high\"\n }\n payload.output_config = {\n effort: effort,\n }\n }\n}\n","import type { Context, Env } from \"hono\"\n\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { createFallbackModel } from \"~/lib/provider-model\"\nimport { getTokenCount } from \"~/lib/tokenizer\"\nimport { type AnthropicMessagesPayload } from \"~/routes/messages/anthropic-types\"\nimport { translateToOpenAI } from \"~/routes/messages/non-stream-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 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 translationOptions =\n (\n providerConfig.type === \"openai-compatible\"\n || providerConfig.type === \"openai-responses\"\n ) ?\n {\n supportPdf: modelConfig?.supportPdf,\n toolContentSupportType: modelConfig?.toolContentSupportType ?? [],\n }\n : undefined\n\n const openAIPayload = translateToOpenAI(anthropicPayload, translationOptions)\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 resolveMappedModel,\n} from \"~/lib/config\"\nimport {\n createFallbackModel,\n parseProviderModelAlias,\n} from \"~/lib/provider-model\"\nimport { getTokenCount } from \"~/lib/tokenizer\"\nimport { handleProviderCountTokensForProvider } from \"~/routes/provider/messages/count-tokens-handler\"\nimport { type Model } from \"~/services/copilot/get-models\"\n\nimport { findEndpointModel } from \"../../lib/models\"\nimport { type AnthropicMessagesPayload } from \"./anthropic-types\"\nimport { translateToOpenAI } from \"./non-stream-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(anthropicPayload.model)\n normalizeSystemMessages(anthropicPayload)\n\n const providerModelAlias = parseProviderModelAlias(anthropicPayload.model)\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 openAIPayload = translateToOpenAI(anthropicPayload)\n\n const requestedModel = anthropicPayload.model\n const resolve = resolveCountTokensModel(requestedModel)\n\n const selectedModel = resolve.model\n anthropicPayload.model = selectedModel.id\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 \"~/services/copilot/create-chat-completions\"\n\nimport {\n type AnthropicMessageDeltaEvent,\n type AnthropicStreamEventData,\n type AnthropicStreamState,\n} from \"./anthropic-types\"\nimport { THINKING_TEXT } from \"./non-stream-translation\"\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 completePendingMessage(state, events, chunk)\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}\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) || hasToolCallDelta(delta)) {\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 hasToolCallDelta(delta: Delta): boolean {\n return Boolean(delta.tool_calls && delta.tool_calls.length > 0)\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: THINKING_TEXT, // Compatible with opencode, it will filter out blocks where the thinking text is empty, so we add a default thinking text here\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 = delta.reasoning_text ?? delta.reasoning_content\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 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: \"An unexpected error occurred during streaming.\",\n },\n }\n}\n","import consola from \"consola\"\nimport { events } from \"fetch-event-stream\"\nimport { createHash } from \"node:crypto\"\n\nimport type { SubagentMarker } from \"~/lib/subagent\"\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 {\n logCopilotQuotaSnapshots,\n logCopilotRateLimits,\n type CopilotQuotaSnapshot,\n} from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\nimport {\n createPooledWebSocketStream,\n createWebSocketUrl,\n} from \"~/services/responses-websocket\"\n\nexport interface ResponsesPayload {\n model: string\n instructions?: string | null\n input?: string | Array<ResponseInputItem>\n tools?: Array<Tool> | null\n tool_choice?: ToolChoiceOptions | ToolChoiceFunction\n temperature?: number | null\n top_p?: number | null\n max_output_tokens?: number | null\n metadata?: Metadata | null\n stream?: boolean | null\n safety_identifier?: string | null\n prompt_cache_key?: string | null\n prompt_cache_retention?: \"in_memory\" | \"24h\" | null\n parallel_tool_calls?: boolean | null\n store?: boolean | null\n reasoning?: Reasoning | null\n context_management?: Array<ResponseContextManagementItem> | null\n include?: Array<ResponseIncludable>\n service_tier?: string | null // NOTE: Unsupported by GitHub Copilot\n [key: string]: unknown\n}\n\nexport type ToolChoiceOptions = \"none\" | \"auto\" | \"required\"\nexport type ToolSearchExecution = \"client\" | \"server\"\n\nexport interface ToolChoiceFunction {\n name: string\n type: \"function\"\n}\n\nexport type Tool =\n | FunctionTool\n | ToolSearchTool\n | NamespaceTool\n | Record<string, unknown>\n\nexport interface FunctionTool {\n name: string\n parameters: { [key: string]: unknown } | null\n strict: boolean | null\n type: \"function\"\n description?: string | null\n defer_loading?: boolean | null\n}\n\nexport interface ToolSearchTool {\n type: \"tool_search\"\n execution?: ToolSearchExecution | null\n description?: string | null\n parameters?: { [key: string]: unknown } | null\n}\n\nexport interface NamespaceTool {\n type: \"namespace\"\n name: string\n description?: string | null\n tools: Array<FunctionTool>\n}\n\nexport type ResponseIncludable =\n | \"file_search_call.results\"\n | \"message.input_image.image_url\"\n | \"computer_call_output.output.image_url\"\n | \"reasoning.encrypted_content\"\n | \"code_interpreter_call.outputs\"\n\nexport interface Reasoning {\n effort?: \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | null\n summary?: \"auto\" | \"concise\" | \"detailed\" | null\n}\n\nexport interface ResponseContextManagementCompactionItem {\n type: \"compaction\"\n compact_threshold: number\n}\n\nexport type ResponseContextManagementItem =\n ResponseContextManagementCompactionItem\n\nexport interface ResponseInputMessage {\n type?: \"message\"\n role: \"user\" | \"assistant\" | \"system\" | \"developer\"\n content?: string | Array<ResponseInputContent>\n status?: string\n phase?: \"commentary\" | \"final_answer\"\n}\n\nexport interface ResponseFunctionToolCallItem {\n type: \"function_call\"\n call_id: string\n name: string\n arguments: string\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n namespace?: string | null\n}\n\nexport interface ResponseFunctionCallOutputItem {\n type: \"function_call_output\"\n call_id: string\n output: string | Array<ResponseInputContent>\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n}\n\nexport interface ResponseToolSearchCallItem {\n type: \"tool_search_call\"\n call_id: string\n arguments: Record<string, unknown> | string\n execution?: ToolSearchExecution | null\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n}\n\nexport interface ResponseToolSearchOutputItem {\n type: \"tool_search_output\"\n call_id: string\n tools: Array<Tool>\n execution?: ToolSearchExecution | null\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n}\n\nexport interface ResponseInputReasoning {\n id?: string\n type: \"reasoning\"\n summary: Array<{\n type: \"summary_text\"\n text: string\n }>\n encrypted_content: string\n}\n\nexport interface ResponseInputCompaction {\n id: string\n type: \"compaction\"\n encrypted_content: string\n}\n\nexport type ResponseInputItem =\n | ResponseInputMessage\n | ResponseFunctionToolCallItem\n | ResponseFunctionCallOutputItem\n | ResponseToolSearchCallItem\n | ResponseToolSearchOutputItem\n | ResponseInputReasoning\n | ResponseInputCompaction\n | Record<string, unknown>\n\nexport type ResponseInputContent =\n | ResponseInputText\n | ResponseInputImage\n | ResponseInputFile\n | Record<string, unknown>\n\nexport interface ResponseInputText {\n type: \"input_text\" | \"output_text\"\n text: string\n}\n\nexport interface ResponseInputImage {\n type: \"input_image\"\n image_url?: string | null\n file_id?: string | null\n detail: \"low\" | \"high\" | \"auto\"\n}\n\nexport interface ResponseInputFile {\n type: \"input_file\"\n file_data?: string | null\n file_id?: string | null\n filename?: string | null\n}\n\nexport interface ResponsesResult {\n id: string\n object: \"response\"\n created_at: number\n model: string\n output: Array<ResponseOutputItem>\n output_text: string\n status: string\n usage?: ResponseUsage | null\n error: ResponseError | null\n incomplete_details: IncompleteDetails | null\n instructions: string | null\n metadata: Metadata | null\n parallel_tool_calls: boolean\n temperature: number | null\n tool_choice: unknown\n tools: Array<Tool>\n top_p: number | null\n}\n\nexport type Metadata = { [key: string]: string }\n\nexport interface IncompleteDetails {\n reason?: \"max_output_tokens\" | \"content_filter\"\n}\n\nexport interface ResponseError {\n message: string\n}\n\nexport type ResponseOutputItem =\n | ResponseOutputMessage\n | ResponseOutputReasoning\n | ResponseOutputFunctionCall\n | ResponseOutputToolSearchCall\n | ResponseOutputToolSearchOutput\n | ResponseOutputCompaction\n\nexport interface ResponseOutputMessage {\n id: string\n type: \"message\"\n role: \"assistant\"\n status: \"completed\" | \"in_progress\" | \"incomplete\"\n content?: Array<ResponseOutputContentBlock>\n}\n\nexport interface ResponseOutputReasoning {\n id: string\n type: \"reasoning\"\n summary?: Array<ResponseReasoningBlock>\n encrypted_content?: string\n status?: \"completed\" | \"in_progress\" | \"incomplete\"\n}\n\nexport interface ResponseReasoningBlock {\n type: string\n text?: string\n}\n\nexport interface ResponseOutputFunctionCall {\n id?: string\n type: \"function_call\"\n call_id: string\n name: string\n arguments: string\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n namespace?: string | null\n}\n\nexport interface ResponseOutputToolSearchCall {\n id?: string\n type: \"tool_search_call\"\n call_id: string\n arguments: Record<string, unknown> | string\n execution?: ToolSearchExecution | null\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n}\n\nexport interface ResponseOutputToolSearchOutput {\n id?: string\n type: \"tool_search_output\"\n call_id: string\n tools: Array<Tool>\n execution?: ToolSearchExecution | null\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n}\n\nexport interface ResponseOutputCompaction {\n id: string\n type: \"compaction\"\n encrypted_content: string\n}\n\nexport type ResponseOutputContentBlock =\n | ResponseOutputText\n | ResponseOutputRefusal\n | Record<string, unknown>\n\nexport interface ResponseOutputText {\n type: \"output_text\"\n text: string\n annotations: Array<unknown>\n}\n\nexport interface ResponseOutputRefusal {\n type: \"refusal\"\n refusal: string\n}\n\nexport interface ResponseUsage {\n input_tokens: number\n output_tokens?: number\n total_tokens: number\n input_tokens_details?: {\n cached_tokens: number\n }\n output_tokens_details?: {\n reasoning_tokens: number\n }\n}\n\nexport type ResponseStreamEvent =\n | ResponseCompletedEvent\n | ResponseIncompleteEvent\n | ResponseCreatedEvent\n | ResponseErrorEvent\n | ResponseFunctionCallArgumentsDeltaEvent\n | ResponseFunctionCallArgumentsDoneEvent\n | ResponseFailedEvent\n | ResponseOutputItemAddedEvent\n | ResponseOutputItemDoneEvent\n | ResponseReasoningSummaryTextDeltaEvent\n | ResponseReasoningSummaryTextDoneEvent\n | ResponseTextDeltaEvent\n | ResponseTextDoneEvent\n\nexport interface ResponseCompletedEvent {\n copilot_quota_snapshots?: Record<string, CopilotQuotaSnapshot>\n response: ResponsesResult\n sequence_number: number\n type: \"response.completed\"\n}\n\nexport interface ResponseIncompleteEvent {\n response: ResponsesResult\n sequence_number: number\n type: \"response.incomplete\"\n}\n\nexport interface ResponseCreatedEvent {\n response: ResponsesResult\n sequence_number: number\n type: \"response.created\"\n}\n\nexport interface ResponseErrorEvent {\n code: string | null\n message: string\n param: string | null\n sequence_number: number\n type: \"error\"\n}\n\nexport interface ResponseFunctionCallArgumentsDeltaEvent {\n delta: string\n item_id: string\n output_index: number\n sequence_number: number\n type: \"response.function_call_arguments.delta\"\n}\n\nexport interface ResponseFunctionCallArgumentsDoneEvent {\n arguments: string\n item_id: string\n name: string\n output_index: number\n sequence_number: number\n type: \"response.function_call_arguments.done\"\n}\n\nexport interface ResponseFailedEvent {\n response: ResponsesResult\n sequence_number: number\n type: \"response.failed\"\n}\n\nexport interface ResponseOutputItemAddedEvent {\n item: ResponseOutputItem\n output_index: number\n sequence_number: number\n type: \"response.output_item.added\"\n}\n\nexport interface ResponseOutputItemDoneEvent {\n item: ResponseOutputItem\n output_index: number\n sequence_number: number\n type: \"response.output_item.done\"\n}\n\nexport interface ResponseReasoningSummaryTextDeltaEvent {\n delta: string\n item_id: string\n output_index: number\n sequence_number: number\n summary_index: number\n type: \"response.reasoning_summary_text.delta\"\n}\n\nexport interface ResponseReasoningSummaryTextDoneEvent {\n item_id: string\n output_index: number\n sequence_number: number\n summary_index: number\n text: string\n type: \"response.reasoning_summary_text.done\"\n}\n\nexport interface ResponseTextDeltaEvent {\n content_index: number\n delta: string\n item_id: string\n output_index: number\n sequence_number: number\n type: \"response.output_text.delta\"\n}\n\nexport interface ResponseTextDoneEvent {\n content_index: number\n item_id: string\n output_index: number\n sequence_number: number\n text: string\n type: \"response.output_text.done\"\n}\n\nexport type ResponsesStream = ReturnType<typeof events>\nexport type CreateResponsesReturn = ResponsesResult | ResponsesStream\nexport type ResponsesTransport = \"http\" | \"websocket\"\n\ntype ResponsesStreamChunk = {\n data?: string\n event?: string\n id?: string | number\n}\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}\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 }: 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 if (payload.stream === true && effectiveTransport === \"websocket\") {\n const websocketRequest = prepareResponsesWebSocketRequest(\n payload,\n headers,\n {\n requestId,\n subagentMarker,\n },\n )\n const stream = createPooledResponsesWebSocketStream(websocketRequest)\n return stream\n }\n\n return await createHttpResponses(payload, headers)\n}\n\nconst createHttpResponses = async (\n payload: ResponsesPayload,\n headers: Record<string, string>,\n): Promise<CreateResponsesReturn> => {\n const response = await fetch(`${copilotBaseUrl(state)}/responses`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\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 events(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): ResponsesStream =>\n createResponsesSafeStream(\n createPooledWebSocketStream(request, {\n createChunk: createResponsesWebSocketStreamChunk,\n isTerminalChunk: isTerminalResponsesStreamChunk,\n openErrorMessage: \"Failed to create responses websocket\",\n streamErrorMessage: \"Responses websocket stream error\",\n terminalChunkMissingMessage:\n \"Responses websocket ended without a terminal response\",\n }),\n )\n\nconst createResponsesSafeStream = async function* (\n source: AsyncIterable<ResponsesStreamChunk>,\n): AsyncGenerator<ResponsesStreamChunk, void, unknown> {\n try {\n yield* source\n } catch (error) {\n yield createResponsesErrorServerSentEventChunk(getErrorMessage(error))\n }\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\nconst encodePoolKeyPart = (value: string): string => encodeURIComponent(value)\n\nconst 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 }\n if (parsed.type === \"response.completed\") {\n logCopilotQuotaSnapshots(parsed.copilot_quota_snapshots)\n }\n return {\n data: JSON.stringify(parsed),\n event: typeof parsed.type === \"string\" ? parsed.type : undefined,\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n }\n } catch {\n return { data }\n }\n}\n\nconst isTerminalResponsesStreamChunk = (chunk: { data?: string }): boolean => {\n if (!chunk.data || chunk.data === \"[DONE]\") {\n return false\n }\n\n try {\n const parsed = JSON.parse(chunk.data) as { type?: unknown }\n return (\n parsed.type === \"response.completed\"\n || parsed.type === \"response.failed\"\n || parsed.type === \"response.incomplete\"\n || parsed.type === \"error\"\n )\n } catch {\n return false\n }\n}\n\nconst createResponsesErrorServerSentEventChunk = (\n message: string,\n): ResponsesStreamChunk => {\n const errorEvent: ResponseErrorEvent = {\n code: null,\n message,\n param: null,\n sequence_number: 0,\n type: \"error\",\n }\n\n return {\n data: JSON.stringify(errorEvent),\n event: errorEvent.type,\n }\n}\n\nconst getErrorMessage = (error: unknown): string => {\n if (error instanceof Error && error.message) {\n return error.message\n }\n\n return String(error)\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} from \"~/lib/config\"\nimport { requestContext } from \"~/lib/request-context\"\nimport { parseUserIdMetadata } 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 \"~/services/copilot/create-responses\"\n\nimport {\n type AnthropicAssistantContentBlock,\n type AnthropicAssistantMessage,\n type AnthropicDocumentBlock,\n type AnthropicResponse,\n type AnthropicImageBlock,\n type AnthropicMessage,\n type AnthropicMessagesPayload,\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 \"./anthropic-types\"\nimport { normalizeToolSchema } from \"./non-stream-translation\"\n\nconst MESSAGE_TYPE = \"message\"\nconst COMPACTION_SIGNATURE_PREFIX = \"cm1#\"\nconst COMPACTION_SIGNATURE_SEPARATOR = \"@\"\n\nexport const THINKING_TEXT = \"Thinking...\"\n\nconst buildPromptCacheKey = (\n basePromptCacheKey: string | null,\n subagentAgentId?: string | null,\n): string | null => {\n if (!basePromptCacheKey) {\n return null\n }\n\n const normalizedSubagentAgentId = subagentAgentId?.trim() || null\n if (!normalizedSubagentAgentId) {\n return basePromptCacheKey\n }\n\n return `${basePromptCacheKey}:agent:${normalizedSubagentAgentId}`\n}\n\nexport const translateAnthropicMessagesToResponsesPayload = (\n payload: AnthropicMessagesPayload,\n subagentAgentId?: string | null,\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 as Array<AnthropicMessage>) {\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 { sessionId: metadataPromptCacheKey } = parseUserIdMetadata(\n payload.metadata?.user_id,\n )\n\n const requestStore = requestContext.getStore()\n const sessionAffinity = requestStore?.sessionAffinity?.trim() || null\n const basePromptCacheKey = metadataPromptCacheKey ?? sessionAffinity\n const promptCacheKey = buildPromptCacheKey(\n basePromptCacheKey,\n subagentAgentId,\n )\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 tool_choice: toolChoice,\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: true,\n reasoning: {\n effort: getReasoningEffortForModel(payload.model),\n summary: \"detailed\",\n },\n include: [\"reasoning.encrypted_content\"],\n }\n\n if (hasOriginalTools) {\n responsesPayload.prompt_cache_key = promptCacheKey\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: AnthropicMessage,\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 return translateAssistantMessage(message, model, applyPhase, state)\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, otherwise it will cause miss cache occasionally —— the usage input cached tokens to be 0\n // https://github.com/microsoft/vscode-copilot-chat/blob/main/src/platform/endpoint/node/responsesApi.ts#L162\n // when use in codex cli, reasoning id is empty, so it will cause miss cache occasionally\n const { encryptedContent, id } = parseReasoningSignature(block.signature)\n const thinking = block.thinking === THINKING_TEXT ? \"\" : block.thinking\n return {\n id,\n type: \"reasoning\",\n summary: thinking ? [{ type: \"summary_text\", text: thinking }] : [],\n encrypted_content: encryptedContent,\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: 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: 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) {\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 // Compatible with opencode, it will filter out blocks where the thinking text is empty, so we add a default thinking text here\n if (!item.summary || item.summary.length === 0) {\n return THINKING_TEXT\n }\n\n collectFromBlocks(item.summary)\n\n return segments.join(\"\").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: THINKING_TEXT,\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\n return {\n input_tokens: inputTokens - (inputCachedTokens ?? 0),\n output_tokens: outputTokens,\n ...(response.usage?.input_tokens_details?.cached_tokens !== undefined && {\n cache_read_input_tokens:\n response.usage.input_tokens_details.cached_tokens,\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","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 ResponseReasoningSummaryTextDeltaEvent,\n type ResponseReasoningSummaryTextDoneEvent,\n type ResponsesResult,\n type ResponseStreamEvent,\n type ResponseTextDeltaEvent,\n type ResponseTextDoneEvent,\n} from \"~/services/copilot/create-responses\"\n\nimport { type AnthropicStreamEventData } from \"./anthropic-types\"\nimport {\n THINKING_TEXT,\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 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 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.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_text.done\": {\n return handleOutputTextDone(rawEvent, state)\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: THINKING_TEXT,\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 // Compatible with opencode, it will filter out blocks where the thinking text is empty, so we add a default thinking text here\n if (!item.summary || item.summary.length === 0) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: THINKING_TEXT,\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 deltaText = rawEvent.delta\n const events = new Array<AnthropicStreamEventData>()\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\n return events\n}\n\nconst handleReasoningSummaryTextDone = (\n rawEvent: ResponseReasoningSummaryTextDoneEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const outputIndex = rawEvent.output_index\n const text = rawEvent.text\n const events = new Array<AnthropicStreamEventData>()\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n\n if (text && !state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: text,\n },\n })\n }\n\n return events\n}\n\nconst handleOutputTextDone = (\n rawEvent: ResponseTextDoneEvent,\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 text = rawEvent.text\n\n const blockIndex = openTextBlockIfNeeded(state, {\n outputIndex,\n contentIndex,\n events,\n })\n\n if (text && !state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"text_delta\",\n text,\n },\n })\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 inputTokens =\n (response.usage?.input_tokens ?? 0) - (inputCachedTokens ?? 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 },\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}\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 {\n ResponseContextManagementCompactionItem,\n ResponseFunctionCallOutputItem,\n ResponseInputContent,\n ResponseInputImage,\n ResponseInputItem,\n ResponseInputMessage,\n ResponsesPayload,\n ResponsesTransport,\n} from \"~/services/copilot/create-responses\"\n\nimport { COMPACT_REQUEST, type CompactType } from \"~/lib/compact\"\nimport {\n isResponsesApiContextManagementEnabled as isConfiguredResponsesApiContextManagementEnabled,\n isResponsesApiWebSocketEnabled as isConfiguredResponsesApiWebSocketEnabled,\n} from \"~/lib/config\"\n\nexport const RESPONSES_ENDPOINT = \"/responses\"\nexport const RESPONSES_WS_ENDPOINT = \"ws:/responses\"\nexport const DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO = 0.9\n\nexport const responsesUtilsDependencies = {\n isResponsesApiContextManagementEnabled:\n isConfiguredResponsesApiContextManagementEnabled,\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\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\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 image of collectInputImageDataUrls(input)) {\n if (!shouldReplace(image)) {\n continue\n }\n\n replaceInputImageWithPlaceholder(image)\n count += 1\n }\n\n return count\n}\n\nconst collectInputImageDataUrls = (\n input: Array<ResponseInputItem>,\n images: Array<InputImageDataUrl> = [],\n): Array<InputImageDataUrl> => {\n for (const item of input) {\n collectInputItemImageDataUrls(item, images)\n }\n\n return images\n}\n\nconst collectInputItemImageDataUrls = (\n item: ResponseInputItem,\n images: Array<InputImageDataUrl>,\n): void => {\n if (isResponseInputMessage(item)) {\n collectContentImageDataUrls(item.content, images)\n } else if (isResponseFunctionCallOutputItem(item)) {\n collectContentImageDataUrls(item.output, images)\n }\n}\n\nconst collectContentImageDataUrls = (\n content: string | Array<ResponseInputContent> | undefined,\n images: Array<InputImageDataUrl>,\n): void => {\n if (!Array.isArray(content)) {\n return\n }\n\n for (const block of content) {\n const image = getInputImageDataUrl(block)\n if (image) {\n images.push(image)\n }\n }\n}\n\nconst getInputImageDataUrl = (\n content: ResponseInputContent,\n): InputImageDataUrl | null => {\n if (!isResponseInputImage(content) || typeof content.image_url !== \"string\") {\n return null\n }\n\n const imageUrl = content.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: content,\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 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 ResponseFunctionCallOutputItem => {\n return (\n typeof item === \"object\"\n && item !== null\n && \"type\" in item\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 createCompactionContextManagement = (\n compactThreshold: number,\n): Array<ResponseContextManagementCompactionItem> => [\n {\n type: \"compaction\",\n compact_threshold: compactThreshold,\n },\n]\n\nexport const applyResponsesApiContextManagement = (\n payload: ResponsesPayload,\n maxPromptTokens?: number,\n compactThresholdRatio = DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO,\n): void => {\n if (payload.context_management !== undefined) {\n return\n }\n\n if (!responsesUtilsDependencies.isResponsesApiContextManagementEnabled()) {\n return\n }\n\n payload.context_management = createCompactionContextManagement(\n resolveResponsesCompactThreshold(maxPromptTokens, compactThresholdRatio),\n )\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 (\n \"type\" in value\n && typeof value.type === \"string\"\n && value.type === \"compaction\"\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 { Model, ModelsResponse } from \"~/services/copilot/get-models\"\n\ninterface CodexModelDefinition {\n contextWindow: number\n id: string\n input: Array<\"text\" | \"image\">\n maxTokens: number\n name: string\n}\n\nconst CODEX_MODELS: Array<CodexModelDefinition> = [\n {\n contextWindow: 100_000,\n id: \"gpt-5.3-codex-spark\",\n input: [\"text\"],\n maxTokens: 32_000,\n name: \"GPT-5.3 Codex Spark\",\n },\n {\n contextWindow: 400_000,\n id: \"gpt-5.4\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.4\",\n },\n {\n contextWindow: 400_000,\n id: \"gpt-5.4-mini\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.4 mini\",\n },\n {\n contextWindow: 272_000,\n id: \"gpt-5.5\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.5\",\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: [\"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"],\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 { ResolvedProviderConfig } from \"~/lib/config\"\nimport type { AnthropicMessagesPayload } from \"~/routes/messages/anthropic-types\"\nimport type { ChatCompletionsPayload } from \"~/services/copilot/create-chat-completions\"\nimport type { ResponsesPayload } from \"~/services/copilot/create-responses\"\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 buildProviderUpstreamHeaders(\n providerConfig: ResolvedProviderConfig,\n requestHeaders: Headers,\n): Record<string, string> {\n const authHeaders: Record<string, string> = {}\n if (providerConfig.authType === \"x-api-key\") {\n authHeaders[\"x-api-key\"] = 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 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 function createProviderProxyResponse(\n upstreamResponse: Response,\n body?: ReadableStream<Uint8Array> | null,\n): Response {\n const headers = new Headers(upstreamResponse.headers)\n\n for (const headerName of STRIPPED_RESPONSE_HEADERS) {\n headers.delete(headerName)\n }\n\n return new Response(body ?? upstreamResponse.body, {\n headers,\n status: upstreamResponse.status,\n statusText: upstreamResponse.statusText,\n })\n}\n\nexport async function forwardProviderMessages(\n providerConfig: ResolvedProviderConfig,\n payload: AnthropicMessagesPayload,\n requestHeaders: Headers,\n): Promise<Response> {\n return await fetch(`${providerConfig.baseUrl}/v1/messages`, {\n method: \"POST\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n body: JSON.stringify(payload),\n })\n}\n\nexport async function forwardProviderChatCompletions(\n providerConfig: ResolvedProviderConfig,\n payload: ChatCompletionsPayload,\n requestHeaders: Headers,\n): Promise<Response> {\n return await fetch(`${providerConfig.baseUrl}/v1/chat/completions`, {\n method: \"POST\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n body: JSON.stringify(payload),\n })\n}\n\nexport async function forwardProviderResponses(\n providerConfig: ResolvedProviderConfig,\n payload: ResponsesPayload,\n requestHeaders: Headers,\n): Promise<Response> {\n return await fetch(`${providerConfig.baseUrl}/v1/responses`, {\n method: \"POST\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n body: JSON.stringify(payload),\n })\n}\n\nexport async function forwardProviderModels(\n providerConfig: ResolvedProviderConfig,\n requestHeaders: Headers,\n): Promise<Response> {\n return await fetch(`${providerConfig.baseUrl}/v1/models`, {\n method: \"GET\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\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 \"~/routes/messages/anthropic-types\"\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n ContentPart,\n Message,\n} from \"~/services/copilot/create-chat-completions\"\nimport type {\n ResponsesResult,\n ResponseStreamEvent,\n ResponsesStream,\n} from \"~/services/copilot/create-responses\"\n\nimport { type ModelConfig, type ResolvedProviderConfig } from \"~/lib/config\"\nimport { logCodexRateLimitsEvent } from \"~/lib/codex-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJson, debugLazy } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { resolveBridgeToolSearchName } from \"~/lib/tool-search\"\nimport {\n createProviderTokenUsageRecorder,\n mergeAnthropicUsage,\n normalizeAnthropicUsage,\n normalizeOpenAIUsage,\n normalizeResponsesUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { parseUserIdMetadata } from \"~/lib/utils\"\nimport {\n translateToAnthropic,\n translateToOpenAI,\n} from \"~/routes/messages/non-stream-translation\"\nimport {\n flushPendingAnthropicStreamEvents,\n translateChunkToAnthropicEvents,\n} from \"~/routes/messages/stream-translation\"\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 { normalizeSystemMessages } 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\"\n\nconst logger = createHandlerLogger(\"provider-messages-handler\")\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 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 return await handleProviderMessagesForProvider(c, { payload, provider })\n}\n\nexport async function handleProviderMessagesForProvider(\n c: Context,\n options: {\n payload: AnthropicMessagesPayload\n provider: string\n },\n): Promise<Response> {\n const { payload, provider } = options\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 try {\n const modelConfig = providerConfig.models?.[payload.model]\n debugJson(logger, \"provider.messages.request\", { payload, provider })\n\n normalizeSystemMessages(payload)\n applyModelDefaults(payload, modelConfig)\n\n if (providerConfig.type === \"openai-responses\") {\n return await handleOpenAIResponsesProviderMessages(c, {\n modelConfig,\n payload,\n provider,\n providerConfig,\n })\n }\n\n if (providerConfig.type === \"openai-compatible\") {\n return await handleOpenAICompatibleProviderMessages(c, {\n modelConfig,\n payload,\n provider,\n providerConfig,\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 )\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 payload,\n provider,\n providerConfig,\n upstreamResponse,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as AnthropicResponse\n return respondProviderMessagesJson(c, {\n body: jsonBody,\n payload,\n provider,\n providerConfig,\n })\n } catch (error) {\n logger.error(\"provider.messages.error\", {\n provider,\n error,\n })\n throw error\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 },\n): Promise<Response> => {\n const { payload, provider, providerConfig } = options\n const selectedModel =\n providerConfig.name === \"codex\" ?\n getCodexModels().data.find((model) => model.id === payload.model)\n : undefined\n const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload)\n\n applyResponsesApiContextManagement(\n responsesPayload,\n selectedModel?.capabilities.limits.max_prompt_tokens,\n )\n compactInputByLatestCompaction(responsesPayload)\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 )\n\n if (responsesPayload.stream && isResponsesStream(upstreamResponse)) {\n return streamResponsesProviderMessages({\n c,\n payload,\n provider,\n providerConfig,\n upstreamResponse,\n })\n }\n\n return respondResponsesProviderMessagesJson(c, {\n body: upstreamResponse as ResponsesResult,\n payload,\n provider,\n providerConfig,\n })\n }\n\n const upstreamResponse = await forwardProviderResponses(\n providerConfig,\n responsesPayload,\n c.req.raw.headers,\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 payload,\n provider,\n providerConfig,\n upstreamResponse: events(upstreamResponse),\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as ResponsesResult\n return respondResponsesProviderMessagesJson(c, {\n body: jsonBody,\n payload,\n provider,\n providerConfig,\n })\n}\n\nconst applyModelDefaults = (\n payload: AnthropicMessagesPayload,\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\nconst 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\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 },\n): Promise<Response> => {\n const { modelConfig, payload, provider, providerConfig } = options\n const openAIPayload = createOpenAICompatiblePayload(payload, modelConfig)\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 )\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 payload,\n provider,\n upstreamResponse,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as ChatCompletionResponse\n return respondOpenAICompatibleProviderMessagesJson(c, {\n body: jsonBody,\n payload,\n provider,\n })\n}\n\nconst createOpenAICompatiblePayload = (\n payload: AnthropicMessagesPayload,\n modelConfig: ModelConfig | undefined,\n): ChatCompletionsPayload => {\n const openAIPayload = translateToOpenAI(payload, {\n supportPdf: modelConfig?.supportPdf,\n toolContentSupportType: modelConfig?.toolContentSupportType ?? [],\n })\n applyOpenAICompatibleThinkingBudget(openAIPayload, payload)\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\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 if (!Object.hasOwn(openAIPayload, \"parallel_tool_calls\")) {\n openAIPayload.parallel_tool_calls = true\n }\n\n if (modelConfig?.contextCache !== false) {\n applyOpenAICompatibleContextCache(openAIPayload)\n }\n\n return openAIPayload\n}\n\nconst normalizeOpenAICompatibleReasoningContent = (\n payload: ChatCompletionsPayload,\n): void => {\n for (const message of payload.messages) {\n if (message.role !== \"assistant\") {\n continue\n }\n\n if (\n message.reasoning_content === undefined\n && message.reasoning_text !== undefined\n ) {\n message.reasoning_content = message.reasoning_text\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 applyOpenAICompatibleContextCache = (\n payload: ChatCompletionsPayload,\n): void => {\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(-2)\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\nconst streamProviderMessages = ({\n c,\n payload,\n provider,\n providerConfig,\n upstreamResponse,\n}: {\n c: Context\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n upstreamResponse: Response\n}): Response => {\n logger.debug(\"provider.messages.streaming\")\n const recordUsage = createProviderMessagesUsageRecorder(payload, provider)\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n\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 stream.writeSSE({ event: \"ping\", data: '{\"type\":\"ping\"}' })\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, providerConfig)\n if (parsed) {\n usage = mergeAnthropicUsage(usage, parsed.usage)\n data = parsed.data\n }\n\n await stream.writeSSE({\n event: eventName,\n data,\n })\n }\n\n recordUsage(usage)\n })\n}\n\nconst streamOpenAICompatibleProviderMessages = ({\n c,\n payload,\n provider,\n upstreamResponse,\n}: {\n c: Context\n payload: AnthropicMessagesPayload\n provider: string\n upstreamResponse: Response\n}): Response => {\n logger.debug(\"provider.messages.openai_compatible.streaming\")\n const recordUsage = createProviderMessagesUsageRecorder(payload, provider)\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n const streamState: AnthropicStreamState = {\n messageStartSent: false,\n contentBlockIndex: 0,\n contentBlockOpen: false,\n toolCalls: {},\n thinkingBlockOpen: false,\n }\n\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 stream.writeSSE({ event: \"ping\", data: '{\"type\":\"ping\"}' })\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 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 stream.writeSSE({\n event: event.type,\n data: eventData,\n })\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 stream.writeSSE({\n event: event.type,\n data: eventData,\n })\n }\n\n recordUsage(usage)\n })\n}\n\nconst streamResponsesProviderMessages = ({\n c,\n payload,\n provider,\n providerConfig,\n upstreamResponse,\n}: {\n c: Context\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n upstreamResponse: ResponsesStream\n}): Response => {\n logger.debug(\"provider.messages.responses.streaming\", {\n provider,\n })\n const recordUsage = createProviderMessagesUsageRecorder(payload, provider)\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 stream.writeSSE({ event: \"ping\", data: '{\"type\":\"ping\"}' })\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 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 stream.writeSSE({\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`,\n )\n await stream.writeSSE({\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n}\n\nconst isResponsesStream = (value: unknown): value is ResponsesStream => {\n return (\n Boolean(value)\n && typeof (value as ResponsesStream)[Symbol.asyncIterator] === \"function\"\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 providerConfig: ResolvedProviderConfig,\n): { data: string; model?: string; usage: UsageTokens } | null => {\n try {\n const parsed = JSON.parse(data) as AnthropicStreamEventData\n if (parsed.type === \"message_start\") {\n adjustInputTokens(providerConfig, parsed.message.usage)\n return {\n data: JSON.stringify(parsed),\n model: parsed.message.model,\n usage: normalizeAnthropicUsage(parsed.message.usage),\n }\n }\n if (parsed.type === \"message_delta\") {\n adjustInputTokens(providerConfig, parsed.usage)\n return {\n data: JSON.stringify(parsed),\n usage: normalizeAnthropicUsage(parsed.usage),\n }\n }\n return { data: JSON.stringify(parsed), 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 respondProviderMessagesJson = (\n c: Context,\n options: {\n body: AnthropicResponse\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n },\n): Response => {\n const { body, payload, provider, providerConfig } = options\n const recordUsage = createProviderMessagesUsageRecorder(payload, provider)\n adjustInputTokens(providerConfig, body.usage)\n recordUsage(normalizeAnthropicUsage(body.usage))\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 payload: AnthropicMessagesPayload\n provider: string\n },\n): Response => {\n const { body, payload, provider } = options\n const recordUsage = createProviderMessagesUsageRecorder(payload, provider)\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 payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n },\n): Response => {\n const { body, payload, provider, providerConfig } = options\n const recordUsage = createProviderMessagesUsageRecorder(payload, provider)\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 createProviderMessagesUsageRecorder = (\n payload: AnthropicMessagesPayload,\n provider: string,\n) =>\n createProviderTokenUsageRecorder({\n endpoint: \"provider_messages\",\n model: payload.model,\n providerName: provider,\n sessionId: parseUserIdMetadata(payload.metadata?.user_id).sessionId,\n })\n\nconst adjustInputTokens = (\n providerConfig: ResolvedProviderConfig,\n usage?: {\n input_tokens?: number\n cache_read_input_tokens?: number\n cache_creation_input_tokens?: number\n },\n): void => {\n if (!providerConfig.adjustInputTokens || !usage) {\n return\n }\n const adjustedInput = Math.max(\n 0,\n (usage.input_tokens ?? 0)\n - (usage.cache_read_input_tokens ?? 0)\n - (usage.cache_creation_input_tokens ?? 0),\n )\n usage.input_tokens = adjustedInput\n debugJson(logger, \"provider.messages.adjusted_usage:\", usage)\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 \"~/routes/messages/anthropic-types\"\n\nimport {\n copilotBaseUrl,\n copilotHeaders,\n prepareForCompact,\n prepareInteractionHeaders,\n prepareMessageProxyHeaders,\n} from \"~/lib/api-config\"\nimport { logCopilotRateLimits } from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\nimport { parseUserIdMetadata } from \"~/lib/utils\"\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 allowedAnthropicBetas = new Set([\n INTERLEAVED_THINKING_BETA,\n \"context-management-2025-06-27\",\n ADVANCED_TOOL_USE_BETA,\n])\n\nconst 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 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\n // claude-opus-4.8 is excluded: Copilot's upstream WAF returns a generic\n // \"Access to this endpoint is forbidden\" 403 whenever a request carries\n // the Claude-Code-style user-agent without a `copilot-integration-id`\n // header. The exact same header set is accepted on claude-opus-4.7, so\n // the gate is a model-id rollout gap on Copilot's side. Skipping the\n // rewrite for 4.8 keeps the default Copilot identity\n // (copilot-integration-id: vscode-chat + GitHubCopilotChat UA +\n // conversation-agent intent) in place; that path is 200. Remove this\n // skip once Copilot's upstream accepts the Claude-Code identity on 4.8.\n // Probed 2026-05-29.\n if (safetyIdentifier && sessionId && payload.model !== \"claude-opus-4.8\") {\n prepareMessageProxyHeaders(headers)\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 response = await fetch(`${copilotBaseUrl(state)}/v1/messages`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\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 \"~/services/copilot/get-models\"\n\nimport { debugJson, debugJsonTail, debugLazy } from \"~/lib/logger\"\nimport { resolveBridgeToolSearchName } from \"~/lib/tool-search\"\nimport {\n createCopilotTokenUsageRecorder,\n mergeAnthropicUsage,\n normalizeAnthropicUsage,\n normalizeOpenAIUsage,\n normalizeResponsesUsage,\n type TokenUsageEndpoint,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { 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 {\n createChatCompletions as createCopilotChatCompletions,\n type ChatCompletionChunk,\n type ChatCompletionResponse,\n type ChatCompletionsPayload,\n type Message,\n} from \"~/services/copilot/create-chat-completions\"\nimport { createMessages as createCopilotMessages } from \"~/services/copilot/create-messages\"\nimport {\n createResponses as createCopilotResponses,\n type ResponsesResult,\n type ResponseStreamEvent,\n} from \"~/services/copilot/create-responses\"\n\nimport {\n type AnthropicMessagesPayload,\n type AnthropicStreamEventData,\n type AnthropicStreamState,\n} from \"./anthropic-types\"\nimport {\n translateToAnthropic,\n translateToOpenAI,\n} from \"./non-stream-translation\"\nimport { prepareMessagesApiPayload } from \"./preprocess\"\nimport {\n flushPendingAnthropicStreamEvents,\n translateChunkToAnthropicEvents,\n} from \"./stream-translation\"\n\nconst COPILOT_CONTEXT_CACHE_SYSTEM_MARKER_LIMIT = 2\nconst COPILOT_CONTEXT_CACHE_NON_SYSTEM_MARKER_LIMIT = 2\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}\n\ninterface ResponsesFlowOptions extends FlowBaseOptions {\n selectedModel?: Model\n}\n\ninterface MessagesFlowOptions extends FlowBaseOptions {\n anthropicBetaHeader?: string\n selectedModel?: Model\n}\n\nexport const handleWithChatCompletions = async (\n c: Context,\n anthropicPayload: AnthropicMessagesPayload,\n options: FlowBaseOptions,\n) => {\n const { logger, subagentMarker, requestId, sessionId, compactType } = options\n const openAIPayload = translateToOpenAI(anthropicPayload)\n prepareCopilotChatCompletionsPayload(openAIPayload)\n const recordUsage = createCopilotUsageRecorder({\n endpoint: \"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 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(normalizeOpenAIUsage(response.usage))\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 contentBlockIndex: 0,\n contentBlockOpen: false,\n toolCalls: {},\n thinkingBlockOpen: false,\n }\n\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 if (chunk.usage) {\n usage = normalizeOpenAIUsage(chunk.usage)\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 stream.writeSSE({\n event: event.type,\n data: eventData,\n })\n }\n }\n\n for (const event of flushPendingAnthropicStreamEvents(streamState)) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\"Translated Anthropic event:\", eventData])\n await stream.writeSSE({\n event: event.type,\n data: eventData,\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 = translateAnthropicMessagesToResponsesPayload(\n anthropicPayload,\n requestOptions.subagentMarker?.agent_id,\n )\n const recordUsage = createCopilotUsageRecorder({\n endpoint: \"responses\",\n fallbackSessionId: requestOptions.sessionId,\n model: responsesPayload.model,\n payload: anthropicPayload,\n })\n\n applyResponsesApiContextManagement(\n responsesPayload,\n selectedModel?.capabilities.limits.max_prompt_tokens,\n )\n\n compactInputByLatestCompaction(responsesPayload)\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 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 stream.writeSSE({ event: \"ping\", data: '{\"type\":\"ping\"}' })\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 if (\n responseEvent.type === \"response.completed\"\n || responseEvent.type === \"response.failed\"\n || responseEvent.type === \"response.incomplete\"\n ) {\n usage = normalizeResponsesUsage(responseEvent.response.usage)\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 stream.writeSSE({\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\",\n )\n await stream.writeSSE({\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n }\n\n debugJsonTail(logger, \"Non-streaming Responses result:\", {\n value: response,\n tailLength: 400,\n })\n const anthropicResponse = translateResponsesResultToAnthropic(\n response as ResponsesResult,\n {\n toolSearchName: resolveBridgeToolSearchName(anthropicPayload.tools),\n },\n )\n recordUsage(normalizeResponsesUsage((response as ResponsesResult).usage))\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: \"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 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\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 if (parsedEvent?.type === \"message_start\") {\n usage = mergeAnthropicUsage(\n usage,\n normalizeAnthropicUsage(parsedEvent.message.usage),\n )\n } else if (parsedEvent?.type === \"message_delta\") {\n usage = mergeAnthropicUsage(\n usage,\n normalizeAnthropicUsage(parsedEvent.usage),\n )\n }\n await stream.writeSSE({\n event: eventName,\n data,\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(normalizeAnthropicUsage(response.usage))\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 isAsyncIterable = <T>(value: unknown): value is AsyncIterable<T> =>\n Boolean(value)\n && typeof (value as AsyncIterable<T>)[Symbol.asyncIterator] === \"function\"\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 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 \"./anthropic-types\"\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 \"~/services/copilot/get-models\"\n\nimport { awaitApproval } from \"~/lib/approval\"\nimport { COMPACT_REQUEST } from \"~/lib/compact\"\nimport {\n getSmallModel,\n isMessagesApiEnabled,\n resolveMappedModel,\n} from \"~/lib/config\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { parseProviderModelAlias } from \"~/lib/provider-model\"\nimport { checkRateLimit } from \"~/lib/rate-limit\"\nimport { state } from \"~/lib/state\"\nimport { generateRequestIdFromPayload, getRootSessionId } from \"~/lib/utils\"\nimport { handleProviderMessagesForProvider } from \"~/routes/provider/messages/handler\"\nimport { getResponsesTransportForModel } from \"~/routes/responses/utils\"\n\nimport type { AnthropicMessagesPayload } from \"./anthropic-types\"\nimport {\n handleWithChatCompletions,\n handleWithMessagesApi,\n handleWithResponsesApi,\n} from \"./api-flows\"\nimport {\n applyLastMessageCacheControl,\n getCompactType,\n getLastMessageContentCacheControl,\n mergeToolResultForClaude,\n normalizeSystemMessages,\n sanitizeIdeTools,\n stripToolReferenceTurnBoundary,\n} from \"./preprocess\"\nimport { parseSubagentMarkerFromFirstUser } from \"./subagent-marker\"\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 const requestedModel = anthropicPayload.model\n anthropicPayload.model = resolveMappedModel(anthropicPayload.model)\n if (anthropicPayload.model !== requestedModel) {\n logger.debug(\n `Resolved model mapping: ${requestedModel} -> ${anthropicPayload.model}`,\n )\n }\n\n const providerModelAlias = parseProviderModelAlias(anthropicPayload.model)\n if (providerModelAlias) {\n anthropicPayload.model = providerModelAlias.model\n return await handleProviderMessagesForProvider(c, {\n payload: anthropicPayload,\n provider: providerModelAlias.provider,\n })\n }\n\n debugJson(logger, \"Anthropic request payload:\", anthropicPayload)\n\n normalizeSystemMessages(anthropicPayload)\n\n await checkRateLimit(state)\n\n sanitizeIdeTools(anthropicPayload)\n\n const subagentMarker = parseSubagentMarkerFromFirstUser(anthropicPayload)\n if (subagentMarker) {\n debugJson(logger, \"Detected Subagent marker:\", subagentMarker)\n }\n\n const sessionId = getRootSessionId(anthropicPayload, c)\n logger.debug(\"Extracted session ID:\", sessionId)\n\n // claude code and opencode compact / auto-continue detection\n const 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 const noTools = !anthropicPayload.tools || anthropicPayload.tools.length === 0\n if (anthropicBeta && noTools && compactType === 0) {\n anthropicPayload.model = getSmallModel()\n }\n\n if (compactType) {\n logger.debug(\"Compact request type:\", compactType)\n }\n\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 const requestId = generateRequestIdFromPayload(anthropicPayload, sessionId)\n logger.debug(\"Generated request ID:\", requestId)\n\n if (state.manualApprove) {\n await awaitApproval()\n }\n\n const selectedModel = findEndpointModel(anthropicPayload.model)\n anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model\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 },\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 },\n )\n }\n\n return await messagesFlowHandlers.handleWithChatCompletions(\n c,\n anthropicPayload,\n {\n subagentMarker,\n requestId,\n sessionId,\n compactType,\n logger,\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","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\nimport { cacheModels } from \"~/lib/utils\"\n\nexport const modelRoutes = new Hono()\n\nmodelRoutes.get(\"/\", async (c) => {\n try {\n if (!state.models) {\n // This should be handled by startup logic, but as a fallback.\n await cacheModels()\n }\n\n const models = state.models?.data.map((model) => {\n // limits is typed as required but is missing for embedding models at runtime\n const is1m =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n model.capabilities.limits?.max_context_window_tokens === 1_000_000\n return {\n ...model,\n id: is1m ? `${model.id}[1m]` : model.id,\n object: \"model\",\n type: \"model\",\n created: 0, // No date available from source\n created_at: new Date(0).toISOString(), // No date available from source\n owned_by: model.vendor,\n display_name: model.name,\n }\n })\n\n return c.json({\n object: \"list\",\n data: models,\n has_more: false,\n })\n } catch (error) {\n return await forwardError(c, error)\n }\n})\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 { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { getModels as getCodexModels } from \"~/services/codex/get-models\"\nimport {\n createProviderProxyResponse,\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 const models = getCodexModels()\n return c.json({\n object: \"list\",\n data: models.data,\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 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 { Context } from \"hono\"\n\nimport { events } from \"fetch-event-stream\"\nimport { streamSSE } from \"hono/streaming\"\n\nimport { logCodexRateLimitsEvent } from \"~/lib/codex-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { requestContext } from \"~/lib/request-context\"\nimport {\n createProviderTokenUsageRecorder,\n normalizeResponsesUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n} from \"~/routes/responses/utils\"\nimport type {\n ResponsesPayload,\n ResponsesResult,\n ResponseStreamEvent,\n ResponsesStream,\n} from \"~/services/copilot/create-responses\"\nimport { forwardCodexResponses } from \"~/services/codex/create-responses\"\nimport { getModels as getCodexModels } from \"~/services/codex/get-models\"\nimport {\n createProviderProxyResponse,\n forwardProviderResponses,\n} from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"provider-responses-handler\")\n\nexport async function handleProviderResponsesForProvider(\n c: Context,\n options: {\n payload: ResponsesPayload\n provider: string\n },\n): Promise<Response> {\n const { payload, provider } = options\n debugJson(logger, \"Responses request payload:\", {\n payload,\n provider,\n })\n const providerConfig = await resolveProviderConfig(provider)\n if (providerConfig?.type !== \"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 const model =\n providerConfig.name === \"codex\" ?\n getCodexModels().data.find((model) => model.id === payload.model)\n : undefined\n\n const maxPromptTokens = model?.capabilities.limits.max_prompt_tokens ?? 0\n // Smaller than the client compaction threshold, use server-side compaction to maintain cache hit rate\n applyResponsesApiContextManagement(payload, maxPromptTokens, 0.8)\n\n const contextManagement = payload.context_management\n debugJson(logger, \"Translated Responses request payload:\", {\n contextManagement,\n provider,\n })\n\n compactInputByLatestCompaction(payload)\n\n if (providerConfig.name === \"codex\") {\n const upstreamResponse = await forwardCodexResponses(\n payload,\n c.req.raw.headers,\n providerConfig.baseUrl,\n )\n const recordUsage = createProviderResponsesUsageRecorder(payload, provider)\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 )\n\n if (!upstreamResponse.ok) {\n throw new HTTPError(\n `Failed to create ${provider} responses`,\n upstreamResponse,\n )\n }\n\n const recordUsage = createProviderResponsesUsageRecorder(payload, provider)\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 createProviderResponsesUsageRecorder = (\n payload: ResponsesPayload,\n provider: string,\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 providerName: provider,\n sessionId: sessionAffinity ?? \"\",\n })\n}\n\nconst streamProviderResponses = (\n c: Context,\n upstreamResponse: ResponsesStream,\n options: {\n normalizeCodex: boolean\n provider: string\n recordUsage: (usage: UsageTokens) => void\n },\n): Response => {\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n\n try {\n for await (const chunk of upstreamResponse) {\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) {\n responseChunk = {\n ...chunk,\n data: JSON.stringify(event),\n event: event.type,\n }\n }\n }\n\n if (event) {\n const nextUsage = getResponsesStreamEventUsage(event)\n if (nextUsage) {\n usage = nextUsage\n }\n }\n\n await stream.writeSSE({\n data: responseChunk.data ?? \"\",\n event: responseChunk.event,\n })\n }\n } finally {\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 events(response)\n\nconst isResponsesStream = (value: unknown): value is ResponsesStream => {\n return (\n Boolean(value)\n && typeof (value as ResponsesStream)[Symbol.asyncIterator] === \"function\"\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 \"~/services/copilot/create-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 { awaitApproval } from \"~/lib/approval\"\nimport {\n isResponsesApiWebSearchEnabled as isConfiguredResponsesApiWebSearchEnabled,\n resolveMappedModel,\n} from \"~/lib/config\"\nimport { createHandlerLogger, debugJson, debugJsonTail } from \"~/lib/logger\"\nimport { parseProviderModelAlias } from \"~/lib/provider-model\"\nimport { checkRateLimit as checkConfiguredRateLimit } from \"~/lib/rate-limit\"\nimport { handleProviderResponsesForProvider } from \"~/routes/provider/responses/handler\"\nimport { state } from \"~/lib/state\"\nimport {\n createCopilotTokenUsageRecorder,\n normalizeResponsesUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { generateRequestIdFromPayload, getUUID } from \"~/lib/utils\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport {\n createResponses as createCopilotResponses,\n type ResponsesPayload,\n type ResponsesResult,\n type ResponseStreamEvent,\n} from \"~/services/copilot/create-responses\"\n\nimport { createStreamIdTracker, fixStreamIds } from \"./stream-id-sync\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n getResponsesTransportForModel,\n getResponsesRequestOptions,\n sanitizeOversizedInputImages,\n} from \"./utils\"\n\nconst logger = createHandlerLogger(\"responses-handler\")\n\nexport const responsesHandlerDependencies = {\n checkRateLimit: checkConfiguredRateLimit,\n createResponses: createCopilotResponses,\n isResponsesApiWebSearchEnabled: isConfiguredResponsesApiWebSearchEnabled,\n}\n\nexport const handleResponses = async (c: Context) => {\n const payload = await c.req.json<ResponsesPayload>()\n const requestedModel = payload.model\n payload.model = resolveMappedModel(payload.model)\n if (payload.model !== requestedModel) {\n logger.debug(\n `Resolved model mapping: ${requestedModel} -> ${payload.model}`,\n )\n }\n\n const providerModelAlias = parseProviderModelAlias(payload.model)\n if (providerModelAlias) {\n payload.model = providerModelAlias.model\n return await handleProviderResponsesForProvider(c, {\n payload,\n provider: providerModelAlias.provider,\n })\n }\n\n debugJson(logger, \"Responses request payload:\", payload)\n await responsesHandlerDependencies.checkRateLimit(state)\n\n const subagentMarker = getCodexResponsesSubagentMarker(c)\n if (subagentMarker) {\n debugJson(logger, \"Detected Codex subagent headers:\", subagentMarker)\n }\n const incomingSessionId =\n subagentMarker ? getIncomingResponsesSessionId(c) : undefined\n const sessionId = incomingSessionId ? getUUID(incomingSessionId) : undefined\n const requestId = generateRequestIdFromPayload(\n { messages: payload.input },\n sessionId,\n )\n logger.debug(\"Generated request ID:\", requestId)\n\n const fallbackSessionId = sessionId ?? getUUID(requestId)\n logger.debug(\"Extracted session ID:\", fallbackSessionId)\n const recordUsage = createCopilotTokenUsageRecorder({\n endpoint: \"responses\",\n fallbackSessionId,\n model: payload.model,\n })\n\n removeUnsupportedTools(payload)\n\n if (!responsesHandlerDependencies.isResponsesApiWebSearchEnabled()) {\n removeWebSearchTool(payload)\n }\n\n compactInputByLatestCompaction(payload)\n\n const selectedModel = state.models?.data.find(\n (model) => model.id === payload.model,\n )\n const responsesTransport = getResponsesTransportForModel(selectedModel)\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 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 applyResponsesApiContextManagement(\n payload,\n selectedModel?.capabilities.limits.max_prompt_tokens,\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 if (state.manualApprove) {\n await awaitApproval()\n }\n\n const response = await responsesHandlerDependencies.createResponses(payload, {\n vision,\n initiator,\n subagentMarker,\n requestId,\n sessionId: fallbackSessionId,\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\n for await (const chunk of response) {\n debugJson(logger, \"Responses stream chunk:\", chunk)\n const parsedEvent = parseResponsesStreamEvent(chunk)\n if (\n parsedEvent?.type === \"response.completed\"\n || parsedEvent?.type === \"response.failed\"\n || parsedEvent?.type === \"response.incomplete\"\n ) {\n usage = normalizeResponsesUsage(parsedEvent.response.usage)\n }\n\n const processedData = fixStreamIds(\n (chunk as { data?: string }).data ?? \"\",\n (chunk as { event?: string }).event,\n idTracker,\n )\n\n await stream.writeSSE({\n id: (chunk as { id?: string }).id,\n event: (chunk as { event?: string }).event,\n data: processedData,\n })\n }\n\n recordUsage(usage)\n })\n }\n\n debugJsonTail(logger, \"Forwarding native Responses result:\", {\n value: response,\n tailLength: 400,\n })\n recordUsage(normalizeResponsesUsage((response as ResponsesResult).usage))\n return c.json(response as ResponsesResult)\n}\n\nconst isAsyncIterable = <T>(value: unknown): value is AsyncIterable<T> =>\n Boolean(value)\n && typeof (value as AsyncIterable<T>)[Symbol.asyncIterator] === \"function\"\n\nconst isStreamingRequested = (payload: ResponsesPayload): boolean =>\n Boolean(payload.stream)\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\"])\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 if (COPILOT_UNSUPPORTED_TOOL_TYPES.has(type)) {\n dropped.push(type)\n return false\n }\n return true\n })\n if (dropped.length > 0) {\n logger.debug(\"Removed unsupported tools:\", dropped)\n }\n}\n\nconst getIncomingResponsesSessionId = (c: Context): string | undefined =>\n getTrimmedHeader(c, \"session-id\") ?? getTrimmedHeader(c, \"x-session-id\")\n\nconst codexSubagentHeaderValues = new Set([\n \"collab_spawn\",\n \"compact\",\n \"memory_consolidation\",\n \"review\",\n])\n\nconst getCodexResponsesSubagentMarker = (c: Context): SubagentMarker | null => {\n const agentType = getTrimmedHeader(c, \"x-openai-subagent\")\n if (!agentType || !codexSubagentHeaderValues.has(agentType)) {\n return null\n }\n\n const threadId = getTrimmedHeader(c, \"thread-id\")\n const rootSessionId = getIncomingResponsesSessionId(c)\n const parentThreadId = getTrimmedHeader(c, \"x-codex-parent-thread-id\")\n if (!threadId && !rootSessionId && !parentThreadId) {\n return null\n }\n\n const agentId = threadId ?? parentThreadId ?? rootSessionId ?? agentType\n\n return {\n agent_id: agentId,\n agent_type: agentType,\n session_id: threadId ?? rootSessionId ?? agentId,\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\"\n\nimport { handleResponses } from \"./handler\"\n\nexport const responsesRoutes = new Hono()\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 } from \"hono\"\n\nimport {\n getTokenUsageDailySummary,\n getTokenUsageEventsPage,\n getTokenUsageSummary,\n type TokenUsagePeriod,\n} from \"~/lib/token-usage\"\n\nexport const tokenUsageRoute = new Hono()\n\nconst periods = new Set<TokenUsagePeriod>([\"day\", \"week\", \"month\"])\nconst DEFAULT_EVENTS_PAGE_SIZE = 20\n\nfunction parsePeriod(value: string | undefined): TokenUsagePeriod {\n return periods.has(value as TokenUsagePeriod) ?\n (value as TokenUsagePeriod)\n : \"day\"\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\ntokenUsageRoute.get(\"/events\", async (c) => {\n const period = parsePeriod(c.req.query(\"period\"))\n const page = parsePositiveInt(c.req.query(\"page\"), 1)\n const pageSize = parsePositiveInt(\n c.req.query(\"page_size\"),\n DEFAULT_EVENTS_PAGE_SIZE,\n )\n const eventsPage = await getTokenUsageEventsPage({ page, pageSize, period })\n return c.json(eventsPage)\n})\n","import { Hono } from \"hono\"\n\nimport { state } from \"~/lib/state\"\n\nexport const tokenRoute = new Hono()\n\ntokenRoute.get(\"/\", (c) => {\n try {\n return c.json({\n token: state.copilotToken,\n })\n } catch (error) {\n console.error(\"Error fetching token:\", error)\n return c.json({ error: \"Failed to fetch token\", token: null }, 500)\n }\n})\n","import { Hono } from \"hono\"\n\nimport { getCopilotUsage } from \"~/services/github/get-copilot-usage\"\n\nexport const usageRoute = new Hono()\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 { Hono } 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 { completionRoutes } from \"./routes/chat-completions/route\"\nimport { configRoutes } from \"./routes/admin/config/route\"\nimport { embeddingRoutes } from \"./routes/embeddings/route\"\nimport { messageRoutes } from \"./routes/messages/route\"\nimport { modelRoutes } from \"./routes/models/route\"\nimport { providerMessageRoutes } from \"./routes/provider/messages/route\"\nimport { providerModelRoutes } from \"./routes/provider/models/route\"\nimport { responsesRoutes } from \"./routes/responses/route\"\nimport { tokenUsageRoute } from \"./routes/token-usage/route\"\nimport { tokenRoute } from \"./routes/token/route\"\nimport { usageRoute } from \"./routes/usage/route\"\n\nexport const server = new Hono()\n\nserver.use(traceIdMiddleware)\nserver.use(logger())\nserver.use(cors())\nserver.use(\n \"*\",\n createAuthMiddleware({\n allowUnauthenticatedPaths: [\"/\", \"/usage-viewer\", \"/usage-viewer/\"],\n shouldSkipPath: (path) => path.startsWith(\"/admin/\"),\n }),\n)\nserver.use(\n \"/admin/*\",\n createAuthMiddleware({\n getApiKeys: getConfiguredAdminApiKeys,\n allowUnauthenticatedPaths: [],\n allowWhenNoApiKeys: false,\n }),\n)\n\nserver.get(\"/\", (c) => c.text(\"Server running\"))\nserver.get(\"/usage-viewer\", (c) => {\n const usageViewerFileUrl = new URL(\"../pages/index.html\", import.meta.url)\n return c.html(readFileSync(usageViewerFileUrl, \"utf8\"))\n})\nserver.get(\"/usage-viewer/\", (c) => c.redirect(\"/usage-viewer\", 301))\n\nserver.route(\"/chat/completions\", completionRoutes)\nserver.route(\"/admin/config\", configRoutes)\nserver.route(\"/models\", modelRoutes)\nserver.route(\"/embeddings\", embeddingRoutes)\nserver.route(\"/usage\", usageRoute)\nserver.route(\"/token-usage\", tokenUsageRoute)\nserver.route(\"/token\", tokenRoute)\nserver.route(\"/responses\", responsesRoutes)\n\n// Compatibility with tools that expect v1/ prefix\nserver.route(\"/v1/chat/completions\", completionRoutes)\nserver.route(\"/v1/models\", modelRoutes)\nserver.route(\"/v1/embeddings\", embeddingRoutes)\nserver.route(\"/v1/responses\", responsesRoutes)\n\n// Anthropic compatible endpoints\nserver.route(\"/v1/messages\", messageRoutes)\n\n// Provider scoped Anthropic-compatible endpoints\nserver.route(\"/:provider/v1/messages\", providerMessageRoutes)\nserver.route(\"/:provider/v1/models\", providerModelRoutes)\n"],"mappings":"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"}