ghc-proxy 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.mjs +8 -3
- package/dist/main.mjs.map +1 -1
- package/package.json +2 -1
package/dist/main.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.mjs","names":["hasVisionInput","containsVisionContent"],"sources":["../src/lib/paths.ts","../src/lib/config.ts","../src/lib/api-config.ts","../src/lib/error.ts","../src/clients/copilot-client.ts","../src/lib/sleep.ts","../src/clients/github-client.ts","../src/clients/vscode-client.ts","../src/lib/state.ts","../src/lib/token.ts","../src/auth.ts","../src/check-usage.ts","../src/lib/version.ts","../src/debug.ts","../src/lib/proxy.ts","../src/lib/shell.ts","../src/lib/request-logger.ts","../src/lib/sse-adapter.ts","../src/lib/approval.ts","../src/lib/rate-limit.ts","../src/routes/middleware/request-guard.ts","../src/lib/assert-never.ts","../src/core/capi/profile.ts","../src/core/capi/request-context.ts","../src/core/capi/plan-builder.ts","../src/translator/anthropic/anthropic-normalizer.ts","../src/translator/anthropic/shared.ts","../src/translator/anthropic/anthropic-stream-transducer.ts","../src/translator/anthropic/openai-anthropic-mapper.ts","../src/translator/anthropic/translation-issue.ts","../src/translator/anthropic/openai-normalizer.ts","../src/translator/anthropic/translation-policy.ts","../src/adapters/anthropic-messages-adapter.ts","../src/adapters/copilot-transport.ts","../src/adapters/openai-chat-adapter.ts","../src/lib/execution-strategy.ts","../src/lib/model-capabilities.ts","../src/lib/tokenizer.ts","../src/lib/upstream-signal.ts","../src/types/copilot.ts","../src/lib/validation.ts","../src/routes/chat-completions/strategy.ts","../src/routes/chat-completions/handler.ts","../src/routes/chat-completions/route.ts","../src/routes/embeddings/handler.ts","../src/routes/embeddings/route.ts","../src/lib/model-resolver.ts","../src/routes/messages/shared.ts","../src/routes/messages/count-tokens-handler.ts","../src/lib/request-model-policy.ts","../src/translator/responses/signature-codec.ts","../src/translator/responses/anthropic-to-responses.ts","../src/routes/responses/context-management.ts","../src/routes/messages/strategies/chat-completions.ts","../src/lib/async-iterable.ts","../src/routes/messages/strategies/native-messages.ts","../src/translator/responses/responses-to-anthropic.ts","../src/translator/responses/responses-stream-translator.ts","../src/routes/messages/strategies/responses-api.ts","../src/routes/messages/handler.ts","../src/routes/messages/route.ts","../src/routes/models/handler.ts","../src/routes/models/route.ts","../src/routes/responses/strategy.ts","../src/routes/responses/handler.ts","../src/routes/responses/resource-handler.ts","../src/routes/responses/route.ts","../src/routes/token/handler.ts","../src/routes/token/route.ts","../src/routes/usage/handler.ts","../src/routes/usage/route.ts","../src/server.ts","../src/start.ts","../src/main.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\n\nconst APP_DIR = path.join(os.homedir(), '.local', 'share', 'ghc-proxy')\n\nconst CONFIG_PATH = path.join(APP_DIR, 'config.json')\n\nexport const PATHS = {\n APP_DIR,\n CONFIG_PATH,\n}\n\nexport async function ensurePaths(): Promise<void> {\n await fs.mkdir(PATHS.APP_DIR, { recursive: true })\n}\n","import fs from 'node:fs/promises'\nimport process from 'node:process'\nimport consola from 'consola'\nimport { z } from 'zod'\n\nimport { PATHS } from './paths'\n\nconst reasoningEffortSchema = z.enum([\n 'none',\n 'minimal',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n])\n\ntype ReasoningEffort = z.infer<typeof reasoningEffortSchema>\n\nconst configFileSchema = z.object({\n githubToken: z.string().optional(),\n modelFallback: z.object({\n claudeOpus: z.string().optional(),\n claudeSonnet: z.string().optional(),\n claudeHaiku: z.string().optional(),\n }).optional(),\n smallModel: z.string().optional(),\n compactUseSmallModel: z.boolean().optional(),\n warmupUseSmallModel: z.boolean().optional(),\n useFunctionApplyPatch: z.boolean().optional(),\n responsesApiContextManagementModels: z.array(z.string()).optional(),\n modelReasoningEfforts: z.record(z.string(), reasoningEffortSchema).optional(),\n}).passthrough()\n\nexport type ConfigFile = z.infer<typeof configFileSchema>\n\nconst KNOWN_CONFIG_KEYS = new Set(Object.keys(configFileSchema.shape))\n\nlet cachedConfig: ConfigFile = {}\n\nconst DEFAULT_REASONING_EFFORT: ReasoningEffort = 'high'\nconst DEFAULT_USE_FUNCTION_APPLY_PATCH = true\nconst DEFAULT_COMPACT_USE_SMALL_MODEL = false\nconst DEFAULT_WARMUP_USE_SMALL_MODEL = false\n\nexport async function readConfig(): Promise<ConfigFile> {\n try {\n const content = await fs.readFile(PATHS.CONFIG_PATH, 'utf8')\n\n if (!content.trim()) {\n cachedConfig = {}\n return {}\n }\n\n const raw = JSON.parse(content) as unknown\n\n if (\n typeof raw !== 'object'\n || raw === null\n || Array.isArray(raw)\n ) {\n consola.warn('config.json is not a valid object. Using defaults.')\n cachedConfig = {}\n return {}\n }\n\n const result = configFileSchema.safeParse(raw)\n if (!result.success) {\n consola.warn(\n 'config.json has invalid fields:',\n result.error.issues.map(i => `${i.path.join('.')}: ${i.message}`).join('; '),\n 'Using defaults for invalid fields.',\n )\n // Fall back to treating the raw object as-is for known valid fields\n cachedConfig = raw as ConfigFile\n return cachedConfig\n }\n\n // Warn about unknown fields\n const unknownKeys = Object.keys(raw as Record<string, unknown>)\n .filter(key => !KNOWN_CONFIG_KEYS.has(key))\n if (unknownKeys.length > 0) {\n consola.warn(`config.json contains unknown fields: ${unknownKeys.join(', ')}`)\n }\n\n cachedConfig = result.data\n return cachedConfig\n }\n catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n cachedConfig = {}\n return {}\n }\n\n consola.warn(\n `Failed to parse config.json: ${(error as Error).message}. Using defaults.`,\n )\n cachedConfig = {}\n return {}\n }\n}\n\nexport function getCachedConfig(): ConfigFile {\n return cachedConfig\n}\n\nexport function getSmallModel(): string | undefined {\n return cachedConfig.smallModel?.trim() || undefined\n}\n\nexport function shouldCompactUseSmallModel(): boolean {\n return cachedConfig.compactUseSmallModel ?? DEFAULT_COMPACT_USE_SMALL_MODEL\n}\n\nexport function shouldWarmupUseSmallModel(): boolean {\n return cachedConfig.warmupUseSmallModel ?? DEFAULT_WARMUP_USE_SMALL_MODEL\n}\n\nexport function shouldUseFunctionApplyPatch(): boolean {\n return cachedConfig.useFunctionApplyPatch ?? DEFAULT_USE_FUNCTION_APPLY_PATCH\n}\n\nexport function isResponsesApiContextManagementModel(model: string): boolean {\n return cachedConfig.responsesApiContextManagementModels?.includes(model) ?? false\n}\n\nexport function getReasoningEffortForModel(model: string): ReasoningEffort {\n return cachedConfig.modelReasoningEfforts?.[model] ?? DEFAULT_REASONING_EFFORT\n}\n\nexport async function writeConfigField(\n field: string,\n value: unknown,\n): Promise<void> {\n try {\n let existing: ConfigFile = {}\n try {\n const content = await fs.readFile(PATHS.CONFIG_PATH, 'utf8')\n if (content.trim()) {\n existing = JSON.parse(content) as ConfigFile\n }\n }\n catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n consola.warn(\n `Could not read existing config.json: ${\n (error as Error).message\n }. Starting fresh.`,\n )\n }\n }\n\n const merged = { ...existing, [field]: value }\n\n await fs.writeFile(\n PATHS.CONFIG_PATH,\n JSON.stringify(merged, null, 2),\n 'utf8',\n )\n await applyConfigFilePermissions(PATHS.CONFIG_PATH)\n\n cachedConfig = merged\n }\n catch (error: unknown) {\n consola.error(`Failed to write config.json: ${(error as Error).message}`)\n throw error\n }\n}\n\nasync function applyConfigFilePermissions(filePath: string): Promise<void> {\n if (process.platform === 'win32') {\n return\n }\n\n try {\n await fs.chmod(filePath, 0o600)\n }\n catch (error) {\n consola.warn(\n `Could not set config.json permissions to 0600: ${(error as Error).message}`,\n )\n }\n}\n","import type { ClientAuth, ClientConfig } from '~/clients'\nimport type { CapiRequestContext } from '~/core/capi'\n\nimport { randomUUID } from 'node:crypto'\n\nexport function standardHeaders() {\n return {\n 'content-type': 'application/json',\n 'accept': 'application/json',\n }\n}\n\nconst COPILOT_VERSION = '0.26.7'\nconst EDITOR_PLUGIN_VERSION = `copilot-chat/${COPILOT_VERSION}`\nconst USER_AGENT = `GitHubCopilotChat/${COPILOT_VERSION}`\n\nconst API_VERSION = '2025-04-01'\n\nexport function copilotBaseUrl(config: ClientConfig) {\n if (config.copilotApiBase) {\n return config.copilotApiBase.replace(/\\/+$/, '')\n }\n return config.accountType === 'individual'\n ? 'https://api.githubcopilot.com'\n : `https://api.${config.accountType}.githubcopilot.com`\n}\nexport interface CopilotHeaderOptions {\n initiator?: 'user' | 'agent'\n requestContext?: Partial<CapiRequestContext>\n vision?: boolean\n}\n\nexport function copilotHeaders(\n auth: ClientAuth,\n config: ClientConfig,\n options: CopilotHeaderOptions = {},\n) {\n const requestContext = options.requestContext\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${auth.copilotToken}`,\n 'content-type': standardHeaders()['content-type'],\n 'copilot-integration-id': 'vscode-chat',\n 'editor-version': `vscode/${config.vsCodeVersion ?? 'unknown'}`,\n 'editor-plugin-version': EDITOR_PLUGIN_VERSION,\n 'user-agent': USER_AGENT,\n 'openai-intent': 'conversation-panel',\n 'x-github-api-version': API_VERSION,\n 'x-request-id': randomUUID(),\n 'x-vscode-user-agent-library-version': 'electron-fetch',\n }\n\n if (options.vision)\n headers['copilot-vision-request'] = 'true'\n\n if (options.initiator) {\n headers['X-Initiator'] = options.initiator\n }\n\n if (requestContext?.interactionType) {\n headers['X-Interaction-Type'] = requestContext.interactionType\n }\n if (requestContext?.agentTaskId) {\n headers['X-Agent-Task-Id'] = requestContext.agentTaskId\n }\n if (requestContext?.parentAgentTaskId) {\n headers['X-Parent-Agent-Id'] = requestContext.parentAgentTaskId\n }\n if (requestContext?.clientSessionId) {\n headers['X-Client-Session-Id'] = requestContext.clientSessionId\n }\n if (requestContext?.interactionId) {\n headers['X-Interaction-Id'] = requestContext.interactionId\n }\n if (requestContext?.clientMachineId) {\n headers['X-Client-Machine-Id'] = requestContext.clientMachineId\n }\n\n return headers\n}\n\nexport const GITHUB_API_BASE_URL = 'https://api.github.com'\nexport function githubHeaders(auth: ClientAuth, config: ClientConfig) {\n return {\n ...standardHeaders(),\n 'authorization': `token ${auth.githubToken}`,\n 'editor-version': `vscode/${config.vsCodeVersion ?? 'unknown'}`,\n 'editor-plugin-version': EDITOR_PLUGIN_VERSION,\n 'user-agent': USER_AGENT,\n 'x-github-api-version': API_VERSION,\n 'x-vscode-user-agent-library-version': 'electron-fetch',\n }\n}\n\nexport const GITHUB_BASE_URL = 'https://github.com'\nexport const GITHUB_CLIENT_ID = 'Iv1.b507a08c87ecfe98'\nexport const GITHUB_APP_SCOPES = ['read:user'].join(' ')\n","import consola from 'consola'\n\nexport interface HTTPErrorBody {\n error: {\n message: string\n type: string\n param?: string\n code?: string\n details?: Array<{ path: unknown, message: string }>\n }\n}\n\n/**\n * Elysia-native error class with `status` property and `toResponse()`.\n * Elysia auto-handles this via `toResponse()` when thrown in route handlers.\n */\nexport class HTTPError extends Error {\n readonly status: number\n readonly body: HTTPErrorBody\n\n constructor(status: number, body: HTTPErrorBody) {\n super(body.error.message)\n this.name = 'HTTPError'\n this.status = status\n this.body = body\n }\n\n toResponse() {\n return Response.json(this.body, { status: this.status })\n }\n}\n\nexport function throwInvalidRequestError(\n message: string,\n param: string,\n code?: string,\n): never {\n throw new HTTPError(400, {\n error: {\n message,\n type: 'invalid_request_error',\n param,\n ...(code ? { code } : {}),\n },\n })\n}\n\nexport function fromTranslationFailure(failure: { message: string, status: number }): HTTPError {\n return new HTTPError(failure.status, {\n error: { message: failure.message, type: 'translation_error' },\n })\n}\n\nfunction isStructuredErrorPayload(\n value: unknown,\n): value is { error: Record<string, unknown> } {\n return typeof value === 'object'\n && value !== null\n && 'error' in value\n && typeof value.error === 'object'\n && value.error !== null\n}\n\n/**\n * Read an upstream Response body and throw an HTTPError with structured payload.\n * Used by CopilotClient when upstream returns a non-OK response.\n */\nexport async function throwUpstreamError(message: string, response: Response): Promise<never> {\n let body: HTTPErrorBody\n try {\n const text = await response.text()\n const json = JSON.parse(text)\n body = isStructuredErrorPayload(json)\n ? json as HTTPErrorBody\n : { error: { message: text, type: 'upstream_error' } }\n }\n catch {\n body = { error: { message, type: 'upstream_error' } }\n }\n consola.error('Upstream error:', body)\n throw new HTTPError(response.status, body)\n}\n","import type { ClientAuth, ClientConfig, ClientDeps } from './types'\nimport type {\n CapiChatCompletionResponse,\n CapiChatCompletionsPayload,\n CapiRequestContext,\n} from '~/core/capi'\nimport type { AnthropicMessagesPayload } from '~/translator'\nimport type {\n EmbeddingRequest,\n EmbeddingResponse,\n ModelsResponse,\n ResponseDeletionResult,\n ResponseInputItemsListParams,\n ResponseInputItemsListResult,\n ResponseInputTokensResult,\n ResponseRetrieveParams,\n ResponsesInputTokensPayload,\n ResponsesPayload,\n ResponsesResult,\n} from '~/types'\n\nimport consola from 'consola'\n\nimport { events } from 'fetch-event-stream'\nimport { copilotBaseUrl, copilotHeaders } from '~/lib/api-config'\n\nimport { throwUpstreamError } from '~/lib/error'\n\nexport class CopilotClient {\n private auth: ClientAuth\n private config: ClientConfig\n private fetchImpl: typeof fetch\n\n constructor(auth: ClientAuth, config: ClientConfig, deps?: ClientDeps) {\n this.auth = auth\n this.config = config\n this.fetchImpl = deps?.fetch ?? fetch\n }\n\n private requireToken(): void {\n if (!this.auth.copilotToken) {\n throw new Error('Copilot token not found')\n }\n }\n\n async createChatCompletions(\n payload: CapiChatCompletionsPayload,\n options?: {\n signal?: AbortSignal\n initiator?: 'user' | 'agent'\n requestContext?: CapiRequestContext\n },\n ) {\n this.requireToken()\n\n const enableVision = payload.messages.some(\n x =>\n typeof x.content !== 'string'\n && x.content?.some(content => content.type === 'image_url'),\n )\n\n const initiator = options?.initiator\n ?? (payload.messages.some(msg => ['assistant', 'tool'].includes(msg.role))\n ? 'agent'\n : 'user')\n\n const headers = copilotHeaders(this.auth, this.config, {\n vision: enableVision,\n initiator,\n requestContext: options?.requestContext,\n })\n\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/chat/completions`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to create chat completions', response)\n await throwUpstreamError('Failed to create chat completions', response)\n }\n\n if (payload.stream) {\n return events(response)\n }\n\n return (await response.json()) as CapiChatCompletionResponse\n }\n\n async createEmbeddings(\n payload: EmbeddingRequest,\n ): Promise<EmbeddingResponse> {\n this.requireToken()\n\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/embeddings`,\n {\n method: 'POST',\n headers: copilotHeaders(this.auth, this.config),\n body: JSON.stringify(payload),\n },\n )\n\n if (!response.ok) {\n await throwUpstreamError('Failed to create embeddings', response)\n }\n\n return (await response.json()) as EmbeddingResponse\n }\n\n async getModels(): Promise<ModelsResponse> {\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/models`,\n {\n headers: copilotHeaders(this.auth, this.config),\n },\n )\n\n if (!response.ok)\n await throwUpstreamError('Failed to get models', response)\n\n return (await response.json()) as ModelsResponse\n }\n\n async createResponses(\n payload: ResponsesPayload,\n options?: {\n signal?: AbortSignal\n initiator?: 'user' | 'agent'\n vision?: boolean\n requestContext?: Partial<CapiRequestContext>\n },\n ) {\n this.requireToken()\n\n const headers = copilotHeaders(this.auth, this.config, {\n vision: options?.vision,\n initiator: options?.initiator,\n requestContext: options?.requestContext,\n })\n\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/responses`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to create responses', response)\n await throwUpstreamError('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\n async getResponse(\n responseId: string,\n options?: {\n signal?: AbortSignal\n params?: ResponseRetrieveParams\n requestContext?: Partial<CapiRequestContext>\n },\n ): Promise<ResponsesResult | Record<string, unknown>> {\n this.requireToken()\n\n const response = await this.fetchImpl(\n this.buildResponsesUrl(responseId, options?.params),\n {\n headers: copilotHeaders(this.auth, this.config, {\n requestContext: options?.requestContext,\n }),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to get response', response)\n await throwUpstreamError('Failed to get response', response)\n }\n\n return await response.json() as ResponsesResult | Record<string, unknown>\n }\n\n async getResponseInputItems(\n responseId: string,\n params?: ResponseInputItemsListParams,\n options?: {\n signal?: AbortSignal\n requestContext?: Partial<CapiRequestContext>\n },\n ): Promise<ResponseInputItemsListResult | Record<string, unknown>> {\n this.requireToken()\n\n const response = await this.fetchImpl(\n this.buildResponseInputItemsUrl(responseId, params),\n {\n headers: copilotHeaders(this.auth, this.config, {\n requestContext: options?.requestContext,\n }),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to get response input items', response)\n await throwUpstreamError('Failed to get response input items', response)\n }\n\n return await response.json() as ResponseInputItemsListResult | Record<string, unknown>\n }\n\n async createResponseInputTokens(\n payload: ResponsesInputTokensPayload,\n options?: {\n signal?: AbortSignal\n requestContext?: Partial<CapiRequestContext>\n },\n ): Promise<ResponseInputTokensResult | Record<string, unknown>> {\n this.requireToken()\n\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/responses/input_tokens`,\n {\n method: 'POST',\n headers: copilotHeaders(this.auth, this.config, {\n requestContext: options?.requestContext,\n }),\n body: JSON.stringify(payload),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to create response input tokens', response)\n await throwUpstreamError('Failed to create response input tokens', response)\n }\n\n return await response.json() as ResponseInputTokensResult | Record<string, unknown>\n }\n\n async deleteResponse(\n responseId: string,\n options?: {\n signal?: AbortSignal\n requestContext?: Partial<CapiRequestContext>\n },\n ): Promise<ResponseDeletionResult | Record<string, unknown>> {\n this.requireToken()\n\n const response = await this.fetchImpl(\n this.buildResponsesUrl(responseId),\n {\n method: 'DELETE',\n headers: copilotHeaders(this.auth, this.config, {\n requestContext: options?.requestContext,\n }),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to delete response', response)\n await throwUpstreamError('Failed to delete response', response)\n }\n\n return await response.json() as ResponseDeletionResult | Record<string, unknown>\n }\n\n async createMessages(\n payload: AnthropicMessagesPayload,\n anthropicBetaHeader?: string,\n options?: {\n signal?: AbortSignal\n requestContext?: Partial<CapiRequestContext>\n },\n ) {\n this.requireToken()\n\n const headers = copilotHeaders(this.auth, this.config, {\n initiator: 'agent',\n requestContext: options?.requestContext,\n })\n\n if (anthropicBetaHeader) {\n headers['anthropic-beta'] = anthropicBetaHeader\n }\n\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/v1/messages`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to create messages', response)\n await throwUpstreamError('Failed to create messages', response)\n }\n\n if (payload.stream) {\n return events(response)\n }\n\n return await response.json()\n }\n\n private buildResponsesUrl(\n responseId?: string,\n params?: ResponseRetrieveParams,\n ): string {\n const base = responseId\n ? `${copilotBaseUrl(this.config)}/responses/${encodeURIComponent(responseId)}`\n : `${copilotBaseUrl(this.config)}/responses`\n\n const searchParams = new URLSearchParams()\n if (params?.include?.length) {\n for (const include of params.include) {\n searchParams.append('include', include)\n }\n }\n if (typeof params?.starting_after === 'number') {\n searchParams.set('starting_after', String(params.starting_after))\n }\n if (typeof params?.include_obfuscation === 'boolean') {\n searchParams.set('include_obfuscation', String(params.include_obfuscation))\n }\n if (typeof params?.stream === 'boolean') {\n searchParams.set('stream', String(params.stream))\n }\n\n const query = searchParams.toString()\n return query ? `${base}?${query}` : base\n }\n\n private buildResponseInputItemsUrl(\n responseId: string,\n params?: ResponseInputItemsListParams,\n ): string {\n const base = `${copilotBaseUrl(this.config)}/responses/${encodeURIComponent(responseId)}/input_items`\n const searchParams = new URLSearchParams()\n\n if (params?.include?.length) {\n for (const include of params.include) {\n searchParams.append('include', include)\n }\n }\n if (typeof params?.after === 'string') {\n searchParams.set('after', params.after)\n }\n if (typeof params?.limit === 'number') {\n searchParams.set('limit', String(params.limit))\n }\n if (typeof params?.order === 'string') {\n searchParams.set('order', params.order)\n }\n\n const query = searchParams.toString()\n return query ? `${base}?${query}` : base\n }\n}\n\nexport function isNonStreamingResponse(\n response: Awaited<ReturnType<CopilotClient['createChatCompletions']>>,\n): response is CapiChatCompletionResponse {\n return Object.hasOwn(response, 'choices')\n}\n","export function sleep(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms)\n })\n}\n","import type { ClientAuth, ClientConfig, ClientDeps } from './types'\n\nimport type {\n CopilotUsageResponse,\n DeviceCodeResponse,\n GetCopilotTokenResponse,\n GithubUserResponse,\n} from '~/types'\n\nimport consola from 'consola'\nimport {\n GITHUB_API_BASE_URL,\n GITHUB_APP_SCOPES,\n GITHUB_BASE_URL,\n GITHUB_CLIENT_ID,\n githubHeaders,\n standardHeaders,\n} from '~/lib/api-config'\nimport { throwUpstreamError } from '~/lib/error'\n\nimport { sleep } from '~/lib/sleep'\n\nexport class GitHubClient {\n private auth: ClientAuth\n private config: ClientConfig\n private fetchImpl: typeof fetch\n\n constructor(auth: ClientAuth, config: ClientConfig, deps?: ClientDeps) {\n this.auth = auth\n this.config = config\n this.fetchImpl = deps?.fetch ?? fetch\n }\n\n async getCopilotUsage(): Promise<CopilotUsageResponse> {\n const response = await this.fetchImpl(\n `${GITHUB_API_BASE_URL}/copilot_internal/user`,\n {\n headers: githubHeaders(this.auth, this.config),\n },\n )\n\n if (!response.ok) {\n await throwUpstreamError('Failed to get Copilot usage', response)\n }\n\n return (await response.json()) as CopilotUsageResponse\n }\n\n async getCopilotToken(): Promise<GetCopilotTokenResponse> {\n const response = await this.fetchImpl(\n `${GITHUB_API_BASE_URL}/copilot_internal/v2/token`,\n {\n headers: githubHeaders(this.auth, this.config),\n },\n )\n\n if (!response.ok) {\n await throwUpstreamError('Failed to get Copilot token', response)\n }\n\n return (await response.json()) as GetCopilotTokenResponse\n }\n\n async getDeviceCode(): Promise<DeviceCodeResponse> {\n const response = await this.fetchImpl(\n `${GITHUB_BASE_URL}/login/device/code`,\n {\n method: 'POST',\n headers: standardHeaders(),\n body: JSON.stringify({\n client_id: GITHUB_CLIENT_ID,\n scope: GITHUB_APP_SCOPES,\n }),\n },\n )\n\n if (!response.ok) {\n await throwUpstreamError('Failed to get device code', response)\n }\n\n return (await response.json()) as DeviceCodeResponse\n }\n\n async pollAccessToken(deviceCode: DeviceCodeResponse): Promise<string> {\n const MAX_POLL_ATTEMPTS = 60 // ~5 minutes at 5s intervals\n const sleepDuration = (deviceCode.interval + 1) * 1000\n consola.debug(`Polling access token with interval of ${sleepDuration}ms`)\n\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n const response = await this.fetchImpl(\n `${GITHUB_BASE_URL}/login/oauth/access_token`,\n {\n method: 'POST',\n headers: standardHeaders(),\n body: JSON.stringify({\n client_id: GITHUB_CLIENT_ID,\n device_code: deviceCode.device_code,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }),\n },\n )\n\n if (!response.ok) {\n await sleep(sleepDuration)\n consola.error('Failed to poll access token:', await response.text())\n continue\n }\n\n const json = (await response.json()) as AccessTokenResponse\n consola.debug('Polling access token response:', json)\n\n if (json.access_token) {\n return json.access_token\n }\n\n await sleep(sleepDuration)\n }\n\n throw new Error('Device code authorization timed out')\n }\n\n async getGitHubUser(): Promise<GithubUserResponse> {\n const response = await this.fetchImpl(`${GITHUB_API_BASE_URL}/user`, {\n headers: {\n authorization: `token ${this.auth.githubToken}`,\n ...standardHeaders(),\n },\n })\n\n if (!response.ok) {\n await throwUpstreamError('Failed to get GitHub user', response)\n }\n\n return (await response.json()) as GithubUserResponse\n }\n}\n\ninterface AccessTokenResponse {\n access_token: string\n token_type: string\n scope: string\n}\n","import { execFile } from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { promisify } from 'node:util'\n\nconst FALLBACK = '1.104.3'\nconst execFileAsync = promisify(execFile)\n\nfunction extractVersion(text: string): string | undefined {\n const versionLine = text\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .find(line => /^\\d+\\.\\d+\\.\\d+$/.test(line))\n\n return versionLine || undefined\n}\n\nasync function getRemoteVSCodeVersion(): Promise<string | undefined> {\n const controller = new AbortController()\n const timeout = setTimeout(() => {\n controller.abort()\n }, 5000)\n\n try {\n const response = await fetch(\n 'https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=visual-studio-code-bin',\n {\n signal: controller.signal,\n },\n )\n\n const pkgbuild = await response.text()\n const pkgverRegex = /pkgver=([0-9.]+)/\n const match = pkgbuild.match(pkgverRegex)\n\n return match?.[1]\n }\n catch {\n return undefined\n }\n finally {\n clearTimeout(timeout)\n }\n}\n\nasync function getVSCodeVersionFromCommand(): Promise<string | undefined> {\n const commands = process.platform === 'win32'\n ? ['code.cmd', 'code-insiders.cmd', 'code']\n : ['code', 'code-insiders']\n\n for (const command of commands) {\n try {\n const result = await execFileAsync(command, ['--version'], {\n timeout: 3000,\n windowsHide: true,\n })\n const version = extractVersion(result.stdout)\n if (version) {\n return version\n }\n }\n catch {\n continue\n }\n }\n\n return undefined\n}\n\nfunction getVSCodePackageJsonCandidates(): Array<string> {\n const homeDirectory = os.homedir()\n const candidates = new Set<string>([\n '/usr/share/code/resources/app/package.json',\n '/usr/share/code-insiders/resources/app/package.json',\n '/var/lib/flatpak/app/com.visualstudio.code/current/active/files/extra/vscode/resources/app/package.json',\n '/Applications/Visual Studio Code.app/Contents/Resources/app/package.json',\n '/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/package.json',\n path.join(homeDirectory, 'Applications', 'Visual Studio Code.app', 'Contents', 'Resources', 'app', 'package.json'),\n path.join(homeDirectory, 'Applications', 'Visual Studio Code - Insiders.app', 'Contents', 'Resources', 'app', 'package.json'),\n ])\n\n const windowsRoots = [\n process.env.LOCALAPPDATA,\n process.env.PROGRAMFILES,\n process.env['PROGRAMFILES(X86)'],\n ].filter((value): value is string => Boolean(value))\n\n for (const root of windowsRoots) {\n candidates.add(\n path.join(root, 'Programs', 'Microsoft VS Code', 'resources', 'app', 'package.json'),\n )\n candidates.add(\n path.join(root, 'Programs', 'Microsoft VS Code Insiders', 'resources', 'app', 'package.json'),\n )\n candidates.add(\n path.join(root, 'Microsoft VS Code', 'resources', 'app', 'package.json'),\n )\n candidates.add(\n path.join(root, 'Microsoft VS Code Insiders', 'resources', 'app', 'package.json'),\n )\n }\n\n return [...candidates]\n}\n\nasync function getVSCodeVersionFromPackageJson(): Promise<string | undefined> {\n const candidates = getVSCodePackageJsonCandidates()\n\n for (const candidate of candidates) {\n try {\n const content = await fs.readFile(candidate, 'utf8')\n const parsed = JSON.parse(content) as { version?: string }\n if (parsed.version) {\n return parsed.version\n }\n }\n catch {\n continue\n }\n }\n\n return undefined\n}\n\nasync function getLocalVSCodeVersion(): Promise<string | undefined> {\n return (\n await getVSCodeVersionFromCommand()\n ?? await getVSCodeVersionFromPackageJson()\n )\n}\n\nexport async function getVSCodeVersion() {\n const [remoteVersion, localVersion] = await Promise.all([\n getRemoteVSCodeVersion(),\n getLocalVSCodeVersion(),\n ])\n\n return remoteVersion ?? localVersion ?? FALLBACK\n}\n","import type { ClientConfig } from '~/clients'\nimport type { ModelsResponse } from '~/types'\n\nimport consola from 'consola'\n\nimport { CopilotClient, getVSCodeVersion } from '~/clients'\n\nexport interface AuthState {\n githubToken?: string\n copilotToken?: string\n copilotApiBase?: string\n}\n\nexport interface RuntimeConfig {\n accountType: 'individual' | 'business' | 'enterprise'\n manualApprove: boolean\n rateLimitSeconds?: number\n rateLimitWait: boolean\n showToken: boolean\n upstreamTimeoutSeconds?: number\n}\n\nexport interface CacheState {\n models?: ModelsResponse\n vsCodeVersion?: string\n}\n\nexport interface RateLimitState {\n lastRequestTimestamp?: number\n}\n\nexport interface AppState {\n auth: AuthState\n config: RuntimeConfig\n cache: CacheState\n rateLimit: RateLimitState\n}\n\nexport const state: AppState = {\n auth: {},\n config: {\n accountType: 'individual',\n manualApprove: false,\n rateLimitWait: false,\n showToken: false,\n },\n cache: {},\n rateLimit: {},\n}\n\nexport function getClientConfig(): ClientConfig {\n return {\n accountType: state.config.accountType,\n vsCodeVersion: state.cache.vsCodeVersion,\n copilotApiBase: state.auth.copilotApiBase,\n }\n}\n\nexport function createCopilotClient(): CopilotClient {\n return new CopilotClient(state.auth, getClientConfig())\n}\n\nexport async function cacheModels(client?: CopilotClient): Promise<void> {\n const copilotClient = client ?? createCopilotClient()\n\n const models = await copilotClient.getModels()\n\n state.cache.models = models\n}\n\nexport async function cacheVSCodeVersion() {\n const response = await getVSCodeVersion()\n state.cache.vsCodeVersion = response\n\n consola.info(`Using VSCode version: ${response}`)\n}\n","import type { GetCopilotTokenResponse } from '~/types'\n\nimport consola from 'consola'\n\nimport { GitHubClient } from '~/clients'\n\nimport { getCachedConfig, writeConfigField } from './config'\nimport { HTTPError } from './error'\nimport { cacheVSCodeVersion, getClientConfig, state } from './state'\n\nasync function writeGithubToken(token: string): Promise<void> {\n await writeConfigField('githubToken', token)\n}\n\nexport async function setupCopilotToken() {\n await ensureVSCodeVersion()\n const githubClient = createGitHubClient()\n const response = await githubClient.getCopilotToken()\n applyCopilotTokenState(response)\n\n consola.debug('GitHub Copilot Token fetched successfully!')\n if (state.config.showToken) {\n consola.info('Copilot token:', response.token)\n }\n\n const REFRESH_BUFFER_SECONDS = 60\n const refreshInterval = (response.refresh_in - REFRESH_BUFFER_SECONDS) * 1000\n const refreshCopilotToken = async () => {\n consola.debug('Refreshing Copilot token')\n try {\n const refreshed = await githubClient.getCopilotToken()\n applyCopilotTokenState(refreshed)\n consola.debug('Copilot token refreshed')\n if (state.config.showToken) {\n consola.info('Refreshed Copilot token:', refreshed.token)\n }\n }\n catch (error) {\n consola.error('Failed to refresh Copilot token:', error)\n }\n }\n\n setInterval(() => {\n void refreshCopilotToken()\n }, refreshInterval)\n}\n\ninterface SetupGitHubTokenOptions {\n force?: boolean\n}\n\nexport async function setupGitHubToken(\n options?: SetupGitHubTokenOptions,\n): Promise<void> {\n try {\n await ensureVSCodeVersion()\n\n const cachedToken = getCachedConfig().githubToken\n const githubToken = cachedToken?.trim() || ''\n\n if (githubToken && !options?.force) {\n state.auth.githubToken = githubToken\n if (state.config.showToken) {\n consola.info('GitHub token:', githubToken)\n }\n try {\n await logUser()\n return\n }\n catch (error) {\n if (isAuthError(error) && !options?.force) {\n consola.warn(\n 'Stored GitHub token invalid or expired. Re-authenticating...',\n )\n await setupGitHubToken({ force: true })\n return\n }\n throw error\n }\n }\n\n consola.info('Not logged in, getting new access token')\n const githubClient = createGitHubClient()\n const response = await githubClient.getDeviceCode()\n consola.debug('Device code response:', response)\n\n consola.info(\n `Please enter the code \"${response.user_code}\" in ${response.verification_uri}`,\n )\n\n const token = await githubClient.pollAccessToken(response)\n await writeGithubToken(token)\n state.auth.githubToken = token\n\n if (state.config.showToken) {\n consola.info('GitHub token:', token)\n }\n await logUser()\n }\n catch (error) {\n if (error instanceof HTTPError) {\n consola.error('Failed to get GitHub token:', error.body)\n throw error\n }\n\n consola.error('Failed to get GitHub token:', error)\n throw error\n }\n}\n\nfunction isAuthError(error: unknown) {\n return error instanceof HTTPError\n && (error.status === 401 || error.status === 403)\n}\n\nasync function logUser() {\n const githubClient = createGitHubClient()\n const user = await githubClient.getGitHubUser()\n consola.info(`Logged in as ${user.login}`)\n}\n\nfunction createGitHubClient() {\n return new GitHubClient(state.auth, getClientConfig())\n}\n\nfunction applyCopilotTokenState(response: GetCopilotTokenResponse) {\n state.auth.copilotToken = response.token\n state.auth.copilotApiBase = normalizeCopilotApiBase(response.endpoints?.api)\n}\n\nfunction normalizeCopilotApiBase(value?: string): string | undefined {\n if (!value) {\n return undefined\n }\n return value.replace(/\\/+$/, '')\n}\n\nasync function ensureVSCodeVersion() {\n if (!state.cache.vsCodeVersion) {\n await cacheVSCodeVersion()\n }\n}\n","#!/usr/bin/env node\n\nimport { defineCommand } from 'citty'\nimport consola from 'consola'\n\nimport { readConfig } from './lib/config'\nimport { ensurePaths } from './lib/paths'\nimport { cacheVSCodeVersion, state } from './lib/state'\nimport { setupGitHubToken } from './lib/token'\n\ninterface RunAuthOptions {\n verbose: boolean\n showToken: boolean\n}\n\nexport async function runAuth(options: RunAuthOptions): Promise<void> {\n if (options.verbose) {\n consola.level = 5\n consola.info('Verbose logging enabled')\n }\n\n state.config.showToken = options.showToken\n\n await ensurePaths()\n await readConfig()\n await cacheVSCodeVersion()\n await setupGitHubToken({ force: true })\n consola.success('GitHub token written to config.json')\n}\n\nexport const auth = defineCommand({\n meta: {\n name: 'auth',\n description: 'Run GitHub auth flow without running the server',\n },\n args: {\n 'verbose': {\n alias: 'v',\n type: 'boolean',\n default: false,\n description: 'Enable verbose logging',\n },\n 'show-token': {\n type: 'boolean',\n default: false,\n description: 'Show GitHub token on auth',\n },\n },\n run({ args }) {\n return runAuth({\n verbose: args.verbose,\n showToken: args['show-token'],\n })\n },\n})\n","import type { QuotaDetail } from '~/types'\nimport process from 'node:process'\nimport { defineCommand } from 'citty'\n\nimport consola from 'consola'\n\nimport { GitHubClient } from '~/clients'\n\nimport { readConfig } from './lib/config'\nimport { ensurePaths } from './lib/paths'\nimport { cacheVSCodeVersion, getClientConfig, state } from './lib/state'\nimport { setupGitHubToken } from './lib/token'\n\nexport const checkUsage = defineCommand({\n meta: {\n name: 'check-usage',\n description: 'Show current GitHub Copilot usage/quota information',\n },\n async run() {\n await ensurePaths()\n await readConfig()\n await cacheVSCodeVersion()\n await setupGitHubToken()\n try {\n const githubClient = new GitHubClient(state.auth, getClientConfig())\n const usage = await githubClient.getCopilotUsage()\n const premium = usage.quota_snapshots.premium_interactions\n const premiumTotal = premium.entitlement\n const premiumUsed = premiumTotal - premium.remaining\n const premiumPercentUsed\n = premiumTotal > 0 ? (premiumUsed / premiumTotal) * 100 : 0\n const premiumPercentRemaining = premium.percent_remaining\n\n // Helper to summarize a quota snapshot\n function summarizeQuota(name: string, snap: QuotaDetail | undefined) {\n if (!snap)\n return `${name}: N/A`\n const total = snap.entitlement\n const used = total - snap.remaining\n const percentUsed = total > 0 ? (used / total) * 100 : 0\n const percentRemaining = snap.percent_remaining\n return `${name}: ${used}/${total} used (${percentUsed.toFixed(1)}% used, ${percentRemaining.toFixed(1)}% remaining)`\n }\n\n const premiumLine = `Premium: ${premiumUsed}/${premiumTotal} used (${premiumPercentUsed.toFixed(1)}% used, ${premiumPercentRemaining.toFixed(1)}% remaining)`\n const chatLine = summarizeQuota('Chat', usage.quota_snapshots.chat)\n const completionsLine = summarizeQuota(\n 'Completions',\n usage.quota_snapshots.completions,\n )\n\n consola.box(\n `Copilot Usage (plan: ${usage.copilot_plan})\\n`\n + `Quota resets: ${usage.quota_reset_date}\\n`\n + `\\nQuotas:\\n`\n + ` ${premiumLine}\\n`\n + ` ${chatLine}\\n`\n + ` ${completionsLine}`,\n )\n }\n catch (err) {\n consola.error('Failed to fetch Copilot usage:', err)\n process.exit(1)\n }\n },\n})\n","import { readFileSync } from 'node:fs'\n\ndeclare const __GHC_PROXY_VERSION__: string | undefined\n\nfunction readVersionFromSource(): string {\n try {\n const url = new URL('../../package.json', import.meta.url)\n const packageJson = JSON.parse(readFileSync(url, 'utf8')) as { version: string }\n return packageJson.version\n }\n catch {\n return 'unknown'\n }\n}\n\n// Build-time injected by tsdown `define`; falls back to reading package.json in dev\nexport const VERSION: string = typeof __GHC_PROXY_VERSION__ !== 'undefined'\n ? __GHC_PROXY_VERSION__\n : readVersionFromSource()\n","#!/usr/bin/env node\n\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport { defineCommand } from 'citty'\nimport consola from 'consola'\n\nimport { getCachedConfig } from './lib/config'\nimport { PATHS } from './lib/paths'\nimport { VERSION } from './lib/version'\n\ninterface DebugInfo {\n version: string\n runtime: {\n name: string\n version: string\n platform: string\n arch: string\n }\n paths: {\n APP_DIR: string\n CONFIG_PATH: string\n }\n configExists: boolean\n tokenExists: boolean\n}\n\ninterface RunDebugOptions {\n json: boolean\n}\n\nfunction getRuntimeInfo() {\n return {\n name: 'bun',\n version: Bun.version,\n platform: os.platform(),\n arch: os.arch(),\n }\n}\n\nfunction hasToken(): boolean {\n try {\n const config = getCachedConfig()\n return Boolean(config.githubToken?.trim())\n }\n catch {\n return false\n }\n}\n\nasync function checkConfigExists(): Promise<boolean> {\n try {\n const stats = await fs.stat(PATHS.CONFIG_PATH)\n if (!stats.isFile())\n return false\n\n const content = await fs.readFile(PATHS.CONFIG_PATH, 'utf8')\n return content.trim().length > 0\n }\n catch {\n return false\n }\n}\n\nasync function getDebugInfo(): Promise<DebugInfo> {\n const configExists = await checkConfigExists()\n\n return {\n version: VERSION,\n runtime: getRuntimeInfo(),\n paths: {\n APP_DIR: PATHS.APP_DIR,\n CONFIG_PATH: PATHS.CONFIG_PATH,\n },\n configExists,\n tokenExists: hasToken(),\n }\n}\n\nfunction printDebugInfoPlain(info: DebugInfo): void {\n consola.info(`ghc-proxy debug\n\nVersion: ${info.version}\nRuntime: ${info.runtime.name} ${info.runtime.version} (${info.runtime.platform} ${info.runtime.arch})\n\nPaths:\n- APP_DIR: ${info.paths.APP_DIR}\n- CONFIG_PATH: ${info.paths.CONFIG_PATH}\n\nConfig exists: ${info.configExists ? 'Yes' : 'No'}\nToken exists: ${info.tokenExists ? 'Yes' : 'No'}`)\n}\n\nexport async function runDebug(options: RunDebugOptions): Promise<void> {\n const debugInfo = await getDebugInfo()\n\n if (options.json) {\n await Bun.write(Bun.stdout, `${JSON.stringify(debugInfo, null, 2)}\\n`)\n }\n else {\n printDebugInfoPlain(debugInfo)\n }\n}\n\nexport const debug = defineCommand({\n meta: {\n name: 'debug',\n description: 'Print debug information about the application',\n },\n args: {\n json: {\n type: 'boolean',\n default: false,\n description: 'Output debug information as JSON',\n },\n },\n run({ args }) {\n return runDebug({\n json: args.json,\n })\n },\n})\n","import type { Dispatcher } from 'undici'\nimport consola from 'consola'\nimport { getProxyForUrl } from 'proxy-from-env'\nimport { Agent, ProxyAgent, setGlobalDispatcher } from 'undici'\n\nexport function initProxyFromEnv(): void {\n if (typeof Bun !== 'undefined')\n return\n\n try {\n const direct = new Agent()\n const proxies = new Map<string, ProxyAgent>()\n\n // We only need a minimal dispatcher that implements `dispatch` at runtime.\n // Typing the object as `Dispatcher` forces TypeScript to require many\n // additional methods. Instead, keep a plain object and cast when passing\n // to `setGlobalDispatcher`.\n const dispatcher = {\n dispatch(\n options: Dispatcher.DispatchOptions,\n handler: Dispatcher.DispatchHandler,\n ) {\n try {\n const origin\n = typeof options.origin === 'string'\n ? new URL(options.origin)\n : (options.origin as URL)\n const get = getProxyForUrl as unknown as (\n u: string,\n ) => string | undefined\n const raw = get(origin.toString())\n const proxyUrl = raw && raw.length > 0 ? raw : undefined\n if (!proxyUrl) {\n consola.debug(`HTTP proxy bypass: ${origin.hostname}`)\n return (direct as unknown as Dispatcher).dispatch(options, handler)\n }\n let agent = proxies.get(proxyUrl)\n if (!agent) {\n agent = new ProxyAgent(proxyUrl)\n proxies.set(proxyUrl, agent)\n }\n let label = proxyUrl\n try {\n const u = new URL(proxyUrl)\n label = `${u.protocol}//${u.host}`\n }\n catch {\n /* noop */\n }\n consola.debug(`HTTP proxy route: ${origin.hostname} via ${label}`)\n return (agent as unknown as Dispatcher).dispatch(options, handler)\n }\n catch {\n return (direct as unknown as Dispatcher).dispatch(options, handler)\n }\n },\n close() {\n return direct.close()\n },\n destroy() {\n return direct.destroy()\n },\n }\n\n setGlobalDispatcher(dispatcher as unknown as Dispatcher)\n consola.debug('HTTP proxy configured from environment (per-URL)')\n }\n catch (err) {\n consola.debug('Proxy setup skipped:', err)\n }\n}\n","import { execFileSync } from 'node:child_process'\nimport path from 'node:path'\nimport process from 'node:process'\n\ntype ShellName = 'bash' | 'zsh' | 'fish' | 'powershell' | 'cmd' | 'sh'\ntype EnvVars = Record<string, string | undefined>\n\nfunction normalizeShellName(raw: string | undefined): ShellName | undefined {\n if (!raw) {\n return undefined\n }\n\n const normalized = path.basename(raw).toLowerCase().replace(/\\.exe$/i, '')\n\n switch (normalized) {\n case 'pwsh':\n case 'powershell': {\n return 'powershell'\n }\n case 'cmd': {\n return 'cmd'\n }\n case 'bash': {\n return 'bash'\n }\n case 'zsh': {\n return 'zsh'\n }\n case 'fish': {\n return 'fish'\n }\n case 'sh': {\n return 'sh'\n }\n default: {\n return undefined\n }\n }\n}\n\nfunction detectWindowsShellFromEnv(env: NodeJS.ProcessEnv): ShellName | undefined {\n if (\n env.PSModulePath\n || env.PSExecutionPolicyPreference\n || env.POWERSHELL_DISTRIBUTION_CHANNEL\n ) {\n return 'powershell'\n }\n\n const shellHints = [\n env.CODEX_SHELL,\n env.npm_config_script_shell,\n env.SHELL,\n env.ComSpec,\n ]\n\n for (const hint of shellHints) {\n const detectedShell = normalizeShellName(hint)\n if (detectedShell) {\n return detectedShell\n }\n }\n\n return undefined\n}\n\nfunction detectWindowsShellFromParent(ppid: number): ShellName | undefined {\n try {\n const parentProcess = execFileSync(\n 'powershell',\n [\n '-NoProfile',\n '-NonInteractive',\n '-Command',\n `(Get-CimInstance Win32_Process -Filter \"ProcessId = ${ppid}\").Name`,\n ],\n { stdio: 'pipe' },\n )\n .toString()\n .trim()\n\n return normalizeShellName(parentProcess)\n }\n catch {\n return undefined\n }\n}\n\nfunction getShell(): ShellName {\n const { platform, ppid, env } = process\n\n if (platform === 'win32') {\n return detectWindowsShellFromEnv(env)\n ?? detectWindowsShellFromParent(ppid)\n ?? 'cmd'\n }\n else {\n const shellPath = env.SHELL\n const detectedShell = normalizeShellName(shellPath)\n if (\n detectedShell\n && detectedShell !== 'cmd'\n && detectedShell !== 'powershell'\n ) {\n return detectedShell\n }\n\n return 'sh'\n }\n}\n\nfunction escapeForPowerShell(value: string): string {\n return `'${value.replaceAll('\\'', '\\'\\'')}'`\n}\n\nfunction escapeForCmd(value: string): string {\n return value.replaceAll('\"', '\"\"')\n}\n\n/**\n * Generates a copy-pasteable script to set multiple environment variables\n * and run a subsequent command.\n * @param {EnvVars} envVars - An object of environment variables to set.\n * @param {string} commandToRun - The command to run after setting the variables.\n * @returns {string} The formatted script string.\n */\nexport function generateEnvScript(\n envVars: EnvVars,\n commandToRun: string = '',\n): string {\n const shell = getShell()\n const filteredEnvVars = Object.entries(envVars).filter(\n ([, value]) => value !== undefined,\n ) as Array<[string, string]>\n\n let commandBlock: string\n\n switch (shell) {\n case 'powershell': {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `$env:${key} = ${escapeForPowerShell(value)}`)\n .join('; ')\n break\n }\n case 'cmd': {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set \"${key}=${escapeForCmd(value)}\"`)\n .join(' & ')\n break\n }\n case 'fish': {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set -gx ${key} ${value}`)\n .join('; ')\n break\n }\n default: {\n // bash, zsh, sh\n const assignments = filteredEnvVars\n .map(([key, value]) => `${key}=${value}`)\n .join(' ')\n commandBlock = filteredEnvVars.length > 0 ? `export ${assignments}` : ''\n break\n }\n }\n\n if (commandBlock && commandToRun) {\n const separator = shell === 'cmd' ? ' & ' : ' && '\n return `${commandBlock}${separator}${commandToRun}`\n }\n\n return commandBlock || commandToRun\n}\n","import consola from 'consola'\nimport { colorize } from 'consola/utils'\n\nexport interface ModelMappingInfo {\n originalModel?: string\n mappedModel?: string\n}\n\nexport function formatElapsed(start: number) {\n const delta = Date.now() - start\n return delta < 1000 ? `${delta}ms` : `${Math.round(delta / 1000)}s`\n}\n\nfunction formatPath(rawUrl: string) {\n try {\n const url = new URL(rawUrl)\n return `${url.pathname}${url.search}`\n }\n catch {\n return rawUrl\n }\n}\n\nfunction colorizeStatus(status: number): string {\n if (status >= 500)\n return colorize('red', status)\n if (status >= 400)\n return colorize('yellow', status)\n if (status >= 300)\n return colorize('cyan', status)\n return colorize('green', status)\n}\n\nconst methodColors: Record<string, Parameters<typeof colorize>[0]> = {\n GET: 'cyan',\n POST: 'magenta',\n PUT: 'yellow',\n PATCH: 'yellow',\n DELETE: 'red',\n}\n\nfunction colorizeMethod(method: string): string {\n return colorize(methodColors[method] ?? 'white', method)\n}\n\nfunction formatModelMapping(info: ModelMappingInfo | undefined): string {\n if (!info)\n return ''\n\n const { originalModel, mappedModel } = info\n if (!originalModel && !mappedModel)\n return ''\n\n const original = originalModel ?? '-'\n const mapped = mappedModel ?? '-'\n\n if (original === mapped) {\n return ` ${colorize('dim', 'model=')}${colorize('blueBright', original)}`\n }\n\n return ` ${colorize('dim', 'model=')}${colorize('blueBright', original)} ${colorize('dim', '→')} ${colorize('greenBright', mapped)}`\n}\n\n/**\n * Request logging function.\n * Logs a formatted request line with method, path, status, elapsed time,\n * and optional model mapping info.\n */\nexport function logRequest(\n method: string,\n url: string,\n status: number,\n elapsed: string,\n modelInfo?: ModelMappingInfo,\n): void {\n const path = formatPath(url)\n const line = [\n colorizeMethod(method),\n colorize('white', path),\n colorizeStatus(status),\n colorize('dim', elapsed),\n ].join(' ')\n\n consola.info(`${line}${formatModelMapping(modelInfo)}`)\n}\n","import type { SSEOutput } from '~/lib/execution-strategy'\n\nimport { sse } from 'elysia'\n\n/**\n * Bridges an AsyncGenerator<SSEOutput> to Elysia's SSE response format.\n * Returns an async generator that yields sse() calls for each SSE output item.\n */\nexport async function* sseAdapter(generator: AsyncGenerator<SSEOutput>) {\n for await (const output of generator) {\n yield sse({\n id: output.id,\n event: output.event,\n data: output.data,\n })\n }\n}\n","import consola from 'consola'\n\nimport { HTTPError } from './error'\n\nexport async function awaitApproval() {\n const response = await consola.prompt(`Accept incoming request?`, {\n type: 'confirm',\n })\n\n if (!response) {\n throw new HTTPError(403, {\n error: { message: 'Request rejected', type: 'forbidden' },\n })\n }\n}\n","import type { AppState } from './state'\n\nimport consola from 'consola'\n\nimport { HTTPError } from './error'\nimport { sleep } from './sleep'\n\nexport async function checkRateLimit(state: AppState) {\n if (state.config.rateLimitSeconds === undefined)\n return\n\n const now = Date.now()\n\n if (!state.rateLimit.lastRequestTimestamp) {\n state.rateLimit.lastRequestTimestamp = now\n return\n }\n\n const elapsedSeconds = (now - state.rateLimit.lastRequestTimestamp) / 1000\n\n if (elapsedSeconds > state.config.rateLimitSeconds) {\n state.rateLimit.lastRequestTimestamp = now\n return\n }\n\n const waitTimeSeconds = Math.ceil(\n state.config.rateLimitSeconds - elapsedSeconds,\n )\n\n if (!state.config.rateLimitWait) {\n consola.warn(\n `Rate limit exceeded. Need to wait ${waitTimeSeconds} more seconds.`,\n )\n throw new HTTPError(429, {\n error: { message: 'Rate limit exceeded', type: 'rate_limit_error' },\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\n state.rateLimit.lastRequestTimestamp = now\n consola.info('Rate limit wait completed, proceeding with request')\n}\n","import { Elysia } from 'elysia'\n\nimport { awaitApproval } from '~/lib/approval'\nimport { checkRateLimit } from '~/lib/rate-limit'\nimport { state } from '~/lib/state'\n\n/**\n * Elysia macro for request guard middleware.\n * Usage: `.use(requestGuardPlugin)` then `.post('/path', handler, { guarded: true })`\n */\nexport const requestGuardPlugin = new Elysia({ name: 'request-guard' })\n .macro({\n guarded: (enabled: boolean) => ({\n async beforeHandle() {\n if (!enabled)\n return\n await runRequestGuard()\n },\n }),\n })\n\n/**\n * Core request guard logic.\n * Checks rate limits and optionally awaits manual approval.\n * Exported for direct use where the plugin is not applicable (e.g., tests).\n */\nexport async function runRequestGuard(): Promise<void> {\n await checkRateLimit(state)\n\n if (state.config.manualApprove) {\n await awaitApproval()\n }\n}\n","/**\n * Compile-time exhaustiveness check for switch/if-else chains on\n * discriminated unions. At runtime, throws with a descriptive message.\n */\nexport function assertNever(value: never, context?: string): never {\n const label = context ?? 'Unexpected value'\n throw new Error(`${label}: ${JSON.stringify(value)}`)\n}\n","import type { CapiChatCompletionsPayload } from './types'\nimport type { ConversationRequest } from '~/core/conversation'\nimport type { ReasoningEffort } from '~/types'\n\nexport interface CapiProfile {\n id: 'base' | 'claude'\n family: 'other' | 'claude' | 'gpt' | 'grok'\n enableCacheControl: boolean\n includeUsageOnStream: boolean\n applyThinking: (\n request: ConversationRequest,\n ) => Pick<CapiChatCompletionsPayload, 'reasoning_effort' | 'thinking_budget'>\n}\n\nfunction inferReasoningEffort(budgetTokens: number): ReasoningEffort {\n if (budgetTokens <= 8000) {\n return 'low'\n }\n if (budgetTokens <= 24000) {\n return 'medium'\n }\n return 'high'\n}\n\nexport function inferModelFamily(model: string): CapiProfile['family'] {\n if (model.startsWith('claude')) {\n return 'claude'\n }\n if (model.startsWith('gpt') || model.startsWith('o1') || model.startsWith('o3') || model.startsWith('o4')) {\n return 'gpt'\n }\n if (model.startsWith('grok')) {\n return 'grok'\n }\n return 'other'\n}\n\nconst baseProfile: CapiProfile = {\n id: 'base',\n family: 'other',\n enableCacheControl: false,\n includeUsageOnStream: false,\n applyThinking(request) {\n const thinking = request.thinking\n if (!thinking || thinking.type === 'disabled') {\n return {}\n }\n\n const budgetTokens = thinking.type === 'adaptive'\n ? 24000\n : thinking.budgetTokens\n\n return {\n reasoning_effort: inferReasoningEffort(budgetTokens),\n }\n },\n}\n\nconst claudeProfile: CapiProfile = {\n id: 'claude',\n family: 'claude',\n enableCacheControl: true,\n includeUsageOnStream: true,\n applyThinking(request) {\n const thinking = request.thinking\n if (!thinking || thinking.type === 'disabled') {\n return {}\n }\n\n const budgetTokens = thinking.type === 'adaptive'\n ? 24000\n : thinking.budgetTokens\n\n return {\n reasoning_effort: inferReasoningEffort(budgetTokens),\n thinking_budget: budgetTokens,\n }\n },\n}\n\nexport function selectCapiProfile(model: string): CapiProfile {\n return inferModelFamily(model) === 'claude'\n ? claudeProfile\n : baseProfile\n}\n","import type { CapiRequestContext } from './types'\n\nimport type { ConversationTurn } from '~/core/conversation'\nimport { randomUUID } from 'node:crypto'\n\nfunction readHeader(\n headers: Headers,\n name: string,\n): string | undefined {\n return headers.get(name) ?? undefined\n}\n\nexport function inferInitiator(turns: Array<ConversationTurn>): 'user' | 'agent' {\n return turns.some(turn => turn.role === 'assistant' || turn.role === 'tool')\n ? 'agent'\n : 'user'\n}\n\nexport function readCapiRequestContext(headers: Headers): Partial<CapiRequestContext> {\n return {\n interactionType: (readHeader(headers, 'x-interaction-type') as CapiRequestContext['interactionType'] | undefined),\n agentTaskId: readHeader(headers, 'x-agent-task-id'),\n parentAgentTaskId: readHeader(headers, 'x-parent-agent-id'),\n clientSessionId: readHeader(headers, 'x-client-session-id'),\n interactionId: readHeader(headers, 'x-interaction-id'),\n clientMachineId: readHeader(headers, 'x-client-machine-id'),\n }\n}\n\nexport function buildCapiRequestContext(\n initiator: 'user' | 'agent',\n overrides: Partial<CapiRequestContext> = {},\n): CapiRequestContext {\n return {\n interactionType:\n overrides.interactionType\n ?? (initiator === 'agent'\n ? 'conversation-agent'\n : 'conversation-user'),\n agentTaskId: overrides.agentTaskId,\n parentAgentTaskId: overrides.parentAgentTaskId,\n clientSessionId: overrides.clientSessionId,\n interactionId: overrides.interactionId ?? randomUUID(),\n clientMachineId: overrides.clientMachineId,\n }\n}\n","import type {\n CapiChatCompletionsPayload,\n CapiExecutionPlan,\n CapiMessage,\n CapiRequestContext,\n CapiTool,\n CopilotCacheControl,\n} from './types'\nimport type {\n CompletionOptions,\n ConversationImageBlock,\n ConversationRequest,\n ConversationTextBlock,\n ConversationToolResultBlock,\n ConversationTurn,\n} from '~/core/conversation'\nimport type {\n ContentPart,\n Message,\n} from '~/types'\n\nimport { assertNever } from '~/lib/assert-never'\nimport { selectCapiProfile } from './profile'\nimport { buildCapiRequestContext, inferInitiator } from './request-context'\n\nconst EPHEMERAL_CACHE_CONTROL: CopilotCacheControl = {\n type: 'ephemeral',\n}\n\nfunction asContentPart(\n block: ConversationTextBlock | ConversationImageBlock,\n): ContentPart {\n if (block.kind === 'text') {\n return {\n type: 'text',\n text: block.text,\n }\n }\n\n return {\n type: 'image_url',\n image_url: {\n url: block.url,\n ...(block.detail ? { detail: block.detail } : {}),\n },\n }\n}\n\nfunction serializeContentBlocks(\n blocks: Array<ConversationTextBlock | ConversationImageBlock>,\n): Message['content'] {\n if (blocks.length === 0) {\n return null\n }\n\n if (blocks.every(block => block.kind === 'text')) {\n if (blocks.length === 1) {\n return blocks[0].text\n }\n\n return blocks.map(block => ({\n type: 'text',\n text: block.text,\n }))\n }\n\n return blocks.map(asContentPart)\n}\n\nfunction serializeToolResultBlock(\n block: ConversationToolResultBlock,\n): CapiMessage {\n return {\n role: 'tool',\n tool_call_id: block.toolUseId,\n content: serializeContentBlocks(block.content),\n }\n}\n\nfunction serializeUserTurn(turn: ConversationTurn): Array<CapiMessage> {\n const messages: Array<CapiMessage> = []\n const pendingBlocks: Array<ConversationTextBlock | ConversationImageBlock> = []\n\n const flushPendingBlocks = () => {\n if (pendingBlocks.length === 0) {\n return\n }\n\n messages.push({\n role: 'user',\n content: serializeContentBlocks(pendingBlocks),\n })\n pendingBlocks.length = 0\n }\n\n for (const block of turn.blocks) {\n if (block.kind === 'text' || block.kind === 'image') {\n pendingBlocks.push(block)\n continue\n }\n\n if (block.kind === 'tool_result') {\n flushPendingBlocks()\n messages.push(serializeToolResultBlock(block))\n }\n }\n\n flushPendingBlocks()\n return messages\n}\n\nfunction serializeAssistantTurn(turn: ConversationTurn): Array<CapiMessage> {\n const textBlocks: Array<ConversationTextBlock | ConversationImageBlock> = []\n const toolCalls: NonNullable<CapiMessage['tool_calls']> = []\n\n for (const block of turn.blocks) {\n if (block.kind === 'text' || block.kind === 'image') {\n textBlocks.push(block)\n continue\n }\n\n if (block.kind === 'tool_use') {\n toolCalls.push({\n id: block.id,\n type: 'function',\n function: {\n name: block.name,\n arguments: block.argumentsText,\n },\n })\n }\n }\n\n return [{\n role: 'assistant',\n content: serializeContentBlocks(textBlocks),\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n ...(turn.meta?.reasoningOpaque ? { reasoning_opaque: turn.meta.reasoningOpaque } : {}),\n ...(turn.meta?.encryptedContent !== undefined ? { encrypted_content: turn.meta.encryptedContent } : {}),\n ...(turn.meta?.phase ? { phase: turn.meta.phase } : {}),\n ...(turn.meta?.copilotAnnotations !== undefined ? { copilot_annotations: turn.meta.copilotAnnotations } : {}),\n }]\n}\n\nfunction serializeSystemLikeTurn(turn: ConversationTurn): Array<CapiMessage> {\n const contentBlocks = turn.blocks.filter(\n (block): block is ConversationTextBlock | ConversationImageBlock =>\n block.kind === 'text' || block.kind === 'image',\n )\n\n return [{\n role: turn.role,\n content: serializeContentBlocks(contentBlocks),\n }]\n}\n\nfunction serializeToolTurn(turn: ConversationTurn): Array<CapiMessage> {\n const contentBlocks = turn.blocks.filter(\n (block): block is ConversationTextBlock | ConversationImageBlock =>\n block.kind === 'text' || block.kind === 'image',\n )\n\n return [{\n role: 'tool',\n tool_call_id: turn.meta?.toolCallId,\n content: serializeContentBlocks(contentBlocks),\n }]\n}\n\nfunction serializeTurns(turns: Array<ConversationTurn>): Array<CapiMessage> {\n return turns.flatMap((turn) => {\n switch (turn.role) {\n case 'system':\n case 'developer':\n return serializeSystemLikeTurn(turn)\n case 'user':\n return serializeUserTurn(turn)\n case 'assistant':\n return serializeAssistantTurn(turn)\n case 'tool':\n return serializeToolTurn(turn)\n default:\n return assertNever(turn.role)\n }\n })\n}\n\nfunction serializeTools(\n tools: ConversationRequest['tools'],\n): Array<CapiTool> | undefined {\n return tools?.map((tool): CapiTool => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }))\n}\n\nfunction serializeToolChoice(\n toolChoice: ConversationRequest['toolChoice'],\n): CapiChatCompletionsPayload['tool_choice'] {\n if (!toolChoice) {\n return undefined\n }\n\n switch (toolChoice.type) {\n case 'none':\n return 'none'\n case 'auto':\n return 'auto'\n case 'required':\n return 'required'\n case 'tool':\n return {\n type: 'function',\n function: { name: toolChoice.name },\n }\n }\n}\n\nfunction serializeCompletionOptions(\n opts: CompletionOptions | undefined,\n): Partial<CapiChatCompletionsPayload> {\n if (!opts) {\n return {}\n }\n\n return {\n ...(opts.n != null ? { n: opts.n } : {}),\n ...(opts.frequencyPenalty != null ? { frequency_penalty: opts.frequencyPenalty } : {}),\n ...(opts.presencePenalty != null ? { presence_penalty: opts.presencePenalty } : {}),\n ...(opts.logitBias != null ? { logit_bias: opts.logitBias } : {}),\n ...(opts.logprobs != null ? { logprobs: opts.logprobs } : {}),\n ...(opts.responseFormat != null ? { response_format: opts.responseFormat } : {}),\n ...(opts.seed != null ? { seed: opts.seed } : {}),\n ...(opts.reasoningEffort != null ? { reasoning_effort: opts.reasoningEffort } : {}),\n }\n}\n\nfunction applyCacheCheckpoints(\n payload: CapiChatCompletionsPayload,\n) {\n const firstSystemLikeIndex = payload.messages.findIndex(\n message => message.role === 'system' || message.role === 'developer',\n )\n if (firstSystemLikeIndex >= 0) {\n payload.messages[firstSystemLikeIndex] = {\n ...payload.messages[firstSystemLikeIndex],\n copilot_cache_control: EPHEMERAL_CACHE_CONTROL,\n }\n }\n\n if (payload.tools && payload.tools.length > 0) {\n const lastToolIndex = payload.tools.length - 1\n payload.tools[lastToolIndex] = {\n ...payload.tools[lastToolIndex],\n copilot_cache_control: EPHEMERAL_CACHE_CONTROL,\n }\n }\n\n const lastCacheEligibleMessageIndex = payload.messages.findLastIndex(\n message => message.role !== 'user',\n )\n if (lastCacheEligibleMessageIndex >= 0) {\n payload.messages[lastCacheEligibleMessageIndex] = {\n ...payload.messages[lastCacheEligibleMessageIndex],\n copilot_cache_control: EPHEMERAL_CACHE_CONTROL,\n }\n }\n}\n\nfunction stripTransportFields(\n payload: CapiChatCompletionsPayload,\n): CapiExecutionPlan['tokenCountPayload'] {\n const { stream_options: _streamOptions, ...rest } = payload\n return {\n ...rest,\n messages: payload.messages.map(({ copilot_cache_control: _cache, ...message }) => message),\n tools: payload.tools?.map(({ copilot_cache_control: _cache, ...tool }) => tool) ?? payload.tools,\n }\n}\n\nexport interface BuildCapiExecutionPlanOptions {\n resolveModel?: (model: string) => string\n requestContext?: Partial<CapiRequestContext>\n}\n\nexport function buildCapiExecutionPlan(\n request: ConversationRequest,\n options: BuildCapiExecutionPlanOptions = {},\n): CapiExecutionPlan {\n const resolvedModel = options.resolveModel?.(request.model) ?? request.model\n const profile = selectCapiProfile(resolvedModel)\n const initiator = inferInitiator(request.turns)\n\n const payload: CapiChatCompletionsPayload = {\n model: resolvedModel,\n messages: serializeTurns(request.turns),\n max_tokens: request.maxTokens,\n stop: request.stopSequences,\n stream: request.stream,\n temperature: request.temperature,\n top_p: request.topP,\n user: request.userId,\n tools: serializeTools(request.tools),\n tool_choice: serializeToolChoice(request.toolChoice),\n ...profile.applyThinking(request),\n ...serializeCompletionOptions(request.completionOptions),\n ...(request.stream && profile.includeUsageOnStream\n ? { stream_options: { include_usage: true } }\n : {}),\n }\n\n if (profile.enableCacheControl) {\n applyCacheCheckpoints(payload)\n }\n\n return {\n payload,\n tokenCountPayload: stripTransportFields(payload),\n requestContext: buildCapiRequestContext(\n initiator,\n options.requestContext,\n ),\n initiator,\n profileId: profile.id,\n resolvedModel,\n }\n}\n","import type {\n NormalizedAnthropicRequest,\n NormalizedBlock,\n NormalizedImageBlock,\n NormalizedTextBlock,\n NormalizedTurn,\n} from './ir'\n\nimport type {\n AnthropicCountTokensPayload,\n AnthropicMessage,\n AnthropicMessagesPayload,\n AnthropicToolResultBlock,\n} from './types'\n\nimport { assertNever } from '~/lib/assert-never'\n\nfunction textBlock(text: string): NormalizedTextBlock {\n return { kind: 'text', text }\n}\n\nfunction imageBlock(\n mediaType: NormalizedImageBlock['mediaType'],\n data: string,\n): NormalizedImageBlock {\n return { kind: 'image', mediaType, data }\n}\n\nfunction normalizeSystemBlocks(\n system: AnthropicMessagesPayload['system'],\n): Array<NormalizedTurn> {\n if (!system) {\n return []\n }\n\n if (typeof system === 'string') {\n return [{ role: 'system', blocks: [textBlock(system)] }]\n }\n\n return [{\n role: 'system',\n blocks: system.map(block => textBlock(block.text)),\n }]\n}\n\nfunction normalizeToolResultContent(\n block: AnthropicToolResultBlock,\n): Array<NormalizedTextBlock | NormalizedImageBlock> {\n if (typeof block.content === 'string') {\n return [textBlock(block.content)]\n }\n\n return block.content.map((contentBlock) => {\n switch (contentBlock.type) {\n case 'text':\n return textBlock(contentBlock.text)\n case 'image':\n return imageBlock(contentBlock.source.media_type, contentBlock.source.data)\n default:\n return assertNever(contentBlock)\n }\n })\n}\n\nfunction normalizeMessage(message: AnthropicMessage): NormalizedTurn {\n if (typeof message.content === 'string') {\n return {\n role: message.role,\n blocks: [textBlock(message.content)],\n }\n }\n\n const blocks: Array<NormalizedBlock> = message.content.map((block) => {\n switch (block.type) {\n case 'text':\n return textBlock(block.text)\n case 'image':\n return imageBlock(block.source.media_type, block.source.data)\n case 'thinking':\n return {\n kind: 'thinking',\n thinking: block.thinking,\n signature: block.signature,\n }\n case 'tool_use':\n return {\n kind: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input,\n }\n case 'tool_result':\n return {\n kind: 'tool_result',\n toolUseId: block.tool_use_id,\n content: normalizeToolResultContent(block),\n isError: block.is_error,\n }\n default:\n return assertNever(block)\n }\n })\n\n return { role: message.role, blocks }\n}\n\nfunction normalizeToolChoice(\n toolChoice: AnthropicMessagesPayload['tool_choice'],\n): NormalizedAnthropicRequest['toolChoice'] {\n if (!toolChoice) {\n return undefined\n }\n\n switch (toolChoice.type) {\n case 'none':\n return { type: 'none' }\n case 'auto':\n return { type: 'auto' }\n case 'any':\n return { type: 'required' }\n case 'tool':\n return toolChoice.name\n ? { type: 'tool', name: toolChoice.name }\n : undefined\n }\n}\n\nfunction normalizeThinking(\n thinking: AnthropicMessagesPayload['thinking'],\n): NormalizedAnthropicRequest['thinking'] {\n if (!thinking) {\n return undefined\n }\n\n switch (thinking.type) {\n case 'disabled':\n return { type: 'disabled' }\n case 'adaptive':\n return { type: 'adaptive' }\n case 'enabled':\n return { type: 'enabled', budgetTokens: thinking.budget_tokens }\n }\n}\n\nexport function normalizeAnthropicRequest(\n payload: AnthropicMessagesPayload | AnthropicCountTokensPayload,\n): NormalizedAnthropicRequest {\n return {\n model: payload.model,\n turns: [\n ...normalizeSystemBlocks(payload.system),\n ...payload.messages.map(normalizeMessage),\n ],\n maxTokens: payload.max_tokens,\n stopSequences: payload.stop_sequences,\n stream: payload.stream,\n temperature: payload.temperature,\n topP: payload.top_p,\n topK: payload.top_k,\n userId: payload.metadata?.user_id,\n tools: payload.tools?.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.input_schema,\n })),\n toolChoice: normalizeToolChoice(payload.tool_choice),\n thinking: normalizeThinking(payload.thinking),\n serviceTier: payload.service_tier,\n }\n}\n","import type { AnthropicResponse } from './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: 'refusal',\n } as const\n return stopReasonMap[finishReason]\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number\n completion_tokens?: number\n prompt_tokens_details?: {\n cached_tokens?: number\n }\n}\n\nexport function mapOpenAIUsageToAnthropic(usage?: OpenAIUsage) {\n return {\n input_tokens:\n (usage?.prompt_tokens ?? 0)\n - (usage?.prompt_tokens_details?.cached_tokens ?? 0),\n output_tokens: usage?.completion_tokens ?? 0,\n ...(usage?.prompt_tokens_details?.cached_tokens !== undefined && {\n cache_read_input_tokens: usage.prompt_tokens_details.cached_tokens,\n }),\n }\n}\n","import type {\n AnthropicContentBlockDeltaEvent,\n AnthropicContentBlockStartEvent,\n AnthropicContentBlockStopEvent,\n AnthropicStreamEventData,\n AnthropicStreamState,\n} from './types'\n\nimport type { CapiChatCompletionChunk } from '~/core/capi'\nimport type { ConversationDelta } from '~/core/conversation'\n\nimport { mapOpenAIStopReasonToAnthropic, mapOpenAIUsageToAnthropic } from './shared'\n\nclass TextBlockWriter {\n private readonly state: AnthropicStreamState\n private readonly blockType: 'text' | 'thinking'\n\n constructor(\n state: AnthropicStreamState,\n blockType: 'text' | 'thinking',\n ) {\n this.state = state\n this.blockType = blockType\n }\n\n open(events: Array<AnthropicStreamEventData>): number {\n const existingIndex = this.blockType === 'text'\n ? this.state.openTextBlockIndex\n : this.state.openThinkingBlockIndex\n if (existingIndex !== null) {\n return existingIndex\n }\n\n const index = this.state.nextContentBlockIndex++\n const event: AnthropicContentBlockStartEvent = this.blockType === 'text'\n ? {\n type: 'content_block_start',\n index,\n content_block: {\n type: 'text',\n text: '',\n },\n }\n : {\n type: 'content_block_start',\n index,\n content_block: {\n type: 'thinking',\n thinking: '',\n },\n }\n events.push(event)\n\n if (this.blockType === 'text') {\n this.state.openTextBlockIndex = index\n }\n else {\n this.state.openThinkingBlockIndex = index\n }\n\n return index\n }\n\n append(events: Array<AnthropicStreamEventData>, text: string) {\n if (!text) {\n return\n }\n\n const index = this.open(events)\n const delta: AnthropicContentBlockDeltaEvent = this.blockType === 'text'\n ? {\n type: 'content_block_delta',\n index,\n delta: {\n type: 'text_delta',\n text,\n },\n }\n : {\n type: 'content_block_delta',\n index,\n delta: {\n type: 'thinking_delta',\n thinking: text,\n },\n }\n events.push(delta)\n }\n\n close(events: Array<AnthropicStreamEventData>) {\n const index = this.blockType === 'text'\n ? this.state.openTextBlockIndex\n : this.state.openThinkingBlockIndex\n if (index === null) {\n return\n }\n\n const event: AnthropicContentBlockStopEvent = {\n type: 'content_block_stop',\n index,\n }\n events.push(event)\n if (this.blockType === 'text') {\n this.state.openTextBlockIndex = null\n }\n else {\n this.state.openThinkingBlockIndex = null\n }\n }\n}\n\nclass ToolUseBlockWriter {\n private readonly state: AnthropicStreamState\n\n constructor(state: AnthropicStreamState) {\n this.state = state\n }\n\n append(\n events: Array<AnthropicStreamEventData>,\n toolCall: NonNullable<CapiChatCompletionChunk['choices'][number]['delta']['tool_calls']>[number],\n ) {\n const lane = this.state.toolCalls[toolCall.index] ?? {\n started: false,\n closed: false,\n }\n\n if (lane.closed) {\n return\n }\n\n if (toolCall.id) {\n lane.id = toolCall.id\n }\n if (toolCall.function?.name) {\n lane.name = toolCall.function.name\n }\n\n if (!lane.started && lane.id && lane.name) {\n lane.anthropicBlockIndex = this.state.nextContentBlockIndex++\n lane.started = true\n events.push({\n type: 'content_block_start',\n index: lane.anthropicBlockIndex,\n content_block: {\n type: 'tool_use',\n id: lane.id,\n name: lane.name,\n input: {},\n },\n })\n }\n\n if (lane.started && toolCall.function?.arguments) {\n events.push({\n type: 'content_block_delta',\n index: lane.anthropicBlockIndex!,\n delta: {\n type: 'input_json_delta',\n partial_json: toolCall.function.arguments,\n },\n })\n }\n\n this.state.toolCalls[toolCall.index] = lane\n }\n\n closeAll(events: Array<AnthropicStreamEventData>) {\n const lanes = Object.values(this.state.toolCalls)\n .filter(lane => lane.started && !lane.closed && lane.anthropicBlockIndex !== undefined)\n .sort((left, right) => left.anthropicBlockIndex! - right.anthropicBlockIndex!)\n\n for (const lane of lanes) {\n events.push({\n type: 'content_block_stop',\n index: lane.anthropicBlockIndex!,\n })\n lane.closed = true\n }\n }\n}\n\nexport class AnthropicStreamTranslator {\n private readonly state: AnthropicStreamState\n private readonly textWriter: TextBlockWriter\n private readonly thinkingWriter: TextBlockWriter\n private readonly toolWriter: ToolUseBlockWriter\n\n constructor() {\n this.state = {\n messageStartSent: false,\n nextContentBlockIndex: 0,\n openTextBlockIndex: null,\n openThinkingBlockIndex: null,\n toolCalls: {},\n messageStopSent: false,\n }\n this.textWriter = new TextBlockWriter(this.state, 'text')\n this.thinkingWriter = new TextBlockWriter(this.state, 'thinking')\n this.toolWriter = new ToolUseBlockWriter(this.state)\n }\n\n onChunk(chunk: CapiChatCompletionChunk): Array<AnthropicStreamEventData> {\n const deltas = this.toConversationDeltas(chunk)\n if (deltas.length === 0) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n\n this.appendMessageStart(events, chunk)\n this.state.lastUsage = chunk.usage\n\n for (const delta of deltas) {\n switch (delta.kind) {\n case 'message_start':\n break\n case 'thinking_delta':\n this.state.lastMetadata = {\n ...this.state.lastMetadata,\n ...delta.metadata,\n }\n this.textWriter.close(events)\n this.thinkingWriter.append(events, delta.text)\n break\n case 'text_delta':\n this.thinkingWriter.close(events)\n this.textWriter.append(events, delta.text)\n break\n case 'tool_use_delta':\n this.thinkingWriter.close(events)\n this.textWriter.close(events)\n this.toolWriter.append(events, {\n index: delta.toolIndex,\n ...(delta.id ? { id: delta.id } : {}),\n ...(delta.name || delta.argumentsText\n ? {\n function: {\n ...(delta.name ? { name: delta.name } : {}),\n ...(delta.argumentsText ? { arguments: delta.argumentsText } : {}),\n },\n }\n : {}),\n })\n break\n case 'message_stop':\n this.state.lastMetadata = {\n ...this.state.lastMetadata,\n ...delta.metadata,\n }\n this.state.pendingStopReason = delta.stopReason\n if (delta.usage) {\n this.state.lastUsage = delta.usage\n }\n events.push(...this.onDone())\n break\n }\n }\n\n return events\n }\n\n onDone(): Array<AnthropicStreamEventData> {\n if (!this.state.messageStartSent || this.state.messageStopSent) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n this.thinkingWriter.close(events)\n this.textWriter.close(events)\n this.toolWriter.closeAll(events)\n\n events.push(\n {\n type: 'message_delta',\n delta: {\n stop_reason: mapOpenAIStopReasonToAnthropic(this.state.pendingStopReason ?? 'stop'),\n stop_sequence: null,\n },\n ...(this.state.lastUsage ? { usage: mapOpenAIUsageToAnthropic(this.state.lastUsage) } : {}),\n },\n {\n type: 'message_stop',\n },\n )\n\n this.state.messageStopSent = true\n return events\n }\n\n onError(error?: unknown): Array<AnthropicStreamEventData> {\n const message = this.getErrorMessage(error)\n return [\n {\n type: 'error',\n error: {\n type: 'api_error',\n message,\n },\n },\n ]\n }\n\n private appendMessageStart(\n events: Array<AnthropicStreamEventData>,\n chunk: CapiChatCompletionChunk,\n ) {\n if (this.state.messageStartSent) {\n return\n }\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 ...mapOpenAIUsageToAnthropic(chunk.usage),\n output_tokens: 0,\n },\n },\n })\n this.state.messageStartSent = true\n }\n\n private getErrorMessage(error: unknown): string {\n if (this.isTimeoutError(error)) {\n return 'Upstream streaming request timed out. Please retry.'\n }\n return 'An unexpected error occurred during streaming.'\n }\n\n private isTimeoutError(error: unknown): boolean {\n if (error instanceof DOMException) {\n return error.name === 'TimeoutError'\n }\n if (error instanceof Error) {\n return error.name === 'TimeoutError'\n }\n return false\n }\n\n private toConversationDeltas(\n chunk: CapiChatCompletionChunk,\n ): Array<ConversationDelta> {\n if (chunk.choices.length === 0) {\n return []\n }\n\n const sortedChoices = [...chunk.choices].sort((left, right) => left.index - right.index)\n const choice = sortedChoices[0]\n const deltas: Array<ConversationDelta> = []\n\n if (!this.state.messageStartSent) {\n deltas.push({\n kind: 'message_start',\n id: chunk.id,\n model: chunk.model,\n usage: chunk.usage,\n })\n }\n\n if (choice.delta.reasoning_text) {\n deltas.push({\n kind: 'thinking_delta',\n text: choice.delta.reasoning_text,\n metadata: {\n reasoningOpaque: choice.delta.reasoning_opaque,\n encryptedContent: choice.delta.encrypted_content,\n phase: choice.delta.phase,\n copilotAnnotations: choice.delta.copilot_annotations,\n },\n })\n }\n\n if (choice.delta.content) {\n deltas.push({\n kind: 'text_delta',\n text: choice.delta.content,\n })\n }\n\n if (choice.delta.tool_calls?.length) {\n for (const toolCall of choice.delta.tool_calls) {\n deltas.push({\n kind: 'tool_use_delta',\n toolIndex: toolCall.index,\n id: toolCall.id,\n name: toolCall.function?.name,\n argumentsText: toolCall.function?.arguments,\n })\n }\n }\n\n if (choice.finish_reason) {\n deltas.push({\n kind: 'message_stop',\n stopReason: choice.finish_reason,\n usage: chunk.usage,\n metadata: {\n reasoningOpaque: choice.delta.reasoning_opaque,\n encryptedContent: choice.delta.encrypted_content,\n phase: choice.delta.phase,\n copilotAnnotations: choice.delta.copilot_annotations,\n },\n })\n }\n\n return deltas\n }\n}\n","import type { NormalizedOpenAIResponse } from './ir'\n\nimport type { AnthropicAssistantContentBlock, AnthropicResponse } from './types'\n\nimport { assertNever } from '~/lib/assert-never'\nimport { mapOpenAIStopReasonToAnthropic, mapOpenAIUsageToAnthropic } from './shared'\n\nfunction mapBlocks(\n response: NormalizedOpenAIResponse,\n): Array<AnthropicAssistantContentBlock> {\n return response.turn.blocks.map((block) => {\n switch (block.kind) {\n case 'text':\n return { type: 'text', text: block.text }\n case 'thinking':\n return {\n type: 'thinking',\n thinking: block.thinking,\n signature: block.signature,\n }\n case 'tool_use':\n return {\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input,\n }\n case 'image':\n return {\n type: 'text',\n text: `[unsupported image content omitted: ${block.mediaType}]`,\n }\n case 'tool_result':\n return {\n type: 'text',\n text: `[unsupported tool_result omitted: ${block.toolUseId}]`,\n }\n default:\n return assertNever(block)\n }\n })\n}\n\nexport function mapOpenAIResponseToAnthropic(\n response: NormalizedOpenAIResponse,\n): AnthropicResponse {\n return {\n id: response.id,\n type: 'message',\n role: 'assistant',\n model: response.model,\n content: mapBlocks(response),\n stop_reason: mapOpenAIStopReasonToAnthropic(response.finishReason),\n stop_sequence: null,\n usage: mapOpenAIUsageToAnthropic(response.usage),\n }\n}\n","export type TranslationIssueSeverity = 'info' | 'warning' | 'error'\n\nexport interface TranslationIssue {\n kind: string\n severity: TranslationIssueSeverity\n message: string\n}\n\nexport class TranslationFailure extends Error {\n readonly status: 400 | 502\n readonly kind: string\n\n constructor(\n message: string,\n options: {\n status: 400 | 502\n kind: string\n },\n ) {\n super(message)\n this.name = 'TranslationFailure'\n this.status = options.status\n this.kind = options.kind\n }\n}\n","import type {\n NormalizedBlock,\n NormalizedOpenAIResponse,\n NormalizedTurn,\n} from './ir'\n\nimport type { TranslationContext } from './translation-policy'\nimport type {\n CapiChatCompletionResponse,\n CapiResponseMessage,\n} from '~/core/capi'\nimport type { ContentPart, Message, ToolCall } from '~/types'\nimport { TranslationFailure } from './translation-issue'\n\nfunction normalizeContentPart(part: ContentPart): NormalizedBlock {\n switch (part.type) {\n case 'text':\n return { kind: 'text', text: part.text }\n case 'image_url': {\n const match = part.image_url.url.match(/^data:(.+);base64,(.+)$/)\n if (!match) {\n throw new TranslationFailure('OpenAI image_url must be a data URL', {\n status: 502,\n kind: 'invalid_upstream_image_url',\n })\n }\n\n const [, mediaType, data] = match\n if (\n mediaType !== 'image/jpeg'\n && mediaType !== 'image/png'\n && mediaType !== 'image/gif'\n && mediaType !== 'image/webp'\n ) {\n throw new TranslationFailure(`Unsupported image media type: ${mediaType}`, {\n status: 502,\n kind: 'invalid_upstream_image_url',\n })\n }\n\n return {\n kind: 'image',\n mediaType,\n data,\n }\n }\n }\n}\n\nfunction normalizeMessageContent(content: Message['content']): Array<NormalizedBlock> {\n if (content === null) {\n return []\n }\n\n if (typeof content === 'string') {\n return content.length > 0 ? [{ kind: 'text', text: content }] : []\n }\n\n return content.map(normalizeContentPart)\n}\n\nfunction parseToolCall(toolCall: ToolCall): NormalizedBlock {\n try {\n return {\n kind: '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 catch {\n throw new TranslationFailure(\n `Invalid upstream tool arguments for tool \"${toolCall.function.name}\"`,\n {\n status: 502,\n kind: 'invalid_upstream_tool_arguments',\n },\n )\n }\n}\n\nfunction normalizeAssistantTurn(\n message: CapiResponseMessage,\n): NormalizedTurn {\n const contentBlocks = normalizeMessageContent(message.content)\n const toolBlocks = message.tool_calls?.map(parseToolCall) ?? []\n const thinkingBlocks: Array<NormalizedBlock> = message.reasoning_text\n ? [{\n kind: 'thinking',\n thinking: message.reasoning_text,\n }]\n : []\n return {\n role: 'assistant',\n blocks: [...thinkingBlocks, ...contentBlocks, ...toolBlocks],\n meta: {\n reasoningOpaque: message.reasoning_opaque,\n encryptedContent: message.encrypted_content,\n phase: message.phase,\n copilotAnnotations: message.copilot_annotations,\n },\n }\n}\n\nexport function normalizeOpenAIResponse(\n response: CapiChatCompletionResponse,\n context: TranslationContext,\n): NormalizedOpenAIResponse {\n if (response.choices.length === 0) {\n throw new TranslationFailure('Upstream response contained no choices', {\n status: 502,\n kind: 'missing_upstream_choice',\n })\n }\n\n const firstChoice = [...response.choices].sort((left, right) => left.index - right.index)[0]\n if (response.choices.length > 1) {\n context.record(\n {\n kind: 'lossy_multiple_choices_ignored',\n severity: 'warning',\n message: 'Upstream response contained multiple choices; only choice index 0 was used.',\n },\n { fatalInStrict: true },\n )\n }\n\n return {\n id: response.id,\n model: response.model,\n turn: normalizeAssistantTurn(firstChoice.message),\n finishReason: firstChoice.finish_reason,\n usage: response.usage,\n }\n}\n","import type { TranslationIssue } from './translation-issue'\nimport { TranslationFailure } from './translation-issue'\n\nexport interface TranslationPolicy {\n mode: 'best-effort' | 'strict'\n}\n\nexport const defaultTranslationPolicy: TranslationPolicy = {\n mode: 'best-effort',\n}\n\nexport class TranslationContext {\n private readonly policy: TranslationPolicy\n private readonly issues: Array<TranslationIssue> = []\n\n constructor(policy: TranslationPolicy = defaultTranslationPolicy) {\n this.policy = policy\n }\n\n record(issue: TranslationIssue, options?: { fatalInStrict?: boolean }) {\n this.issues.push(issue)\n if (this.policy.mode === 'strict' && options?.fatalInStrict) {\n throw new TranslationFailure(issue.message, {\n status: 400,\n kind: issue.kind,\n })\n }\n }\n\n getIssues(): Array<TranslationIssue> {\n return [...this.issues]\n }\n}\n","import type {\n CapiChatCompletionResponse,\n CapiExecutionPlan,\n CapiRequestContext,\n} from '~/core/capi'\nimport type {\n ConversationBlock,\n ConversationImageBlock,\n ConversationRequest,\n ConversationTextBlock,\n ConversationTurn,\n} from '~/core/conversation'\nimport type { AnthropicOpenAIMapperOptions } from '~/translator/anthropic/anthropic-openai-mapper'\nimport type { NormalizedAnthropicRequest, NormalizedBlock, NormalizedTurn } from '~/translator/anthropic/ir'\nimport type { TranslationIssue } from '~/translator/anthropic/translation-issue'\nimport type { TranslationPolicy } from '~/translator/anthropic/translation-policy'\nimport type {\n AnthropicCountTokensPayload,\n AnthropicMessagesPayload,\n AnthropicResponse,\n} from '~/translator/anthropic/types'\n\nimport { buildCapiExecutionPlan } from '~/core/capi'\nimport { normalizeAnthropicRequest } from '~/translator/anthropic/anthropic-normalizer'\nimport { AnthropicStreamTranslator } from '~/translator/anthropic/anthropic-stream-transducer'\nimport { mapOpenAIResponseToAnthropic } from '~/translator/anthropic/openai-anthropic-mapper'\nimport { normalizeOpenAIResponse } from '~/translator/anthropic/openai-normalizer'\nimport { defaultTranslationPolicy, TranslationContext } from '~/translator/anthropic/translation-policy'\n\nexport interface AnthropicMessagesAdapterOptions {\n modelResolver?: AnthropicOpenAIMapperOptions['resolveModel']\n getModelCapabilities?: AnthropicOpenAIMapperOptions['getModelCapabilities']\n policy?: TranslationPolicy\n}\n\ninterface NormalizedAnthropicConversation {\n normalized: NormalizedAnthropicRequest\n conversation: ConversationRequest\n issues: Array<TranslationIssue>\n}\n\nfunction toConversationBlock(block: NormalizedBlock): ConversationBlock {\n switch (block.kind) {\n case 'text':\n return {\n kind: 'text',\n text: block.text,\n }\n case 'image':\n return {\n kind: 'image',\n url: `data:${block.mediaType};base64,${block.data}`,\n }\n case 'thinking':\n return {\n kind: 'thinking',\n text: block.thinking,\n signature: block.signature,\n }\n case 'tool_use':\n return {\n kind: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input,\n argumentsText: JSON.stringify(block.input),\n }\n case 'tool_result':\n return {\n kind: 'tool_result',\n toolUseId: block.toolUseId,\n content: block.content.map(contentBlock => toConversationBlock(contentBlock)) as Array<ConversationTextBlock | ConversationImageBlock>,\n isError: block.isError,\n }\n }\n}\n\nfunction toConversationTurn(turn: NormalizedTurn): ConversationTurn {\n return {\n role: turn.role,\n blocks: turn.blocks.map(toConversationBlock),\n }\n}\n\nfunction recordAnthropicRequestIssues(\n request: NormalizedAnthropicRequest,\n context: TranslationContext,\n) {\n if (request.topK !== undefined) {\n context.record(\n {\n kind: 'unsupported_top_k',\n severity: 'warning',\n message: 'Anthropic top_k is not supported by the upstream Copilot CAPI payload and was dropped.',\n },\n { fatalInStrict: true },\n )\n }\n\n if (request.serviceTier !== undefined) {\n context.record(\n {\n kind: 'unsupported_service_tier',\n severity: 'warning',\n message: 'Anthropic service_tier is not supported by the upstream Copilot CAPI payload and was dropped.',\n },\n { fatalInStrict: true },\n )\n }\n\n for (const turn of request.turns) {\n if (turn.role === 'user') {\n for (const block of turn.blocks) {\n if (block.kind === 'tool_result' && block.isError) {\n context.record({\n kind: 'lossy_tool_result_error_flag_dropped',\n severity: 'warning',\n message: 'tool_result.is_error is not representable in upstream tool messages and was dropped.',\n })\n }\n }\n continue\n }\n\n if (turn.role !== 'assistant') {\n continue\n }\n\n let sawToolUse = false\n let sawTextOrThinkingAfterTool = false\n let sawThinking = false\n\n for (const block of turn.blocks) {\n if (block.kind === 'thinking') {\n sawThinking = true\n if (sawToolUse) {\n sawTextOrThinkingAfterTool = true\n }\n }\n else if (block.kind === 'text') {\n if (sawToolUse) {\n sawTextOrThinkingAfterTool = true\n }\n }\n else if (block.kind === 'tool_use') {\n sawToolUse = true\n }\n }\n\n if (sawThinking) {\n context.record({\n kind: 'lossy_thinking_omitted_from_prompt',\n severity: 'warning',\n message: 'Anthropic thinking blocks were preserved internally but omitted from the upstream prompt.',\n })\n }\n\n if (sawTextOrThinkingAfterTool) {\n context.record({\n kind: 'lossy_interleaving_flattened',\n severity: 'warning',\n message: 'Assistant text/tool_use interleaving was flattened to upstream content + tool_calls.',\n })\n }\n }\n}\n\nfunction applyThinkingBudgetOverride(\n plan: CapiExecutionPlan,\n request: NormalizedAnthropicRequest,\n options: Required<Pick<AnthropicMessagesAdapterOptions, 'getModelCapabilities'>>,\n) {\n if (!request.thinking || request.thinking.type === 'disabled') {\n return\n }\n\n const supportsThinkingBudget = options.getModelCapabilities(plan.resolvedModel).supportsThinkingBudget\n if (supportsThinkingBudget && plan.payload.thinking_budget == null) {\n const budgetTokens = request.thinking.type === 'adaptive'\n ? 24000\n : request.thinking.budgetTokens\n plan.payload.thinking_budget = budgetTokens\n plan.tokenCountPayload.thinking_budget = budgetTokens\n }\n\n if (!supportsThinkingBudget) {\n delete plan.payload.thinking_budget\n delete plan.tokenCountPayload.thinking_budget\n }\n}\n\nfunction normalizeAnthropicConversation(\n payload: AnthropicMessagesPayload | AnthropicCountTokensPayload,\n policy: TranslationPolicy,\n): NormalizedAnthropicConversation {\n const context = new TranslationContext(policy)\n const normalized = normalizeAnthropicRequest(payload)\n recordAnthropicRequestIssues(normalized, context)\n\n return {\n normalized,\n conversation: {\n model: normalized.model,\n turns: normalized.turns.map(toConversationTurn),\n maxTokens: normalized.maxTokens,\n stopSequences: normalized.stopSequences,\n stream: normalized.stream,\n temperature: normalized.temperature,\n topP: normalized.topP,\n userId: normalized.userId,\n tools: normalized.tools?.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n })),\n toolChoice: normalized.toolChoice,\n thinking: normalized.thinking,\n },\n issues: context.getIssues(),\n }\n}\n\nexport class AnthropicMessagesAdapter {\n private readonly options: Required<AnthropicMessagesAdapterOptions>\n private lastIssues: Array<TranslationIssue> = []\n\n constructor(options: AnthropicMessagesAdapterOptions = {}) {\n this.options = {\n modelResolver: options.modelResolver ?? (model => model),\n getModelCapabilities:\n options.getModelCapabilities\n ?? ((model: string) => ({\n supportsThinkingBudget: model.startsWith('claude'),\n })),\n policy: options.policy ?? defaultTranslationPolicy,\n }\n }\n\n toConversation(\n payload: AnthropicMessagesPayload | AnthropicCountTokensPayload,\n ): ConversationRequest {\n const { conversation, issues } = normalizeAnthropicConversation(payload, this.options.policy)\n this.lastIssues = issues\n return conversation\n }\n\n toCapiPlan(\n payload: AnthropicMessagesPayload | AnthropicCountTokensPayload,\n options?: { requestContext?: Partial<CapiRequestContext> },\n ): CapiExecutionPlan {\n const { conversation, normalized, issues } = normalizeAnthropicConversation(\n payload,\n this.options.policy,\n )\n this.lastIssues = issues\n const plan = buildCapiExecutionPlan(conversation, {\n resolveModel: this.options.modelResolver,\n requestContext: options?.requestContext,\n })\n\n applyThinkingBudgetOverride(plan, normalized, this.options)\n return plan\n }\n\n toTokenCountPayload(\n payload: AnthropicMessagesPayload | AnthropicCountTokensPayload,\n ) {\n return this.toCapiPlan(payload).tokenCountPayload\n }\n\n fromCapiResponse(response: CapiChatCompletionResponse): AnthropicResponse {\n const context = new TranslationContext(this.options.policy)\n const normalized = normalizeOpenAIResponse(response, context)\n const result = mapOpenAIResponseToAnthropic(normalized)\n this.lastIssues = context.getIssues()\n return result\n }\n\n createStreamSerializer() {\n return new AnthropicStreamTranslator()\n }\n\n getLastIssues(): Array<TranslationIssue> {\n return [...this.lastIssues]\n }\n}\n","import type { CopilotClient } from '~/clients'\nimport type { CapiExecutionPlan } from '~/core/capi'\n\nexport class CopilotTransport {\n private readonly client: CopilotClient\n\n constructor(client: CopilotClient) {\n this.client = client\n }\n\n execute(\n plan: CapiExecutionPlan,\n options?: { signal?: AbortSignal },\n ) {\n return this.client.createChatCompletions(plan.payload, {\n signal: options?.signal,\n initiator: plan.initiator,\n requestContext: plan.requestContext,\n })\n }\n}\n","import type {\n CapiChatCompletionChunk,\n CapiChatCompletionResponse,\n CapiExecutionPlan,\n CapiRequestContext,\n} from '~/core/capi'\nimport type {\n CompletionOptions,\n ConversationBlock,\n ConversationRequest,\n ConversationTurn,\n} from '~/core/conversation'\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n} from '~/types'\n\nimport { buildCapiExecutionPlan } from '~/core/capi'\n\nfunction toConversationBlocks(\n content: ChatCompletionsPayload['messages'][number]['content'],\n): Array<ConversationBlock> {\n if (content === null) {\n return []\n }\n\n if (typeof content === 'string') {\n return content.length > 0\n ? [{ kind: 'text', text: content }]\n : []\n }\n\n return content.map((part) => {\n if (part.type === 'text') {\n return {\n kind: 'text',\n text: part.text,\n }\n }\n\n return {\n kind: 'image',\n url: part.image_url.url,\n detail: part.image_url.detail,\n }\n })\n}\n\nfunction normalizeToolArguments(\n argumentsText: string,\n): Record<string, unknown> {\n try {\n const parsed = JSON.parse(argumentsText) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>\n }\n }\n catch {\n }\n\n return {}\n}\n\nfunction toConversationTurns(payload: ChatCompletionsPayload): Array<ConversationTurn> {\n return payload.messages.map((message) => {\n const blocks = toConversationBlocks(message.content)\n\n if (message.role === 'assistant') {\n const toolBlocks = message.tool_calls?.map(toolCall => ({\n kind: 'tool_use' as const,\n id: toolCall.id,\n name: toolCall.function.name,\n input: normalizeToolArguments(toolCall.function.arguments),\n argumentsText: toolCall.function.arguments,\n }))\n\n return {\n role: 'assistant',\n blocks: [...blocks, ...(toolBlocks ?? [])],\n }\n }\n\n if (message.role === 'tool') {\n return {\n role: 'tool',\n blocks,\n meta: {\n toolCallId: message.tool_call_id,\n },\n }\n }\n\n return {\n role: message.role,\n blocks,\n }\n })\n}\n\nfunction sanitizeResponse(response: CapiChatCompletionResponse): ChatCompletionResponse {\n return {\n id: response.id,\n object: response.object,\n created: response.created,\n model: response.model,\n system_fingerprint: response.system_fingerprint,\n usage: response.usage,\n choices: response.choices.map(choice => ({\n index: choice.index,\n finish_reason: choice.finish_reason,\n logprobs: choice.logprobs,\n message: {\n role: choice.message.role,\n content: choice.message.content,\n ...(choice.message.tool_calls ? { tool_calls: choice.message.tool_calls } : {}),\n },\n })),\n }\n}\n\nfunction sanitizeChunk(chunk: CapiChatCompletionChunk): ChatCompletionChunk {\n return {\n id: chunk.id,\n object: chunk.object,\n created: chunk.created,\n model: chunk.model,\n system_fingerprint: chunk.system_fingerprint,\n usage: chunk.usage,\n choices: chunk.choices.map(choice => ({\n index: choice.index,\n finish_reason: choice.finish_reason,\n logprobs: choice.logprobs,\n delta: {\n ...(choice.delta.role && choice.delta.role !== 'developer'\n ? { role: choice.delta.role }\n : {}),\n content: choice.delta.content,\n reasoning_text: choice.delta.reasoning_text,\n tool_calls: choice.delta.tool_calls,\n },\n })),\n }\n}\n\nfunction buildCompletionOptions(payload: ChatCompletionsPayload): CompletionOptions | undefined {\n const opts: CompletionOptions = {\n ...(payload.n != null ? { n: payload.n } : {}),\n ...(payload.frequency_penalty != null ? { frequencyPenalty: payload.frequency_penalty } : {}),\n ...(payload.presence_penalty != null ? { presencePenalty: payload.presence_penalty } : {}),\n ...(payload.logit_bias != null ? { logitBias: payload.logit_bias } : {}),\n ...(payload.logprobs != null ? { logprobs: payload.logprobs } : {}),\n ...(payload.response_format != null ? { responseFormat: payload.response_format } : {}),\n ...(payload.seed != null ? { seed: payload.seed } : {}),\n ...(payload.reasoning_effort != null ? { reasoningEffort: payload.reasoning_effort } : {}),\n }\n\n return Object.keys(opts).length > 0 ? opts : undefined\n}\n\nexport class OpenAIChatAdapter {\n toConversation(payload: ChatCompletionsPayload): ConversationRequest {\n return {\n model: payload.model,\n turns: toConversationTurns(payload),\n maxTokens: payload.max_tokens ?? undefined,\n stopSequences:\n payload.stop == null\n ? undefined\n : Array.isArray(payload.stop)\n ? payload.stop\n : [payload.stop],\n stream: payload.stream ?? undefined,\n temperature: payload.temperature,\n topP: payload.top_p,\n userId: payload.user ?? undefined,\n tools: payload.tools?.map(tool => ({\n name: tool.function.name,\n description: tool.function.description,\n inputSchema: tool.function.parameters,\n })),\n toolChoice:\n payload.tool_choice == null\n ? undefined\n : typeof payload.tool_choice === 'string'\n ? payload.tool_choice === 'required'\n ? { type: 'required' }\n : payload.tool_choice === 'none'\n ? { type: 'none' }\n : { type: 'auto' }\n : { type: 'tool', name: payload.tool_choice.function.name },\n thinking:\n payload.thinking_budget != null\n ? { type: 'enabled', budgetTokens: payload.thinking_budget }\n : undefined,\n completionOptions: buildCompletionOptions(payload),\n }\n }\n\n toCapiPlan(\n payload: ChatCompletionsPayload,\n options?: { requestContext?: Partial<CapiRequestContext> },\n ): CapiExecutionPlan {\n return buildCapiExecutionPlan(this.toConversation(payload), {\n requestContext: options?.requestContext,\n })\n }\n\n toTokenCountPayload(payload: ChatCompletionsPayload) {\n return this.toCapiPlan(payload).tokenCountPayload\n }\n\n fromCapiResponse(response: CapiChatCompletionResponse): ChatCompletionResponse {\n return sanitizeResponse(response)\n }\n\n serializeStreamChunk(chunk: CapiChatCompletionChunk): ChatCompletionChunk {\n return sanitizeChunk(chunk)\n }\n}\n","export interface SSEOutput {\n id?: string\n event?: string\n data: string\n comment?: string\n retry?: number\n}\n\nexport interface SSEStreamChunk {\n id?: number | string\n event?: string\n data?: string\n comment?: string\n retry?: number\n}\n\nexport type ExecutionResult\n = | { kind: 'json', data: unknown }\n | { kind: 'stream', generator: AsyncGenerator<SSEOutput> }\n\nexport interface ExecutionStrategy<TResult, TChunk> {\n execute: () => Promise<TResult>\n isStream: (result: TResult) => result is TResult & AsyncIterable<TChunk>\n translateResult: (result: TResult) => unknown\n translateStreamChunk: (chunk: TChunk) => SSEOutput | SSEOutput[] | null\n onStreamDone?: () => SSEOutput | SSEOutput[] | null\n onStreamError?: (error: unknown) => SSEOutput | SSEOutput[] | null\n shouldBreakStream?: (chunk: TChunk) => boolean\n}\n\n/**\n * Strategy runner. Returns a discriminated union\n * instead of a framework-specific Response.\n */\nexport async function runStrategy<TResult, TChunk>(\n strategy: ExecutionStrategy<TResult, TChunk>,\n signal: { signal: AbortSignal, clientSignal?: AbortSignal, cleanup: () => void },\n): Promise<ExecutionResult> {\n const result = await strategy.execute()\n\n if (!strategy.isStream(result)) {\n signal.cleanup()\n return { kind: 'json', data: strategy.translateResult(result) }\n }\n\n async function* generateSSE(): AsyncGenerator<SSEOutput> {\n try {\n for await (const chunk of result as AsyncIterable<TChunk>) {\n const outputs = normalizeOutputs(strategy.translateStreamChunk(chunk))\n for (const output of outputs) {\n yield output\n }\n if (strategy.shouldBreakStream?.(chunk as TChunk)) {\n break\n }\n }\n const doneOutputs = normalizeOutputs(strategy.onStreamDone?.() ?? null)\n for (const output of doneOutputs) {\n yield output\n }\n }\n catch (error) {\n // Only suppress error events when the *client* disconnected.\n // Upstream timeouts (proxy-side abort) should still emit onStreamError\n // so strategies can translate them into proper SSE error events.\n if (!signal.clientSignal?.aborted) {\n const errOutputs = normalizeOutputs(strategy.onStreamError?.(error) ?? null)\n for (const output of errOutputs) {\n yield output\n }\n }\n }\n finally {\n signal.cleanup()\n }\n }\n\n return { kind: 'stream', generator: generateSSE() }\n}\n\nfunction normalizeOutputs(value: SSEOutput | SSEOutput[] | null): SSEOutput[] {\n if (!value) {\n return []\n }\n return Array.isArray(value) ? value : [value]\n}\n\n/**\n * Creates an SSEOutput by copying SSE metadata fields from a raw chunk\n * and replacing the data field with the provided value.\n */\nexport function passthroughSSEChunk(chunk: SSEStreamChunk, data: string): SSEOutput {\n return {\n ...(chunk.comment ? { comment: chunk.comment } : {}),\n ...(chunk.event ? { event: chunk.event } : {}),\n ...(chunk.id !== undefined ? { id: String(chunk.id) } : {}),\n ...(chunk.retry !== undefined ? { retry: chunk.retry } : {}),\n data,\n }\n}\n","import type { Model } from '~/types'\n\nimport { state } from './state'\n\nexport const RESPONSES_ENDPOINT = '/responses' as const\nexport const MESSAGES_ENDPOINT = '/v1/messages' as const\n\nexport function findModelById(\n modelId: string,\n): Model | undefined {\n return state.cache.models?.data.find(model => model.id === modelId)\n}\n\nexport function modelSupportsEndpoint(\n model: Model | undefined,\n endpoint: string,\n): boolean {\n return model?.supported_endpoints?.includes(endpoint) ?? false\n}\n\nexport function modelSupportsToolCalls(\n model: Model | undefined,\n): boolean {\n return model?.capabilities.supports.tool_calls ?? false\n}\n\nexport function modelSupportsAdaptiveThinking(\n model: Model | undefined,\n): boolean {\n return model?.capabilities.supports.adaptive_thinking ?? false\n}\n\nexport function modelSupportsVision(\n model: Model | undefined,\n): boolean {\n return model?.capabilities.supports.vision ?? false\n}\n\nexport function getModelVisionLimits(\n model: Model | undefined,\n): Model['capabilities']['limits']['vision'] | undefined {\n return model?.capabilities.limits.vision\n}\n","import type {\n ChatCompletionsPayload,\n ContentPart,\n Message,\n Model,\n Tool,\n ToolCall,\n} from '~/types'\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// Token counting constants\nconst TOKENS_PER_MESSAGE = 3\nconst TOKENS_PER_NAME = 1\nconst REPLY_PRIMING_TOKENS = 3\n\n// Model-specific constants for tool token calculation\nconst BASE_CONSTANTS = {\n propertyInitOverhead: 3,\n propertyKeyOverhead: 3,\n enumOverhead: -3,\n enumItemCost: 3,\n functionEndOverhead: 12,\n}\n\ntype ModelConstants = typeof BASE_CONSTANTS & { functionInitOverhead: number }\n\n/**\n * Calculate tokens for tool calls\n */\nfunction calculateToolCallsTokens(toolCalls: Array<ToolCall>, encoder: Encoder, constants: ModelConstants): number {\n let tokens = 0\n for (const toolCall of toolCalls) {\n tokens += constants.functionInitOverhead\n tokens += encoder.encode(JSON.stringify(toolCall)).length\n }\n tokens += constants.functionEndOverhead\n return tokens\n}\n\n/**\n * Calculate tokens for content parts\n */\nfunction calculateContentPartsTokens(contentParts: Array<ContentPart>, encoder: Encoder): 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 }\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 */\nfunction calculateMessageTokens(message: Message, encoder: Encoder, constants: ModelConstants): number {\n let tokens = TOKENS_PER_MESSAGE\n for (const [key, value] of Object.entries(message)) {\n if (typeof value === 'string') {\n tokens += encoder.encode(value).length\n }\n if (key === 'name') {\n tokens += TOKENS_PER_NAME\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 */\nfunction calculateTokens(messages: Array<Message>, encoder: Encoder, constants: ModelConstants): 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 += REPLY_PRIMING_TOKENS\n return numTokens\n}\n\n/**\n * Get the corresponding encoder module based on encoding type\n */\nasync function getEncoder(encoding: string): Promise<Encoder> {\n const cached = encodingCache.get(encoding)\n if (cached)\n return cached\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 function getTokenizerFromModel(model: Model): string {\n return model.capabilities.tokenizer || 'o200k_base'\n}\n\n/**\n * Get model-specific constants for token calculation\n */\nfunction getModelConstants(model: Model): ModelConstants {\n const isLegacy = model.id === 'gpt-3.5-turbo' || model.id === 'gpt-4'\n return { ...BASE_CONSTANTS, functionInitOverhead: isLegacy ? 10 : 7 }\n}\n\n/**\n * Calculate tokens for a single parameter\n */\nfunction calculateParameterTokens(key: string, prop: unknown, context: {\n encoder: Encoder\n constants: ModelConstants\n}): number {\n const { encoder, constants } = context\n let tokens = constants.propertyKeyOverhead\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.enumOverhead\n for (const item of param.enum) {\n tokens += constants.enumItemCost\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 // Handle additional properties (excluding standard ones)\n const excludedKeys = new Set(['type', 'description', 'enum'])\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'\n ? propertyValue\n : (\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 function parameters\n */\nfunction calculateParametersTokens(parameters: unknown, encoder: Encoder, constants: ModelConstants): 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 for (const [key, value] of Object.entries(params)) {\n if (key === 'properties') {\n const properties = value as Record<string, unknown>\n if (Object.keys(properties).length > 0) {\n tokens += constants.propertyInitOverhead\n for (const propKey of Object.keys(properties)) {\n tokens += calculateParameterTokens(propKey, properties[propKey], {\n encoder,\n constants,\n })\n }\n }\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 */\nfunction calculateToolTokens(tool: Tool, encoder: Encoder, constants: ModelConstants): number {\n let tokens = constants.functionInitOverhead\n const func = tool.function\n const functionName = func.name\n let functionDescription = func.description || ''\n if (functionDescription.endsWith('.')) {\n functionDescription = functionDescription.slice(0, -1)\n }\n const line = `${functionName}:${functionDescription}`\n tokens += encoder.encode(line).length\n if (\n typeof func.parameters === 'object'\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 function numTokensForTools(tools: Array<Tool>, encoder: Encoder, constants: ModelConstants): number {\n let toolTokenCount = 0\n for (const tool of tools) {\n toolTokenCount += calculateToolTokens(tool, encoder, constants)\n }\n toolTokenCount += constants.functionEndOverhead\n return toolTokenCount\n}\n\n/**\n * Calculate the token count of messages, supporting multiple GPT encoders\n */\nexport async function getTokenCount(payload: ChatCompletionsPayload, model: Model): Promise<{ input: number, output: number }> {\n // Get tokenizer string\n const tokenizer = getTokenizerFromModel(model)\n\n // Get corresponding encoder module\n const encoder = await getEncoder(tokenizer)\n\n const inputMessages = payload.messages.filter(\n msg => msg.role !== 'assistant',\n )\n const outputMessages = payload.messages.filter(\n msg => msg.role === 'assistant',\n )\n\n const constants = getModelConstants(model)\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 { state } from '~/lib/state'\n\nconst DEFAULT_TIMEOUT_MS = 1_800_000 // 30 minutes\n\nexport function createUpstreamSignal(clientSignal?: AbortSignal, timeoutMs = DEFAULT_TIMEOUT_MS) {\n const controller = new AbortController()\n const timeout = timeoutMs > 0\n ? setTimeout(() => controller.abort(), timeoutMs)\n : undefined\n\n const onAbort = () => controller.abort()\n if (clientSignal && !clientSignal.aborted) {\n clientSignal.addEventListener('abort', onAbort)\n }\n\n return {\n signal: controller.signal,\n clientSignal,\n cleanup: () => {\n if (timeout)\n clearTimeout(timeout)\n clientSignal?.removeEventListener('abort', onAbort)\n },\n }\n}\n\n/**\n * Convenience wrapper that reads the upstream timeout from runtime config.\n */\nexport function createUpstreamSignalFromConfig(clientSignal: AbortSignal) {\n return createUpstreamSignal(\n clientSignal,\n state.config.upstreamTimeoutSeconds !== undefined\n ? state.config.upstreamTimeoutSeconds * 1000\n : undefined,\n )\n}\n","// Streaming types\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 cached_tokens: number\n }\n completion_tokens_details?: {\n accepted_prediction_tokens: number\n rejected_prediction_tokens: number\n }\n }\n}\n\ninterface Delta {\n content?: string | null\n reasoning_text?: 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}\n\ninterface 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\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 cached_tokens: number\n }\n }\n}\n\ninterface ResponseMessage {\n role: 'assistant'\n content: 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\nexport const REASONING_EFFORT_VALUES = ['minimal', 'low', 'medium', 'high'] as const\nexport type ReasoningEffort = typeof REASONING_EFFORT_VALUES[number]\n\n// Payload types\nexport interface ChatCompletionsPayload {\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 reasoning_effort?: ReasoningEffort | null\n thinking_budget?: number | 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}\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\n\nexport interface TextPart {\n type: 'text'\n text: string\n}\n\nexport interface ImagePart {\n type: 'image_url'\n image_url: {\n url: string\n detail?: 'low' | 'high' | 'auto'\n }\n}\n\n// Embeddings\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\n// Models\nexport interface ModelsResponse {\n data: Array<Model>\n object: string\n}\n\ninterface ModelLimits {\n max_context_window_tokens?: number\n max_output_tokens?: number\n max_prompt_tokens?: number\n max_inputs?: number\n vision?: {\n max_prompt_image_size?: number\n max_prompt_images?: number\n supported_media_types?: Array<string>\n }\n}\n\ninterface ModelSupports {\n tool_calls?: boolean\n parallel_tool_calls?: boolean\n dimensions?: boolean\n adaptive_thinking?: boolean\n vision?: boolean\n streaming?: boolean\n structured_outputs?: boolean\n reasoning_effort?: Array<string>\n}\n\ninterface ModelCapabilities {\n family: string\n limits: ModelLimits\n object: string\n supports: ModelSupports\n tokenizer: string\n type: string\n}\n\nexport interface Model {\n capabilities: ModelCapabilities\n id: string\n model_picker_enabled: boolean\n name: string\n object: string\n preview: boolean\n vendor: string\n version: string\n policy?: {\n state: string\n terms: string\n }\n supported_endpoints?: Array<string>\n}\n","import type {\n AnthropicCountTokensPayload,\n AnthropicMessagesPayload,\n} from '~/translator'\nimport type {\n ChatCompletionsPayload,\n EmbeddingRequest,\n ResponsesInputTokensPayload,\n ResponsesPayload,\n} from '~/types'\n\nimport consola from 'consola'\nimport { z } from 'zod'\n\nimport { REASONING_EFFORT_VALUES } from '~/types'\n\nimport { shouldUseFunctionApplyPatch } from './config'\nimport { HTTPError } from './error'\n\nconst jsonObjectSchema = z.object({}).catchall(z.unknown())\nconst finiteNumberSchema = z.number().finite()\nconst nonNegativeIntegerSchema = z.number().int().nonnegative()\nconst openAIPenaltySchema = finiteNumberSchema.min(-2).max(2)\nconst openAILogitBiasKeySchema = z.string().regex(/^\\d+$/)\nconst openAILogitBiasValueSchema = finiteNumberSchema.min(-100).max(100)\n\nfunction createObjectSchemaDefinitionSchema(message: string) {\n return jsonObjectSchema.superRefine((schema, ctx) => {\n const typeValue = schema.type\n if (typeValue !== undefined && typeValue !== 'object') {\n ctx.addIssue({\n code: 'custom',\n message,\n })\n }\n })\n}\n\nconst openAITextPartSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n}).loose()\n\nconst openAIImagePartSchema = z.object({\n type: z.literal('image_url'),\n image_url: z.object({\n url: z.string(),\n detail: z.enum(['low', 'high', 'auto']).optional(),\n }).loose(),\n}).loose()\n\nconst openAIContentSchema = z.union([\n z.string(),\n z.null(),\n z.array(z.union([openAITextPartSchema, openAIImagePartSchema])),\n])\n\nconst openAIToolCallSchema = z.object({\n id: z.string(),\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n arguments: z.string(),\n }).loose(),\n}).loose()\n\nconst openAIMessageSchema = z.object({\n role: z.enum(['user', 'assistant', 'system', 'tool', 'developer']),\n content: openAIContentSchema,\n name: z.string().optional(),\n tool_calls: z.array(openAIToolCallSchema).optional(),\n tool_call_id: z.string().optional(),\n}).loose().superRefine((message, ctx) => {\n if (message.role === 'tool' && !message.tool_call_id) {\n ctx.addIssue({\n code: 'custom',\n message: 'tool messages require tool_call_id',\n path: ['tool_call_id'],\n })\n }\n\n if (message.role !== 'assistant' && message.tool_calls) {\n ctx.addIssue({\n code: 'custom',\n message: 'tool_calls are only valid on assistant messages',\n path: ['tool_calls'],\n })\n }\n})\n\nconst openAIToolSchema = z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n parameters: createObjectSchemaDefinitionSchema('tool function.parameters must describe an object'),\n }).loose(),\n}).loose()\n\nconst openAIToolChoiceSchema = z.union([\n z.literal('none'),\n z.literal('auto'),\n z.literal('required'),\n z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n }).loose(),\n }).loose(),\n])\n\nconst openAIResponseFormatSchema = z.object({\n type: z.literal('json_object'),\n})\n\nconst responsesInputTextSchema = z.object({\n type: z.enum(['input_text', 'output_text']),\n text: z.string(),\n}).loose()\n\nconst responsesInputImageSchema = z.object({\n type: z.literal('input_image'),\n image_url: z.string().nullable().optional(),\n file_id: z.string().nullable().optional(),\n detail: z.enum(['low', 'high', 'auto']).optional(),\n}).loose().superRefine((item, ctx) => {\n if (!item.image_url && !item.file_id) {\n ctx.addIssue({\n code: 'custom',\n message: 'input_image requires image_url or file_id',\n })\n }\n})\n\nconst responsesInputFileSchema = z.object({\n type: z.literal('input_file'),\n file_id: z.string().nullable().optional(),\n file_url: z.string().nullable().optional(),\n file_data: z.string().nullable().optional(),\n filename: z.string().nullable().optional(),\n}).loose().superRefine((item, ctx) => {\n if (!item.file_id && !item.file_url && !item.file_data) {\n ctx.addIssue({\n code: 'custom',\n message: 'input_file requires file_id, file_url, or file_data',\n })\n }\n\n if (item.file_data && !item.filename) {\n ctx.addIssue({\n code: 'custom',\n message: 'input_file with file_data requires filename',\n })\n }\n})\n\nconst responsesUnknownContentSchema = z.object({\n type: z.string().min(1),\n}).catchall(z.unknown()).superRefine((item, ctx) => {\n if (['input_text', 'output_text', 'input_image', 'input_file'].includes(item.type)) {\n ctx.addIssue({\n code: 'custom',\n message: `content item type ${item.type} must match the explicit schema`,\n })\n }\n})\n\nconst responsesInputContentSchema = z.union([\n responsesInputTextSchema,\n responsesInputImageSchema,\n responsesInputFileSchema,\n responsesUnknownContentSchema,\n])\n\nconst responsesMessageSchema = z.object({\n type: z.literal('message').optional(),\n role: z.enum(['user', 'assistant', 'system', 'developer']),\n content: z.union([\n z.string(),\n z.array(responsesInputContentSchema),\n ]).optional(),\n status: z.string().optional(),\n phase: z.enum(['commentary', 'final_answer']).optional(),\n}).loose()\n\nconst responsesFunctionCallSchema = z.object({\n type: z.literal('function_call'),\n call_id: z.string().min(1),\n name: z.string().min(1),\n arguments: z.string(),\n status: z.enum(['in_progress', 'completed', 'incomplete']).optional(),\n}).loose()\n\nconst responsesFunctionCallOutputSchema = z.object({\n type: z.literal('function_call_output'),\n call_id: z.string().min(1),\n output: z.union([\n z.string(),\n z.array(responsesInputContentSchema),\n ]),\n status: z.enum(['in_progress', 'completed', 'incomplete']).optional(),\n}).loose()\n\nconst responsesReasoningSummarySchema = z.object({\n type: z.literal('summary_text'),\n text: z.string(),\n}).loose()\n\nconst responsesReasoningInputSchema = z.object({\n id: z.string().optional(),\n type: z.literal('reasoning'),\n summary: z.array(responsesReasoningSummarySchema),\n encrypted_content: z.string().min(1),\n}).loose()\n\nconst responsesCompactionInputSchema = z.object({\n id: z.string().min(1),\n type: z.literal('compaction'),\n encrypted_content: z.string().min(1),\n}).loose()\n\nconst responsesItemReferenceInputSchema = z.object({\n type: z.literal('item_reference'),\n id: z.string().min(1),\n}).loose()\n\nconst responsesUnknownInputItemSchema = z.object({\n type: z.string().min(1),\n}).catchall(z.unknown()).superRefine((item, ctx) => {\n if (['message', 'function_call', 'function_call_output', 'reasoning', 'compaction', 'item_reference'].includes(item.type)) {\n ctx.addIssue({\n code: 'custom',\n message: `input item type ${item.type} must match the explicit schema`,\n })\n }\n})\n\nconst responsesInputItemSchema = z.union([\n responsesMessageSchema,\n responsesFunctionCallSchema,\n responsesFunctionCallOutputSchema,\n responsesReasoningInputSchema,\n responsesCompactionInputSchema,\n responsesItemReferenceInputSchema,\n responsesUnknownInputItemSchema,\n])\n\nconst responsesFunctionToolSchema = z.object({\n type: z.literal('function'),\n name: z.string().min(1),\n parameters: jsonObjectSchema.nullable().optional(),\n strict: z.boolean().nullable().optional(),\n description: z.string().nullable().optional(),\n}).loose()\n\nconst responsesUnknownToolSchema = z.object({\n type: z.string().min(1),\n}).catchall(z.unknown()).superRefine((tool, ctx) => {\n if (tool.type === 'function') {\n ctx.addIssue({\n code: 'custom',\n message: 'tool type function must match the explicit schema',\n })\n }\n})\n\nconst responsesToolSchema = z.union([\n responsesFunctionToolSchema,\n responsesUnknownToolSchema,\n])\n\nconst responsesToolChoiceSchema = z.union([\n z.literal('none'),\n z.literal('auto'),\n z.literal('required'),\n z.object({\n type: z.literal('function'),\n name: z.string().min(1),\n }).loose(),\n])\n\nconst responsesReasoningConfigSchema = z.object({\n effort: z.enum(['none', 'minimal', 'low', 'medium', 'high', 'xhigh']).nullable().optional(),\n summary: z.enum(['auto', 'concise', 'detailed']).nullable().optional(),\n}).loose()\n\nconst responsesTextFormatTextSchema = z.object({\n type: z.literal('text'),\n}).loose()\n\nconst responsesTextFormatJsonObjectSchema = z.object({\n type: z.literal('json_object'),\n}).loose()\n\nconst responsesTextFormatJsonSchemaSchema = z.object({\n type: z.literal('json_schema'),\n name: z.string().min(1),\n schema: jsonObjectSchema,\n description: z.string().nullable().optional(),\n strict: z.boolean().nullable().optional(),\n}).loose()\n\nconst responsesTextConfigSchema = z.object({\n format: z.union([\n responsesTextFormatTextSchema,\n responsesTextFormatJsonObjectSchema,\n responsesTextFormatJsonSchemaSchema,\n ]).nullable().optional(),\n verbosity: z.enum(['low', 'medium', 'high']).nullable().optional(),\n}).loose()\n\nconst responsesContextManagementSchema = z.object({\n type: z.literal('compaction'),\n compact_threshold: nonNegativeIntegerSchema,\n}).loose()\n\nconst responsesConversationSchema = z.union([\n z.string().min(1),\n z.object({\n id: z.string().nullable().optional(),\n }).loose(),\n])\n\nfunction createResponsesPayloadSchema(options: {\n requireModel: boolean\n}) {\n return z.object({\n model: options.requireModel\n ? z.string().min(1)\n : z.string().min(1).nullable().optional(),\n instructions: z.string().nullable().optional(),\n input: z.union([\n z.string(),\n z.array(responsesInputItemSchema),\n z.null(),\n ]).optional(),\n conversation: responsesConversationSchema.nullable().optional(),\n previous_response_id: z.string().nullable().optional(),\n tools: z.array(responsesToolSchema).nullable().optional(),\n tool_choice: responsesToolChoiceSchema.nullable().optional(),\n temperature: finiteNumberSchema.min(0).max(2).nullable().optional(),\n top_p: finiteNumberSchema.min(0).max(1).nullable().optional(),\n max_output_tokens: nonNegativeIntegerSchema.nullable().optional(),\n max_tool_calls: nonNegativeIntegerSchema.nullable().optional(),\n metadata: z.record(z.string(), z.string()).nullable().optional(),\n stream: z.boolean().nullable().optional(),\n safety_identifier: z.string().nullable().optional(),\n prompt_cache_key: z.string().nullable().optional(),\n truncation: z.enum(['auto', 'disabled']).nullable().optional(),\n parallel_tool_calls: z.boolean().nullable().optional(),\n store: z.boolean().nullable().optional(),\n user: z.string().nullable().optional(),\n prompt: z.union([z.string().min(1), jsonObjectSchema]).nullable().optional(),\n text: responsesTextConfigSchema.nullable().optional(),\n reasoning: responsesReasoningConfigSchema.nullable().optional(),\n context_management: z.array(responsesContextManagementSchema).nullable().optional(),\n include: z.array(z.string().min(1)).nullable().optional(),\n service_tier: z.string().nullable().optional(),\n }).loose().superRefine((payload, ctx) => {\n const toolChoice = payload.tool_choice\n if (\n toolChoice\n && typeof toolChoice === 'object'\n && 'name' in toolChoice\n && typeof toolChoice.name === 'string'\n && Array.isArray(payload.tools)\n ) {\n const declaredFunctionNames = payload.tools\n .filter((tool) => {\n if (tool.type === 'function' && typeof tool.name === 'string') {\n return true\n }\n return shouldUseFunctionApplyPatch()\n && tool.type === 'custom'\n && tool.name === 'apply_patch'\n })\n .map(tool => tool.name)\n if (!declaredFunctionNames.includes(toolChoice.name)) {\n ctx.addIssue({\n code: 'custom',\n message: 'tool_choice.name must reference a declared function tool',\n path: ['tool_choice', 'name'],\n })\n }\n }\n })\n}\n\nconst responsesPayloadSchema = createResponsesPayloadSchema({ requireModel: true })\nconst responsesInputTokensPayloadSchema = createResponsesPayloadSchema({ requireModel: false })\n\nconst openAIChatPayloadSchema = z.object({\n model: z.string().min(1),\n messages: z.array(openAIMessageSchema).min(1),\n temperature: finiteNumberSchema.min(0).max(2).nullable().optional(),\n top_p: finiteNumberSchema.min(0).max(1).nullable().optional(),\n max_tokens: nonNegativeIntegerSchema.nullable().optional(),\n stop: z.union([z.string(), z.array(z.string())]).nullable().optional(),\n n: z.number().int().positive().nullable().optional(),\n stream: z.boolean().nullable().optional(),\n frequency_penalty: openAIPenaltySchema.nullable().optional(),\n presence_penalty: openAIPenaltySchema.nullable().optional(),\n logit_bias: z.record(openAILogitBiasKeySchema, openAILogitBiasValueSchema).nullable().optional(),\n logprobs: z.boolean().nullable().optional(),\n response_format: openAIResponseFormatSchema.nullable().optional(),\n seed: z.number().int().nullable().optional(),\n tools: z.array(openAIToolSchema).nullable().optional(),\n tool_choice: openAIToolChoiceSchema.nullable().optional(),\n user: z.string().nullable().optional(),\n reasoning_effort: z.enum(REASONING_EFFORT_VALUES).nullable().optional(),\n thinking_budget: z.number().int().positive().nullable().optional(),\n}).loose().superRefine((payload, ctx) => {\n const toolChoice = payload.tool_choice\n\n if (\n toolChoice\n && typeof toolChoice === 'object'\n && 'function' in toolChoice\n && !payload.tools?.some(tool => tool.function.name === toolChoice.function.name)\n ) {\n ctx.addIssue({\n code: 'custom',\n message: 'tool_choice.function.name must reference a declared tool',\n path: ['tool_choice', 'function', 'name'],\n })\n }\n})\n\nconst anthropicTextBlockSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n}).loose()\n\nconst anthropicImageBlockSchema = z.object({\n type: z.literal('image'),\n source: z.object({\n type: z.literal('base64'),\n media_type: z.enum(['image/jpeg', 'image/png', 'image/gif', 'image/webp']),\n data: z.string().min(1),\n }).loose(),\n}).loose()\n\nconst anthropicThinkingBlockSchema = z.object({\n type: z.literal('thinking'),\n thinking: z.string(),\n signature: z.string().optional(),\n}).loose()\n\nconst anthropicToolUseBlockSchema = z.object({\n type: z.literal('tool_use'),\n id: z.string().min(1),\n name: z.string().min(1),\n input: jsonObjectSchema,\n}).loose()\n\nconst anthropicToolResultContentBlockSchema = z.union([\n anthropicTextBlockSchema,\n anthropicImageBlockSchema,\n])\n\nconst anthropicToolResultBlockSchema = z.object({\n type: z.literal('tool_result'),\n tool_use_id: z.string().min(1),\n content: z.union([\n z.string(),\n z.array(anthropicToolResultContentBlockSchema),\n ]),\n is_error: z.boolean().optional(),\n}).loose()\n\nconst anthropicUserMessageSchema = z.object({\n role: z.literal('user'),\n content: z.union([\n z.string(),\n z.array(z.union([\n anthropicTextBlockSchema,\n anthropicImageBlockSchema,\n anthropicToolResultBlockSchema,\n ])),\n ]),\n}).loose()\n\nconst anthropicAssistantMessageSchema = z.object({\n role: z.literal('assistant'),\n content: z.union([\n z.string(),\n z.array(z.union([\n anthropicTextBlockSchema,\n anthropicThinkingBlockSchema,\n anthropicToolUseBlockSchema,\n ])),\n ]),\n}).loose()\n\nconst anthropicMessageSchema = z.union([\n anthropicUserMessageSchema,\n anthropicAssistantMessageSchema,\n])\n\nconst anthropicToolSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n input_schema: createObjectSchemaDefinitionSchema('tool input_schema must describe an object'),\n}).loose()\n\nconst anthropicToolChoiceSchema = z.union([\n z.object({\n type: z.literal('auto'),\n }).loose(),\n z.object({\n type: z.literal('any'),\n }).loose(),\n z.object({\n type: z.literal('none'),\n }).loose(),\n z.object({\n type: z.literal('tool'),\n name: z.string().min(1),\n }).loose(),\n])\n\nconst anthropicThinkingSchema = z.union([\n z.object({\n type: z.literal('disabled'),\n }).loose(),\n z.object({\n type: z.literal('adaptive'),\n }).loose(),\n z.object({\n type: z.literal('enabled'),\n budget_tokens: z.number().int().positive(),\n }).loose(),\n])\n\nconst anthropicMessagesBasePayloadSchema = z.object({\n model: z.string().min(1),\n messages: z.array(anthropicMessageSchema).min(1),\n system: z.union([\n z.string(),\n z.array(anthropicTextBlockSchema),\n ]).optional(),\n metadata: z.object({\n user_id: z.string().optional(),\n }).loose().optional(),\n stop_sequences: z.array(z.string()).optional(),\n stream: z.boolean().optional(),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n top_k: z.number().int().positive().optional(),\n tools: z.array(anthropicToolSchema).optional(),\n tool_choice: anthropicToolChoiceSchema.optional(),\n thinking: anthropicThinkingSchema.optional(),\n service_tier: z.enum(['auto', 'standard_only']).optional(),\n}).loose().superRefine((payload, ctx) => {\n if (payload.tool_choice?.type === 'tool' && !payload.tools?.some(tool => tool.name === payload.tool_choice?.name)) {\n ctx.addIssue({\n code: 'custom',\n message: 'tool_choice.name must reference a declared tool',\n path: ['tool_choice', 'name'],\n })\n }\n})\n\nconst anthropicMessagesPayloadSchema = anthropicMessagesBasePayloadSchema.extend({\n max_tokens: z.number().int().nonnegative(),\n})\n\nconst anthropicCountTokensPayloadSchema = anthropicMessagesBasePayloadSchema.extend({\n max_tokens: z.number().int().nonnegative().optional(),\n})\n\nconst embeddingRequestSchema = z.object({\n input: z.union([z.string(), z.array(z.string())]),\n model: z.string().min(1),\n}).loose()\n\nfunction throwInvalidPayload(context: string, issues: Array<z.core.$ZodIssue>): never {\n consola.warn('Invalid request payload', { context, issues })\n throw new HTTPError(400, {\n error: {\n message: 'Invalid request payload',\n type: 'invalid_request_error',\n param: context,\n details: issues.map(i => ({ path: i.path, message: i.message })),\n },\n })\n}\n\nexport function parseOpenAIChatPayload(payload: unknown): ChatCompletionsPayload {\n const result = openAIChatPayloadSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('openai.chat', result.error.issues)\n }\n return result.data as ChatCompletionsPayload\n}\n\nexport function parseAnthropicMessagesPayload(payload: unknown): AnthropicMessagesPayload {\n const result = anthropicMessagesPayloadSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('anthropic.messages', result.error.issues)\n }\n return result.data as AnthropicMessagesPayload\n}\n\nexport function parseAnthropicCountTokensPayload(payload: unknown): AnthropicCountTokensPayload {\n const result = anthropicCountTokensPayloadSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('anthropic.messages.count_tokens', result.error.issues)\n }\n return result.data as AnthropicCountTokensPayload\n}\n\nexport function parseEmbeddingRequest(payload: unknown): EmbeddingRequest {\n const result = embeddingRequestSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('openai.embeddings', result.error.issues)\n }\n return result.data as EmbeddingRequest\n}\n\nexport function parseResponsesPayload(payload: unknown): ResponsesPayload {\n const result = responsesPayloadSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('openai.responses', result.error.issues)\n }\n return result.data as ResponsesPayload\n}\n\nexport function parseResponsesInputTokensPayload(payload: unknown): ResponsesInputTokensPayload {\n const result = responsesInputTokensPayloadSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('openai.responses.input_tokens', result.error.issues)\n }\n return result.data as ResponsesInputTokensPayload\n}\n","import type { CopilotTransport, OpenAIChatAdapter } from '~/adapters'\nimport type { CapiChatCompletionChunk, CapiExecutionPlan } from '~/core/capi'\nimport type { ExecutionStrategy, SSEStreamChunk } from '~/lib/execution-strategy'\n\nimport consola from 'consola'\nimport { isNonStreamingResponse } from '~/clients'\nimport { passthroughSSEChunk } from '~/lib/execution-strategy'\n\ntype ChatCompletionsResult = Awaited<ReturnType<CopilotTransport['execute']>>\n\nexport function createChatCompletionsStrategy(\n transport: CopilotTransport,\n adapter: OpenAIChatAdapter,\n plan: CapiExecutionPlan,\n signal: AbortSignal,\n): ExecutionStrategy<ChatCompletionsResult, SSEStreamChunk> {\n return {\n execute() {\n return transport.execute(plan, { signal })\n },\n\n isStream(result): result is ChatCompletionsResult & AsyncIterable<SSEStreamChunk> {\n return !isNonStreamingResponse(result)\n },\n\n translateResult(result) {\n consola.debug('Non-streaming response:', JSON.stringify(result))\n return adapter.fromCapiResponse(result as Exclude<ChatCompletionsResult, AsyncIterable<SSEStreamChunk>>)\n },\n\n translateStreamChunk(chunk) {\n consola.debug('Streaming chunk:', JSON.stringify(chunk))\n if (chunk.data === '[DONE]') {\n return passthroughSSEChunk(chunk, chunk.data)\n }\n\n if (!chunk.data) {\n return null\n }\n\n const sanitizedChunk = adapter.serializeStreamChunk(\n JSON.parse(chunk.data) as CapiChatCompletionChunk,\n )\n return passthroughSSEChunk(chunk, JSON.stringify(sanitizedChunk))\n },\n }\n}\n","import type { ExecutionResult } from '~/lib/execution-strategy'\nimport type { ModelMappingInfo } from '~/lib/request-logger'\nimport consola from 'consola'\n\nimport { CopilotTransport, OpenAIChatAdapter } from '~/adapters'\nimport { readCapiRequestContext } from '~/core/capi'\nimport { runStrategy } from '~/lib/execution-strategy'\nimport { findModelById } from '~/lib/model-capabilities'\nimport { createCopilotClient } from '~/lib/state'\nimport { getTokenCount } from '~/lib/tokenizer'\nimport { createUpstreamSignalFromConfig } from '~/lib/upstream-signal'\nimport { parseOpenAIChatPayload } from '~/lib/validation'\n\nimport { createChatCompletionsStrategy } from './strategy'\n\nexport interface CompletionCoreParams {\n body: unknown\n signal: AbortSignal\n headers: Headers\n}\n\nexport interface CompletionCoreResult {\n result: ExecutionResult\n modelMapping?: ModelMappingInfo\n}\n\n/**\n * Core handler for chat completions.\n */\nexport async function handleCompletionCore(\n { body, signal, headers }: CompletionCoreParams,\n): Promise<CompletionCoreResult> {\n const adapter = new OpenAIChatAdapter()\n let payload = parseOpenAIChatPayload(body)\n consola.debug('Request payload:', JSON.stringify(payload).slice(-400))\n\n const originalModel = payload.model\n const selectedModel = findModelById(payload.model)\n\n try {\n if (selectedModel) {\n const tokenCount = await getTokenCount(payload, selectedModel)\n consola.info('Current token count:', tokenCount)\n }\n else {\n consola.warn('No model selected, skipping token count calculation')\n }\n }\n catch (error) {\n consola.warn('Failed to calculate token count:', error)\n }\n\n if (payload.max_tokens == null) {\n payload = {\n ...payload,\n max_tokens: selectedModel?.capabilities.limits.max_output_tokens,\n }\n consola.debug('Set max_tokens to:', JSON.stringify(payload.max_tokens))\n }\n\n const upstreamSignal = createUpstreamSignalFromConfig(signal)\n\n const plan = adapter.toCapiPlan(payload, {\n requestContext: readCapiRequestContext(headers),\n })\n\n const modelMapping: ModelMappingInfo = {\n originalModel,\n mappedModel: plan.resolvedModel,\n }\n\n const copilotClient = createCopilotClient()\n const transport = new CopilotTransport(copilotClient)\n\n consola.debug('Streaming response')\n const strategy = createChatCompletionsStrategy(transport, adapter, plan, upstreamSignal.signal)\n const result = await runStrategy(strategy, upstreamSignal)\n return { result, modelMapping }\n}\n","import { Elysia } from 'elysia'\n\nimport { sseAdapter } from '~/lib/sse-adapter'\nimport { requestGuardPlugin } from '~/routes/middleware/request-guard'\n\nimport { handleCompletionCore } from './handler'\n\nexport function createCompletionRoutes() {\n return new Elysia()\n .use(requestGuardPlugin)\n .post('/chat/completions', async function* (ctx) {\n const { body, request } = ctx\n const { result, modelMapping } = await handleCompletionCore({\n body,\n signal: request.signal,\n headers: request.headers,\n })\n if ('requestMeta' in ctx && ctx.requestMeta && typeof ctx.requestMeta === 'object') {\n (ctx.requestMeta as { modelMapping: unknown }).modelMapping = modelMapping\n }\n if (result.kind === 'json') {\n return result.data\n }\n yield* sseAdapter(result.generator)\n }, { guarded: true })\n}\n","import { createCopilotClient } from '~/lib/state'\nimport { parseEmbeddingRequest } from '~/lib/validation'\n\n/**\n * Core handler for creating embeddings.\n */\nexport async function handleEmbeddingsCore(body: unknown): Promise<object> {\n const payload = parseEmbeddingRequest(body)\n const copilotClient = createCopilotClient()\n return await copilotClient.createEmbeddings(payload)\n}\n","import { Elysia } from 'elysia'\n\nimport { handleEmbeddingsCore } from './handler'\n\nexport function createEmbeddingRoutes() {\n return new Elysia()\n .post('/embeddings', async ({ body }) => {\n return handleEmbeddingsCore(body)\n })\n}\n","import process from 'node:process'\n\nimport { getCachedConfig } from './config'\n\nexport interface ModelFallbackConfig {\n claudeOpus: string\n claudeSonnet: string\n claudeHaiku: string\n}\n\nexport const DEFAULT_FALLBACKS: ModelFallbackConfig = {\n claudeOpus: 'claude-opus-4.6',\n claudeSonnet: 'claude-sonnet-4.6',\n claudeHaiku: 'claude-haiku-4.5',\n}\n\nexport function getModelFallbackConfig(): ModelFallbackConfig {\n const cachedConfig = getCachedConfig()\n return {\n claudeOpus:\n process.env.MODEL_FALLBACK_CLAUDE_OPUS\n || cachedConfig.modelFallback?.claudeOpus\n || DEFAULT_FALLBACKS.claudeOpus,\n claudeSonnet:\n process.env.MODEL_FALLBACK_CLAUDE_SONNET\n || cachedConfig.modelFallback?.claudeSonnet\n || DEFAULT_FALLBACKS.claudeSonnet,\n claudeHaiku:\n process.env.MODEL_FALLBACK_CLAUDE_HAIKU\n || cachedConfig.modelFallback?.claudeHaiku\n || DEFAULT_FALLBACKS.claudeHaiku,\n }\n}\n\nexport function resolveModel(\n modelId: string,\n knownModelIds: Set<string> | undefined,\n config: ModelFallbackConfig,\n): string {\n if (knownModelIds?.has(modelId)) {\n return modelId\n }\n if (modelId.startsWith('claude-opus-'))\n return config.claudeOpus\n if (modelId.startsWith('claude-sonnet-'))\n return config.claudeSonnet\n if (modelId.startsWith('claude-haiku-'))\n return config.claudeHaiku\n return modelId\n}\n","import { AnthropicMessagesAdapter } from '~/adapters'\nimport { getModelFallbackConfig, resolveModel } from '~/lib/model-resolver'\nimport { state } from '~/lib/state'\n\n/**\n * Creates a shared AnthropicMessagesAdapter with standard model resolution\n * and capability detection. Used by both messages handler and count-tokens handler.\n */\nexport function createAnthropicAdapter(): AnthropicMessagesAdapter {\n const knownModelIds = state.cache.models\n ? new Set(state.cache.models.data.map(model => model.id))\n : undefined\n const fallbackConfig = getModelFallbackConfig()\n\n return new AnthropicMessagesAdapter({\n modelResolver: (model: string) => resolveModel(model, knownModelIds, fallbackConfig),\n getModelCapabilities: model => ({\n supportsThinkingBudget: model.startsWith('claude'),\n }),\n })\n}\n","import consola from 'consola'\n\nimport { fromTranslationFailure, HTTPError } from '~/lib/error'\nimport { state } from '~/lib/state'\nimport { getTokenCount } from '~/lib/tokenizer'\nimport { parseAnthropicCountTokensPayload } from '~/lib/validation'\nimport { TranslationFailure } from '~/translator/anthropic/translation-issue'\n\nimport { createAnthropicAdapter } from './shared'\n\n// Token estimation constants\nconst CLAUDE_TOOL_OVERHEAD_TOKENS = 346\nconst GROK_TOOL_OVERHEAD_TOKENS = 480\nconst CLAUDE_ESTIMATION_FACTOR = 1.15\nconst GROK_ESTIMATION_FACTOR = 1.03\n\nexport interface CountTokensCoreParams {\n body: unknown\n headers: Headers\n}\n\n/**\n * Core handler for counting tokens.\n */\nexport async function handleCountTokensCore(\n { body, headers }: CountTokensCoreParams,\n): Promise<{ input_tokens: number }> {\n const anthropicBeta = headers.get('anthropic-beta') ?? undefined\n const anthropicPayload = parseAnthropicCountTokensPayload(body)\n\n const adapter = createAnthropicAdapter()\n\n let openAIPayload\n try {\n openAIPayload = adapter.toTokenCountPayload(anthropicPayload)\n }\n catch (error) {\n if (error instanceof TranslationFailure) {\n throw fromTranslationFailure(error)\n }\n throw error\n }\n\n const selectedModel = state.cache.models?.data.find(\n model => model.id === openAIPayload.model,\n )\n\n if (!selectedModel) {\n throw new HTTPError(400, {\n error: {\n message: `Model not found for token counting: \"${openAIPayload.model}\"`,\n type: 'invalid_request_error',\n },\n })\n }\n\n const tokenCount = await getTokenCount(openAIPayload, selectedModel)\n\n if (anthropicPayload.tools && anthropicPayload.tools.length > 0) {\n let mcpToolExist = false\n if (anthropicBeta?.startsWith('claude-code')) {\n mcpToolExist = anthropicPayload.tools.some(tool =>\n tool.name.startsWith('mcp__'),\n )\n }\n if (!mcpToolExist) {\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 + CLAUDE_TOOL_OVERHEAD_TOKENS\n }\n else if (anthropicPayload.model.startsWith('grok')) {\n tokenCount.input = tokenCount.input + GROK_TOOL_OVERHEAD_TOKENS\n }\n }\n }\n\n let finalTokenCount = tokenCount.input + tokenCount.output\n if (anthropicPayload.model.startsWith('claude')) {\n finalTokenCount = Math.round(finalTokenCount * CLAUDE_ESTIMATION_FACTOR)\n }\n else if (anthropicPayload.model.startsWith('grok')) {\n finalTokenCount = Math.round(finalTokenCount * GROK_ESTIMATION_FACTOR)\n }\n\n consola.info('Token count:', finalTokenCount)\n\n return {\n input_tokens: finalTokenCount,\n }\n}\n","import type { AnthropicMessagesPayload } from '~/translator'\nimport type { Model } from '~/types'\n\nimport { getSmallModel, shouldCompactUseSmallModel, shouldWarmupUseSmallModel } from './config'\nimport {\n findModelById,\n modelSupportsAdaptiveThinking,\n modelSupportsToolCalls,\n modelSupportsVision,\n} from './model-capabilities'\n\nconst COMPACT_SYSTEM_PROMPT_START\n = 'You are a helpful AI assistant tasked with summarizing conversations'\nconst WARMUP_BETA_MARKERS = ['warmup', 'probe', 'preflight']\n\nexport interface ModelRoutingResult {\n originalModel: string\n routedModel: string\n reason?: 'compact' | 'warmup'\n}\n\nexport function applyMessagesModelPolicy(\n payload: AnthropicMessagesPayload,\n anthropicBetaHeader: string | undefined,\n): ModelRoutingResult {\n const originalModel = payload.model\n const smallModel = getSmallModel()\n if (!smallModel) {\n return { originalModel, routedModel: originalModel }\n }\n\n const originalSelection = findModelById(originalModel)\n const smallSelection = findModelById(smallModel)\n\n if (\n shouldCompactUseSmallModel()\n && isCompactRequest(payload)\n && canRouteToSmallModel(payload, originalSelection, smallSelection)\n ) {\n payload.model = smallModel\n return {\n originalModel,\n routedModel: smallModel,\n reason: 'compact',\n }\n }\n\n if (\n shouldWarmupUseSmallModel()\n && isWarmupRequest(payload, anthropicBetaHeader)\n && canRouteToSmallModel(payload, originalSelection, smallSelection)\n ) {\n payload.model = smallModel\n return {\n originalModel,\n routedModel: smallModel,\n reason: 'warmup',\n }\n }\n\n return { originalModel, routedModel: originalModel }\n}\n\nexport function isCompactRequest(payload: AnthropicMessagesPayload): boolean {\n if (typeof payload.system === 'string') {\n return payload.system.startsWith(COMPACT_SYSTEM_PROMPT_START)\n }\n if (!Array.isArray(payload.system)) {\n return false\n }\n return payload.system.some(\n block => typeof block.text === 'string'\n && block.text.startsWith(COMPACT_SYSTEM_PROMPT_START),\n )\n}\n\nexport function isWarmupRequest(\n payload: AnthropicMessagesPayload,\n anthropicBetaHeader: string | undefined,\n): boolean {\n if (!anthropicBetaHeader || isCompactRequest(payload)) {\n return false\n }\n\n const normalizedBeta = anthropicBetaHeader.toLowerCase()\n if (!WARMUP_BETA_MARKERS.some(marker => normalizedBeta.includes(marker))) {\n return false\n }\n\n if (payload.system !== undefined || payload.thinking !== undefined) {\n return false\n }\n\n if (payload.tools && payload.tools.length > 0) {\n return false\n }\n\n if (payload.max_tokens > 64) {\n return false\n }\n\n return hasSingleShortUserTextMessage(payload)\n}\n\nfunction canRouteToSmallModel(\n payload: AnthropicMessagesPayload,\n originalModel: Model | undefined,\n smallModel: Model | undefined,\n): boolean {\n if (!originalModel || !smallModel) {\n return false\n }\n\n const originalEndpoints = new Set(originalModel.supported_endpoints ?? [])\n const smallEndpoints = new Set(smallModel.supported_endpoints ?? [])\n for (const endpoint of originalEndpoints) {\n if (!smallEndpoints.has(endpoint)) {\n return false\n }\n }\n\n if (payload.tools?.length && !modelSupportsToolCalls(smallModel)) {\n return false\n }\n\n if (payload.thinking && !modelSupportsAdaptiveThinking(smallModel)) {\n return false\n }\n\n if (hasVisionInput(payload) && !modelSupportsVision(smallModel)) {\n return false\n }\n\n return true\n}\n\nfunction hasSingleShortUserTextMessage(payload: AnthropicMessagesPayload): boolean {\n if (payload.messages.length !== 1) {\n return false\n }\n\n const [message] = payload.messages\n if (message.role !== 'user') {\n return false\n }\n\n if (typeof message.content === 'string') {\n return message.content.trim().length > 0 && message.content.length <= 64\n }\n\n if (message.content.length !== 1 || message.content[0]?.type !== 'text') {\n return false\n }\n\n const text = message.content[0].text.trim()\n return text.length > 0 && text.length <= 64\n}\n\nfunction hasVisionInput(payload: AnthropicMessagesPayload): boolean {\n return payload.messages.some(message => containsVisionContent(message.content))\n}\n\nfunction containsVisionContent(content: AnthropicMessagesPayload['messages'][number]['content']): boolean {\n if (!Array.isArray(content)) {\n return false\n }\n\n return content.some(block => block.type === 'image')\n}\n","const COMPACTION_PREFIX = 'cm1#'\nconst SEPARATOR = '@'\n\ninterface CompactionCarrier {\n id: string\n encrypted_content: string\n}\n\nfunction encodeCompaction(carrier: CompactionCarrier): string {\n return `${COMPACTION_PREFIX}${carrier.encrypted_content}${SEPARATOR}${carrier.id}`\n}\n\nfunction decodeCompaction(signature: string): CompactionCarrier | undefined {\n if (!signature.startsWith(COMPACTION_PREFIX)) {\n return undefined\n }\n\n const raw = signature.slice(COMPACTION_PREFIX.length)\n const separatorIndex = raw.indexOf(SEPARATOR)\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 if (!encrypted_content) {\n return undefined\n }\n\n return { id, encrypted_content }\n}\n\nfunction encodeReasoning(item: { id: string, encrypted_content?: string | null }): string {\n return `${item.encrypted_content ?? ''}${SEPARATOR}${item.id}`\n}\n\nfunction decodeReasoning(signature: string): { encryptedContent: string, id: string } {\n const splitIndex = signature.lastIndexOf(SEPARATOR)\n if (splitIndex <= 0 || splitIndex === signature.length - 1) {\n return { encryptedContent: signature, id: '' }\n }\n return {\n encryptedContent: signature.slice(0, splitIndex),\n id: signature.slice(splitIndex + 1),\n }\n}\n\nfunction isCompactionSignature(signature: string): boolean {\n return signature.startsWith(COMPACTION_PREFIX)\n}\n\nfunction isReasoningSignature(signature: string): boolean {\n return !isCompactionSignature(signature) && signature.includes(SEPARATOR)\n}\n\nexport const SignatureCodec = {\n encodeCompaction,\n decodeCompaction,\n encodeReasoning,\n decodeReasoning,\n isCompactionSignature,\n isReasoningSignature,\n} as const\n\nexport type { CompactionCarrier }\n","import type {\n AnthropicAssistantContentBlock,\n AnthropicAssistantMessage,\n AnthropicImageBlock,\n AnthropicMessage,\n AnthropicMessagesPayload,\n AnthropicTextBlock,\n AnthropicThinkingBlock,\n AnthropicTool,\n AnthropicToolResultBlock,\n AnthropicToolUseBlock,\n AnthropicUserContentBlock,\n AnthropicUserMessage,\n} from '~/translator'\nimport type {\n ResponseFunctionCallOutputItem,\n ResponseFunctionToolCallItem,\n ResponseInputCompaction,\n ResponseInputContent,\n ResponseInputImage,\n ResponseInputItem,\n ResponseInputMessage,\n ResponseInputReasoning,\n ResponseInputText,\n ResponsesPayload,\n ResponseTool,\n ToolChoiceFunction,\n ToolChoiceOptions,\n} from '~/types'\nimport { TranslationFailure } from '~/translator/anthropic/translation-issue'\n\nimport { SignatureCodec } from './signature-codec'\n\nconst MESSAGE_TYPE = 'message'\n\nconst USER_ID_ACCOUNT_RE = /user_([^_]+)_account/\nconst USER_ID_SESSION_RE = /_session_(.+)$/\n\nexport const THINKING_TEXT = 'Thinking...'\n\nexport interface AnthropicToResponsesOptions {\n reasoningEffortResolver?: (model: string) => string\n}\n\nexport function translateAnthropicToResponsesPayload(\n payload: AnthropicMessagesPayload,\n options?: AnthropicToResponsesOptions,\n): ResponsesPayload {\n assertResponsesCompatibleRequest(payload)\n\n const input: Array<ResponseInputItem> = []\n\n for (const message of payload.messages) {\n input.push(...translateMessage(message))\n }\n\n const { safetyIdentifier, promptCacheKey } = parseUserId(payload.metadata?.user_id)\n const reasoning = resolveResponsesReasoningConfig(payload, options)\n\n return {\n model: payload.model,\n input,\n instructions: translateSystemPrompt(payload.system),\n temperature: payload.temperature ?? null,\n top_p: payload.top_p ?? null,\n max_output_tokens: payload.max_tokens,\n tools: convertAnthropicTools(payload.tools),\n tool_choice: convertAnthropicToolChoice(payload.tool_choice),\n metadata: payload.metadata ? { ...payload.metadata } : null,\n safety_identifier: safetyIdentifier,\n prompt_cache_key: promptCacheKey,\n stream: payload.stream ?? null,\n store: false,\n parallel_tool_calls: true,\n ...(reasoning\n ? {\n reasoning,\n include: ['reasoning.encrypted_content'],\n }\n : {}),\n }\n}\n\nexport function encodeCompactionCarrierSignature(compaction: { id: string, encrypted_content: string }): string {\n return SignatureCodec.encodeCompaction(compaction)\n}\n\nexport function decodeCompactionCarrierSignature(\n signature: string,\n): { id: string, encrypted_content: string } | undefined {\n return SignatureCodec.decodeCompaction(signature)\n}\n\nfunction translateMessage(message: AnthropicMessage): Array<ResponseInputItem> {\n if (message.role === 'user') {\n return translateUserMessage(message)\n }\n return translateAssistantMessage(message)\n}\n\nfunction translateUserMessage(\n message: AnthropicUserMessage,\n): Array<ResponseInputItem> {\n if (typeof message.content === 'string') {\n return [createMessage('user', message.content)]\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(createFunctionCallOutput(block))\n continue\n }\n\n const converted = translateUserContentBlock(block)\n if (converted) {\n pendingContent.push(converted)\n }\n }\n\n flushPendingContent(pendingContent, items, { role: 'user' })\n return items\n}\n\nfunction translateAssistantMessage(\n message: AnthropicAssistantMessage,\n): Array<ResponseInputItem> {\n const assistantPhase = resolveAssistantPhase(message.content)\n if (typeof message.content === 'string') {\n return [createMessage('assistant', message.content, assistantPhase)]\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 flushPendingContent(pendingContent, items, { role: 'assistant', phase: assistantPhase })\n items.push(createFunctionToolCall(block))\n continue\n }\n\n if (block.type === 'thinking' && block.signature) {\n const compaction = createCompactionContent(block)\n if (compaction) {\n flushPendingContent(pendingContent, items, { role: 'assistant', phase: assistantPhase })\n items.push(compaction)\n continue\n }\n\n if (SignatureCodec.isReasoningSignature(block.signature)) {\n flushPendingContent(pendingContent, items, { role: 'assistant', phase: assistantPhase })\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, { role: 'assistant', phase: assistantPhase })\n return items\n}\n\nfunction translateUserContentBlock(\n block: AnthropicUserContentBlock,\n): ResponseInputContent | undefined {\n switch (block.type) {\n case 'text':\n return createTextContent(block.text)\n case 'image':\n return createImageContent(block)\n default:\n return undefined\n }\n}\n\nfunction translateAssistantContentBlock(\n block: AnthropicAssistantContentBlock,\n): ResponseInputContent | undefined {\n switch (block.type) {\n case 'text':\n return createOutputTextContent(block.text)\n default:\n return undefined\n }\n}\n\nfunction 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 target.push(createMessage(message.role, [...pendingContent], message.phase))\n pendingContent.length = 0\n}\n\nfunction createMessage(\n role: ResponseInputMessage['role'],\n content: string | Array<ResponseInputContent>,\n phase?: ResponseInputMessage['phase'],\n): ResponseInputMessage {\n return {\n type: MESSAGE_TYPE,\n role,\n content,\n ...(role === 'assistant' && phase ? { phase } : {}),\n }\n}\n\nfunction resolveAssistantPhase(\n content: AnthropicAssistantMessage['content'],\n): ResponseInputMessage['phase'] | undefined {\n if (typeof content === 'string') {\n return 'final_answer'\n }\n if (!Array.isArray(content)) {\n return undefined\n }\n\n let hasText = false\n let hasToolUse = false\n for (const block of content) {\n if (block.type === 'text')\n hasText = true\n else if (block.type === 'tool_use')\n hasToolUse = true\n if (hasText && hasToolUse)\n break\n }\n\n if (!hasText) {\n return undefined\n }\n return hasToolUse ? 'commentary' : 'final_answer'\n}\n\nfunction createTextContent(text: string): ResponseInputText {\n return { type: 'input_text', text }\n}\n\nfunction createOutputTextContent(text: string): ResponseInputText {\n return { type: 'output_text', text }\n}\n\nfunction createImageContent(block: AnthropicImageBlock): ResponseInputImage {\n return {\n type: 'input_image',\n image_url: `data:${block.source.media_type};base64,${block.source.data}`,\n detail: 'auto',\n }\n}\n\nfunction createReasoningContent(\n block: AnthropicThinkingBlock,\n): ResponseInputReasoning {\n const { encryptedContent, id } = SignatureCodec.decodeReasoning(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\nfunction createCompactionContent(\n block: AnthropicThinkingBlock,\n): ResponseInputCompaction | undefined {\n const compaction = decodeCompactionCarrierSignature(block.signature ?? '')\n if (!compaction) {\n return undefined\n }\n return {\n id: compaction.id,\n type: 'compaction',\n encrypted_content: compaction.encrypted_content,\n }\n}\n\nfunction createFunctionToolCall(\n block: AnthropicToolUseBlock,\n): ResponseFunctionToolCallItem {\n return {\n type: 'function_call',\n call_id: block.id,\n name: block.name,\n arguments: JSON.stringify(block.input),\n status: 'completed',\n }\n}\n\nfunction createFunctionCallOutput(\n block: AnthropicToolResultBlock,\n): ResponseFunctionCallOutputItem {\n return {\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}\n\nfunction translateSystemPrompt(\n system: string | Array<AnthropicTextBlock> | undefined,\n): string | null {\n if (!system) {\n return null\n }\n if (typeof system === 'string') {\n return system\n }\n const text = system.map(block => block.text).join(' ')\n return text.length > 0 ? text : null\n}\n\nfunction convertAnthropicTools(\n tools: Array<AnthropicTool> | undefined,\n): Array<ResponseTool> | null {\n if (!tools || tools.length === 0) {\n return null\n }\n return tools.map(tool => ({\n type: 'function',\n name: tool.name,\n parameters: tool.input_schema,\n strict: false,\n ...(tool.description ? { description: tool.description } : {}),\n }))\n}\n\nfunction convertAnthropicToolChoice(\n choice: AnthropicMessagesPayload['tool_choice'],\n): ToolChoiceOptions | ToolChoiceFunction {\n if (!choice) {\n return 'auto'\n }\n switch (choice.type) {\n case 'auto':\n return 'auto'\n case 'any':\n return 'required'\n case 'tool':\n return choice.name ? { type: 'function', name: choice.name } : 'auto'\n case 'none':\n return 'none'\n }\n}\n\nfunction resolveResponsesReasoningConfig(\n payload: AnthropicMessagesPayload,\n options?: AnthropicToResponsesOptions,\n): ResponsesPayload['reasoning'] | undefined {\n const effort = resolveResponsesReasoningEffort(payload, options)\n if (!effort) {\n return undefined\n }\n\n return {\n effort,\n summary: effort === 'none' ? null : 'detailed',\n }\n}\n\nfunction resolveResponsesReasoningEffort(\n payload: AnthropicMessagesPayload,\n options?: AnthropicToResponsesOptions,\n): NonNullable<ResponsesPayload['reasoning']>['effort'] | undefined {\n if (payload.thinking?.type === 'disabled') {\n return 'none'\n }\n\n if (payload.output_config?.effort) {\n return mapAnthropicEffortToResponses(payload.output_config.effort)\n }\n\n if (payload.thinking?.type === 'adaptive') {\n return 'medium'\n }\n\n if (payload.thinking?.type === 'enabled') {\n return (options?.reasoningEffortResolver?.(payload.model) ?? 'medium') as NonNullable<ResponsesPayload['reasoning']>['effort']\n }\n\n return undefined\n}\n\nfunction mapAnthropicEffortToResponses(\n effort: NonNullable<AnthropicMessagesPayload['output_config']>['effort'],\n): NonNullable<ResponsesPayload['reasoning']>['effort'] {\n if (effort === 'max') {\n return 'xhigh'\n }\n return effort\n}\n\nfunction assertResponsesCompatibleRequest(\n payload: AnthropicMessagesPayload,\n) {\n if (payload.stop_sequences?.length) {\n throw new TranslationFailure(\n 'Anthropic stop_sequences cannot be forwarded through the Responses execution path.',\n {\n status: 400,\n kind: 'unsupported_stop_sequences',\n },\n )\n }\n\n if (payload.top_k !== undefined) {\n throw new TranslationFailure(\n 'Anthropic top_k is not supported on the Responses execution path.',\n {\n status: 400,\n kind: 'unsupported_top_k',\n },\n )\n }\n\n if (payload.service_tier !== undefined) {\n throw new TranslationFailure(\n 'Anthropic service_tier is not supported on the Responses execution path.',\n {\n status: 400,\n kind: 'unsupported_service_tier',\n },\n )\n }\n}\n\nfunction parseUserId(\n userId: string | undefined,\n): { safetyIdentifier: string | null, promptCacheKey: string | null } {\n if (!userId) {\n return { safetyIdentifier: null, promptCacheKey: null }\n }\n\n const userMatch = userId.match(USER_ID_ACCOUNT_RE)\n const sessionMatch = userId.match(USER_ID_SESSION_RE)\n\n return {\n safetyIdentifier: userMatch ? userMatch[1] : null,\n promptCacheKey: sessionMatch ? sessionMatch[1] : null,\n }\n}\n\nfunction convertToolResultContent(\n content: string | Array<AnthropicTextBlock | AnthropicImageBlock>,\n): string | Array<ResponseInputContent> {\n if (typeof content === 'string') {\n return content\n }\n\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 case 'image':\n result.push(createImageContent(block))\n break\n default:\n break\n }\n }\n\n return result\n}\n","import type {\n ResponseContextManagementCompactionItem,\n ResponseInputItem,\n ResponsesPayload,\n} from '~/types'\n\nimport { isResponsesApiContextManagementModel } from '~/lib/config'\n\n/** Default token threshold when model limits are unknown. */\nconst DEFAULT_COMPACT_THRESHOLD = 50_000\n/** Fraction of max prompt tokens to use as compact threshold. */\nconst COMPACT_THRESHOLD_RATIO = 0.9\n\nexport function getResponsesRequestOptions(\n payload: ResponsesPayload,\n): { vision: boolean, initiator: 'user' | 'agent' } {\n return {\n vision: hasVisionInput(payload),\n initiator: hasAgentInitiator(payload) ? 'agent' : 'user',\n }\n}\n\nexport function hasAgentInitiator(payload: ResponsesPayload): boolean {\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 return String(lastItem.role).toLowerCase() === 'assistant'\n}\n\nexport function hasVisionInput(payload: ResponsesPayload): boolean {\n return getPayloadItems(payload).some(item => containsVisionContent(item))\n}\n\nexport function resolveResponsesCompactThreshold(\n maxPromptTokens?: number,\n): number {\n if (typeof maxPromptTokens === 'number' && maxPromptTokens > 0) {\n return Math.floor(maxPromptTokens * COMPACT_THRESHOLD_RATIO)\n }\n return DEFAULT_COMPACT_THRESHOLD\n}\n\nfunction createCompactionContextManagement(\n compactThreshold: number,\n): Array<ResponseContextManagementCompactionItem> {\n return [{\n type: 'compaction',\n compact_threshold: compactThreshold,\n }]\n}\n\nexport function applyContextManagement(\n payload: ResponsesPayload,\n maxPromptTokens?: number,\n): void {\n if (payload.context_management !== undefined) {\n return\n }\n if (!isResponsesApiContextManagementModel(payload.model)) {\n return\n }\n\n payload.context_management = createCompactionContextManagement(\n resolveResponsesCompactThreshold(maxPromptTokens),\n )\n}\n\nexport function compactInputByLatestCompaction(\n payload: ResponsesPayload,\n): void {\n if (!Array.isArray(payload.input) || payload.input.length === 0) {\n return\n }\n\n const latestCompactionMessageIndex = getLatestCompactionMessageIndex(payload.input)\n if (latestCompactionMessageIndex === undefined) {\n return\n }\n\n payload.input = payload.input.slice(latestCompactionMessageIndex)\n}\n\nfunction getLatestCompactionMessageIndex(\n input: Array<ResponseInputItem>,\n): number | undefined {\n for (let index = input.length - 1; index >= 0; index--) {\n if (isCompactionInputItem(input[index])) {\n return index\n }\n }\n}\n\nfunction isCompactionInputItem(value: ResponseInputItem): boolean {\n return 'type' in value && value.type === 'compaction'\n}\n\nfunction getPayloadItems(payload: ResponsesPayload): Array<ResponseInputItem> {\n return Array.isArray(payload.input) ? payload.input : []\n}\n\nfunction containsVisionContent(value: unknown): boolean {\n if (!value) {\n return false\n }\n if (Array.isArray(value)) {\n return value.some(entry => containsVisionContent(entry))\n }\n if (typeof value !== 'object') {\n return false\n }\n\n const record = value as Record<string, unknown>\n if (record.type === 'input_image') {\n return true\n }\n if (Array.isArray(record.content)) {\n return record.content.some(entry => containsVisionContent(entry))\n }\n return false\n}\n","import type { AnthropicMessagesAdapter, CopilotTransport } from '~/adapters'\nimport type { CapiChatCompletionChunk, CapiExecutionPlan } from '~/core/capi'\nimport type { ExecutionStrategy, SSEOutput, SSEStreamChunk } from '~/lib/execution-strategy'\n\nimport consola from 'consola'\nimport { isNonStreamingResponse } from '~/clients'\n\ntype ChatCompletionsResult = Awaited<ReturnType<CopilotTransport['execute']>>\n\nexport function createMessagesViaChatCompletionsStrategy(\n transport: CopilotTransport,\n adapter: AnthropicMessagesAdapter,\n plan: CapiExecutionPlan,\n signal: AbortSignal,\n): ExecutionStrategy<ChatCompletionsResult, SSEStreamChunk> {\n let streamTranslator: ReturnType<AnthropicMessagesAdapter['createStreamSerializer']>\n let done = false\n\n return {\n execute() {\n return transport.execute(plan, { signal })\n },\n\n isStream(result): result is ChatCompletionsResult & AsyncIterable<SSEStreamChunk> {\n return !isNonStreamingResponse(result)\n },\n\n translateResult(result) {\n consola.debug(\n 'Non-streaming response from Copilot (full):',\n JSON.stringify(result, null, 2),\n )\n const anthropicResponse = adapter.fromCapiResponse(\n result as Exclude<ChatCompletionsResult, AsyncIterable<SSEStreamChunk>>,\n )\n consola.debug(\n 'Translated Anthropic response:',\n JSON.stringify(anthropicResponse),\n )\n return anthropicResponse\n },\n\n translateStreamChunk(chunk): SSEOutput | SSEOutput[] | null {\n if (!streamTranslator) {\n streamTranslator = adapter.createStreamSerializer()\n }\n\n consola.debug('Copilot raw stream event:', JSON.stringify(chunk))\n\n if (chunk.data === '[DONE]') {\n const finalEvents = streamTranslator.onDone()\n done = true\n return finalEvents.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n }\n\n if (!chunk.data) {\n return null\n }\n\n const parsed = JSON.parse(chunk.data) as CapiChatCompletionChunk\n const events = streamTranslator.onChunk(parsed)\n\n return events.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n },\n\n shouldBreakStream() {\n return done\n },\n\n onStreamError(error) {\n consola.error('Error streaming Anthropic response:', error)\n if (!streamTranslator) {\n streamTranslator = adapter.createStreamSerializer()\n }\n const errorEvents = streamTranslator.onError(error)\n return errorEvents.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n },\n }\n}\n","export function isAsyncIterable<T>(value: unknown): value is AsyncIterable<T> {\n return Boolean(value)\n && typeof (value as AsyncIterable<T>)[Symbol.asyncIterator] === 'function'\n}\n","import type { CopilotClient } from '~/clients'\nimport type { CapiRequestContext } from '~/core/capi'\nimport type { ExecutionStrategy } from '~/lib/execution-strategy'\nimport type { AnthropicMessagesPayload } from '~/translator'\n\nimport { isAsyncIterable } from '~/lib/async-iterable'\n\ninterface MessagesStreamChunk {\n event?: string\n data?: string\n}\n\ntype NativeMessagesResult = Awaited<ReturnType<CopilotClient['createMessages']>>\n\nexport function createNativeMessagesStrategy(\n copilotClient: CopilotClient,\n payload: AnthropicMessagesPayload,\n anthropicBetaHeader: string | undefined,\n options: {\n signal: AbortSignal\n requestContext: Partial<CapiRequestContext>\n },\n): ExecutionStrategy<NativeMessagesResult, MessagesStreamChunk> {\n return {\n execute() {\n return copilotClient.createMessages(payload, anthropicBetaHeader, options)\n },\n\n isStream(result): result is NativeMessagesResult & AsyncIterable<MessagesStreamChunk> {\n return isAsyncIterable(result)\n },\n\n translateResult(result) {\n return result\n },\n\n translateStreamChunk(chunk) {\n return {\n ...(chunk.event ? { event: chunk.event } : {}),\n data: chunk.data ?? '',\n }\n },\n }\n}\n","import type {\n AnthropicAssistantContentBlock,\n AnthropicResponse,\n AnthropicToolUseBlock,\n} from '~/translator'\nimport type {\n ResponseOutputContentBlock,\n ResponseOutputFunctionCall,\n ResponseOutputReasoning,\n ResponseOutputRefusal,\n ResponseOutputText,\n ResponseReasoningBlock,\n ResponsesResult,\n} from '~/types'\n\nimport consola from 'consola'\n\nimport { THINKING_TEXT } from './anthropic-to-responses'\nimport { SignatureCodec } from './signature-codec'\n\nexport function translateResponsesToAnthropic(\n response: ResponsesResult,\n): AnthropicResponse {\n const contentBlocks = mapOutputToAnthropicContent(response.output)\n return {\n id: response.id,\n type: 'message',\n role: 'assistant',\n content: contentBlocks.length > 0 ? contentBlocks : fallbackContentBlocks(response.output_text),\n model: response.model,\n stop_reason: mapResponsesStopReason(response),\n stop_sequence: null,\n usage: mapResponsesUsage(response),\n }\n}\n\nfunction mapOutputToAnthropicContent(\n output: ResponsesResult['output'],\n): Array<AnthropicAssistantContentBlock> {\n const blocks: Array<AnthropicAssistantContentBlock> = []\n\n for (const item of output) {\n switch (item.type) {\n case 'reasoning': {\n const thinking = extractReasoningText(item)\n if (thinking) {\n blocks.push({\n type: 'thinking',\n thinking,\n signature: SignatureCodec.encodeReasoning(item),\n })\n }\n break\n }\n case 'function_call': {\n const toolUseBlock = createToolUseContentBlock(item)\n if (toolUseBlock) {\n blocks.push(toolUseBlock)\n }\n break\n }\n case 'message': {\n const text = combineMessageTextContent(item.content)\n if (text) {\n blocks.push({ type: 'text', text })\n }\n break\n }\n case 'compaction': {\n if (item.id && item.encrypted_content) {\n blocks.push({\n type: 'thinking',\n thinking: THINKING_TEXT,\n signature: SignatureCodec.encodeCompaction({\n id: item.id,\n encrypted_content: item.encrypted_content,\n }),\n })\n }\n break\n }\n }\n }\n\n return blocks\n}\n\nfunction combineMessageTextContent(\n content: Array<ResponseOutputContentBlock> | undefined,\n): string {\n if (!Array.isArray(content)) {\n return ''\n }\n\n let aggregated = ''\n for (const block of content) {\n if (isResponseOutputText(block)) {\n aggregated += block.text\n continue\n }\n if (isResponseOutputRefusal(block)) {\n aggregated += block.refusal\n continue\n }\n if (typeof (block as { text?: unknown }).text === 'string') {\n aggregated += (block as { text: string }).text\n }\n }\n return aggregated\n}\n\nfunction extractReasoningText(item: ResponseOutputReasoning): string {\n if (!item.summary || item.summary.length === 0) {\n return THINKING_TEXT\n }\n\n const segments: Array<string> = []\n collectReasoningSegments(item.summary, segments)\n return segments.join('').trim()\n}\n\nfunction collectReasoningSegments(\n blocks: Array<ResponseReasoningBlock>,\n segments: Array<string>,\n) {\n for (const block of blocks) {\n if (typeof block.text === 'string') {\n segments.push(block.text)\n }\n }\n}\n\nfunction createToolUseContentBlock(\n call: ResponseOutputFunctionCall,\n): AnthropicToolUseBlock | null {\n if (!call.name || !call.call_id) {\n return null\n }\n\n return {\n type: 'tool_use',\n id: call.call_id,\n name: call.name,\n input: parseFunctionCallArguments(call.arguments),\n }\n}\n\nfunction parseFunctionCallArguments(\n rawArguments: string,\n): Record<string, unknown> {\n if (!rawArguments.trim()) {\n return {}\n }\n\n try {\n const parsed = JSON.parse(rawArguments) as unknown\n if (Array.isArray(parsed)) {\n return { arguments: parsed }\n }\n if (parsed && typeof parsed === 'object') {\n return parsed as Record<string, unknown>\n }\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\nfunction fallbackContentBlocks(\n outputText: string,\n): Array<AnthropicAssistantContentBlock> {\n if (!outputText) {\n return []\n }\n return [{\n type: 'text',\n text: outputText,\n }]\n}\n\nfunction mapResponsesStopReason(\n response: ResponsesResult,\n): AnthropicResponse['stop_reason'] {\n if (response.status === 'completed') {\n return response.output.some(item => item.type === 'function_call')\n ? 'tool_use'\n : 'end_turn'\n }\n\n if (response.status === 'incomplete') {\n if (response.incomplete_details?.reason === 'max_output_tokens') {\n return 'max_tokens'\n }\n if (response.incomplete_details?.reason === 'content_filter') {\n return 'end_turn'\n }\n }\n\n return null\n}\n\nfunction 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 cachedTokens = response.usage?.input_tokens_details?.cached_tokens\n\n return {\n input_tokens: inputTokens - (cachedTokens ?? 0),\n output_tokens: outputTokens,\n ...(cachedTokens !== undefined ? { cache_read_input_tokens: cachedTokens } : {}),\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isResponseOutputText(\n block: ResponseOutputContentBlock,\n): block is ResponseOutputText {\n return isRecord(block) && block.type === 'output_text'\n}\n\nfunction isResponseOutputRefusal(\n block: ResponseOutputContentBlock,\n): block is ResponseOutputRefusal {\n return isRecord(block) && block.type === 'refusal'\n}\n","import type { FunctionCallStreamState, ResponsesStreamState } from './types'\nimport type { AnthropicStreamEventData } from '~/translator'\nimport type {\n ResponseCompletedEvent,\n ResponseCreatedEvent,\n ResponseErrorEvent,\n ResponseFailedEvent,\n ResponseFunctionCallArgumentsDeltaEvent,\n ResponseFunctionCallArgumentsDoneEvent,\n ResponseIncompleteEvent,\n ResponseOutputItemAddedEvent,\n ResponseOutputItemDoneEvent,\n ResponseReasoningSummaryTextDeltaEvent,\n ResponseReasoningSummaryTextDoneEvent,\n ResponseStreamEvent,\n ResponseTextDeltaEvent,\n ResponseTextDoneEvent,\n} from '~/types'\nimport { THINKING_TEXT } from './anthropic-to-responses'\nimport { translateResponsesToAnthropic } from './responses-to-anthropic'\nimport { SignatureCodec } from './signature-codec'\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\nfunction updateWhitespaceRunState(\n previousCount: number,\n chunk: string,\n): { nextCount: number, exceeded: boolean } {\n let count = previousCount\n\n for (const char of chunk) {\n if (char === ' ' || 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 count = 0\n }\n\n return { nextCount: count, exceeded: false }\n}\n\nexport class ResponsesStreamTranslator {\n private readonly state: ResponsesStreamState = {\n messageStartSent: false,\n messageCompleted: false,\n nextContentBlockIndex: 0,\n activeScalarBlockKey: null,\n activeScalarBlockIndex: null,\n blockHasDelta: new Set(),\n functionCallStateByOutputIndex: new Map(),\n }\n\n get isCompleted(): boolean {\n return this.state.messageCompleted\n }\n\n onEvent(rawEvent: ResponseStreamEvent): Array<AnthropicStreamEventData> {\n switch (rawEvent.type) {\n case 'response.created':\n return this.handleResponseCreated(rawEvent)\n case 'response.output_item.added':\n return this.handleOutputItemAdded(rawEvent)\n case 'response.output_item.done':\n return this.handleOutputItemDone(rawEvent)\n case 'response.output_text.delta':\n return this.handleOutputTextDelta(rawEvent)\n case 'response.output_text.done':\n return this.handleOutputTextDone(rawEvent)\n case 'response.reasoning_summary_text.delta':\n return this.handleReasoningSummaryTextDelta(rawEvent)\n case 'response.reasoning_summary_text.done':\n return this.handleReasoningSummaryTextDone(rawEvent)\n case 'response.function_call_arguments.delta':\n return this.handleFunctionCallArgumentsDelta(rawEvent)\n case 'response.function_call_arguments.done':\n return this.handleFunctionCallArgumentsDone(rawEvent)\n case 'response.completed':\n case 'response.incomplete':\n return this.handleResponseCompleted(rawEvent)\n case 'response.failed':\n return this.handleResponseFailed(rawEvent)\n case 'error':\n return this.handleErrorEvent(rawEvent)\n default:\n return []\n }\n }\n\n onDone(): Array<AnthropicStreamEventData> {\n if (this.state.messageCompleted) {\n return []\n }\n\n this.state.messageCompleted = true\n return [buildErrorEvent('Responses stream ended without completion')]\n }\n\n onError(error?: unknown): Array<AnthropicStreamEventData> {\n this.state.messageCompleted = true\n return [buildErrorEvent(error instanceof Error ? error.message : 'Responses stream failed')]\n }\n\n private handleResponseCreated(\n rawEvent: ResponseCreatedEvent,\n ): Array<AnthropicStreamEventData> {\n this.state.messageStartSent = true\n const cachedTokens = rawEvent.response.usage?.input_tokens_details?.cached_tokens ?? 0\n\n return [{\n type: 'message_start',\n message: {\n id: rawEvent.response.id,\n type: 'message',\n role: 'assistant',\n content: [],\n model: rawEvent.response.model,\n stop_reason: null,\n stop_sequence: null,\n usage: {\n input_tokens: (rawEvent.response.usage?.input_tokens ?? 0) - cachedTokens,\n output_tokens: 0,\n cache_read_input_tokens: cachedTokens,\n },\n },\n }]\n }\n\n private handleOutputItemAdded(\n rawEvent: ResponseOutputItemAddedEvent,\n ): Array<AnthropicStreamEventData> {\n if (rawEvent.item.type !== 'function_call') {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openFunctionCallBlock({\n outputIndex: rawEvent.output_index,\n toolCallId: rawEvent.item.call_id,\n name: rawEvent.item.name,\n events,\n })\n\n if (rawEvent.item.arguments) {\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'input_json_delta',\n partial_json: rawEvent.item.arguments,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n }\n\n return events\n }\n\n private handleOutputItemDone(\n rawEvent: ResponseOutputItemDoneEvent,\n ): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n\n if (rawEvent.item.type === 'compaction') {\n if (!rawEvent.item.id || !rawEvent.item.encrypted_content) {\n return events\n }\n\n const blockIndex = this.openThinkingBlock(rawEvent.output_index, events)\n if (!this.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: SignatureCodec.encodeCompaction({\n id: rawEvent.item.id,\n encrypted_content: rawEvent.item.encrypted_content,\n }),\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n this.closeScalarBlock(`thinking:${rawEvent.output_index}`, events)\n return events\n }\n\n if (rawEvent.item.type === 'reasoning') {\n const blockIndex = this.openThinkingBlock(rawEvent.output_index, events)\n if ((!rawEvent.item.summary || rawEvent.item.summary.length === 0) && !this.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 events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'signature_delta',\n signature: SignatureCodec.encodeReasoning(rawEvent.item),\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n this.closeScalarBlock(`thinking:${rawEvent.output_index}`, events)\n }\n\n if (rawEvent.item.type === 'function_call') {\n const blockIndex = this.openFunctionCallBlock({\n outputIndex: rawEvent.output_index,\n toolCallId: rawEvent.item.call_id,\n name: rawEvent.item.name,\n events,\n })\n if (rawEvent.item.arguments && !this.state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'input_json_delta',\n partial_json: rawEvent.item.arguments,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n }\n this.closeFunctionCallBlock(rawEvent.output_index, events)\n }\n\n return events\n }\n\n private handleOutputTextDelta(\n rawEvent: ResponseTextDeltaEvent,\n ): Array<AnthropicStreamEventData> {\n if (!rawEvent.delta) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openTextBlock(rawEvent.output_index, rawEvent.content_index, events)\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'text_delta',\n text: rawEvent.delta,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n return events\n }\n\n private handleOutputTextDone(\n rawEvent: ResponseTextDoneEvent,\n ): Array<AnthropicStreamEventData> {\n if (!rawEvent.text) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openTextBlock(rawEvent.output_index, rawEvent.content_index, events)\n if (!this.state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'text_delta',\n text: rawEvent.text,\n },\n })\n }\n this.closeScalarBlock(`text:${rawEvent.output_index}:${rawEvent.content_index}`, events)\n return events\n }\n\n private handleReasoningSummaryTextDelta(\n rawEvent: ResponseReasoningSummaryTextDeltaEvent,\n ): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openThinkingBlock(rawEvent.output_index, events)\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'thinking_delta',\n thinking: rawEvent.delta,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n return events\n }\n\n private handleReasoningSummaryTextDone(\n rawEvent: ResponseReasoningSummaryTextDoneEvent,\n ): Array<AnthropicStreamEventData> {\n if (!rawEvent.text) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openThinkingBlock(rawEvent.output_index, events)\n if (!this.state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'thinking_delta',\n thinking: rawEvent.text,\n },\n })\n }\n this.closeScalarBlock(`thinking:${rawEvent.output_index}`, events)\n return events\n }\n\n private handleFunctionCallArgumentsDelta(\n rawEvent: ResponseFunctionCallArgumentsDeltaEvent,\n ): Array<AnthropicStreamEventData> {\n if (!rawEvent.delta) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openFunctionCallBlock({\n outputIndex: rawEvent.output_index,\n events,\n })\n\n const functionCallState = this.state.functionCallStateByOutputIndex.get(rawEvent.output_index)\n if (!functionCallState) {\n return this.handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError('Received function call arguments delta without an open tool call block.'),\n )\n }\n if (functionCallState.closed) {\n return this.handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError('Received function call arguments delta after the tool call block was already completed.'),\n )\n }\n\n const { nextCount, exceeded } = updateWhitespaceRunState(\n functionCallState.consecutiveWhitespaceCount,\n rawEvent.delta,\n )\n if (exceeded) {\n return this.handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError('Received function call arguments delta containing more than 20 consecutive whitespace characters.'),\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: rawEvent.delta,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n return events\n }\n\n private handleFunctionCallArgumentsDone(\n rawEvent: ResponseFunctionCallArgumentsDoneEvent,\n ): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openFunctionCallBlock({\n outputIndex: rawEvent.output_index,\n events,\n })\n\n if (rawEvent.arguments && !this.state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'input_json_delta',\n partial_json: rawEvent.arguments,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n }\n\n this.closeFunctionCallBlock(rawEvent.output_index, events)\n return events\n }\n\n private handleResponseCompleted(\n rawEvent: ResponseCompletedEvent | ResponseIncompleteEvent,\n ): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n this.closeAllOpenBlocks(events)\n const anthropic = translateResponsesToAnthropic(rawEvent.response)\n events.push({\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 events.push({ type: 'message_stop' })\n this.state.messageCompleted = true\n return events\n }\n\n private handleResponseFailed(\n rawEvent: ResponseFailedEvent,\n ): Array<AnthropicStreamEventData> {\n this.state.messageCompleted = true\n return [buildErrorEvent(rawEvent.response.error?.message ?? 'The response failed due to an unknown error.')]\n }\n\n private handleErrorEvent(\n rawEvent: ResponseErrorEvent,\n ): Array<AnthropicStreamEventData> {\n this.state.messageCompleted = true\n return [buildErrorEvent(rawEvent.message || 'An unexpected error occurred during streaming.')]\n }\n\n private handleFunctionCallArgumentsValidationError(\n error: FunctionCallArgumentsValidationError,\n ): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n this.closeAllOpenBlocks(events)\n this.state.messageCompleted = true\n events.push(buildErrorEvent(error.message))\n return events\n }\n\n private openTextBlock(\n outputIndex: number,\n contentIndex: number,\n events: Array<AnthropicStreamEventData>,\n ): number {\n return this.openScalarBlock({\n key: `text:${outputIndex}:${contentIndex}`,\n contentBlock: {\n type: 'text',\n text: '',\n },\n events,\n })\n }\n\n private openThinkingBlock(\n outputIndex: number,\n events: Array<AnthropicStreamEventData>,\n ): number {\n return this.openScalarBlock({\n key: `thinking:${outputIndex}`,\n contentBlock: {\n type: 'thinking',\n thinking: '',\n },\n events,\n })\n }\n\n private openFunctionCallBlock(params: {\n outputIndex: number\n toolCallId?: string\n name?: string\n events: Array<AnthropicStreamEventData>\n }): number {\n let state = this.state.functionCallStateByOutputIndex.get(params.outputIndex)\n if (!state) {\n const blockIndex = this.state.nextContentBlockIndex++\n state = {\n blockIndex,\n toolCallId: params.toolCallId ?? `tool_call_${blockIndex}`,\n name: params.name ?? 'function',\n consecutiveWhitespaceCount: 0,\n started: false,\n closed: false,\n }\n this.state.functionCallStateByOutputIndex.set(params.outputIndex, state)\n }\n else if (state.closed) {\n throw new FunctionCallArgumentsValidationError('Cannot reopen a completed tool call block.')\n }\n\n if (!state.started) {\n params.events.push({\n type: 'content_block_start',\n index: state.blockIndex,\n content_block: {\n type: 'tool_use',\n id: state.toolCallId,\n name: state.name,\n input: {},\n },\n })\n state.started = true\n }\n\n return state.blockIndex\n }\n\n private openScalarBlock(params: {\n key: string\n contentBlock: Extract<\n AnthropicStreamEventData,\n { type: 'content_block_start' }\n >['content_block']\n events: Array<AnthropicStreamEventData>\n }): number {\n if (this.state.activeScalarBlockKey === params.key && this.state.activeScalarBlockIndex !== null) {\n return this.state.activeScalarBlockIndex\n }\n\n this.closeActiveScalarBlock(params.events)\n\n const blockIndex = this.state.nextContentBlockIndex++\n params.events.push({\n type: 'content_block_start',\n index: blockIndex,\n content_block: params.contentBlock,\n })\n this.state.activeScalarBlockKey = params.key\n this.state.activeScalarBlockIndex = blockIndex\n return blockIndex\n }\n\n private closeScalarBlock(\n key: string,\n events: Array<AnthropicStreamEventData>,\n ) {\n if (this.state.activeScalarBlockKey !== key) {\n return\n }\n this.closeActiveScalarBlock(events)\n }\n\n private closeActiveScalarBlock(events: Array<AnthropicStreamEventData>) {\n if (this.state.activeScalarBlockIndex === null) {\n return\n }\n\n events.push({\n type: 'content_block_stop',\n index: this.state.activeScalarBlockIndex,\n })\n this.state.blockHasDelta.delete(this.state.activeScalarBlockIndex)\n this.state.activeScalarBlockKey = null\n this.state.activeScalarBlockIndex = null\n }\n\n private closeFunctionCallBlock(\n outputIndex: number,\n events: Array<AnthropicStreamEventData>,\n ) {\n const state = this.state.functionCallStateByOutputIndex.get(outputIndex)\n if (!state || !state.started || state.closed) {\n return\n }\n\n events.push({\n type: 'content_block_stop',\n index: state.blockIndex,\n })\n this.state.blockHasDelta.delete(state.blockIndex)\n state.closed = true\n }\n\n private closeAllOpenBlocks(events: Array<AnthropicStreamEventData>) {\n this.closeActiveScalarBlock(events)\n\n const openBlocks: Array<FunctionCallStreamState> = []\n for (const fnState of this.state.functionCallStateByOutputIndex.values()) {\n if (fnState.started && !fnState.closed) {\n openBlocks.push(fnState)\n }\n }\n openBlocks.sort((left, right) => left.blockIndex - right.blockIndex)\n\n for (const fnState of openBlocks) {\n events.push({\n type: 'content_block_stop',\n index: fnState.blockIndex,\n })\n this.state.blockHasDelta.delete(fnState.blockIndex)\n fnState.closed = true\n }\n }\n}\n\nexport function buildErrorEvent(message: string): AnthropicStreamEventData {\n return {\n type: 'error',\n error: {\n type: 'api_error',\n message,\n },\n }\n}\n","import type { CopilotClient } from '~/clients'\nimport type { CapiRequestContext } from '~/core/capi'\nimport type { ExecutionStrategy, SSEOutput, SSEStreamChunk } from '~/lib/execution-strategy'\nimport type { ResponsesPayload, ResponsesResult, ResponseStreamEvent } from '~/types'\n\nimport consola from 'consola'\nimport { isAsyncIterable } from '~/lib/async-iterable'\nimport { ResponsesStreamTranslator } from '~/translator/responses/responses-stream-translator'\nimport { translateResponsesToAnthropic } from '~/translator/responses/responses-to-anthropic'\n\ntype ResponsesApiResult = ResponsesResult | AsyncIterable<SSEStreamChunk>\n\nexport function createMessagesViaResponsesStrategy(\n copilotClient: CopilotClient,\n responsesPayload: ResponsesPayload,\n options: {\n vision: boolean\n initiator: 'user' | 'agent'\n signal: AbortSignal\n requestContext: Partial<CapiRequestContext>\n },\n): ExecutionStrategy<ResponsesApiResult, SSEStreamChunk> {\n const translator = new ResponsesStreamTranslator()\n\n return {\n execute() {\n return copilotClient.createResponses(responsesPayload, options) as Promise<ResponsesApiResult>\n },\n\n isStream(result): result is AsyncIterable<SSEStreamChunk> {\n return Boolean(responsesPayload.stream) && isAsyncIterable(result)\n },\n\n translateResult(result) {\n return translateResponsesToAnthropic(result as ResponsesResult)\n },\n\n translateStreamChunk(chunk): SSEOutput | SSEOutput[] | null {\n if (chunk.event === 'ping') {\n return {\n event: 'ping',\n data: '{\"type\":\"ping\"}',\n }\n }\n\n if (!chunk.data) {\n return null\n }\n\n const events = translator.onEvent(\n JSON.parse(chunk.data) as ResponseStreamEvent,\n )\n\n return events.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n },\n\n shouldBreakStream() {\n return translator.isCompleted\n },\n\n onStreamDone() {\n if (translator.isCompleted) {\n return null\n }\n const events = translator.onDone()\n return events.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n },\n\n onStreamError(error) {\n consola.error('Error streaming Anthropic response via Responses API:', error)\n const events = translator.onError(error)\n return events.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n },\n }\n}\n","import type { ExecutionResult } from '~/lib/execution-strategy'\nimport type { ModelMappingInfo } from '~/lib/request-logger'\nimport type { Model } from '~/types'\nimport consola from 'consola'\n\nimport { CopilotTransport } from '~/adapters'\nimport { readCapiRequestContext } from '~/core/capi'\nimport { getReasoningEffortForModel } from '~/lib/config'\nimport { fromTranslationFailure } from '~/lib/error'\nimport { runStrategy } from '~/lib/execution-strategy'\nimport {\n findModelById,\n MESSAGES_ENDPOINT,\n modelSupportsEndpoint,\n RESPONSES_ENDPOINT,\n} from '~/lib/model-capabilities'\nimport { applyMessagesModelPolicy } from '~/lib/request-model-policy'\nimport { createCopilotClient } from '~/lib/state'\nimport { createUpstreamSignalFromConfig } from '~/lib/upstream-signal'\nimport { parseAnthropicMessagesPayload } from '~/lib/validation'\nimport { TranslationFailure } from '~/translator/anthropic/translation-issue'\nimport { translateAnthropicToResponsesPayload } from '~/translator/responses/anthropic-to-responses'\nimport { SignatureCodec } from '~/translator/responses/signature-codec'\n\nimport { applyContextManagement, compactInputByLatestCompaction, getResponsesRequestOptions } from '../responses/context-management'\nimport { createAnthropicAdapter } from './shared'\nimport { createMessagesViaChatCompletionsStrategy } from './strategies/chat-completions'\nimport { createNativeMessagesStrategy } from './strategies/native-messages'\nimport { createMessagesViaResponsesStrategy } from './strategies/responses-api'\n\nexport interface MessagesCoreParams {\n body: unknown\n signal: AbortSignal\n headers: Headers\n}\n\nexport interface MessagesCoreResult {\n result: ExecutionResult\n modelMapping?: ModelMappingInfo\n}\n\n/**\n * Core handler for Anthropic messages endpoint.\n * Returns both the execution result and model mapping info.\n */\nexport async function handleMessagesCore(\n { body, signal, headers }: MessagesCoreParams,\n): Promise<MessagesCoreResult> {\n const anthropicPayload = parseAnthropicMessagesPayload(body)\n if (consola.level >= 4)\n consola.debug('Anthropic request payload:', JSON.stringify(anthropicPayload))\n\n const anthropicBetaHeader = headers.get('anthropic-beta') ?? undefined\n const modelRouting = applyMessagesModelPolicy(\n anthropicPayload,\n anthropicBetaHeader,\n )\n let modelMapping: ModelMappingInfo = {\n originalModel: modelRouting.originalModel,\n mappedModel: modelRouting.routedModel,\n }\n\n if (modelRouting.reason) {\n consola.debug(\n `Routed anthropic request to small model via ${modelRouting.reason}:`,\n `${modelRouting.originalModel} -> ${modelRouting.routedModel}`,\n )\n }\n\n const selectedModel = findModelById(anthropicPayload.model)\n\n const upstreamSignal = createUpstreamSignalFromConfig(signal)\n\n const copilotClient = createCopilotClient()\n\n if (shouldUseMessagesApi(selectedModel)) {\n filterThinkingBlocksForNativeMessages(anthropicPayload)\n\n const strategy = createNativeMessagesStrategy(\n copilotClient,\n anthropicPayload,\n anthropicBetaHeader,\n {\n signal: upstreamSignal.signal,\n requestContext: readCapiRequestContext(headers),\n },\n )\n const result = await runStrategy(strategy, upstreamSignal)\n return { result, modelMapping }\n }\n\n if (shouldUseResponsesApi(selectedModel)) {\n let responsesPayload\n try {\n responsesPayload = translateAnthropicToResponsesPayload(anthropicPayload, {\n reasoningEffortResolver: getReasoningEffortForModel,\n })\n }\n catch (error) {\n if (error instanceof TranslationFailure) {\n throw fromTranslationFailure(error)\n }\n throw error\n }\n modelMapping = {\n originalModel: modelRouting.originalModel,\n mappedModel: responsesPayload.model,\n }\n\n applyContextManagement(\n responsesPayload,\n selectedModel?.capabilities.limits.max_prompt_tokens,\n )\n compactInputByLatestCompaction(responsesPayload)\n\n const { vision, initiator } = getResponsesRequestOptions(responsesPayload)\n const strategy = createMessagesViaResponsesStrategy(\n copilotClient,\n responsesPayload,\n {\n vision,\n initiator,\n signal: upstreamSignal.signal,\n requestContext: readCapiRequestContext(headers),\n },\n )\n const result = await runStrategy(strategy, upstreamSignal)\n return { result, modelMapping }\n }\n\n const adapter = createAnthropicAdapter()\n let plan\n try {\n plan = adapter.toCapiPlan(anthropicPayload, {\n requestContext: readCapiRequestContext(headers),\n })\n }\n catch (error) {\n if (error instanceof TranslationFailure) {\n throw fromTranslationFailure(error)\n }\n throw error\n }\n\n modelMapping = {\n originalModel: modelRouting.originalModel,\n mappedModel: plan.resolvedModel,\n }\n consola.debug(\n 'Claude Code requested model:',\n anthropicPayload.model,\n '-> Copilot model:',\n plan.resolvedModel,\n )\n if (consola.level >= 4) {\n consola.debug(\n 'Planned Copilot request payload:',\n JSON.stringify(plan.payload),\n )\n }\n\n const transport = new CopilotTransport(copilotClient)\n const strategy = createMessagesViaChatCompletionsStrategy(\n transport,\n adapter,\n plan,\n upstreamSignal.signal,\n )\n const result = await runStrategy(strategy, upstreamSignal)\n return { result, modelMapping }\n}\n\nfunction filterThinkingBlocksForNativeMessages(\n anthropicPayload: ReturnType<typeof parseAnthropicMessagesPayload>,\n) {\n for (const message of anthropicPayload.messages) {\n if (message.role !== 'assistant' || !Array.isArray(message.content)) {\n continue\n }\n message.content = message.content.filter((block) => {\n if (block.type !== 'thinking') {\n return true\n }\n return Boolean(\n block.thinking\n && block.thinking !== 'Thinking...'\n && block.signature\n && !SignatureCodec.isReasoningSignature(block.signature)\n && !SignatureCodec.isCompactionSignature(block.signature),\n )\n })\n }\n}\n\nfunction shouldUseResponsesApi(\n selectedModel: Model | undefined,\n): boolean {\n return modelSupportsEndpoint(selectedModel, RESPONSES_ENDPOINT)\n}\n\nfunction shouldUseMessagesApi(\n selectedModel: Model | undefined,\n): boolean {\n return modelSupportsEndpoint(selectedModel, MESSAGES_ENDPOINT)\n}\n","import { Elysia } from 'elysia'\n\nimport { sseAdapter } from '~/lib/sse-adapter'\nimport { requestGuardPlugin } from '~/routes/middleware/request-guard'\n\nimport { handleCountTokensCore } from './count-tokens-handler'\nimport { handleMessagesCore } from './handler'\n\nexport function createMessageRoutes() {\n return new Elysia()\n .use(requestGuardPlugin)\n .post('/messages', async function* (ctx) {\n const { body, request } = ctx\n const { result, modelMapping } = await handleMessagesCore({\n body,\n signal: request.signal,\n headers: request.headers,\n })\n if ('requestMeta' in ctx && ctx.requestMeta && typeof ctx.requestMeta === 'object') {\n (ctx.requestMeta as { modelMapping: unknown }).modelMapping = modelMapping\n }\n if (result.kind === 'json') {\n return result.data\n }\n yield* sseAdapter(result.generator)\n }, { guarded: true })\n .post('/messages/count_tokens', async ({ body, request }) => {\n return handleCountTokensCore({\n body,\n headers: request.headers,\n })\n }, { guarded: true })\n}\n","import { cacheModels, createCopilotClient, state } from '~/lib/state'\n\n/**\n * Core handler for listing models.\n */\nexport async function handleModelsCore(): Promise<object> {\n if (!state.cache.models) {\n // This should be handled by startup logic, but as a fallback.\n const copilotClient = createCopilotClient()\n await cacheModels(copilotClient)\n }\n\n const models = state.cache.models?.data.map(model => ({\n id: 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 return {\n object: 'list',\n data: models,\n has_more: false,\n }\n}\n","import { Elysia } from 'elysia'\n\nimport { handleModelsCore } from './handler'\n\nexport function createModelRoutes() {\n return new Elysia()\n .get('/models', async () => {\n return handleModelsCore()\n })\n}\n","import type { CopilotClient } from '~/clients'\nimport type { CapiRequestContext } from '~/core/capi'\nimport type { ExecutionStrategy, SSEStreamChunk } from '~/lib/execution-strategy'\nimport type { ResponsesPayload, ResponsesResult } from '~/types'\n\nimport { isAsyncIterable } from '~/lib/async-iterable'\nimport { passthroughSSEChunk } from '~/lib/execution-strategy'\n\ninterface StreamIdState {\n responseId?: string\n itemIdsByOutputIndex: Map<number, string>\n}\n\nfunction createStreamIdTracker(): StreamIdState {\n return {\n itemIdsByOutputIndex: new Map(),\n }\n}\n\nfunction fixStreamIds(\n rawData: string,\n eventName: string | undefined,\n state: StreamIdState,\n): string {\n if (!rawData) {\n return rawData\n }\n\n let parsed: Record<string, unknown>\n try {\n parsed = JSON.parse(rawData) as Record<string, unknown>\n }\n catch {\n return rawData\n }\n\n if (eventName === 'response.created' || eventName === 'response.completed' || eventName === 'response.incomplete') {\n const response = parsed.response as Record<string, unknown> | undefined\n if (response?.id && typeof response.id === 'string') {\n state.responseId = response.id\n }\n }\n\n if (eventName === 'response.output_item.added' || eventName === 'response.output_item.done') {\n const outputIndex = typeof parsed.output_index === 'number' ? parsed.output_index : undefined\n const item = parsed.item as Record<string, unknown> | undefined\n if (outputIndex !== undefined && typeof item?.id === 'string') {\n state.itemIdsByOutputIndex.set(outputIndex, item.id)\n }\n }\n\n if (\n (eventName === 'response.function_call_arguments.delta'\n || eventName === 'response.function_call_arguments.done'\n || eventName === 'response.output_text.delta'\n || eventName === 'response.output_text.done'\n || eventName === 'response.reasoning_summary_text.delta'\n || eventName === 'response.reasoning_summary_text.done')\n && typeof parsed.output_index === 'number'\n ) {\n const stableId = state.itemIdsByOutputIndex.get(parsed.output_index)\n if (stableId && parsed.item_id !== stableId) {\n parsed.item_id = stableId\n }\n }\n\n if (state.responseId && parsed.response && typeof parsed.response === 'object') {\n const response = parsed.response as Record<string, unknown>\n if (response.id !== state.responseId) {\n response.id = state.responseId\n }\n }\n\n return JSON.stringify(parsed)\n}\n\nexport function createResponsesPassthroughStrategy(\n copilotClient: CopilotClient,\n payload: ResponsesPayload,\n options: {\n vision: boolean\n initiator: 'user' | 'agent'\n requestContext: Partial<CapiRequestContext>\n signal: AbortSignal\n },\n): ExecutionStrategy<ResponsesResult | AsyncIterable<SSEStreamChunk>, SSEStreamChunk> {\n const tracker = createStreamIdTracker()\n\n return {\n execute() {\n return copilotClient.createResponses(payload, options) as Promise<ResponsesResult | AsyncIterable<SSEStreamChunk>>\n },\n\n isStream(result): result is AsyncIterable<SSEStreamChunk> {\n return Boolean(payload.stream) && isAsyncIterable(result)\n },\n\n translateResult(result) {\n return result as ResponsesResult\n },\n\n translateStreamChunk(chunk) {\n return passthroughSSEChunk(chunk, fixStreamIds(chunk.data ?? '', chunk.event, tracker))\n },\n }\n}\n","import type { ExecutionResult } from '~/lib/execution-strategy'\n\nimport type { ResponsesPayload } from '~/types'\nimport { readCapiRequestContext } from '~/core/capi'\nimport { shouldUseFunctionApplyPatch } from '~/lib/config'\nimport { throwInvalidRequestError } from '~/lib/error'\nimport { runStrategy } from '~/lib/execution-strategy'\nimport { findModelById, modelSupportsEndpoint, RESPONSES_ENDPOINT } from '~/lib/model-capabilities'\nimport { createCopilotClient } from '~/lib/state'\nimport { createUpstreamSignalFromConfig } from '~/lib/upstream-signal'\nimport { parseResponsesPayload } from '~/lib/validation'\n\nimport { applyContextManagement, compactInputByLatestCompaction, getResponsesRequestOptions } from './context-management'\nimport { createResponsesPassthroughStrategy } from './strategy'\n\nexport interface ResponsesCoreParams {\n body: unknown\n signal: AbortSignal\n headers: Headers\n}\n\n/**\n * Core handler for responses endpoint.\n */\nexport async function handleResponsesCore(\n { body, signal, headers }: ResponsesCoreParams,\n): Promise<ExecutionResult> {\n const payload = parseResponsesPayload(body)\n\n applyResponsesToolTransforms(payload)\n applyResponsesInputPolicies(payload)\n compactInputByLatestCompaction(payload)\n\n const selectedModel = findModelById(payload.model)\n if (!selectedModel) {\n throwInvalidRequestError(\n 'The selected model could not be resolved.',\n 'model',\n )\n }\n if (!modelSupportsEndpoint(selectedModel, RESPONSES_ENDPOINT)) {\n throwInvalidRequestError(\n 'The selected model does not support the responses endpoint.',\n 'model',\n )\n }\n\n applyContextManagement(\n payload,\n selectedModel.capabilities.limits.max_prompt_tokens,\n )\n\n const { vision, initiator } = getResponsesRequestOptions(payload)\n const upstreamSignal = createUpstreamSignalFromConfig(signal)\n const copilotClient = createCopilotClient()\n\n const strategy = createResponsesPassthroughStrategy(copilotClient, payload, {\n vision,\n initiator,\n requestContext: readCapiRequestContext(headers),\n signal: upstreamSignal.signal,\n })\n\n return runStrategy(strategy, upstreamSignal)\n}\n\nfunction applyResponsesToolTransforms(payload: ResponsesPayload): void {\n applyFunctionApplyPatch(payload)\n rejectUnsupportedBuiltinTools(payload)\n}\n\nfunction applyFunctionApplyPatch(payload: ResponsesPayload): void {\n if (!shouldUseFunctionApplyPatch() || !Array.isArray(payload.tools)) {\n return\n }\n\n payload.tools = payload.tools.map((tool) => {\n if (\n tool.type === 'custom'\n && typeof tool.name === 'string'\n && tool.name === 'apply_patch'\n ) {\n return {\n type: 'function',\n name: tool.name,\n description: 'Use the `apply_patch` tool to edit files',\n parameters: {\n type: 'object',\n properties: {\n input: {\n type: 'string',\n description: 'The entire contents of the apply_patch command',\n },\n },\n required: ['input'],\n },\n strict: false,\n }\n }\n\n return tool\n })\n}\n\nfunction rejectUnsupportedBuiltinTools(payload: ResponsesPayload): void {\n if (!Array.isArray(payload.tools)) {\n return\n }\n\n for (const tool of payload.tools) {\n if (tool.type === 'web_search') {\n throwInvalidRequestError(\n 'The selected Copilot endpoint does not support the Responses web_search tool.',\n 'tools',\n 'unsupported_tool_web_search',\n )\n }\n }\n}\n\nfunction applyResponsesInputPolicies(payload: ResponsesPayload): void {\n rejectUnsupportedRemoteImageUrls(payload)\n}\n\nfunction rejectUnsupportedRemoteImageUrls(payload: ResponsesPayload): void {\n if (!Array.isArray(payload.input) || !containsRemoteImageUrl(payload.input)) {\n return\n }\n\n throwInvalidRequestError(\n 'The selected Copilot endpoint does not support external image URLs on the Responses API. Use file_id or data URL image input instead.',\n 'input',\n 'unsupported_input_image_remote_url',\n )\n}\n\nfunction containsRemoteImageUrl(value: unknown): boolean {\n if (!value) {\n return false\n }\n if (Array.isArray(value)) {\n return value.some(entry => containsRemoteImageUrl(entry))\n }\n if (typeof value !== 'object') {\n return false\n }\n\n const record = value as Record<string, unknown>\n if (\n record.type === 'input_image'\n && typeof record.image_url === 'string'\n && /^https?:\\/\\//i.test(record.image_url)\n ) {\n return true\n }\n\n return Object.values(record).some(entry => containsRemoteImageUrl(entry))\n}\n","import type {\n ResponseInputItemsListParams,\n ResponseRetrieveParams,\n ResponsesInputTokensPayload,\n} from '~/types'\n\nimport { readCapiRequestContext } from '~/core/capi'\nimport { throwInvalidRequestError } from '~/lib/error'\nimport { createCopilotClient } from '~/lib/state'\nimport { parseResponsesInputTokensPayload } from '~/lib/validation'\n\n// --- Core request parameter interfaces ---\n\nexport interface ResourceHandlerParams {\n params: { responseId?: string }\n url: string\n headers: Headers\n signal: AbortSignal\n}\n\nexport interface ResourceHandlerBodyParams {\n body: unknown\n headers: Headers\n signal: AbortSignal\n}\n\n// --- Core functions ---\n\nexport async function handleRetrieveResponseCore(\n { params, url, headers, signal }: ResourceHandlerParams,\n): Promise<object> {\n const responseId = requireResponseId(params.responseId)\n const copilotClient = createCopilotClient()\n return await copilotClient.getResponse(responseId, {\n params: getRetrieveParamsFromUrl(url),\n requestContext: readCapiRequestContext(headers),\n signal,\n })\n}\n\nexport async function handleListResponseInputItemsCore(\n { params, url, headers, signal }: ResourceHandlerParams,\n): Promise<object> {\n const responseId = requireResponseId(params.responseId)\n const copilotClient = createCopilotClient()\n return await copilotClient.getResponseInputItems(\n responseId,\n getInputItemsParamsFromUrl(url),\n {\n requestContext: readCapiRequestContext(headers),\n signal,\n },\n )\n}\n\nexport async function handleCreateResponseInputTokensCore(\n { body, headers, signal }: ResourceHandlerBodyParams,\n): Promise<object> {\n const payload = parseResponsesInputTokensPayload(body) as ResponsesInputTokensPayload\n const copilotClient = createCopilotClient()\n return await copilotClient.createResponseInputTokens(payload, {\n requestContext: readCapiRequestContext(headers),\n signal,\n })\n}\n\nexport async function handleDeleteResponseCore(\n { params, headers, signal }: Omit<ResourceHandlerParams, 'url'>,\n): Promise<object> {\n const responseId = requireResponseId(params.responseId)\n const copilotClient = createCopilotClient()\n return await copilotClient.deleteResponse(responseId, {\n requestContext: readCapiRequestContext(headers),\n signal,\n })\n}\n\n// --- Shared helpers ---\n\nfunction requireResponseId(responseId: string | undefined): string {\n if (!responseId) {\n throwInvalidRequestError('Response id is required.', 'response_id')\n }\n return responseId\n}\n\nfunction getRetrieveParamsFromUrl(rawUrl: string): ResponseRetrieveParams {\n const url = new URL(rawUrl)\n const params: ResponseRetrieveParams = {\n include: getIncludeParams(url),\n }\n\n const startingAfter = url.searchParams.get('starting_after')\n if (startingAfter !== null) {\n const parsed = Number(startingAfter)\n if (!Number.isInteger(parsed) || parsed < 0) {\n throwInvalidRequestError(\n 'Query parameter starting_after must be a non-negative integer.',\n 'starting_after',\n )\n }\n params.starting_after = parsed\n }\n\n const includeObfuscation = url.searchParams.get('include_obfuscation')\n if (includeObfuscation !== null) {\n const parsed = parseBooleanParam(includeObfuscation)\n if (parsed === undefined) {\n throwInvalidRequestError(\n 'Query parameter include_obfuscation must be true or false.',\n 'include_obfuscation',\n )\n }\n params.include_obfuscation = parsed\n }\n\n const stream = url.searchParams.get('stream')\n if (stream !== null) {\n const parsed = parseBooleanParam(stream)\n if (parsed === undefined) {\n throwInvalidRequestError(\n 'Query parameter stream must be true or false.',\n 'stream',\n )\n }\n params.stream = parsed\n }\n\n return params\n}\n\nfunction getInputItemsParamsFromUrl(rawUrl: string): ResponseInputItemsListParams {\n const url = new URL(rawUrl)\n const limit = url.searchParams.get('limit')\n const order = url.searchParams.get('order')\n const params: ResponseInputItemsListParams = {\n after: url.searchParams.get('after') ?? undefined,\n include: getIncludeParams(url),\n }\n\n if (limit !== null) {\n const parsed = Number(limit)\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) {\n throwInvalidRequestError(\n 'Query parameter limit must be an integer between 1 and 100.',\n 'limit',\n )\n }\n params.limit = parsed\n }\n\n if (order !== null) {\n if (order !== 'asc' && order !== 'desc') {\n throwInvalidRequestError(\n 'Query parameter order must be \"asc\" or \"desc\".',\n 'order',\n )\n }\n params.order = order\n }\n\n return params\n}\n\nfunction getIncludeParams(url: URL): Array<string> | undefined {\n const includes = url.searchParams.getAll('include')\n .flatMap(value => value.split(','))\n .map(value => value.trim())\n .filter(Boolean)\n\n return includes.length > 0 ? includes : undefined\n}\n\nfunction parseBooleanParam(value: string): boolean | undefined {\n if (value === 'true') {\n return true\n }\n if (value === 'false') {\n return false\n }\n return undefined\n}\n","import { Elysia } from 'elysia'\n\nimport { sseAdapter } from '~/lib/sse-adapter'\nimport { requestGuardPlugin } from '~/routes/middleware/request-guard'\n\nimport { handleResponsesCore } from './handler'\nimport {\n handleCreateResponseInputTokensCore,\n handleDeleteResponseCore,\n handleListResponseInputItemsCore,\n handleRetrieveResponseCore,\n} from './resource-handler'\n\nexport function createResponsesRoutes() {\n return new Elysia()\n .use(requestGuardPlugin)\n .post('/responses', async function* ({ body, request }) {\n const result = await handleResponsesCore({\n body,\n signal: request.signal,\n headers: request.headers,\n })\n if (result.kind === 'json') {\n return result.data\n }\n yield* sseAdapter(result.generator)\n }, { guarded: true })\n .post('/responses/input_tokens', async ({ body, request }) => {\n return handleCreateResponseInputTokensCore({\n body,\n headers: request.headers,\n signal: request.signal,\n })\n }, { guarded: true })\n .get('/responses/:responseId/input_items', async ({ params, request }) => {\n return handleListResponseInputItemsCore({\n params,\n url: request.url,\n headers: request.headers,\n signal: request.signal,\n })\n })\n .get('/responses/:responseId', async ({ params, request }) => {\n return handleRetrieveResponseCore({\n params,\n url: request.url,\n headers: request.headers,\n signal: request.signal,\n })\n })\n .delete('/responses/:responseId', async ({ params, request }) => {\n return handleDeleteResponseCore({\n params,\n headers: request.headers,\n signal: request.signal,\n })\n })\n}\n","import { state } from '~/lib/state'\n\n/**\n * Core handler for retrieving the token.\n */\nexport function handleTokenCore(): object {\n return {\n token: state.auth.copilotToken,\n }\n}\n","import { Elysia } from 'elysia'\n\nimport { handleTokenCore } from './handler'\n\nexport function createTokenRoute() {\n return new Elysia()\n .get('/token', () => handleTokenCore())\n}\n","import { GitHubClient } from '~/clients'\nimport { getClientConfig, state } from '~/lib/state'\n\n/**\n * Core handler for retrieving usage data.\n */\nexport async function handleUsageCore(): Promise<object> {\n const githubClient = new GitHubClient(state.auth, getClientConfig())\n return await githubClient.getCopilotUsage()\n}\n","import { Elysia } from 'elysia'\n\nimport { handleUsageCore } from './handler'\n\nexport function createUsageRoute() {\n return new Elysia()\n .get('/usage', async () => handleUsageCore())\n}\n","import type { ModelMappingInfo } from './lib/request-logger'\n\nimport { cors } from '@elysiajs/cors'\nimport { Elysia } from 'elysia'\n\nimport { HTTPError } from './lib/error'\nimport { formatElapsed, logRequest } from './lib/request-logger'\nimport { createCompletionRoutes } from './routes/chat-completions/route'\nimport { createEmbeddingRoutes } from './routes/embeddings/route'\nimport { createMessageRoutes } from './routes/messages/route'\nimport { createModelRoutes } from './routes/models/route'\nimport { createResponsesRoutes } from './routes/responses/route'\nimport { createTokenRoute } from './routes/token/route'\nimport { createUsageRoute } from './routes/usage/route'\n\nexport interface ServerOptions {\n idleTimeout?: number\n}\n\nexport function createServer(options?: ServerOptions) {\n return new Elysia({\n serve: options?.idleTimeout !== undefined\n ? { idleTimeout: options.idleTimeout }\n : undefined,\n })\n .use(cors())\n .error({ HTTP: HTTPError })\n .derive(() => {\n return {\n requestStart: Date.now(),\n requestMeta: {\n modelMapping: undefined as ModelMappingInfo | undefined,\n },\n }\n })\n .onAfterHandle(({ request, requestStart, requestMeta, set }) => {\n const elapsed = formatElapsed(requestStart)\n const status = typeof set.status === 'number' ? set.status : 200\n logRequest(request.method, request.url, status, elapsed, requestMeta.modelMapping)\n })\n .onError(({ code, error }) => {\n // HTTPError is auto-handled via toResponse() — just let it through\n if (code === 'HTTP')\n return\n\n if (error instanceof Error && error.name === 'AbortError') {\n return Response.json(\n { error: { message: 'Upstream request was aborted', type: 'timeout_error' } },\n { status: 504 },\n )\n }\n\n const message = error instanceof Error ? error.message : String(error)\n return Response.json(\n { error: { message, type: 'error' } },\n { status: 500 },\n )\n })\n .get('/', () => 'Server running')\n .use(createCompletionRoutes())\n .use(createModelRoutes())\n .use(createEmbeddingRoutes())\n .use(createResponsesRoutes())\n .use(createTokenRoute())\n .use(createUsageRoute())\n .group('/v1', (app) => {\n return app\n .use(createCompletionRoutes())\n .use(createModelRoutes())\n .use(createEmbeddingRoutes())\n .use(createResponsesRoutes())\n .use(createMessageRoutes())\n })\n}\n","#!/usr/bin/env node\n\nimport type { RuntimeConfig } from './lib/state'\nimport { defineCommand } from 'citty'\nimport clipboard from 'clipboardy'\nimport consola from 'consola'\n\nimport { readConfig } from './lib/config'\nimport { ensurePaths } from './lib/paths'\nimport { initProxyFromEnv } from './lib/proxy'\nimport { generateEnvScript } from './lib/shell'\nimport { cacheModels, cacheVSCodeVersion, createCopilotClient, state } from './lib/state'\nimport { setupCopilotToken, setupGitHubToken } from './lib/token'\nimport { createServer } from './server'\n\ninterface RunServerOptions {\n port: number\n verbose: boolean\n accountType: string\n manual: boolean\n rateLimit?: number\n rateLimitWait: boolean\n githubToken?: string\n claudeCode: boolean\n showToken: boolean\n proxyEnv: boolean\n idleTimeoutSeconds?: number\n upstreamTimeoutSeconds?: number\n}\n\nasync function maybeCopyClaudeCodeCommand(serverUrl: string): Promise<void> {\n if (!state.cache.models) {\n return\n }\n\n const selectableModels = state.cache.models.data.filter(\n model => model.model_picker_enabled,\n )\n const modelOptions\n = selectableModels.length > 0 ? selectableModels : state.cache.models.data\n\n const selectedModel = await consola.prompt(\n 'Select a model to use with Claude Code',\n {\n type: 'select',\n options: modelOptions.map(model => model.id),\n },\n )\n\n const selectedSmallModel = await consola.prompt(\n 'Select a small model to use with Claude Code',\n {\n type: 'select',\n options: modelOptions.map(model => model.id),\n },\n )\n\n const command = generateEnvScript(\n {\n ANTHROPIC_BASE_URL: serverUrl,\n ANTHROPIC_AUTH_TOKEN: 'dummy',\n ANTHROPIC_MODEL: selectedModel,\n ANTHROPIC_DEFAULT_SONNET_MODEL: selectedModel,\n ANTHROPIC_SMALL_FAST_MODEL: selectedSmallModel,\n ANTHROPIC_DEFAULT_HAIKU_MODEL: selectedSmallModel,\n DISABLE_NON_ESSENTIAL_MODEL_CALLS: '1',\n CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',\n },\n 'claude',\n )\n\n try {\n clipboard.writeSync(command)\n consola.success('Copied Claude Code command to clipboard!')\n }\n catch {\n consola.warn(\n 'Failed to copy to clipboard. Here is the Claude Code command:',\n )\n consola.log(command)\n }\n}\n\nexport async function runServer(options: RunServerOptions): Promise<void> {\n const accountType: RuntimeConfig['accountType']\n = (\n options.accountType === 'individual'\n || options.accountType === 'business'\n || options.accountType === 'enterprise'\n )\n ? options.accountType\n : 'individual'\n\n if (accountType !== options.accountType) {\n consola.warn(\n `Unknown account type \"${options.accountType}\". Falling back to \"individual\".`,\n )\n }\n\n if (options.proxyEnv) {\n initProxyFromEnv()\n }\n\n if (options.verbose) {\n consola.level = 5\n consola.info('Verbose logging enabled')\n }\n\n state.config.accountType = accountType\n if (accountType !== 'individual') {\n consola.info(`Using ${accountType} plan GitHub account`)\n }\n\n if (options.githubToken) {\n state.auth.githubToken = options.githubToken\n consola.info('Using provided GitHub token')\n }\n\n state.config.manualApprove = options.manual\n state.config.rateLimitSeconds = options.rateLimit\n state.config.rateLimitWait = options.rateLimitWait\n state.config.showToken = options.showToken\n state.config.upstreamTimeoutSeconds = options.upstreamTimeoutSeconds\n\n await ensurePaths()\n await readConfig()\n await cacheVSCodeVersion()\n\n if (!options.githubToken) {\n await setupGitHubToken()\n }\n\n await setupCopilotToken()\n\n const copilotClient = createCopilotClient()\n await cacheModels(copilotClient)\n\n consola.info(\n `Available models: \\n${state.cache.models?.data.map(model => `- ${model.id}`).join('\\n')}`,\n )\n\n const serverUrl = `http://localhost:${options.port}`\n\n if (options.claudeCode) {\n if (!state.cache.models) {\n throw new Error('Models should be loaded by now')\n }\n await maybeCopyClaudeCodeCommand(serverUrl)\n }\n\n const app = createServer({ idleTimeout: options.idleTimeoutSeconds })\n app.listen(options.port)\n}\n\nfunction parseIntArg(raw: string | undefined, name: string, fallbackMsg: string): number | undefined {\n if (raw === undefined)\n return undefined\n const n = Number.parseInt(raw, 10)\n if (Number.isNaN(n) || n < 0) {\n consola.warn(`Invalid --${name} value \"${raw}\". ${fallbackMsg}`)\n return undefined\n }\n return n\n}\n\nexport const start = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the Copilot API server',\n },\n args: {\n 'port': {\n alias: 'p',\n type: 'string',\n default: '4141',\n description: 'Port to listen on',\n },\n 'verbose': {\n alias: 'v',\n type: 'boolean',\n default: false,\n description: 'Enable verbose logging',\n },\n 'account-type': {\n alias: 'a',\n type: 'string',\n default: 'individual',\n description: 'Account type to use (individual, business, enterprise)',\n },\n 'manual': {\n type: 'boolean',\n default: false,\n description: 'Enable manual request approval',\n },\n 'rate-limit': {\n alias: 'r',\n type: 'string',\n description: 'Rate limit in seconds between requests',\n },\n 'wait': {\n alias: 'w',\n type: 'boolean',\n default: false,\n description:\n 'Wait instead of error when rate limit is hit. Has no effect if rate limit is not set',\n },\n 'github-token': {\n alias: 'g',\n type: 'string',\n description:\n 'Provide GitHub token directly (must be generated using the `auth` subcommand)',\n },\n 'claude-code': {\n alias: 'c',\n type: 'boolean',\n default: false,\n description:\n 'Generate a command to launch Claude Code with Copilot API config',\n },\n 'show-token': {\n type: 'boolean',\n default: false,\n description: 'Show GitHub and Copilot tokens on fetch and refresh',\n },\n 'proxy-env': {\n type: 'boolean',\n default: false,\n description: 'Initialize proxy from environment variables',\n },\n 'idle-timeout': {\n type: 'string',\n default: '120',\n description: 'Bun server idle timeout in seconds',\n },\n 'upstream-timeout': {\n type: 'string',\n default: '1800',\n description: 'Upstream request timeout in seconds (0 to disable)',\n },\n },\n run({ args }) {\n const rateLimit = parseIntArg(args['rate-limit'], 'rate-limit', 'Rate limiting disabled.')\n const idleTimeoutSeconds = parseIntArg(args['idle-timeout'], 'idle-timeout', 'Falling back to Bun default.')\n const upstreamTimeoutSeconds = parseIntArg(args['upstream-timeout'], 'upstream-timeout', 'Falling back to default (300s).')\n\n return runServer({\n port: Number.parseInt(args.port, 10),\n verbose: args.verbose,\n accountType: args['account-type'],\n manual: args.manual,\n rateLimit,\n rateLimitWait: args.wait,\n githubToken: args['github-token'],\n claudeCode: args['claude-code'],\n showToken: args['show-token'],\n proxyEnv: args['proxy-env'],\n idleTimeoutSeconds,\n upstreamTimeoutSeconds,\n })\n },\n})\n","#!/usr/bin/env node\n\nimport process from 'node:process'\nimport { defineCommand, runMain } from 'citty'\nimport consola from 'consola'\n\nimport { auth } from './auth'\nimport { checkUsage } from './check-usage'\nimport { debug } from './debug'\nimport { VERSION } from './lib/version'\nimport { start } from './start'\n\nconst main = defineCommand({\n meta: {\n name: 'ghc-proxy',\n version: VERSION,\n description:\n 'A wrapper around GitHub Copilot API to make it OpenAI compatible, making it usable for other tools.',\n },\n subCommands: { auth, start, 'check-usage': checkUsage, debug },\n})\n\nrunMain(main).catch((error) => {\n consola.error('Failed to start CLI:', error)\n process.exitCode = 1\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.mjs","names":["hasVisionInput","containsVisionContent"],"sources":["../src/lib/paths.ts","../src/lib/config.ts","../src/lib/api-config.ts","../src/lib/error.ts","../src/clients/copilot-client.ts","../src/lib/sleep.ts","../src/clients/github-client.ts","../src/clients/vscode-client.ts","../src/lib/state.ts","../src/lib/token.ts","../src/auth.ts","../src/check-usage.ts","../src/lib/version.ts","../src/debug.ts","../src/lib/proxy.ts","../src/lib/shell.ts","../src/lib/request-logger.ts","../src/lib/sse-adapter.ts","../src/lib/approval.ts","../src/lib/rate-limit.ts","../src/routes/middleware/request-guard.ts","../src/lib/assert-never.ts","../src/core/capi/profile.ts","../src/core/capi/request-context.ts","../src/core/capi/plan-builder.ts","../src/translator/anthropic/anthropic-normalizer.ts","../src/translator/anthropic/shared.ts","../src/translator/anthropic/anthropic-stream-transducer.ts","../src/translator/anthropic/openai-anthropic-mapper.ts","../src/translator/anthropic/translation-issue.ts","../src/translator/anthropic/openai-normalizer.ts","../src/translator/anthropic/translation-policy.ts","../src/adapters/anthropic-messages-adapter.ts","../src/adapters/copilot-transport.ts","../src/adapters/openai-chat-adapter.ts","../src/lib/execution-strategy.ts","../src/lib/model-capabilities.ts","../src/lib/tokenizer.ts","../src/lib/upstream-signal.ts","../src/types/copilot.ts","../src/lib/validation.ts","../src/routes/chat-completions/strategy.ts","../src/routes/chat-completions/handler.ts","../src/routes/chat-completions/route.ts","../src/routes/embeddings/handler.ts","../src/routes/embeddings/route.ts","../src/lib/model-resolver.ts","../src/routes/messages/shared.ts","../src/routes/messages/count-tokens-handler.ts","../src/lib/request-model-policy.ts","../src/translator/responses/signature-codec.ts","../src/translator/responses/anthropic-to-responses.ts","../src/routes/responses/context-management.ts","../src/routes/messages/strategies/chat-completions.ts","../src/lib/async-iterable.ts","../src/routes/messages/strategies/native-messages.ts","../src/translator/responses/responses-to-anthropic.ts","../src/translator/responses/responses-stream-translator.ts","../src/routes/messages/strategies/responses-api.ts","../src/routes/messages/handler.ts","../src/routes/messages/route.ts","../src/routes/models/handler.ts","../src/routes/models/route.ts","../src/routes/responses/strategy.ts","../src/routes/responses/handler.ts","../src/routes/responses/resource-handler.ts","../src/routes/responses/route.ts","../src/routes/token/handler.ts","../src/routes/token/route.ts","../src/routes/usage/handler.ts","../src/routes/usage/route.ts","../src/server.ts","../src/start.ts","../src/main.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\n\nconst APP_DIR = path.join(os.homedir(), '.local', 'share', 'ghc-proxy')\n\nconst CONFIG_PATH = path.join(APP_DIR, 'config.json')\n\nexport const PATHS = {\n APP_DIR,\n CONFIG_PATH,\n}\n\nexport async function ensurePaths(): Promise<void> {\n await fs.mkdir(PATHS.APP_DIR, { recursive: true })\n}\n","import fs from 'node:fs/promises'\nimport process from 'node:process'\nimport consola from 'consola'\nimport { z } from 'zod'\n\nimport { PATHS } from './paths'\n\nconst reasoningEffortSchema = z.enum([\n 'none',\n 'minimal',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n])\n\ntype ReasoningEffort = z.infer<typeof reasoningEffortSchema>\n\nconst configFileSchema = z.object({\n githubToken: z.string().optional(),\n modelFallback: z.object({\n claudeOpus: z.string().optional(),\n claudeSonnet: z.string().optional(),\n claudeHaiku: z.string().optional(),\n }).optional(),\n smallModel: z.string().optional(),\n compactUseSmallModel: z.boolean().optional(),\n warmupUseSmallModel: z.boolean().optional(),\n useFunctionApplyPatch: z.boolean().optional(),\n responsesApiContextManagementModels: z.array(z.string()).optional(),\n modelReasoningEfforts: z.record(z.string(), reasoningEffortSchema).optional(),\n}).passthrough()\n\nexport type ConfigFile = z.infer<typeof configFileSchema>\n\nconst KNOWN_CONFIG_KEYS = new Set(Object.keys(configFileSchema.shape))\n\nlet cachedConfig: ConfigFile = {}\n\nconst DEFAULT_REASONING_EFFORT: ReasoningEffort = 'high'\nconst DEFAULT_USE_FUNCTION_APPLY_PATCH = true\nconst DEFAULT_COMPACT_USE_SMALL_MODEL = false\nconst DEFAULT_WARMUP_USE_SMALL_MODEL = false\n\nexport async function readConfig(): Promise<ConfigFile> {\n try {\n const content = await fs.readFile(PATHS.CONFIG_PATH, 'utf8')\n\n if (!content.trim()) {\n cachedConfig = {}\n return {}\n }\n\n const raw = JSON.parse(content) as unknown\n\n if (\n typeof raw !== 'object'\n || raw === null\n || Array.isArray(raw)\n ) {\n consola.warn('config.json is not a valid object. Using defaults.')\n cachedConfig = {}\n return {}\n }\n\n const result = configFileSchema.safeParse(raw)\n if (!result.success) {\n consola.warn(\n 'config.json has invalid fields:',\n result.error.issues.map(i => `${i.path.join('.')}: ${i.message}`).join('; '),\n 'Using defaults for invalid fields.',\n )\n // Fall back to treating the raw object as-is for known valid fields\n cachedConfig = raw as ConfigFile\n return cachedConfig\n }\n\n // Warn about unknown fields\n const unknownKeys = Object.keys(raw as Record<string, unknown>)\n .filter(key => !KNOWN_CONFIG_KEYS.has(key))\n if (unknownKeys.length > 0) {\n consola.warn(`config.json contains unknown fields: ${unknownKeys.join(', ')}`)\n }\n\n cachedConfig = result.data\n return cachedConfig\n }\n catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n cachedConfig = {}\n return {}\n }\n\n consola.warn(\n `Failed to parse config.json: ${(error as Error).message}. Using defaults.`,\n )\n cachedConfig = {}\n return {}\n }\n}\n\nexport function getCachedConfig(): ConfigFile {\n return cachedConfig\n}\n\nexport function getSmallModel(): string | undefined {\n return cachedConfig.smallModel?.trim() || undefined\n}\n\nexport function shouldCompactUseSmallModel(): boolean {\n return cachedConfig.compactUseSmallModel ?? DEFAULT_COMPACT_USE_SMALL_MODEL\n}\n\nexport function shouldWarmupUseSmallModel(): boolean {\n return cachedConfig.warmupUseSmallModel ?? DEFAULT_WARMUP_USE_SMALL_MODEL\n}\n\nexport function shouldUseFunctionApplyPatch(): boolean {\n return cachedConfig.useFunctionApplyPatch ?? DEFAULT_USE_FUNCTION_APPLY_PATCH\n}\n\nexport function isResponsesApiContextManagementModel(model: string): boolean {\n return cachedConfig.responsesApiContextManagementModels?.includes(model) ?? false\n}\n\nexport function getReasoningEffortForModel(model: string): ReasoningEffort {\n return cachedConfig.modelReasoningEfforts?.[model] ?? DEFAULT_REASONING_EFFORT\n}\n\nexport async function writeConfigField(\n field: string,\n value: unknown,\n): Promise<void> {\n try {\n let existing: ConfigFile = {}\n try {\n const content = await fs.readFile(PATHS.CONFIG_PATH, 'utf8')\n if (content.trim()) {\n existing = JSON.parse(content) as ConfigFile\n }\n }\n catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n consola.warn(\n `Could not read existing config.json: ${\n (error as Error).message\n }. Starting fresh.`,\n )\n }\n }\n\n const merged = { ...existing, [field]: value }\n\n await fs.writeFile(\n PATHS.CONFIG_PATH,\n JSON.stringify(merged, null, 2),\n 'utf8',\n )\n await applyConfigFilePermissions(PATHS.CONFIG_PATH)\n\n cachedConfig = merged\n }\n catch (error: unknown) {\n consola.error(`Failed to write config.json: ${(error as Error).message}`)\n throw error\n }\n}\n\nasync function applyConfigFilePermissions(filePath: string): Promise<void> {\n if (process.platform === 'win32') {\n return\n }\n\n try {\n await fs.chmod(filePath, 0o600)\n }\n catch (error) {\n consola.warn(\n `Could not set config.json permissions to 0600: ${(error as Error).message}`,\n )\n }\n}\n","import type { ClientAuth, ClientConfig } from '~/clients'\nimport type { CapiRequestContext } from '~/core/capi'\n\nimport { randomUUID } from 'node:crypto'\n\nexport function standardHeaders() {\n return {\n 'content-type': 'application/json',\n 'accept': 'application/json',\n }\n}\n\nconst COPILOT_VERSION = '0.26.7'\nconst EDITOR_PLUGIN_VERSION = `copilot-chat/${COPILOT_VERSION}`\nconst USER_AGENT = `GitHubCopilotChat/${COPILOT_VERSION}`\n\nconst API_VERSION = '2025-04-01'\n\nexport function copilotBaseUrl(config: ClientConfig) {\n if (config.copilotApiBase) {\n return config.copilotApiBase.replace(/\\/+$/, '')\n }\n return config.accountType === 'individual'\n ? 'https://api.githubcopilot.com'\n : `https://api.${config.accountType}.githubcopilot.com`\n}\nexport interface CopilotHeaderOptions {\n initiator?: 'user' | 'agent'\n requestContext?: Partial<CapiRequestContext>\n vision?: boolean\n}\n\nexport function copilotHeaders(\n auth: ClientAuth,\n config: ClientConfig,\n options: CopilotHeaderOptions = {},\n) {\n const requestContext = options.requestContext\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${auth.copilotToken}`,\n 'content-type': standardHeaders()['content-type'],\n 'copilot-integration-id': 'vscode-chat',\n 'editor-version': `vscode/${config.vsCodeVersion ?? 'unknown'}`,\n 'editor-plugin-version': EDITOR_PLUGIN_VERSION,\n 'user-agent': USER_AGENT,\n 'openai-intent': 'conversation-panel',\n 'x-github-api-version': API_VERSION,\n 'x-request-id': randomUUID(),\n 'x-vscode-user-agent-library-version': 'electron-fetch',\n }\n\n if (options.vision)\n headers['copilot-vision-request'] = 'true'\n\n if (options.initiator) {\n headers['X-Initiator'] = options.initiator\n }\n\n if (requestContext?.interactionType) {\n headers['X-Interaction-Type'] = requestContext.interactionType\n }\n if (requestContext?.agentTaskId) {\n headers['X-Agent-Task-Id'] = requestContext.agentTaskId\n }\n if (requestContext?.parentAgentTaskId) {\n headers['X-Parent-Agent-Id'] = requestContext.parentAgentTaskId\n }\n if (requestContext?.clientSessionId) {\n headers['X-Client-Session-Id'] = requestContext.clientSessionId\n }\n if (requestContext?.interactionId) {\n headers['X-Interaction-Id'] = requestContext.interactionId\n }\n if (requestContext?.clientMachineId) {\n headers['X-Client-Machine-Id'] = requestContext.clientMachineId\n }\n\n return headers\n}\n\nexport const GITHUB_API_BASE_URL = 'https://api.github.com'\nexport function githubHeaders(auth: ClientAuth, config: ClientConfig) {\n return {\n ...standardHeaders(),\n 'authorization': `token ${auth.githubToken}`,\n 'editor-version': `vscode/${config.vsCodeVersion ?? 'unknown'}`,\n 'editor-plugin-version': EDITOR_PLUGIN_VERSION,\n 'user-agent': USER_AGENT,\n 'x-github-api-version': API_VERSION,\n 'x-vscode-user-agent-library-version': 'electron-fetch',\n }\n}\n\nexport const GITHUB_BASE_URL = 'https://github.com'\nexport const GITHUB_CLIENT_ID = 'Iv1.b507a08c87ecfe98'\nexport const GITHUB_APP_SCOPES = ['read:user'].join(' ')\n","import consola from 'consola'\n\nexport interface HTTPErrorBody {\n error: {\n message: string\n type: string\n param?: string\n code?: string\n details?: Array<{ path: unknown, message: string }>\n }\n}\n\n/**\n * Elysia-native error class with `status` property and `toResponse()`.\n * Elysia auto-handles this via `toResponse()` when thrown in route handlers.\n */\nexport class HTTPError extends Error {\n readonly status: number\n readonly body: HTTPErrorBody\n\n constructor(status: number, body: HTTPErrorBody) {\n super(body.error.message)\n this.name = 'HTTPError'\n this.status = status\n this.body = body\n }\n\n toResponse() {\n return Response.json(this.body, { status: this.status })\n }\n}\n\nexport function throwInvalidRequestError(\n message: string,\n param: string,\n code?: string,\n): never {\n throw new HTTPError(400, {\n error: {\n message,\n type: 'invalid_request_error',\n param,\n ...(code ? { code } : {}),\n },\n })\n}\n\nexport function fromTranslationFailure(failure: { message: string, status: number }): HTTPError {\n return new HTTPError(failure.status, {\n error: { message: failure.message, type: 'translation_error' },\n })\n}\n\nfunction isStructuredErrorPayload(\n value: unknown,\n): value is { error: Record<string, unknown> } {\n return typeof value === 'object'\n && value !== null\n && 'error' in value\n && typeof value.error === 'object'\n && value.error !== null\n}\n\n/**\n * Read an upstream Response body and throw an HTTPError with structured payload.\n * Used by CopilotClient when upstream returns a non-OK response.\n */\nexport async function throwUpstreamError(message: string, response: Response): Promise<never> {\n let body: HTTPErrorBody\n try {\n const text = await response.text()\n const json = JSON.parse(text)\n body = isStructuredErrorPayload(json)\n ? json as HTTPErrorBody\n : { error: { message: text, type: 'upstream_error' } }\n }\n catch {\n body = { error: { message, type: 'upstream_error' } }\n }\n consola.error('Upstream error:', body)\n throw new HTTPError(response.status, body)\n}\n","import type { ClientAuth, ClientConfig, ClientDeps } from './types'\nimport type {\n CapiChatCompletionResponse,\n CapiChatCompletionsPayload,\n CapiRequestContext,\n} from '~/core/capi'\nimport type { AnthropicMessagesPayload } from '~/translator'\nimport type {\n EmbeddingRequest,\n EmbeddingResponse,\n ModelsResponse,\n ResponseDeletionResult,\n ResponseInputItemsListParams,\n ResponseInputItemsListResult,\n ResponseInputTokensResult,\n ResponseRetrieveParams,\n ResponsesInputTokensPayload,\n ResponsesPayload,\n ResponsesResult,\n} from '~/types'\n\nimport consola from 'consola'\n\nimport { events } from 'fetch-event-stream'\nimport { copilotBaseUrl, copilotHeaders } from '~/lib/api-config'\n\nimport { throwUpstreamError } from '~/lib/error'\n\nexport class CopilotClient {\n private auth: ClientAuth\n private config: ClientConfig\n private fetchImpl: typeof fetch\n\n constructor(auth: ClientAuth, config: ClientConfig, deps?: ClientDeps) {\n this.auth = auth\n this.config = config\n this.fetchImpl = deps?.fetch ?? fetch\n }\n\n private requireToken(): void {\n if (!this.auth.copilotToken) {\n throw new Error('Copilot token not found')\n }\n }\n\n async createChatCompletions(\n payload: CapiChatCompletionsPayload,\n options?: {\n signal?: AbortSignal\n initiator?: 'user' | 'agent'\n requestContext?: CapiRequestContext\n },\n ) {\n this.requireToken()\n\n const enableVision = payload.messages.some(\n x =>\n typeof x.content !== 'string'\n && x.content?.some(content => content.type === 'image_url'),\n )\n\n const initiator = options?.initiator\n ?? (payload.messages.some(msg => ['assistant', 'tool'].includes(msg.role))\n ? 'agent'\n : 'user')\n\n const headers = copilotHeaders(this.auth, this.config, {\n vision: enableVision,\n initiator,\n requestContext: options?.requestContext,\n })\n\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/chat/completions`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to create chat completions', response)\n await throwUpstreamError('Failed to create chat completions', response)\n }\n\n if (payload.stream) {\n return events(response)\n }\n\n return (await response.json()) as CapiChatCompletionResponse\n }\n\n async createEmbeddings(\n payload: EmbeddingRequest,\n ): Promise<EmbeddingResponse> {\n this.requireToken()\n\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/embeddings`,\n {\n method: 'POST',\n headers: copilotHeaders(this.auth, this.config),\n body: JSON.stringify(payload),\n },\n )\n\n if (!response.ok) {\n await throwUpstreamError('Failed to create embeddings', response)\n }\n\n return (await response.json()) as EmbeddingResponse\n }\n\n async getModels(): Promise<ModelsResponse> {\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/models`,\n {\n headers: copilotHeaders(this.auth, this.config),\n },\n )\n\n if (!response.ok)\n await throwUpstreamError('Failed to get models', response)\n\n return (await response.json()) as ModelsResponse\n }\n\n async createResponses(\n payload: ResponsesPayload,\n options?: {\n signal?: AbortSignal\n initiator?: 'user' | 'agent'\n vision?: boolean\n requestContext?: Partial<CapiRequestContext>\n },\n ) {\n this.requireToken()\n\n const headers = copilotHeaders(this.auth, this.config, {\n vision: options?.vision,\n initiator: options?.initiator,\n requestContext: options?.requestContext,\n })\n\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/responses`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to create responses', response)\n await throwUpstreamError('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\n async getResponse(\n responseId: string,\n options?: {\n signal?: AbortSignal\n params?: ResponseRetrieveParams\n requestContext?: Partial<CapiRequestContext>\n },\n ): Promise<ResponsesResult | Record<string, unknown>> {\n this.requireToken()\n\n const response = await this.fetchImpl(\n this.buildResponsesUrl(responseId, options?.params),\n {\n headers: copilotHeaders(this.auth, this.config, {\n requestContext: options?.requestContext,\n }),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to get response', response)\n await throwUpstreamError('Failed to get response', response)\n }\n\n return await response.json() as ResponsesResult | Record<string, unknown>\n }\n\n async getResponseInputItems(\n responseId: string,\n params?: ResponseInputItemsListParams,\n options?: {\n signal?: AbortSignal\n requestContext?: Partial<CapiRequestContext>\n },\n ): Promise<ResponseInputItemsListResult | Record<string, unknown>> {\n this.requireToken()\n\n const response = await this.fetchImpl(\n this.buildResponseInputItemsUrl(responseId, params),\n {\n headers: copilotHeaders(this.auth, this.config, {\n requestContext: options?.requestContext,\n }),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to get response input items', response)\n await throwUpstreamError('Failed to get response input items', response)\n }\n\n return await response.json() as ResponseInputItemsListResult | Record<string, unknown>\n }\n\n async createResponseInputTokens(\n payload: ResponsesInputTokensPayload,\n options?: {\n signal?: AbortSignal\n requestContext?: Partial<CapiRequestContext>\n },\n ): Promise<ResponseInputTokensResult | Record<string, unknown>> {\n this.requireToken()\n\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/responses/input_tokens`,\n {\n method: 'POST',\n headers: copilotHeaders(this.auth, this.config, {\n requestContext: options?.requestContext,\n }),\n body: JSON.stringify(payload),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to create response input tokens', response)\n await throwUpstreamError('Failed to create response input tokens', response)\n }\n\n return await response.json() as ResponseInputTokensResult | Record<string, unknown>\n }\n\n async deleteResponse(\n responseId: string,\n options?: {\n signal?: AbortSignal\n requestContext?: Partial<CapiRequestContext>\n },\n ): Promise<ResponseDeletionResult | Record<string, unknown>> {\n this.requireToken()\n\n const response = await this.fetchImpl(\n this.buildResponsesUrl(responseId),\n {\n method: 'DELETE',\n headers: copilotHeaders(this.auth, this.config, {\n requestContext: options?.requestContext,\n }),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to delete response', response)\n await throwUpstreamError('Failed to delete response', response)\n }\n\n return await response.json() as ResponseDeletionResult | Record<string, unknown>\n }\n\n async createMessages(\n payload: AnthropicMessagesPayload,\n anthropicBetaHeader?: string,\n options?: {\n signal?: AbortSignal\n requestContext?: Partial<CapiRequestContext>\n },\n ) {\n this.requireToken()\n\n const headers = copilotHeaders(this.auth, this.config, {\n initiator: 'agent',\n requestContext: options?.requestContext,\n })\n\n if (anthropicBetaHeader) {\n headers['anthropic-beta'] = anthropicBetaHeader\n }\n\n const response = await this.fetchImpl(\n `${copilotBaseUrl(this.config)}/v1/messages`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: options?.signal,\n },\n )\n\n if (!response.ok) {\n consola.error('Failed to create messages', response)\n await throwUpstreamError('Failed to create messages', response)\n }\n\n if (payload.stream) {\n return events(response)\n }\n\n return await response.json()\n }\n\n private buildResponsesUrl(\n responseId?: string,\n params?: ResponseRetrieveParams,\n ): string {\n const base = responseId\n ? `${copilotBaseUrl(this.config)}/responses/${encodeURIComponent(responseId)}`\n : `${copilotBaseUrl(this.config)}/responses`\n\n const searchParams = new URLSearchParams()\n if (params?.include?.length) {\n for (const include of params.include) {\n searchParams.append('include', include)\n }\n }\n if (typeof params?.starting_after === 'number') {\n searchParams.set('starting_after', String(params.starting_after))\n }\n if (typeof params?.include_obfuscation === 'boolean') {\n searchParams.set('include_obfuscation', String(params.include_obfuscation))\n }\n if (typeof params?.stream === 'boolean') {\n searchParams.set('stream', String(params.stream))\n }\n\n const query = searchParams.toString()\n return query ? `${base}?${query}` : base\n }\n\n private buildResponseInputItemsUrl(\n responseId: string,\n params?: ResponseInputItemsListParams,\n ): string {\n const base = `${copilotBaseUrl(this.config)}/responses/${encodeURIComponent(responseId)}/input_items`\n const searchParams = new URLSearchParams()\n\n if (params?.include?.length) {\n for (const include of params.include) {\n searchParams.append('include', include)\n }\n }\n if (typeof params?.after === 'string') {\n searchParams.set('after', params.after)\n }\n if (typeof params?.limit === 'number') {\n searchParams.set('limit', String(params.limit))\n }\n if (typeof params?.order === 'string') {\n searchParams.set('order', params.order)\n }\n\n const query = searchParams.toString()\n return query ? `${base}?${query}` : base\n }\n}\n\nexport function isNonStreamingResponse(\n response: Awaited<ReturnType<CopilotClient['createChatCompletions']>>,\n): response is CapiChatCompletionResponse {\n return Object.hasOwn(response, 'choices')\n}\n","export function sleep(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms)\n })\n}\n","import type { ClientAuth, ClientConfig, ClientDeps } from './types'\n\nimport type {\n CopilotUsageResponse,\n DeviceCodeResponse,\n GetCopilotTokenResponse,\n GithubUserResponse,\n} from '~/types'\n\nimport consola from 'consola'\nimport {\n GITHUB_API_BASE_URL,\n GITHUB_APP_SCOPES,\n GITHUB_BASE_URL,\n GITHUB_CLIENT_ID,\n githubHeaders,\n standardHeaders,\n} from '~/lib/api-config'\nimport { throwUpstreamError } from '~/lib/error'\n\nimport { sleep } from '~/lib/sleep'\n\nexport class GitHubClient {\n private auth: ClientAuth\n private config: ClientConfig\n private fetchImpl: typeof fetch\n\n constructor(auth: ClientAuth, config: ClientConfig, deps?: ClientDeps) {\n this.auth = auth\n this.config = config\n this.fetchImpl = deps?.fetch ?? fetch\n }\n\n async getCopilotUsage(): Promise<CopilotUsageResponse> {\n const response = await this.fetchImpl(\n `${GITHUB_API_BASE_URL}/copilot_internal/user`,\n {\n headers: githubHeaders(this.auth, this.config),\n },\n )\n\n if (!response.ok) {\n await throwUpstreamError('Failed to get Copilot usage', response)\n }\n\n return (await response.json()) as CopilotUsageResponse\n }\n\n async getCopilotToken(): Promise<GetCopilotTokenResponse> {\n const response = await this.fetchImpl(\n `${GITHUB_API_BASE_URL}/copilot_internal/v2/token`,\n {\n headers: githubHeaders(this.auth, this.config),\n },\n )\n\n if (!response.ok) {\n await throwUpstreamError('Failed to get Copilot token', response)\n }\n\n return (await response.json()) as GetCopilotTokenResponse\n }\n\n async getDeviceCode(): Promise<DeviceCodeResponse> {\n const response = await this.fetchImpl(\n `${GITHUB_BASE_URL}/login/device/code`,\n {\n method: 'POST',\n headers: standardHeaders(),\n body: JSON.stringify({\n client_id: GITHUB_CLIENT_ID,\n scope: GITHUB_APP_SCOPES,\n }),\n },\n )\n\n if (!response.ok) {\n await throwUpstreamError('Failed to get device code', response)\n }\n\n return (await response.json()) as DeviceCodeResponse\n }\n\n async pollAccessToken(deviceCode: DeviceCodeResponse): Promise<string> {\n const MAX_POLL_ATTEMPTS = 60 // ~5 minutes at 5s intervals\n const sleepDuration = (deviceCode.interval + 1) * 1000\n consola.debug(`Polling access token with interval of ${sleepDuration}ms`)\n\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n const response = await this.fetchImpl(\n `${GITHUB_BASE_URL}/login/oauth/access_token`,\n {\n method: 'POST',\n headers: standardHeaders(),\n body: JSON.stringify({\n client_id: GITHUB_CLIENT_ID,\n device_code: deviceCode.device_code,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }),\n },\n )\n\n if (!response.ok) {\n await sleep(sleepDuration)\n consola.error('Failed to poll access token:', await response.text())\n continue\n }\n\n const json = (await response.json()) as AccessTokenResponse\n consola.debug('Polling access token response:', json)\n\n if (json.access_token) {\n return json.access_token\n }\n\n await sleep(sleepDuration)\n }\n\n throw new Error('Device code authorization timed out')\n }\n\n async getGitHubUser(): Promise<GithubUserResponse> {\n const response = await this.fetchImpl(`${GITHUB_API_BASE_URL}/user`, {\n headers: {\n authorization: `token ${this.auth.githubToken}`,\n ...standardHeaders(),\n },\n })\n\n if (!response.ok) {\n await throwUpstreamError('Failed to get GitHub user', response)\n }\n\n return (await response.json()) as GithubUserResponse\n }\n}\n\ninterface AccessTokenResponse {\n access_token: string\n token_type: string\n scope: string\n}\n","import { execFile } from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { promisify } from 'node:util'\n\nconst FALLBACK = '1.104.3'\nconst execFileAsync = promisify(execFile)\n\nfunction extractVersion(text: string): string | undefined {\n const versionLine = text\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .find(line => /^\\d+\\.\\d+\\.\\d+$/.test(line))\n\n return versionLine || undefined\n}\n\nasync function getRemoteVSCodeVersion(): Promise<string | undefined> {\n const controller = new AbortController()\n const timeout = setTimeout(() => {\n controller.abort()\n }, 5000)\n\n try {\n const response = await fetch(\n 'https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=visual-studio-code-bin',\n {\n signal: controller.signal,\n },\n )\n\n const pkgbuild = await response.text()\n const pkgverRegex = /pkgver=([0-9.]+)/\n const match = pkgbuild.match(pkgverRegex)\n\n return match?.[1]\n }\n catch {\n return undefined\n }\n finally {\n clearTimeout(timeout)\n }\n}\n\nasync function getVSCodeVersionFromCommand(): Promise<string | undefined> {\n const commands = process.platform === 'win32'\n ? ['code.cmd', 'code-insiders.cmd', 'code']\n : ['code', 'code-insiders']\n\n for (const command of commands) {\n try {\n const result = await execFileAsync(command, ['--version'], {\n timeout: 3000,\n windowsHide: true,\n })\n const version = extractVersion(result.stdout)\n if (version) {\n return version\n }\n }\n catch {\n continue\n }\n }\n\n return undefined\n}\n\nfunction getVSCodePackageJsonCandidates(): Array<string> {\n const homeDirectory = os.homedir()\n const candidates = new Set<string>([\n '/usr/share/code/resources/app/package.json',\n '/usr/share/code-insiders/resources/app/package.json',\n '/var/lib/flatpak/app/com.visualstudio.code/current/active/files/extra/vscode/resources/app/package.json',\n '/Applications/Visual Studio Code.app/Contents/Resources/app/package.json',\n '/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/package.json',\n path.join(homeDirectory, 'Applications', 'Visual Studio Code.app', 'Contents', 'Resources', 'app', 'package.json'),\n path.join(homeDirectory, 'Applications', 'Visual Studio Code - Insiders.app', 'Contents', 'Resources', 'app', 'package.json'),\n ])\n\n const windowsRoots = [\n process.env.LOCALAPPDATA,\n process.env.PROGRAMFILES,\n process.env['PROGRAMFILES(X86)'],\n ].filter((value): value is string => Boolean(value))\n\n for (const root of windowsRoots) {\n candidates.add(\n path.join(root, 'Programs', 'Microsoft VS Code', 'resources', 'app', 'package.json'),\n )\n candidates.add(\n path.join(root, 'Programs', 'Microsoft VS Code Insiders', 'resources', 'app', 'package.json'),\n )\n candidates.add(\n path.join(root, 'Microsoft VS Code', 'resources', 'app', 'package.json'),\n )\n candidates.add(\n path.join(root, 'Microsoft VS Code Insiders', 'resources', 'app', 'package.json'),\n )\n }\n\n return [...candidates]\n}\n\nasync function getVSCodeVersionFromPackageJson(): Promise<string | undefined> {\n const candidates = getVSCodePackageJsonCandidates()\n\n for (const candidate of candidates) {\n try {\n const content = await fs.readFile(candidate, 'utf8')\n const parsed = JSON.parse(content) as { version?: string }\n if (parsed.version) {\n return parsed.version\n }\n }\n catch {\n continue\n }\n }\n\n return undefined\n}\n\nasync function getLocalVSCodeVersion(): Promise<string | undefined> {\n return (\n await getVSCodeVersionFromCommand()\n ?? await getVSCodeVersionFromPackageJson()\n )\n}\n\nexport async function getVSCodeVersion() {\n const [remoteVersion, localVersion] = await Promise.all([\n getRemoteVSCodeVersion(),\n getLocalVSCodeVersion(),\n ])\n\n return remoteVersion ?? localVersion ?? FALLBACK\n}\n","import type { ClientConfig } from '~/clients'\nimport type { ModelsResponse } from '~/types'\n\nimport consola from 'consola'\n\nimport { CopilotClient, getVSCodeVersion } from '~/clients'\n\nexport interface AuthState {\n githubToken?: string\n copilotToken?: string\n copilotApiBase?: string\n}\n\nexport interface RuntimeConfig {\n accountType: 'individual' | 'business' | 'enterprise'\n manualApprove: boolean\n rateLimitSeconds?: number\n rateLimitWait: boolean\n showToken: boolean\n upstreamTimeoutSeconds?: number\n}\n\nexport interface CacheState {\n models?: ModelsResponse\n vsCodeVersion?: string\n}\n\nexport interface RateLimitState {\n lastRequestTimestamp?: number\n}\n\nexport interface AppState {\n auth: AuthState\n config: RuntimeConfig\n cache: CacheState\n rateLimit: RateLimitState\n}\n\nexport const state: AppState = {\n auth: {},\n config: {\n accountType: 'individual',\n manualApprove: false,\n rateLimitWait: false,\n showToken: false,\n },\n cache: {},\n rateLimit: {},\n}\n\nexport function getClientConfig(): ClientConfig {\n return {\n accountType: state.config.accountType,\n vsCodeVersion: state.cache.vsCodeVersion,\n copilotApiBase: state.auth.copilotApiBase,\n }\n}\n\nexport function createCopilotClient(): CopilotClient {\n return new CopilotClient(state.auth, getClientConfig())\n}\n\nexport async function cacheModels(client?: CopilotClient): Promise<void> {\n const copilotClient = client ?? createCopilotClient()\n\n const models = await copilotClient.getModels()\n\n state.cache.models = models\n}\n\nexport async function cacheVSCodeVersion() {\n const response = await getVSCodeVersion()\n state.cache.vsCodeVersion = response\n\n consola.info(`Using VSCode version: ${response}`)\n}\n","import type { GetCopilotTokenResponse } from '~/types'\n\nimport consola from 'consola'\n\nimport { GitHubClient } from '~/clients'\n\nimport { getCachedConfig, writeConfigField } from './config'\nimport { HTTPError } from './error'\nimport { cacheVSCodeVersion, getClientConfig, state } from './state'\n\nasync function writeGithubToken(token: string): Promise<void> {\n await writeConfigField('githubToken', token)\n}\n\nexport async function setupCopilotToken() {\n await ensureVSCodeVersion()\n const githubClient = createGitHubClient()\n const response = await githubClient.getCopilotToken()\n applyCopilotTokenState(response)\n\n consola.debug('GitHub Copilot Token fetched successfully!')\n if (state.config.showToken) {\n consola.info('Copilot token:', response.token)\n }\n\n const REFRESH_BUFFER_SECONDS = 60\n const refreshInterval = (response.refresh_in - REFRESH_BUFFER_SECONDS) * 1000\n const refreshCopilotToken = async () => {\n consola.debug('Refreshing Copilot token')\n try {\n const refreshed = await githubClient.getCopilotToken()\n applyCopilotTokenState(refreshed)\n consola.debug('Copilot token refreshed')\n if (state.config.showToken) {\n consola.info('Refreshed Copilot token:', refreshed.token)\n }\n }\n catch (error) {\n consola.error('Failed to refresh Copilot token:', error)\n }\n }\n\n setInterval(() => {\n void refreshCopilotToken()\n }, refreshInterval)\n}\n\ninterface SetupGitHubTokenOptions {\n force?: boolean\n}\n\nexport async function setupGitHubToken(\n options?: SetupGitHubTokenOptions,\n): Promise<void> {\n try {\n await ensureVSCodeVersion()\n\n const cachedToken = getCachedConfig().githubToken\n const githubToken = cachedToken?.trim() || ''\n\n if (githubToken && !options?.force) {\n state.auth.githubToken = githubToken\n if (state.config.showToken) {\n consola.info('GitHub token:', githubToken)\n }\n try {\n await logUser()\n return\n }\n catch (error) {\n if (isAuthError(error) && !options?.force) {\n consola.warn(\n 'Stored GitHub token invalid or expired. Re-authenticating...',\n )\n await setupGitHubToken({ force: true })\n return\n }\n throw error\n }\n }\n\n consola.info('Not logged in, getting new access token')\n const githubClient = createGitHubClient()\n const response = await githubClient.getDeviceCode()\n consola.debug('Device code response:', response)\n\n consola.info(\n `Please enter the code \"${response.user_code}\" in ${response.verification_uri}`,\n )\n\n const token = await githubClient.pollAccessToken(response)\n await writeGithubToken(token)\n state.auth.githubToken = token\n\n if (state.config.showToken) {\n consola.info('GitHub token:', token)\n }\n await logUser()\n }\n catch (error) {\n if (error instanceof HTTPError) {\n consola.error('Failed to get GitHub token:', error.body)\n throw error\n }\n\n consola.error('Failed to get GitHub token:', error)\n throw error\n }\n}\n\nfunction isAuthError(error: unknown) {\n return error instanceof HTTPError\n && (error.status === 401 || error.status === 403)\n}\n\nasync function logUser() {\n const githubClient = createGitHubClient()\n const user = await githubClient.getGitHubUser()\n consola.info(`Logged in as ${user.login}`)\n}\n\nfunction createGitHubClient() {\n return new GitHubClient(state.auth, getClientConfig())\n}\n\nfunction applyCopilotTokenState(response: GetCopilotTokenResponse) {\n state.auth.copilotToken = response.token\n state.auth.copilotApiBase = normalizeCopilotApiBase(response.endpoints?.api)\n}\n\nfunction normalizeCopilotApiBase(value?: string): string | undefined {\n if (!value) {\n return undefined\n }\n return value.replace(/\\/+$/, '')\n}\n\nasync function ensureVSCodeVersion() {\n if (!state.cache.vsCodeVersion) {\n await cacheVSCodeVersion()\n }\n}\n","#!/usr/bin/env node\n\nimport { defineCommand } from 'citty'\nimport consola from 'consola'\n\nimport { readConfig } from './lib/config'\nimport { ensurePaths } from './lib/paths'\nimport { cacheVSCodeVersion, state } from './lib/state'\nimport { setupGitHubToken } from './lib/token'\n\ninterface RunAuthOptions {\n verbose: boolean\n showToken: boolean\n}\n\nexport async function runAuth(options: RunAuthOptions): Promise<void> {\n if (options.verbose) {\n consola.level = 5\n consola.info('Verbose logging enabled')\n }\n\n state.config.showToken = options.showToken\n\n await ensurePaths()\n await readConfig()\n await cacheVSCodeVersion()\n await setupGitHubToken({ force: true })\n consola.success('GitHub token written to config.json')\n}\n\nexport const auth = defineCommand({\n meta: {\n name: 'auth',\n description: 'Run GitHub auth flow without running the server',\n },\n args: {\n 'verbose': {\n alias: 'v',\n type: 'boolean',\n default: false,\n description: 'Enable verbose logging',\n },\n 'show-token': {\n type: 'boolean',\n default: false,\n description: 'Show GitHub token on auth',\n },\n },\n run({ args }) {\n return runAuth({\n verbose: args.verbose,\n showToken: args['show-token'],\n })\n },\n})\n","import type { QuotaDetail } from '~/types'\nimport process from 'node:process'\nimport { defineCommand } from 'citty'\n\nimport consola from 'consola'\n\nimport { GitHubClient } from '~/clients'\n\nimport { readConfig } from './lib/config'\nimport { ensurePaths } from './lib/paths'\nimport { cacheVSCodeVersion, getClientConfig, state } from './lib/state'\nimport { setupGitHubToken } from './lib/token'\n\nexport const checkUsage = defineCommand({\n meta: {\n name: 'check-usage',\n description: 'Show current GitHub Copilot usage/quota information',\n },\n async run() {\n await ensurePaths()\n await readConfig()\n await cacheVSCodeVersion()\n await setupGitHubToken()\n try {\n const githubClient = new GitHubClient(state.auth, getClientConfig())\n const usage = await githubClient.getCopilotUsage()\n const premium = usage.quota_snapshots.premium_interactions\n const premiumTotal = premium.entitlement\n const premiumUsed = premiumTotal - premium.remaining\n const premiumPercentUsed\n = premiumTotal > 0 ? (premiumUsed / premiumTotal) * 100 : 0\n const premiumPercentRemaining = premium.percent_remaining\n\n // Helper to summarize a quota snapshot\n function summarizeQuota(name: string, snap: QuotaDetail | undefined) {\n if (!snap)\n return `${name}: N/A`\n const total = snap.entitlement\n const used = total - snap.remaining\n const percentUsed = total > 0 ? (used / total) * 100 : 0\n const percentRemaining = snap.percent_remaining\n return `${name}: ${used}/${total} used (${percentUsed.toFixed(1)}% used, ${percentRemaining.toFixed(1)}% remaining)`\n }\n\n const premiumLine = `Premium: ${premiumUsed}/${premiumTotal} used (${premiumPercentUsed.toFixed(1)}% used, ${premiumPercentRemaining.toFixed(1)}% remaining)`\n const chatLine = summarizeQuota('Chat', usage.quota_snapshots.chat)\n const completionsLine = summarizeQuota(\n 'Completions',\n usage.quota_snapshots.completions,\n )\n\n consola.box(\n `Copilot Usage (plan: ${usage.copilot_plan})\\n`\n + `Quota resets: ${usage.quota_reset_date}\\n`\n + `\\nQuotas:\\n`\n + ` ${premiumLine}\\n`\n + ` ${chatLine}\\n`\n + ` ${completionsLine}`,\n )\n }\n catch (err) {\n consola.error('Failed to fetch Copilot usage:', err)\n process.exit(1)\n }\n },\n})\n","import { readFileSync } from 'node:fs'\n\ndeclare const __GHC_PROXY_VERSION__: string | undefined\n\nfunction readVersionFromSource(): string {\n try {\n const url = new URL('../../package.json', import.meta.url)\n const packageJson = JSON.parse(readFileSync(url, 'utf8')) as { version: string }\n return packageJson.version\n }\n catch {\n return 'unknown'\n }\n}\n\n// Build-time injected by tsdown `define`; falls back to reading package.json in dev\nexport const VERSION: string = typeof __GHC_PROXY_VERSION__ !== 'undefined'\n ? __GHC_PROXY_VERSION__\n : readVersionFromSource()\n","#!/usr/bin/env node\n\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport { defineCommand } from 'citty'\nimport consola from 'consola'\n\nimport { getCachedConfig } from './lib/config'\nimport { PATHS } from './lib/paths'\nimport { VERSION } from './lib/version'\n\ninterface DebugInfo {\n version: string\n runtime: {\n name: string\n version: string\n platform: string\n arch: string\n }\n paths: {\n APP_DIR: string\n CONFIG_PATH: string\n }\n configExists: boolean\n tokenExists: boolean\n}\n\ninterface RunDebugOptions {\n json: boolean\n}\n\nfunction getRuntimeInfo() {\n return {\n name: 'bun',\n version: Bun.version,\n platform: os.platform(),\n arch: os.arch(),\n }\n}\n\nfunction hasToken(): boolean {\n try {\n const config = getCachedConfig()\n return Boolean(config.githubToken?.trim())\n }\n catch {\n return false\n }\n}\n\nasync function checkConfigExists(): Promise<boolean> {\n try {\n const stats = await fs.stat(PATHS.CONFIG_PATH)\n if (!stats.isFile())\n return false\n\n const content = await fs.readFile(PATHS.CONFIG_PATH, 'utf8')\n return content.trim().length > 0\n }\n catch {\n return false\n }\n}\n\nasync function getDebugInfo(): Promise<DebugInfo> {\n const configExists = await checkConfigExists()\n\n return {\n version: VERSION,\n runtime: getRuntimeInfo(),\n paths: {\n APP_DIR: PATHS.APP_DIR,\n CONFIG_PATH: PATHS.CONFIG_PATH,\n },\n configExists,\n tokenExists: hasToken(),\n }\n}\n\nfunction printDebugInfoPlain(info: DebugInfo): void {\n consola.info(`ghc-proxy debug\n\nVersion: ${info.version}\nRuntime: ${info.runtime.name} ${info.runtime.version} (${info.runtime.platform} ${info.runtime.arch})\n\nPaths:\n- APP_DIR: ${info.paths.APP_DIR}\n- CONFIG_PATH: ${info.paths.CONFIG_PATH}\n\nConfig exists: ${info.configExists ? 'Yes' : 'No'}\nToken exists: ${info.tokenExists ? 'Yes' : 'No'}`)\n}\n\nexport async function runDebug(options: RunDebugOptions): Promise<void> {\n const debugInfo = await getDebugInfo()\n\n if (options.json) {\n await Bun.write(Bun.stdout, `${JSON.stringify(debugInfo, null, 2)}\\n`)\n }\n else {\n printDebugInfoPlain(debugInfo)\n }\n}\n\nexport const debug = defineCommand({\n meta: {\n name: 'debug',\n description: 'Print debug information about the application',\n },\n args: {\n json: {\n type: 'boolean',\n default: false,\n description: 'Output debug information as JSON',\n },\n },\n run({ args }) {\n return runDebug({\n json: args.json,\n })\n },\n})\n","import type { Dispatcher } from 'undici'\nimport consola from 'consola'\nimport { getProxyForUrl } from 'proxy-from-env'\nimport { Agent, ProxyAgent, setGlobalDispatcher } from 'undici'\n\nexport function initProxyFromEnv(): void {\n if (typeof Bun !== 'undefined')\n return\n\n try {\n const direct = new Agent()\n const proxies = new Map<string, ProxyAgent>()\n\n // We only need a minimal dispatcher that implements `dispatch` at runtime.\n // Typing the object as `Dispatcher` forces TypeScript to require many\n // additional methods. Instead, keep a plain object and cast when passing\n // to `setGlobalDispatcher`.\n const dispatcher = {\n dispatch(\n options: Dispatcher.DispatchOptions,\n handler: Dispatcher.DispatchHandler,\n ) {\n try {\n const origin\n = typeof options.origin === 'string'\n ? new URL(options.origin)\n : (options.origin as URL)\n const get = getProxyForUrl as unknown as (\n u: string,\n ) => string | undefined\n const raw = get(origin.toString())\n const proxyUrl = raw && raw.length > 0 ? raw : undefined\n if (!proxyUrl) {\n consola.debug(`HTTP proxy bypass: ${origin.hostname}`)\n return (direct as unknown as Dispatcher).dispatch(options, handler)\n }\n let agent = proxies.get(proxyUrl)\n if (!agent) {\n agent = new ProxyAgent(proxyUrl)\n proxies.set(proxyUrl, agent)\n }\n let label = proxyUrl\n try {\n const u = new URL(proxyUrl)\n label = `${u.protocol}//${u.host}`\n }\n catch {\n /* noop */\n }\n consola.debug(`HTTP proxy route: ${origin.hostname} via ${label}`)\n return (agent as unknown as Dispatcher).dispatch(options, handler)\n }\n catch {\n return (direct as unknown as Dispatcher).dispatch(options, handler)\n }\n },\n close() {\n return direct.close()\n },\n destroy() {\n return direct.destroy()\n },\n }\n\n setGlobalDispatcher(dispatcher as unknown as Dispatcher)\n consola.debug('HTTP proxy configured from environment (per-URL)')\n }\n catch (err) {\n consola.debug('Proxy setup skipped:', err)\n }\n}\n","import { execFileSync } from 'node:child_process'\nimport path from 'node:path'\nimport process from 'node:process'\n\ntype ShellName = 'bash' | 'zsh' | 'fish' | 'powershell' | 'cmd' | 'sh'\ntype EnvVars = Record<string, string | undefined>\n\nfunction normalizeShellName(raw: string | undefined): ShellName | undefined {\n if (!raw) {\n return undefined\n }\n\n const normalized = path.basename(raw).toLowerCase().replace(/\\.exe$/i, '')\n\n switch (normalized) {\n case 'pwsh':\n case 'powershell': {\n return 'powershell'\n }\n case 'cmd': {\n return 'cmd'\n }\n case 'bash': {\n return 'bash'\n }\n case 'zsh': {\n return 'zsh'\n }\n case 'fish': {\n return 'fish'\n }\n case 'sh': {\n return 'sh'\n }\n default: {\n return undefined\n }\n }\n}\n\nfunction detectWindowsShellFromEnv(env: NodeJS.ProcessEnv): ShellName | undefined {\n if (\n env.PSModulePath\n || env.PSExecutionPolicyPreference\n || env.POWERSHELL_DISTRIBUTION_CHANNEL\n ) {\n return 'powershell'\n }\n\n const shellHints = [\n env.CODEX_SHELL,\n env.npm_config_script_shell,\n env.SHELL,\n env.ComSpec,\n ]\n\n for (const hint of shellHints) {\n const detectedShell = normalizeShellName(hint)\n if (detectedShell) {\n return detectedShell\n }\n }\n\n return undefined\n}\n\nfunction detectWindowsShellFromParent(ppid: number): ShellName | undefined {\n try {\n const parentProcess = execFileSync(\n 'powershell',\n [\n '-NoProfile',\n '-NonInteractive',\n '-Command',\n `(Get-CimInstance Win32_Process -Filter \"ProcessId = ${ppid}\").Name`,\n ],\n { stdio: 'pipe' },\n )\n .toString()\n .trim()\n\n return normalizeShellName(parentProcess)\n }\n catch {\n return undefined\n }\n}\n\nfunction getShell(): ShellName {\n const { platform, ppid, env } = process\n\n if (platform === 'win32') {\n return detectWindowsShellFromEnv(env)\n ?? detectWindowsShellFromParent(ppid)\n ?? 'cmd'\n }\n else {\n const shellPath = env.SHELL\n const detectedShell = normalizeShellName(shellPath)\n if (\n detectedShell\n && detectedShell !== 'cmd'\n && detectedShell !== 'powershell'\n ) {\n return detectedShell\n }\n\n return 'sh'\n }\n}\n\nfunction escapeForPowerShell(value: string): string {\n return `'${value.replaceAll('\\'', '\\'\\'')}'`\n}\n\nfunction escapeForCmd(value: string): string {\n return value.replaceAll('\"', '\"\"')\n}\n\n/**\n * Generates a copy-pasteable script to set multiple environment variables\n * and run a subsequent command.\n * @param {EnvVars} envVars - An object of environment variables to set.\n * @param {string} commandToRun - The command to run after setting the variables.\n * @returns {string} The formatted script string.\n */\nexport function generateEnvScript(\n envVars: EnvVars,\n commandToRun: string = '',\n): string {\n const shell = getShell()\n const filteredEnvVars = Object.entries(envVars).filter(\n ([, value]) => value !== undefined,\n ) as Array<[string, string]>\n\n let commandBlock: string\n\n switch (shell) {\n case 'powershell': {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `$env:${key} = ${escapeForPowerShell(value)}`)\n .join('; ')\n break\n }\n case 'cmd': {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set \"${key}=${escapeForCmd(value)}\"`)\n .join(' & ')\n break\n }\n case 'fish': {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set -gx ${key} ${value}`)\n .join('; ')\n break\n }\n default: {\n // bash, zsh, sh\n const assignments = filteredEnvVars\n .map(([key, value]) => `${key}=${value}`)\n .join(' ')\n commandBlock = filteredEnvVars.length > 0 ? `export ${assignments}` : ''\n break\n }\n }\n\n if (commandBlock && commandToRun) {\n const separator = shell === 'cmd' ? ' & ' : ' && '\n return `${commandBlock}${separator}${commandToRun}`\n }\n\n return commandBlock || commandToRun\n}\n","import consola from 'consola'\nimport { colorize } from 'consola/utils'\n\nexport interface ModelMappingInfo {\n originalModel?: string\n mappedModel?: string\n}\n\nexport function formatElapsed(start: number) {\n const delta = Date.now() - start\n return delta < 1000 ? `${delta}ms` : `${Math.round(delta / 1000)}s`\n}\n\nfunction formatPath(rawUrl: string) {\n try {\n const url = new URL(rawUrl)\n return `${url.pathname}${url.search}`\n }\n catch {\n return rawUrl\n }\n}\n\nfunction colorizeStatus(status: number): string {\n if (status >= 500)\n return colorize('red', status)\n if (status >= 400)\n return colorize('yellow', status)\n if (status >= 300)\n return colorize('cyan', status)\n return colorize('green', status)\n}\n\nconst methodColors: Record<string, Parameters<typeof colorize>[0]> = {\n GET: 'cyan',\n POST: 'magenta',\n PUT: 'yellow',\n PATCH: 'yellow',\n DELETE: 'red',\n}\n\nfunction colorizeMethod(method: string): string {\n return colorize(methodColors[method] ?? 'white', method)\n}\n\nfunction formatModelMapping(info: ModelMappingInfo | undefined): string {\n if (!info)\n return ''\n\n const { originalModel, mappedModel } = info\n if (!originalModel && !mappedModel)\n return ''\n\n const original = originalModel ?? '-'\n const mapped = mappedModel ?? '-'\n\n if (original === mapped) {\n return ` ${colorize('dim', 'model=')}${colorize('blueBright', original)}`\n }\n\n return ` ${colorize('dim', 'model=')}${colorize('blueBright', original)} ${colorize('dim', '→')} ${colorize('greenBright', mapped)}`\n}\n\n/**\n * Request logging function.\n * Logs a formatted request line with method, path, status, elapsed time,\n * and optional model mapping info.\n */\nexport function logRequest(\n method: string,\n url: string,\n status: number,\n elapsed: string,\n modelInfo?: ModelMappingInfo,\n): void {\n const path = formatPath(url)\n const line = [\n colorizeMethod(method),\n colorize('white', path),\n colorizeStatus(status),\n colorize('dim', elapsed),\n ].join(' ')\n\n consola.info(`${line}${formatModelMapping(modelInfo)}`)\n}\n","import type { SSEOutput } from '~/lib/execution-strategy'\n\nimport { sse } from 'elysia'\n\n/**\n * Bridges an AsyncGenerator<SSEOutput> to Elysia's SSE response format.\n * Returns an async generator that yields sse() calls for each SSE output item.\n */\nexport async function* sseAdapter(generator: AsyncGenerator<SSEOutput>) {\n for await (const output of generator) {\n yield sse({\n id: output.id,\n event: output.event,\n data: output.data,\n })\n }\n}\n","import consola from 'consola'\n\nimport { HTTPError } from './error'\n\nexport async function awaitApproval() {\n const response = await consola.prompt(`Accept incoming request?`, {\n type: 'confirm',\n })\n\n if (!response) {\n throw new HTTPError(403, {\n error: { message: 'Request rejected', type: 'forbidden' },\n })\n }\n}\n","import type { AppState } from './state'\n\nimport consola from 'consola'\n\nimport { HTTPError } from './error'\nimport { sleep } from './sleep'\n\nexport async function checkRateLimit(state: AppState) {\n if (state.config.rateLimitSeconds === undefined)\n return\n\n const now = Date.now()\n\n if (!state.rateLimit.lastRequestTimestamp) {\n state.rateLimit.lastRequestTimestamp = now\n return\n }\n\n const elapsedSeconds = (now - state.rateLimit.lastRequestTimestamp) / 1000\n\n if (elapsedSeconds > state.config.rateLimitSeconds) {\n state.rateLimit.lastRequestTimestamp = now\n return\n }\n\n const waitTimeSeconds = Math.ceil(\n state.config.rateLimitSeconds - elapsedSeconds,\n )\n\n if (!state.config.rateLimitWait) {\n consola.warn(\n `Rate limit exceeded. Need to wait ${waitTimeSeconds} more seconds.`,\n )\n throw new HTTPError(429, {\n error: { message: 'Rate limit exceeded', type: 'rate_limit_error' },\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\n state.rateLimit.lastRequestTimestamp = now\n consola.info('Rate limit wait completed, proceeding with request')\n}\n","import { Elysia } from 'elysia'\n\nimport { awaitApproval } from '~/lib/approval'\nimport { checkRateLimit } from '~/lib/rate-limit'\nimport { state } from '~/lib/state'\n\n/**\n * Elysia macro for request guard middleware.\n * Usage: `.use(requestGuardPlugin)` then `.post('/path', handler, { guarded: true })`\n */\nexport const requestGuardPlugin = new Elysia({ name: 'request-guard' })\n .macro({\n guarded: (enabled: boolean) => ({\n async beforeHandle() {\n if (!enabled)\n return\n await runRequestGuard()\n },\n }),\n })\n\n/**\n * Core request guard logic.\n * Checks rate limits and optionally awaits manual approval.\n * Exported for direct use where the plugin is not applicable (e.g., tests).\n */\nexport async function runRequestGuard(): Promise<void> {\n await checkRateLimit(state)\n\n if (state.config.manualApprove) {\n await awaitApproval()\n }\n}\n","/**\n * Compile-time exhaustiveness check for switch/if-else chains on\n * discriminated unions. At runtime, throws with a descriptive message.\n */\nexport function assertNever(value: never, context?: string): never {\n const label = context ?? 'Unexpected value'\n throw new Error(`${label}: ${JSON.stringify(value)}`)\n}\n","import type { CapiChatCompletionsPayload } from './types'\nimport type { ConversationRequest } from '~/core/conversation'\nimport type { ReasoningEffort } from '~/types'\n\nexport interface CapiProfile {\n id: 'base' | 'claude'\n family: 'other' | 'claude' | 'gpt' | 'grok'\n enableCacheControl: boolean\n includeUsageOnStream: boolean\n applyThinking: (\n request: ConversationRequest,\n ) => Pick<CapiChatCompletionsPayload, 'reasoning_effort' | 'thinking_budget'>\n}\n\nfunction inferReasoningEffort(budgetTokens: number): ReasoningEffort {\n if (budgetTokens <= 8000) {\n return 'low'\n }\n if (budgetTokens <= 24000) {\n return 'medium'\n }\n return 'high'\n}\n\nexport function inferModelFamily(model: string): CapiProfile['family'] {\n if (model.startsWith('claude')) {\n return 'claude'\n }\n if (model.startsWith('gpt') || model.startsWith('o1') || model.startsWith('o3') || model.startsWith('o4')) {\n return 'gpt'\n }\n if (model.startsWith('grok')) {\n return 'grok'\n }\n return 'other'\n}\n\nconst baseProfile: CapiProfile = {\n id: 'base',\n family: 'other',\n enableCacheControl: false,\n includeUsageOnStream: false,\n applyThinking(request) {\n const thinking = request.thinking\n if (!thinking || thinking.type === 'disabled') {\n return {}\n }\n\n const budgetTokens = thinking.type === 'adaptive'\n ? 24000\n : thinking.budgetTokens\n\n return {\n reasoning_effort: inferReasoningEffort(budgetTokens),\n }\n },\n}\n\nconst claudeProfile: CapiProfile = {\n id: 'claude',\n family: 'claude',\n enableCacheControl: true,\n includeUsageOnStream: true,\n applyThinking(request) {\n const thinking = request.thinking\n if (!thinking || thinking.type === 'disabled') {\n return {}\n }\n\n const budgetTokens = thinking.type === 'adaptive'\n ? 24000\n : thinking.budgetTokens\n\n return {\n reasoning_effort: inferReasoningEffort(budgetTokens),\n thinking_budget: budgetTokens,\n }\n },\n}\n\nexport function selectCapiProfile(model: string): CapiProfile {\n return inferModelFamily(model) === 'claude'\n ? claudeProfile\n : baseProfile\n}\n","import type { CapiRequestContext } from './types'\n\nimport type { ConversationTurn } from '~/core/conversation'\nimport { randomUUID } from 'node:crypto'\n\nfunction readHeader(\n headers: Headers,\n name: string,\n): string | undefined {\n return headers.get(name) ?? undefined\n}\n\nexport function inferInitiator(turns: Array<ConversationTurn>): 'user' | 'agent' {\n return turns.some(turn => turn.role === 'assistant' || turn.role === 'tool')\n ? 'agent'\n : 'user'\n}\n\nexport function readCapiRequestContext(headers: Headers): Partial<CapiRequestContext> {\n return {\n interactionType: (readHeader(headers, 'x-interaction-type') as CapiRequestContext['interactionType'] | undefined),\n agentTaskId: readHeader(headers, 'x-agent-task-id'),\n parentAgentTaskId: readHeader(headers, 'x-parent-agent-id'),\n clientSessionId: readHeader(headers, 'x-client-session-id'),\n interactionId: readHeader(headers, 'x-interaction-id'),\n clientMachineId: readHeader(headers, 'x-client-machine-id'),\n }\n}\n\nexport function buildCapiRequestContext(\n initiator: 'user' | 'agent',\n overrides: Partial<CapiRequestContext> = {},\n): CapiRequestContext {\n return {\n interactionType:\n overrides.interactionType\n ?? (initiator === 'agent'\n ? 'conversation-agent'\n : 'conversation-user'),\n agentTaskId: overrides.agentTaskId,\n parentAgentTaskId: overrides.parentAgentTaskId,\n clientSessionId: overrides.clientSessionId,\n interactionId: overrides.interactionId ?? randomUUID(),\n clientMachineId: overrides.clientMachineId,\n }\n}\n","import type {\n CapiChatCompletionsPayload,\n CapiExecutionPlan,\n CapiMessage,\n CapiRequestContext,\n CapiTool,\n CopilotCacheControl,\n} from './types'\nimport type {\n CompletionOptions,\n ConversationImageBlock,\n ConversationRequest,\n ConversationTextBlock,\n ConversationToolResultBlock,\n ConversationTurn,\n} from '~/core/conversation'\nimport type {\n ContentPart,\n Message,\n} from '~/types'\n\nimport { assertNever } from '~/lib/assert-never'\nimport { selectCapiProfile } from './profile'\nimport { buildCapiRequestContext, inferInitiator } from './request-context'\n\nconst EPHEMERAL_CACHE_CONTROL: CopilotCacheControl = {\n type: 'ephemeral',\n}\n\nfunction asContentPart(\n block: ConversationTextBlock | ConversationImageBlock,\n): ContentPart {\n if (block.kind === 'text') {\n return {\n type: 'text',\n text: block.text,\n }\n }\n\n return {\n type: 'image_url',\n image_url: {\n url: block.url,\n ...(block.detail ? { detail: block.detail } : {}),\n },\n }\n}\n\nfunction serializeContentBlocks(\n blocks: Array<ConversationTextBlock | ConversationImageBlock>,\n): Message['content'] {\n if (blocks.length === 0) {\n return null\n }\n\n if (blocks.every(block => block.kind === 'text')) {\n if (blocks.length === 1) {\n return blocks[0].text\n }\n\n return blocks.map(block => ({\n type: 'text',\n text: block.text,\n }))\n }\n\n return blocks.map(asContentPart)\n}\n\nfunction serializeToolResultBlock(\n block: ConversationToolResultBlock,\n): CapiMessage {\n return {\n role: 'tool',\n tool_call_id: block.toolUseId,\n content: serializeContentBlocks(block.content),\n }\n}\n\nfunction serializeUserTurn(turn: ConversationTurn): Array<CapiMessage> {\n const messages: Array<CapiMessage> = []\n const pendingBlocks: Array<ConversationTextBlock | ConversationImageBlock> = []\n\n const flushPendingBlocks = () => {\n if (pendingBlocks.length === 0) {\n return\n }\n\n messages.push({\n role: 'user',\n content: serializeContentBlocks(pendingBlocks),\n })\n pendingBlocks.length = 0\n }\n\n for (const block of turn.blocks) {\n if (block.kind === 'text' || block.kind === 'image') {\n pendingBlocks.push(block)\n continue\n }\n\n if (block.kind === 'tool_result') {\n flushPendingBlocks()\n messages.push(serializeToolResultBlock(block))\n }\n }\n\n flushPendingBlocks()\n return messages\n}\n\nfunction serializeAssistantTurn(turn: ConversationTurn): Array<CapiMessage> {\n const textBlocks: Array<ConversationTextBlock | ConversationImageBlock> = []\n const toolCalls: NonNullable<CapiMessage['tool_calls']> = []\n\n for (const block of turn.blocks) {\n if (block.kind === 'text' || block.kind === 'image') {\n textBlocks.push(block)\n continue\n }\n\n if (block.kind === 'tool_use') {\n toolCalls.push({\n id: block.id,\n type: 'function',\n function: {\n name: block.name,\n arguments: block.argumentsText,\n },\n })\n }\n }\n\n return [{\n role: 'assistant',\n content: serializeContentBlocks(textBlocks),\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n ...(turn.meta?.reasoningOpaque ? { reasoning_opaque: turn.meta.reasoningOpaque } : {}),\n ...(turn.meta?.encryptedContent !== undefined ? { encrypted_content: turn.meta.encryptedContent } : {}),\n ...(turn.meta?.phase ? { phase: turn.meta.phase } : {}),\n ...(turn.meta?.copilotAnnotations !== undefined ? { copilot_annotations: turn.meta.copilotAnnotations } : {}),\n }]\n}\n\nfunction serializeSystemLikeTurn(turn: ConversationTurn): Array<CapiMessage> {\n const contentBlocks = turn.blocks.filter(\n (block): block is ConversationTextBlock | ConversationImageBlock =>\n block.kind === 'text' || block.kind === 'image',\n )\n\n return [{\n role: turn.role,\n content: serializeContentBlocks(contentBlocks),\n }]\n}\n\nfunction serializeToolTurn(turn: ConversationTurn): Array<CapiMessage> {\n const contentBlocks = turn.blocks.filter(\n (block): block is ConversationTextBlock | ConversationImageBlock =>\n block.kind === 'text' || block.kind === 'image',\n )\n\n return [{\n role: 'tool',\n tool_call_id: turn.meta?.toolCallId,\n content: serializeContentBlocks(contentBlocks),\n }]\n}\n\nfunction serializeTurns(turns: Array<ConversationTurn>): Array<CapiMessage> {\n return turns.flatMap((turn) => {\n switch (turn.role) {\n case 'system':\n case 'developer':\n return serializeSystemLikeTurn(turn)\n case 'user':\n return serializeUserTurn(turn)\n case 'assistant':\n return serializeAssistantTurn(turn)\n case 'tool':\n return serializeToolTurn(turn)\n default:\n return assertNever(turn.role)\n }\n })\n}\n\nfunction serializeTools(\n tools: ConversationRequest['tools'],\n): Array<CapiTool> | undefined {\n return tools?.map((tool): CapiTool => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }))\n}\n\nfunction serializeToolChoice(\n toolChoice: ConversationRequest['toolChoice'],\n): CapiChatCompletionsPayload['tool_choice'] {\n if (!toolChoice) {\n return undefined\n }\n\n switch (toolChoice.type) {\n case 'none':\n return 'none'\n case 'auto':\n return 'auto'\n case 'required':\n return 'required'\n case 'tool':\n return {\n type: 'function',\n function: { name: toolChoice.name },\n }\n }\n}\n\nfunction serializeCompletionOptions(\n opts: CompletionOptions | undefined,\n): Partial<CapiChatCompletionsPayload> {\n if (!opts) {\n return {}\n }\n\n return {\n ...(opts.n != null ? { n: opts.n } : {}),\n ...(opts.frequencyPenalty != null ? { frequency_penalty: opts.frequencyPenalty } : {}),\n ...(opts.presencePenalty != null ? { presence_penalty: opts.presencePenalty } : {}),\n ...(opts.logitBias != null ? { logit_bias: opts.logitBias } : {}),\n ...(opts.logprobs != null ? { logprobs: opts.logprobs } : {}),\n ...(opts.responseFormat != null ? { response_format: opts.responseFormat } : {}),\n ...(opts.seed != null ? { seed: opts.seed } : {}),\n ...(opts.reasoningEffort != null ? { reasoning_effort: opts.reasoningEffort } : {}),\n }\n}\n\nfunction applyCacheCheckpoints(\n payload: CapiChatCompletionsPayload,\n) {\n const firstSystemLikeIndex = payload.messages.findIndex(\n message => message.role === 'system' || message.role === 'developer',\n )\n if (firstSystemLikeIndex >= 0) {\n payload.messages[firstSystemLikeIndex] = {\n ...payload.messages[firstSystemLikeIndex],\n copilot_cache_control: EPHEMERAL_CACHE_CONTROL,\n }\n }\n\n if (payload.tools && payload.tools.length > 0) {\n const lastToolIndex = payload.tools.length - 1\n payload.tools[lastToolIndex] = {\n ...payload.tools[lastToolIndex],\n copilot_cache_control: EPHEMERAL_CACHE_CONTROL,\n }\n }\n\n const lastCacheEligibleMessageIndex = payload.messages.findLastIndex(\n message => message.role !== 'user',\n )\n if (lastCacheEligibleMessageIndex >= 0) {\n payload.messages[lastCacheEligibleMessageIndex] = {\n ...payload.messages[lastCacheEligibleMessageIndex],\n copilot_cache_control: EPHEMERAL_CACHE_CONTROL,\n }\n }\n}\n\nfunction stripTransportFields(\n payload: CapiChatCompletionsPayload,\n): CapiExecutionPlan['tokenCountPayload'] {\n const { stream_options: _streamOptions, ...rest } = payload\n return {\n ...rest,\n messages: payload.messages.map(({ copilot_cache_control: _cache, ...message }) => message),\n tools: payload.tools?.map(({ copilot_cache_control: _cache, ...tool }) => tool) ?? payload.tools,\n }\n}\n\nexport interface BuildCapiExecutionPlanOptions {\n resolveModel?: (model: string) => string\n requestContext?: Partial<CapiRequestContext>\n}\n\nexport function buildCapiExecutionPlan(\n request: ConversationRequest,\n options: BuildCapiExecutionPlanOptions = {},\n): CapiExecutionPlan {\n const resolvedModel = options.resolveModel?.(request.model) ?? request.model\n const profile = selectCapiProfile(resolvedModel)\n const initiator = inferInitiator(request.turns)\n\n const payload: CapiChatCompletionsPayload = {\n model: resolvedModel,\n messages: serializeTurns(request.turns),\n max_tokens: request.maxTokens,\n stop: request.stopSequences,\n stream: request.stream,\n temperature: request.temperature,\n top_p: request.topP,\n user: request.userId,\n tools: serializeTools(request.tools),\n tool_choice: serializeToolChoice(request.toolChoice),\n ...profile.applyThinking(request),\n ...serializeCompletionOptions(request.completionOptions),\n ...(request.stream && profile.includeUsageOnStream\n ? { stream_options: { include_usage: true } }\n : {}),\n }\n\n if (profile.enableCacheControl) {\n applyCacheCheckpoints(payload)\n }\n\n return {\n payload,\n tokenCountPayload: stripTransportFields(payload),\n requestContext: buildCapiRequestContext(\n initiator,\n options.requestContext,\n ),\n initiator,\n profileId: profile.id,\n resolvedModel,\n }\n}\n","import type {\n NormalizedAnthropicRequest,\n NormalizedBlock,\n NormalizedImageBlock,\n NormalizedTextBlock,\n NormalizedTurn,\n} from './ir'\n\nimport type {\n AnthropicCountTokensPayload,\n AnthropicMessage,\n AnthropicMessagesPayload,\n AnthropicToolResultBlock,\n} from './types'\n\nimport { assertNever } from '~/lib/assert-never'\n\nfunction textBlock(text: string): NormalizedTextBlock {\n return { kind: 'text', text }\n}\n\nfunction imageBlock(\n mediaType: NormalizedImageBlock['mediaType'],\n data: string,\n): NormalizedImageBlock {\n return { kind: 'image', mediaType, data }\n}\n\nfunction normalizeSystemBlocks(\n system: AnthropicMessagesPayload['system'],\n): Array<NormalizedTurn> {\n if (!system) {\n return []\n }\n\n if (typeof system === 'string') {\n return [{ role: 'system', blocks: [textBlock(system)] }]\n }\n\n return [{\n role: 'system',\n blocks: system.map(block => textBlock(block.text)),\n }]\n}\n\nfunction normalizeToolResultContent(\n block: AnthropicToolResultBlock,\n): Array<NormalizedTextBlock | NormalizedImageBlock> {\n if (typeof block.content === 'string') {\n return [textBlock(block.content)]\n }\n\n return block.content.map((contentBlock) => {\n switch (contentBlock.type) {\n case 'text':\n return textBlock(contentBlock.text)\n case 'image':\n return imageBlock(contentBlock.source.media_type, contentBlock.source.data)\n default:\n return assertNever(contentBlock)\n }\n })\n}\n\nfunction normalizeMessage(message: AnthropicMessage): NormalizedTurn {\n if (typeof message.content === 'string') {\n return {\n role: message.role,\n blocks: [textBlock(message.content)],\n }\n }\n\n const blocks: Array<NormalizedBlock> = message.content.map((block) => {\n switch (block.type) {\n case 'text':\n return textBlock(block.text)\n case 'image':\n return imageBlock(block.source.media_type, block.source.data)\n case 'thinking':\n return {\n kind: 'thinking',\n thinking: block.thinking,\n signature: block.signature,\n }\n case 'tool_use':\n return {\n kind: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input,\n }\n case 'tool_result':\n return {\n kind: 'tool_result',\n toolUseId: block.tool_use_id,\n content: normalizeToolResultContent(block),\n isError: block.is_error,\n }\n default:\n return assertNever(block)\n }\n })\n\n return { role: message.role, blocks }\n}\n\nfunction normalizeToolChoice(\n toolChoice: AnthropicMessagesPayload['tool_choice'],\n): NormalizedAnthropicRequest['toolChoice'] {\n if (!toolChoice) {\n return undefined\n }\n\n switch (toolChoice.type) {\n case 'none':\n return { type: 'none' }\n case 'auto':\n return { type: 'auto' }\n case 'any':\n return { type: 'required' }\n case 'tool':\n return toolChoice.name\n ? { type: 'tool', name: toolChoice.name }\n : undefined\n }\n}\n\nfunction normalizeThinking(\n thinking: AnthropicMessagesPayload['thinking'],\n): NormalizedAnthropicRequest['thinking'] {\n if (!thinking) {\n return undefined\n }\n\n switch (thinking.type) {\n case 'disabled':\n return { type: 'disabled' }\n case 'adaptive':\n return { type: 'adaptive' }\n case 'enabled':\n return { type: 'enabled', budgetTokens: thinking.budget_tokens }\n }\n}\n\nexport function normalizeAnthropicRequest(\n payload: AnthropicMessagesPayload | AnthropicCountTokensPayload,\n): NormalizedAnthropicRequest {\n return {\n model: payload.model,\n turns: [\n ...normalizeSystemBlocks(payload.system),\n ...payload.messages.map(normalizeMessage),\n ],\n maxTokens: payload.max_tokens,\n stopSequences: payload.stop_sequences,\n stream: payload.stream,\n temperature: payload.temperature,\n topP: payload.top_p,\n topK: payload.top_k,\n userId: payload.metadata?.user_id,\n tools: payload.tools?.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.input_schema,\n })),\n toolChoice: normalizeToolChoice(payload.tool_choice),\n thinking: normalizeThinking(payload.thinking),\n serviceTier: payload.service_tier,\n }\n}\n","import type { AnthropicResponse } from './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: 'refusal',\n } as const\n return stopReasonMap[finishReason]\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number\n completion_tokens?: number\n prompt_tokens_details?: {\n cached_tokens?: number\n }\n}\n\nexport function mapOpenAIUsageToAnthropic(usage?: OpenAIUsage) {\n return {\n input_tokens:\n (usage?.prompt_tokens ?? 0)\n - (usage?.prompt_tokens_details?.cached_tokens ?? 0),\n output_tokens: usage?.completion_tokens ?? 0,\n ...(usage?.prompt_tokens_details?.cached_tokens !== undefined && {\n cache_read_input_tokens: usage.prompt_tokens_details.cached_tokens,\n }),\n }\n}\n","import type {\n AnthropicContentBlockDeltaEvent,\n AnthropicContentBlockStartEvent,\n AnthropicContentBlockStopEvent,\n AnthropicStreamEventData,\n AnthropicStreamState,\n} from './types'\n\nimport type { CapiChatCompletionChunk } from '~/core/capi'\nimport type { ConversationDelta } from '~/core/conversation'\n\nimport { mapOpenAIStopReasonToAnthropic, mapOpenAIUsageToAnthropic } from './shared'\n\nclass TextBlockWriter {\n private readonly state: AnthropicStreamState\n private readonly blockType: 'text' | 'thinking'\n\n constructor(\n state: AnthropicStreamState,\n blockType: 'text' | 'thinking',\n ) {\n this.state = state\n this.blockType = blockType\n }\n\n open(events: Array<AnthropicStreamEventData>): number {\n const existingIndex = this.blockType === 'text'\n ? this.state.openTextBlockIndex\n : this.state.openThinkingBlockIndex\n if (existingIndex !== null) {\n return existingIndex\n }\n\n const index = this.state.nextContentBlockIndex++\n const event: AnthropicContentBlockStartEvent = this.blockType === 'text'\n ? {\n type: 'content_block_start',\n index,\n content_block: {\n type: 'text',\n text: '',\n },\n }\n : {\n type: 'content_block_start',\n index,\n content_block: {\n type: 'thinking',\n thinking: '',\n },\n }\n events.push(event)\n\n if (this.blockType === 'text') {\n this.state.openTextBlockIndex = index\n }\n else {\n this.state.openThinkingBlockIndex = index\n }\n\n return index\n }\n\n append(events: Array<AnthropicStreamEventData>, text: string) {\n if (!text) {\n return\n }\n\n const index = this.open(events)\n const delta: AnthropicContentBlockDeltaEvent = this.blockType === 'text'\n ? {\n type: 'content_block_delta',\n index,\n delta: {\n type: 'text_delta',\n text,\n },\n }\n : {\n type: 'content_block_delta',\n index,\n delta: {\n type: 'thinking_delta',\n thinking: text,\n },\n }\n events.push(delta)\n }\n\n close(events: Array<AnthropicStreamEventData>) {\n const index = this.blockType === 'text'\n ? this.state.openTextBlockIndex\n : this.state.openThinkingBlockIndex\n if (index === null) {\n return\n }\n\n const event: AnthropicContentBlockStopEvent = {\n type: 'content_block_stop',\n index,\n }\n events.push(event)\n if (this.blockType === 'text') {\n this.state.openTextBlockIndex = null\n }\n else {\n this.state.openThinkingBlockIndex = null\n }\n }\n}\n\nclass ToolUseBlockWriter {\n private readonly state: AnthropicStreamState\n\n constructor(state: AnthropicStreamState) {\n this.state = state\n }\n\n append(\n events: Array<AnthropicStreamEventData>,\n toolCall: NonNullable<CapiChatCompletionChunk['choices'][number]['delta']['tool_calls']>[number],\n ) {\n const lane = this.state.toolCalls[toolCall.index] ?? {\n started: false,\n closed: false,\n }\n\n if (lane.closed) {\n return\n }\n\n if (toolCall.id) {\n lane.id = toolCall.id\n }\n if (toolCall.function?.name) {\n lane.name = toolCall.function.name\n }\n\n if (!lane.started && lane.id && lane.name) {\n lane.anthropicBlockIndex = this.state.nextContentBlockIndex++\n lane.started = true\n events.push({\n type: 'content_block_start',\n index: lane.anthropicBlockIndex,\n content_block: {\n type: 'tool_use',\n id: lane.id,\n name: lane.name,\n input: {},\n },\n })\n }\n\n if (lane.started && toolCall.function?.arguments) {\n events.push({\n type: 'content_block_delta',\n index: lane.anthropicBlockIndex!,\n delta: {\n type: 'input_json_delta',\n partial_json: toolCall.function.arguments,\n },\n })\n }\n\n this.state.toolCalls[toolCall.index] = lane\n }\n\n closeAll(events: Array<AnthropicStreamEventData>) {\n const lanes = Object.values(this.state.toolCalls)\n .filter(lane => lane.started && !lane.closed && lane.anthropicBlockIndex !== undefined)\n .sort((left, right) => left.anthropicBlockIndex! - right.anthropicBlockIndex!)\n\n for (const lane of lanes) {\n events.push({\n type: 'content_block_stop',\n index: lane.anthropicBlockIndex!,\n })\n lane.closed = true\n }\n }\n}\n\nexport class AnthropicStreamTranslator {\n private readonly state: AnthropicStreamState\n private readonly textWriter: TextBlockWriter\n private readonly thinkingWriter: TextBlockWriter\n private readonly toolWriter: ToolUseBlockWriter\n\n constructor() {\n this.state = {\n messageStartSent: false,\n nextContentBlockIndex: 0,\n openTextBlockIndex: null,\n openThinkingBlockIndex: null,\n toolCalls: {},\n messageStopSent: false,\n }\n this.textWriter = new TextBlockWriter(this.state, 'text')\n this.thinkingWriter = new TextBlockWriter(this.state, 'thinking')\n this.toolWriter = new ToolUseBlockWriter(this.state)\n }\n\n onChunk(chunk: CapiChatCompletionChunk): Array<AnthropicStreamEventData> {\n const deltas = this.toConversationDeltas(chunk)\n if (deltas.length === 0) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n\n this.appendMessageStart(events, chunk)\n this.state.lastUsage = chunk.usage\n\n for (const delta of deltas) {\n switch (delta.kind) {\n case 'message_start':\n break\n case 'thinking_delta':\n this.state.lastMetadata = {\n ...this.state.lastMetadata,\n ...delta.metadata,\n }\n this.textWriter.close(events)\n this.thinkingWriter.append(events, delta.text)\n break\n case 'text_delta':\n this.thinkingWriter.close(events)\n this.textWriter.append(events, delta.text)\n break\n case 'tool_use_delta':\n this.thinkingWriter.close(events)\n this.textWriter.close(events)\n this.toolWriter.append(events, {\n index: delta.toolIndex,\n ...(delta.id ? { id: delta.id } : {}),\n ...(delta.name || delta.argumentsText\n ? {\n function: {\n ...(delta.name ? { name: delta.name } : {}),\n ...(delta.argumentsText ? { arguments: delta.argumentsText } : {}),\n },\n }\n : {}),\n })\n break\n case 'message_stop':\n this.state.lastMetadata = {\n ...this.state.lastMetadata,\n ...delta.metadata,\n }\n this.state.pendingStopReason = delta.stopReason\n if (delta.usage) {\n this.state.lastUsage = delta.usage\n }\n events.push(...this.onDone())\n break\n }\n }\n\n return events\n }\n\n onDone(): Array<AnthropicStreamEventData> {\n if (!this.state.messageStartSent || this.state.messageStopSent) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n this.thinkingWriter.close(events)\n this.textWriter.close(events)\n this.toolWriter.closeAll(events)\n\n events.push(\n {\n type: 'message_delta',\n delta: {\n stop_reason: mapOpenAIStopReasonToAnthropic(this.state.pendingStopReason ?? 'stop'),\n stop_sequence: null,\n },\n ...(this.state.lastUsage ? { usage: mapOpenAIUsageToAnthropic(this.state.lastUsage) } : {}),\n },\n {\n type: 'message_stop',\n },\n )\n\n this.state.messageStopSent = true\n return events\n }\n\n onError(error?: unknown): Array<AnthropicStreamEventData> {\n const message = this.getErrorMessage(error)\n return [\n {\n type: 'error',\n error: {\n type: 'api_error',\n message,\n },\n },\n ]\n }\n\n private appendMessageStart(\n events: Array<AnthropicStreamEventData>,\n chunk: CapiChatCompletionChunk,\n ) {\n if (this.state.messageStartSent) {\n return\n }\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 ...mapOpenAIUsageToAnthropic(chunk.usage),\n output_tokens: 0,\n },\n },\n })\n this.state.messageStartSent = true\n }\n\n private getErrorMessage(error: unknown): string {\n if (this.isTimeoutError(error)) {\n return 'Upstream streaming request timed out. Please retry.'\n }\n return 'An unexpected error occurred during streaming.'\n }\n\n private isTimeoutError(error: unknown): boolean {\n if (error instanceof DOMException) {\n return error.name === 'TimeoutError'\n }\n if (error instanceof Error) {\n return error.name === 'TimeoutError'\n }\n return false\n }\n\n private toConversationDeltas(\n chunk: CapiChatCompletionChunk,\n ): Array<ConversationDelta> {\n if (chunk.choices.length === 0) {\n return []\n }\n\n const sortedChoices = [...chunk.choices].sort((left, right) => left.index - right.index)\n const choice = sortedChoices[0]\n const deltas: Array<ConversationDelta> = []\n\n if (!this.state.messageStartSent) {\n deltas.push({\n kind: 'message_start',\n id: chunk.id,\n model: chunk.model,\n usage: chunk.usage,\n })\n }\n\n if (choice.delta.reasoning_text) {\n deltas.push({\n kind: 'thinking_delta',\n text: choice.delta.reasoning_text,\n metadata: {\n reasoningOpaque: choice.delta.reasoning_opaque,\n encryptedContent: choice.delta.encrypted_content,\n phase: choice.delta.phase,\n copilotAnnotations: choice.delta.copilot_annotations,\n },\n })\n }\n\n if (choice.delta.content) {\n deltas.push({\n kind: 'text_delta',\n text: choice.delta.content,\n })\n }\n\n if (choice.delta.tool_calls?.length) {\n for (const toolCall of choice.delta.tool_calls) {\n deltas.push({\n kind: 'tool_use_delta',\n toolIndex: toolCall.index,\n id: toolCall.id,\n name: toolCall.function?.name,\n argumentsText: toolCall.function?.arguments,\n })\n }\n }\n\n if (choice.finish_reason) {\n deltas.push({\n kind: 'message_stop',\n stopReason: choice.finish_reason,\n usage: chunk.usage,\n metadata: {\n reasoningOpaque: choice.delta.reasoning_opaque,\n encryptedContent: choice.delta.encrypted_content,\n phase: choice.delta.phase,\n copilotAnnotations: choice.delta.copilot_annotations,\n },\n })\n }\n\n return deltas\n }\n}\n","import type { NormalizedOpenAIResponse } from './ir'\n\nimport type { AnthropicAssistantContentBlock, AnthropicResponse } from './types'\n\nimport { assertNever } from '~/lib/assert-never'\nimport { mapOpenAIStopReasonToAnthropic, mapOpenAIUsageToAnthropic } from './shared'\n\nfunction mapBlocks(\n response: NormalizedOpenAIResponse,\n): Array<AnthropicAssistantContentBlock> {\n return response.turn.blocks.map((block) => {\n switch (block.kind) {\n case 'text':\n return { type: 'text', text: block.text }\n case 'thinking':\n return {\n type: 'thinking',\n thinking: block.thinking,\n signature: block.signature,\n }\n case 'tool_use':\n return {\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input,\n }\n case 'image':\n return {\n type: 'text',\n text: `[unsupported image content omitted: ${block.mediaType}]`,\n }\n case 'tool_result':\n return {\n type: 'text',\n text: `[unsupported tool_result omitted: ${block.toolUseId}]`,\n }\n default:\n return assertNever(block)\n }\n })\n}\n\nexport function mapOpenAIResponseToAnthropic(\n response: NormalizedOpenAIResponse,\n): AnthropicResponse {\n return {\n id: response.id,\n type: 'message',\n role: 'assistant',\n model: response.model,\n content: mapBlocks(response),\n stop_reason: mapOpenAIStopReasonToAnthropic(response.finishReason),\n stop_sequence: null,\n usage: mapOpenAIUsageToAnthropic(response.usage),\n }\n}\n","export type TranslationIssueSeverity = 'info' | 'warning' | 'error'\n\nexport interface TranslationIssue {\n kind: string\n severity: TranslationIssueSeverity\n message: string\n}\n\nexport class TranslationFailure extends Error {\n readonly status: 400 | 502\n readonly kind: string\n\n constructor(\n message: string,\n options: {\n status: 400 | 502\n kind: string\n },\n ) {\n super(message)\n this.name = 'TranslationFailure'\n this.status = options.status\n this.kind = options.kind\n }\n}\n","import type {\n NormalizedBlock,\n NormalizedOpenAIResponse,\n NormalizedTurn,\n} from './ir'\n\nimport type { TranslationContext } from './translation-policy'\nimport type {\n CapiChatCompletionResponse,\n CapiResponseMessage,\n} from '~/core/capi'\nimport type { ContentPart, Message, ToolCall } from '~/types'\nimport { TranslationFailure } from './translation-issue'\n\nfunction normalizeContentPart(part: ContentPart): NormalizedBlock {\n switch (part.type) {\n case 'text':\n return { kind: 'text', text: part.text }\n case 'image_url': {\n const match = part.image_url.url.match(/^data:(.+);base64,(.+)$/)\n if (!match) {\n throw new TranslationFailure('OpenAI image_url must be a data URL', {\n status: 502,\n kind: 'invalid_upstream_image_url',\n })\n }\n\n const [, mediaType, data] = match\n if (\n mediaType !== 'image/jpeg'\n && mediaType !== 'image/png'\n && mediaType !== 'image/gif'\n && mediaType !== 'image/webp'\n ) {\n throw new TranslationFailure(`Unsupported image media type: ${mediaType}`, {\n status: 502,\n kind: 'invalid_upstream_image_url',\n })\n }\n\n return {\n kind: 'image',\n mediaType,\n data,\n }\n }\n }\n}\n\nfunction normalizeMessageContent(content: Message['content']): Array<NormalizedBlock> {\n if (content === null) {\n return []\n }\n\n if (typeof content === 'string') {\n return content.length > 0 ? [{ kind: 'text', text: content }] : []\n }\n\n return content.map(normalizeContentPart)\n}\n\nfunction parseToolCall(toolCall: ToolCall): NormalizedBlock {\n try {\n return {\n kind: '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 catch {\n throw new TranslationFailure(\n `Invalid upstream tool arguments for tool \"${toolCall.function.name}\"`,\n {\n status: 502,\n kind: 'invalid_upstream_tool_arguments',\n },\n )\n }\n}\n\nfunction normalizeAssistantTurn(\n message: CapiResponseMessage,\n): NormalizedTurn {\n const contentBlocks = normalizeMessageContent(message.content)\n const toolBlocks = message.tool_calls?.map(parseToolCall) ?? []\n const thinkingBlocks: Array<NormalizedBlock> = message.reasoning_text\n ? [{\n kind: 'thinking',\n thinking: message.reasoning_text,\n }]\n : []\n return {\n role: 'assistant',\n blocks: [...thinkingBlocks, ...contentBlocks, ...toolBlocks],\n meta: {\n reasoningOpaque: message.reasoning_opaque,\n encryptedContent: message.encrypted_content,\n phase: message.phase,\n copilotAnnotations: message.copilot_annotations,\n },\n }\n}\n\nexport function normalizeOpenAIResponse(\n response: CapiChatCompletionResponse,\n context: TranslationContext,\n): NormalizedOpenAIResponse {\n if (response.choices.length === 0) {\n throw new TranslationFailure('Upstream response contained no choices', {\n status: 502,\n kind: 'missing_upstream_choice',\n })\n }\n\n const firstChoice = [...response.choices].sort((left, right) => left.index - right.index)[0]\n if (response.choices.length > 1) {\n context.record(\n {\n kind: 'lossy_multiple_choices_ignored',\n severity: 'warning',\n message: 'Upstream response contained multiple choices; only choice index 0 was used.',\n },\n { fatalInStrict: true },\n )\n }\n\n return {\n id: response.id,\n model: response.model,\n turn: normalizeAssistantTurn(firstChoice.message),\n finishReason: firstChoice.finish_reason,\n usage: response.usage,\n }\n}\n","import type { TranslationIssue } from './translation-issue'\nimport { TranslationFailure } from './translation-issue'\n\nexport interface TranslationPolicy {\n mode: 'best-effort' | 'strict'\n}\n\nexport const defaultTranslationPolicy: TranslationPolicy = {\n mode: 'best-effort',\n}\n\nexport class TranslationContext {\n private readonly policy: TranslationPolicy\n private readonly issues: Array<TranslationIssue> = []\n\n constructor(policy: TranslationPolicy = defaultTranslationPolicy) {\n this.policy = policy\n }\n\n record(issue: TranslationIssue, options?: { fatalInStrict?: boolean }) {\n this.issues.push(issue)\n if (this.policy.mode === 'strict' && options?.fatalInStrict) {\n throw new TranslationFailure(issue.message, {\n status: 400,\n kind: issue.kind,\n })\n }\n }\n\n getIssues(): Array<TranslationIssue> {\n return [...this.issues]\n }\n}\n","import type {\n CapiChatCompletionResponse,\n CapiExecutionPlan,\n CapiRequestContext,\n} from '~/core/capi'\nimport type {\n ConversationBlock,\n ConversationImageBlock,\n ConversationRequest,\n ConversationTextBlock,\n ConversationTurn,\n} from '~/core/conversation'\nimport type { AnthropicOpenAIMapperOptions } from '~/translator/anthropic/anthropic-openai-mapper'\nimport type { NormalizedAnthropicRequest, NormalizedBlock, NormalizedTurn } from '~/translator/anthropic/ir'\nimport type { TranslationIssue } from '~/translator/anthropic/translation-issue'\nimport type { TranslationPolicy } from '~/translator/anthropic/translation-policy'\nimport type {\n AnthropicCountTokensPayload,\n AnthropicMessagesPayload,\n AnthropicResponse,\n} from '~/translator/anthropic/types'\n\nimport { buildCapiExecutionPlan } from '~/core/capi'\nimport { normalizeAnthropicRequest } from '~/translator/anthropic/anthropic-normalizer'\nimport { AnthropicStreamTranslator } from '~/translator/anthropic/anthropic-stream-transducer'\nimport { mapOpenAIResponseToAnthropic } from '~/translator/anthropic/openai-anthropic-mapper'\nimport { normalizeOpenAIResponse } from '~/translator/anthropic/openai-normalizer'\nimport { defaultTranslationPolicy, TranslationContext } from '~/translator/anthropic/translation-policy'\n\nexport interface AnthropicMessagesAdapterOptions {\n modelResolver?: AnthropicOpenAIMapperOptions['resolveModel']\n getModelCapabilities?: AnthropicOpenAIMapperOptions['getModelCapabilities']\n policy?: TranslationPolicy\n}\n\ninterface NormalizedAnthropicConversation {\n normalized: NormalizedAnthropicRequest\n conversation: ConversationRequest\n issues: Array<TranslationIssue>\n}\n\nfunction toConversationBlock(block: NormalizedBlock): ConversationBlock {\n switch (block.kind) {\n case 'text':\n return {\n kind: 'text',\n text: block.text,\n }\n case 'image':\n return {\n kind: 'image',\n url: `data:${block.mediaType};base64,${block.data}`,\n }\n case 'thinking':\n return {\n kind: 'thinking',\n text: block.thinking,\n signature: block.signature,\n }\n case 'tool_use':\n return {\n kind: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input,\n argumentsText: JSON.stringify(block.input),\n }\n case 'tool_result':\n return {\n kind: 'tool_result',\n toolUseId: block.toolUseId,\n content: block.content.map(contentBlock => toConversationBlock(contentBlock)) as Array<ConversationTextBlock | ConversationImageBlock>,\n isError: block.isError,\n }\n }\n}\n\nfunction toConversationTurn(turn: NormalizedTurn): ConversationTurn {\n return {\n role: turn.role,\n blocks: turn.blocks.map(toConversationBlock),\n }\n}\n\nfunction recordAnthropicRequestIssues(\n request: NormalizedAnthropicRequest,\n context: TranslationContext,\n) {\n if (request.topK !== undefined) {\n context.record(\n {\n kind: 'unsupported_top_k',\n severity: 'warning',\n message: 'Anthropic top_k is not supported by the upstream Copilot CAPI payload and was dropped.',\n },\n { fatalInStrict: true },\n )\n }\n\n if (request.serviceTier !== undefined) {\n context.record(\n {\n kind: 'unsupported_service_tier',\n severity: 'warning',\n message: 'Anthropic service_tier is not supported by the upstream Copilot CAPI payload and was dropped.',\n },\n { fatalInStrict: true },\n )\n }\n\n for (const turn of request.turns) {\n if (turn.role === 'user') {\n for (const block of turn.blocks) {\n if (block.kind === 'tool_result' && block.isError) {\n context.record({\n kind: 'lossy_tool_result_error_flag_dropped',\n severity: 'warning',\n message: 'tool_result.is_error is not representable in upstream tool messages and was dropped.',\n })\n }\n }\n continue\n }\n\n if (turn.role !== 'assistant') {\n continue\n }\n\n let sawToolUse = false\n let sawTextOrThinkingAfterTool = false\n let sawThinking = false\n\n for (const block of turn.blocks) {\n if (block.kind === 'thinking') {\n sawThinking = true\n if (sawToolUse) {\n sawTextOrThinkingAfterTool = true\n }\n }\n else if (block.kind === 'text') {\n if (sawToolUse) {\n sawTextOrThinkingAfterTool = true\n }\n }\n else if (block.kind === 'tool_use') {\n sawToolUse = true\n }\n }\n\n if (sawThinking) {\n context.record({\n kind: 'lossy_thinking_omitted_from_prompt',\n severity: 'warning',\n message: 'Anthropic thinking blocks were preserved internally but omitted from the upstream prompt.',\n })\n }\n\n if (sawTextOrThinkingAfterTool) {\n context.record({\n kind: 'lossy_interleaving_flattened',\n severity: 'warning',\n message: 'Assistant text/tool_use interleaving was flattened to upstream content + tool_calls.',\n })\n }\n }\n}\n\nfunction applyThinkingBudgetOverride(\n plan: CapiExecutionPlan,\n request: NormalizedAnthropicRequest,\n options: Required<Pick<AnthropicMessagesAdapterOptions, 'getModelCapabilities'>>,\n) {\n if (!request.thinking || request.thinking.type === 'disabled') {\n return\n }\n\n const supportsThinkingBudget = options.getModelCapabilities(plan.resolvedModel).supportsThinkingBudget\n if (supportsThinkingBudget && plan.payload.thinking_budget == null) {\n const budgetTokens = request.thinking.type === 'adaptive'\n ? 24000\n : request.thinking.budgetTokens\n plan.payload.thinking_budget = budgetTokens\n plan.tokenCountPayload.thinking_budget = budgetTokens\n }\n\n if (!supportsThinkingBudget) {\n delete plan.payload.thinking_budget\n delete plan.tokenCountPayload.thinking_budget\n }\n}\n\nfunction normalizeAnthropicConversation(\n payload: AnthropicMessagesPayload | AnthropicCountTokensPayload,\n policy: TranslationPolicy,\n): NormalizedAnthropicConversation {\n const context = new TranslationContext(policy)\n const normalized = normalizeAnthropicRequest(payload)\n recordAnthropicRequestIssues(normalized, context)\n\n return {\n normalized,\n conversation: {\n model: normalized.model,\n turns: normalized.turns.map(toConversationTurn),\n maxTokens: normalized.maxTokens,\n stopSequences: normalized.stopSequences,\n stream: normalized.stream,\n temperature: normalized.temperature,\n topP: normalized.topP,\n userId: normalized.userId,\n tools: normalized.tools?.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n })),\n toolChoice: normalized.toolChoice,\n thinking: normalized.thinking,\n },\n issues: context.getIssues(),\n }\n}\n\nexport class AnthropicMessagesAdapter {\n private readonly options: Required<AnthropicMessagesAdapterOptions>\n private lastIssues: Array<TranslationIssue> = []\n\n constructor(options: AnthropicMessagesAdapterOptions = {}) {\n this.options = {\n modelResolver: options.modelResolver ?? (model => model),\n getModelCapabilities:\n options.getModelCapabilities\n ?? ((model: string) => ({\n supportsThinkingBudget: model.startsWith('claude'),\n })),\n policy: options.policy ?? defaultTranslationPolicy,\n }\n }\n\n toConversation(\n payload: AnthropicMessagesPayload | AnthropicCountTokensPayload,\n ): ConversationRequest {\n const { conversation, issues } = normalizeAnthropicConversation(payload, this.options.policy)\n this.lastIssues = issues\n return conversation\n }\n\n toCapiPlan(\n payload: AnthropicMessagesPayload | AnthropicCountTokensPayload,\n options?: { requestContext?: Partial<CapiRequestContext> },\n ): CapiExecutionPlan {\n const { conversation, normalized, issues } = normalizeAnthropicConversation(\n payload,\n this.options.policy,\n )\n this.lastIssues = issues\n const plan = buildCapiExecutionPlan(conversation, {\n resolveModel: this.options.modelResolver,\n requestContext: options?.requestContext,\n })\n\n applyThinkingBudgetOverride(plan, normalized, this.options)\n return plan\n }\n\n toTokenCountPayload(\n payload: AnthropicMessagesPayload | AnthropicCountTokensPayload,\n ) {\n return this.toCapiPlan(payload).tokenCountPayload\n }\n\n fromCapiResponse(response: CapiChatCompletionResponse): AnthropicResponse {\n const context = new TranslationContext(this.options.policy)\n const normalized = normalizeOpenAIResponse(response, context)\n const result = mapOpenAIResponseToAnthropic(normalized)\n this.lastIssues = context.getIssues()\n return result\n }\n\n createStreamSerializer() {\n return new AnthropicStreamTranslator()\n }\n\n getLastIssues(): Array<TranslationIssue> {\n return [...this.lastIssues]\n }\n}\n","import type { CopilotClient } from '~/clients'\nimport type { CapiExecutionPlan } from '~/core/capi'\n\nexport class CopilotTransport {\n private readonly client: CopilotClient\n\n constructor(client: CopilotClient) {\n this.client = client\n }\n\n execute(\n plan: CapiExecutionPlan,\n options?: { signal?: AbortSignal },\n ) {\n return this.client.createChatCompletions(plan.payload, {\n signal: options?.signal,\n initiator: plan.initiator,\n requestContext: plan.requestContext,\n })\n }\n}\n","import type {\n CapiChatCompletionChunk,\n CapiChatCompletionResponse,\n CapiExecutionPlan,\n CapiRequestContext,\n} from '~/core/capi'\nimport type {\n CompletionOptions,\n ConversationBlock,\n ConversationRequest,\n ConversationTurn,\n} from '~/core/conversation'\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n} from '~/types'\n\nimport { buildCapiExecutionPlan } from '~/core/capi'\n\nfunction toConversationBlocks(\n content: ChatCompletionsPayload['messages'][number]['content'],\n): Array<ConversationBlock> {\n if (content === null) {\n return []\n }\n\n if (typeof content === 'string') {\n return content.length > 0\n ? [{ kind: 'text', text: content }]\n : []\n }\n\n return content.map((part) => {\n if (part.type === 'text') {\n return {\n kind: 'text',\n text: part.text,\n }\n }\n\n return {\n kind: 'image',\n url: part.image_url.url,\n detail: part.image_url.detail,\n }\n })\n}\n\nfunction normalizeToolArguments(\n argumentsText: string,\n): Record<string, unknown> {\n try {\n const parsed = JSON.parse(argumentsText) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>\n }\n }\n catch {\n }\n\n return {}\n}\n\nfunction toConversationTurns(payload: ChatCompletionsPayload): Array<ConversationTurn> {\n return payload.messages.map((message) => {\n const blocks = toConversationBlocks(message.content)\n\n if (message.role === 'assistant') {\n const toolBlocks = message.tool_calls?.map(toolCall => ({\n kind: 'tool_use' as const,\n id: toolCall.id,\n name: toolCall.function.name,\n input: normalizeToolArguments(toolCall.function.arguments),\n argumentsText: toolCall.function.arguments,\n }))\n\n return {\n role: 'assistant',\n blocks: [...blocks, ...(toolBlocks ?? [])],\n }\n }\n\n if (message.role === 'tool') {\n return {\n role: 'tool',\n blocks,\n meta: {\n toolCallId: message.tool_call_id,\n },\n }\n }\n\n return {\n role: message.role,\n blocks,\n }\n })\n}\n\nfunction sanitizeResponse(response: CapiChatCompletionResponse): ChatCompletionResponse {\n return {\n id: response.id,\n object: response.object,\n created: response.created,\n model: response.model,\n system_fingerprint: response.system_fingerprint,\n usage: response.usage,\n choices: response.choices.map(choice => ({\n index: choice.index,\n finish_reason: choice.finish_reason,\n logprobs: choice.logprobs,\n message: {\n role: choice.message.role,\n content: choice.message.content,\n ...(choice.message.tool_calls ? { tool_calls: choice.message.tool_calls } : {}),\n },\n })),\n }\n}\n\nfunction sanitizeChunk(chunk: CapiChatCompletionChunk): ChatCompletionChunk {\n return {\n id: chunk.id,\n object: chunk.object,\n created: chunk.created,\n model: chunk.model,\n system_fingerprint: chunk.system_fingerprint,\n usage: chunk.usage,\n choices: chunk.choices.map(choice => ({\n index: choice.index,\n finish_reason: choice.finish_reason,\n logprobs: choice.logprobs,\n delta: {\n ...(choice.delta.role && choice.delta.role !== 'developer'\n ? { role: choice.delta.role }\n : {}),\n content: choice.delta.content,\n reasoning_text: choice.delta.reasoning_text,\n tool_calls: choice.delta.tool_calls,\n },\n })),\n }\n}\n\nfunction buildCompletionOptions(payload: ChatCompletionsPayload): CompletionOptions | undefined {\n const opts: CompletionOptions = {\n ...(payload.n != null ? { n: payload.n } : {}),\n ...(payload.frequency_penalty != null ? { frequencyPenalty: payload.frequency_penalty } : {}),\n ...(payload.presence_penalty != null ? { presencePenalty: payload.presence_penalty } : {}),\n ...(payload.logit_bias != null ? { logitBias: payload.logit_bias } : {}),\n ...(payload.logprobs != null ? { logprobs: payload.logprobs } : {}),\n ...(payload.response_format != null ? { responseFormat: payload.response_format } : {}),\n ...(payload.seed != null ? { seed: payload.seed } : {}),\n ...(payload.reasoning_effort != null ? { reasoningEffort: payload.reasoning_effort } : {}),\n }\n\n return Object.keys(opts).length > 0 ? opts : undefined\n}\n\nexport class OpenAIChatAdapter {\n toConversation(payload: ChatCompletionsPayload): ConversationRequest {\n return {\n model: payload.model,\n turns: toConversationTurns(payload),\n maxTokens: payload.max_tokens ?? undefined,\n stopSequences:\n payload.stop == null\n ? undefined\n : Array.isArray(payload.stop)\n ? payload.stop\n : [payload.stop],\n stream: payload.stream ?? undefined,\n temperature: payload.temperature,\n topP: payload.top_p,\n userId: payload.user ?? undefined,\n tools: payload.tools?.map(tool => ({\n name: tool.function.name,\n description: tool.function.description,\n inputSchema: tool.function.parameters,\n })),\n toolChoice:\n payload.tool_choice == null\n ? undefined\n : typeof payload.tool_choice === 'string'\n ? payload.tool_choice === 'required'\n ? { type: 'required' }\n : payload.tool_choice === 'none'\n ? { type: 'none' }\n : { type: 'auto' }\n : { type: 'tool', name: payload.tool_choice.function.name },\n thinking:\n payload.thinking_budget != null\n ? { type: 'enabled', budgetTokens: payload.thinking_budget }\n : undefined,\n completionOptions: buildCompletionOptions(payload),\n }\n }\n\n toCapiPlan(\n payload: ChatCompletionsPayload,\n options?: { requestContext?: Partial<CapiRequestContext> },\n ): CapiExecutionPlan {\n return buildCapiExecutionPlan(this.toConversation(payload), {\n requestContext: options?.requestContext,\n })\n }\n\n toTokenCountPayload(payload: ChatCompletionsPayload) {\n return this.toCapiPlan(payload).tokenCountPayload\n }\n\n fromCapiResponse(response: CapiChatCompletionResponse): ChatCompletionResponse {\n return sanitizeResponse(response)\n }\n\n serializeStreamChunk(chunk: CapiChatCompletionChunk): ChatCompletionChunk {\n return sanitizeChunk(chunk)\n }\n}\n","export interface SSEOutput {\n id?: string\n event?: string\n data: string\n comment?: string\n retry?: number\n}\n\nexport interface SSEStreamChunk {\n id?: number | string\n event?: string\n data?: string\n comment?: string\n retry?: number\n}\n\nexport type ExecutionResult\n = | { kind: 'json', data: unknown }\n | { kind: 'stream', generator: AsyncGenerator<SSEOutput> }\n\nexport interface ExecutionStrategy<TResult, TChunk> {\n execute: () => Promise<TResult>\n isStream: (result: TResult) => result is TResult & AsyncIterable<TChunk>\n translateResult: (result: TResult) => unknown\n translateStreamChunk: (chunk: TChunk) => SSEOutput | SSEOutput[] | null\n onStreamDone?: () => SSEOutput | SSEOutput[] | null\n onStreamError?: (error: unknown) => SSEOutput | SSEOutput[] | null\n shouldBreakStream?: (chunk: TChunk) => boolean\n}\n\n/**\n * Strategy runner. Returns a discriminated union\n * instead of a framework-specific Response.\n */\nexport async function runStrategy<TResult, TChunk>(\n strategy: ExecutionStrategy<TResult, TChunk>,\n signal: { signal: AbortSignal, clientSignal?: AbortSignal, cleanup: () => void },\n): Promise<ExecutionResult> {\n const result = await strategy.execute()\n\n if (!strategy.isStream(result)) {\n signal.cleanup()\n return { kind: 'json', data: strategy.translateResult(result) }\n }\n\n async function* generateSSE(): AsyncGenerator<SSEOutput> {\n try {\n for await (const chunk of result as AsyncIterable<TChunk>) {\n const outputs = normalizeOutputs(strategy.translateStreamChunk(chunk))\n for (const output of outputs) {\n yield output\n }\n if (strategy.shouldBreakStream?.(chunk as TChunk)) {\n break\n }\n }\n const doneOutputs = normalizeOutputs(strategy.onStreamDone?.() ?? null)\n for (const output of doneOutputs) {\n yield output\n }\n }\n catch (error) {\n // Only suppress error events when the *client* disconnected.\n // Upstream timeouts (proxy-side abort) should still emit onStreamError\n // so strategies can translate them into proper SSE error events.\n if (!signal.clientSignal?.aborted) {\n const errOutputs = normalizeOutputs(strategy.onStreamError?.(error) ?? null)\n for (const output of errOutputs) {\n yield output\n }\n }\n }\n finally {\n signal.cleanup()\n }\n }\n\n return { kind: 'stream', generator: generateSSE() }\n}\n\nfunction normalizeOutputs(value: SSEOutput | SSEOutput[] | null): SSEOutput[] {\n if (!value) {\n return []\n }\n return Array.isArray(value) ? value : [value]\n}\n\n/**\n * Creates an SSEOutput by copying SSE metadata fields from a raw chunk\n * and replacing the data field with the provided value.\n */\nexport function passthroughSSEChunk(chunk: SSEStreamChunk, data: string): SSEOutput {\n return {\n ...(chunk.comment ? { comment: chunk.comment } : {}),\n ...(chunk.event ? { event: chunk.event } : {}),\n ...(chunk.id !== undefined ? { id: String(chunk.id) } : {}),\n ...(chunk.retry !== undefined ? { retry: chunk.retry } : {}),\n data,\n }\n}\n","import type { Model } from '~/types'\n\nimport { state } from './state'\n\nexport const RESPONSES_ENDPOINT = '/responses' as const\nexport const MESSAGES_ENDPOINT = '/v1/messages' as const\n\nexport function findModelById(\n modelId: string,\n): Model | undefined {\n return state.cache.models?.data.find(model => model.id === modelId)\n}\n\nexport function modelSupportsEndpoint(\n model: Model | undefined,\n endpoint: string,\n): boolean {\n return model?.supported_endpoints?.includes(endpoint) ?? false\n}\n\nexport function modelSupportsToolCalls(\n model: Model | undefined,\n): boolean {\n return model?.capabilities.supports.tool_calls ?? false\n}\n\nexport function modelSupportsAdaptiveThinking(\n model: Model | undefined,\n): boolean {\n return model?.capabilities.supports.adaptive_thinking ?? false\n}\n\nexport function modelSupportsVision(\n model: Model | undefined,\n): boolean {\n return model?.capabilities.supports.vision ?? false\n}\n\nexport function getModelVisionLimits(\n model: Model | undefined,\n): Model['capabilities']['limits']['vision'] | undefined {\n return model?.capabilities.limits.vision\n}\n","import type {\n ChatCompletionsPayload,\n ContentPart,\n Message,\n Model,\n Tool,\n ToolCall,\n} from '~/types'\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// Token counting constants\nconst TOKENS_PER_MESSAGE = 3\nconst TOKENS_PER_NAME = 1\nconst REPLY_PRIMING_TOKENS = 3\n\n// Model-specific constants for tool token calculation\nconst BASE_CONSTANTS = {\n propertyInitOverhead: 3,\n propertyKeyOverhead: 3,\n enumOverhead: -3,\n enumItemCost: 3,\n functionEndOverhead: 12,\n}\n\ntype ModelConstants = typeof BASE_CONSTANTS & { functionInitOverhead: number }\n\n/**\n * Calculate tokens for tool calls\n */\nfunction calculateToolCallsTokens(toolCalls: Array<ToolCall>, encoder: Encoder, constants: ModelConstants): number {\n let tokens = 0\n for (const toolCall of toolCalls) {\n tokens += constants.functionInitOverhead\n tokens += encoder.encode(JSON.stringify(toolCall)).length\n }\n tokens += constants.functionEndOverhead\n return tokens\n}\n\n/**\n * Calculate tokens for content parts\n */\nfunction calculateContentPartsTokens(contentParts: Array<ContentPart>, encoder: Encoder): 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 }\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 */\nfunction calculateMessageTokens(message: Message, encoder: Encoder, constants: ModelConstants): number {\n let tokens = TOKENS_PER_MESSAGE\n for (const [key, value] of Object.entries(message)) {\n if (typeof value === 'string') {\n tokens += encoder.encode(value).length\n }\n if (key === 'name') {\n tokens += TOKENS_PER_NAME\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 */\nfunction calculateTokens(messages: Array<Message>, encoder: Encoder, constants: ModelConstants): 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 += REPLY_PRIMING_TOKENS\n return numTokens\n}\n\n/**\n * Get the corresponding encoder module based on encoding type\n */\nasync function getEncoder(encoding: string): Promise<Encoder> {\n const cached = encodingCache.get(encoding)\n if (cached)\n return cached\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 function getTokenizerFromModel(model: Model): string {\n return model.capabilities.tokenizer || 'o200k_base'\n}\n\n/**\n * Get model-specific constants for token calculation\n */\nfunction getModelConstants(model: Model): ModelConstants {\n const isLegacy = model.id === 'gpt-3.5-turbo' || model.id === 'gpt-4'\n return { ...BASE_CONSTANTS, functionInitOverhead: isLegacy ? 10 : 7 }\n}\n\n/**\n * Calculate tokens for a single parameter\n */\nfunction calculateParameterTokens(key: string, prop: unknown, context: {\n encoder: Encoder\n constants: ModelConstants\n}): number {\n const { encoder, constants } = context\n let tokens = constants.propertyKeyOverhead\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.enumOverhead\n for (const item of param.enum) {\n tokens += constants.enumItemCost\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 // Handle additional properties (excluding standard ones)\n const excludedKeys = new Set(['type', 'description', 'enum'])\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'\n ? propertyValue\n : (\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 function parameters\n */\nfunction calculateParametersTokens(parameters: unknown, encoder: Encoder, constants: ModelConstants): 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 for (const [key, value] of Object.entries(params)) {\n if (key === 'properties') {\n const properties = value as Record<string, unknown>\n if (Object.keys(properties).length > 0) {\n tokens += constants.propertyInitOverhead\n for (const propKey of Object.keys(properties)) {\n tokens += calculateParameterTokens(propKey, properties[propKey], {\n encoder,\n constants,\n })\n }\n }\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 */\nfunction calculateToolTokens(tool: Tool, encoder: Encoder, constants: ModelConstants): number {\n let tokens = constants.functionInitOverhead\n const func = tool.function\n const functionName = func.name\n let functionDescription = func.description || ''\n if (functionDescription.endsWith('.')) {\n functionDescription = functionDescription.slice(0, -1)\n }\n const line = `${functionName}:${functionDescription}`\n tokens += encoder.encode(line).length\n if (\n typeof func.parameters === 'object'\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 function numTokensForTools(tools: Array<Tool>, encoder: Encoder, constants: ModelConstants): number {\n let toolTokenCount = 0\n for (const tool of tools) {\n toolTokenCount += calculateToolTokens(tool, encoder, constants)\n }\n toolTokenCount += constants.functionEndOverhead\n return toolTokenCount\n}\n\n/**\n * Calculate the token count of messages, supporting multiple GPT encoders\n */\nexport async function getTokenCount(payload: ChatCompletionsPayload, model: Model): Promise<{ input: number, output: number }> {\n // Get tokenizer string\n const tokenizer = getTokenizerFromModel(model)\n\n // Get corresponding encoder module\n const encoder = await getEncoder(tokenizer)\n\n const inputMessages = payload.messages.filter(\n msg => msg.role !== 'assistant',\n )\n const outputMessages = payload.messages.filter(\n msg => msg.role === 'assistant',\n )\n\n const constants = getModelConstants(model)\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 { state } from '~/lib/state'\n\nconst DEFAULT_TIMEOUT_MS = 1_800_000 // 30 minutes\n\nexport function createUpstreamSignal(clientSignal?: AbortSignal, timeoutMs = DEFAULT_TIMEOUT_MS) {\n const controller = new AbortController()\n const timeout = timeoutMs > 0\n ? setTimeout(() => controller.abort(), timeoutMs)\n : undefined\n\n const onAbort = () => controller.abort()\n if (clientSignal && !clientSignal.aborted) {\n clientSignal.addEventListener('abort', onAbort)\n }\n\n return {\n signal: controller.signal,\n clientSignal,\n cleanup: () => {\n if (timeout)\n clearTimeout(timeout)\n clientSignal?.removeEventListener('abort', onAbort)\n },\n }\n}\n\n/**\n * Convenience wrapper that reads the upstream timeout from runtime config.\n */\nexport function createUpstreamSignalFromConfig(clientSignal: AbortSignal) {\n return createUpstreamSignal(\n clientSignal,\n state.config.upstreamTimeoutSeconds !== undefined\n ? state.config.upstreamTimeoutSeconds * 1000\n : undefined,\n )\n}\n","// Streaming types\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 cached_tokens: number\n }\n completion_tokens_details?: {\n accepted_prediction_tokens: number\n rejected_prediction_tokens: number\n }\n }\n}\n\ninterface Delta {\n content?: string | null\n reasoning_text?: 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}\n\ninterface 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\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 cached_tokens: number\n }\n }\n}\n\ninterface ResponseMessage {\n role: 'assistant'\n content: 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\nexport const REASONING_EFFORT_VALUES = ['minimal', 'low', 'medium', 'high'] as const\nexport type ReasoningEffort = typeof REASONING_EFFORT_VALUES[number]\n\n// Payload types\nexport interface ChatCompletionsPayload {\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 reasoning_effort?: ReasoningEffort | null\n thinking_budget?: number | 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}\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\n\nexport interface TextPart {\n type: 'text'\n text: string\n}\n\nexport interface ImagePart {\n type: 'image_url'\n image_url: {\n url: string\n detail?: 'low' | 'high' | 'auto'\n }\n}\n\n// Embeddings\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\n// Models\nexport interface ModelsResponse {\n data: Array<Model>\n object: string\n}\n\ninterface ModelLimits {\n max_context_window_tokens?: number\n max_output_tokens?: number\n max_prompt_tokens?: number\n max_inputs?: number\n vision?: {\n max_prompt_image_size?: number\n max_prompt_images?: number\n supported_media_types?: Array<string>\n }\n}\n\ninterface ModelSupports {\n tool_calls?: boolean\n parallel_tool_calls?: boolean\n dimensions?: boolean\n adaptive_thinking?: boolean\n vision?: boolean\n streaming?: boolean\n structured_outputs?: boolean\n reasoning_effort?: Array<string>\n}\n\ninterface ModelCapabilities {\n family: string\n limits: ModelLimits\n object: string\n supports: ModelSupports\n tokenizer: string\n type: string\n}\n\nexport interface Model {\n capabilities: ModelCapabilities\n id: string\n model_picker_enabled: boolean\n name: string\n object: string\n preview: boolean\n vendor: string\n version: string\n policy?: {\n state: string\n terms: string\n }\n supported_endpoints?: Array<string>\n}\n","import type {\n AnthropicCountTokensPayload,\n AnthropicMessagesPayload,\n} from '~/translator'\nimport type {\n ChatCompletionsPayload,\n EmbeddingRequest,\n ResponsesInputTokensPayload,\n ResponsesPayload,\n} from '~/types'\n\nimport consola from 'consola'\nimport { z } from 'zod'\n\nimport { REASONING_EFFORT_VALUES } from '~/types'\n\nimport { shouldUseFunctionApplyPatch } from './config'\nimport { HTTPError } from './error'\n\nconst jsonObjectSchema = z.object({}).catchall(z.unknown())\nconst finiteNumberSchema = z.number().finite()\nconst nonNegativeIntegerSchema = z.number().int().nonnegative()\nconst openAIPenaltySchema = finiteNumberSchema.min(-2).max(2)\nconst openAILogitBiasKeySchema = z.string().regex(/^\\d+$/)\nconst openAILogitBiasValueSchema = finiteNumberSchema.min(-100).max(100)\n\nfunction createObjectSchemaDefinitionSchema(message: string) {\n return jsonObjectSchema.superRefine((schema, ctx) => {\n const typeValue = schema.type\n if (typeValue !== undefined && typeValue !== 'object') {\n ctx.addIssue({\n code: 'custom',\n message,\n })\n }\n })\n}\n\nconst openAITextPartSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n}).loose()\n\nconst openAIImagePartSchema = z.object({\n type: z.literal('image_url'),\n image_url: z.object({\n url: z.string(),\n detail: z.enum(['low', 'high', 'auto']).optional(),\n }).loose(),\n}).loose()\n\nconst openAIContentSchema = z.union([\n z.string(),\n z.null(),\n z.array(z.union([openAITextPartSchema, openAIImagePartSchema])),\n])\n\nconst openAIToolCallSchema = z.object({\n id: z.string(),\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n arguments: z.string(),\n }).loose(),\n}).loose()\n\nconst openAIMessageSchema = z.object({\n role: z.enum(['user', 'assistant', 'system', 'tool', 'developer']),\n content: openAIContentSchema,\n name: z.string().optional(),\n tool_calls: z.array(openAIToolCallSchema).optional(),\n tool_call_id: z.string().optional(),\n}).loose().superRefine((message, ctx) => {\n if (message.role === 'tool' && !message.tool_call_id) {\n ctx.addIssue({\n code: 'custom',\n message: 'tool messages require tool_call_id',\n path: ['tool_call_id'],\n })\n }\n\n if (message.role !== 'assistant' && message.tool_calls) {\n ctx.addIssue({\n code: 'custom',\n message: 'tool_calls are only valid on assistant messages',\n path: ['tool_calls'],\n })\n }\n})\n\nconst openAIToolSchema = z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n parameters: createObjectSchemaDefinitionSchema('tool function.parameters must describe an object'),\n }).loose(),\n}).loose()\n\nconst openAIToolChoiceSchema = z.union([\n z.literal('none'),\n z.literal('auto'),\n z.literal('required'),\n z.object({\n type: z.literal('function'),\n function: z.object({\n name: z.string().min(1),\n }).loose(),\n }).loose(),\n])\n\nconst openAIResponseFormatSchema = z.object({\n type: z.literal('json_object'),\n})\n\nconst responsesInputTextSchema = z.object({\n type: z.enum(['input_text', 'output_text']),\n text: z.string(),\n}).loose()\n\nconst responsesInputImageSchema = z.object({\n type: z.literal('input_image'),\n image_url: z.string().nullable().optional(),\n file_id: z.string().nullable().optional(),\n detail: z.enum(['low', 'high', 'auto']).optional(),\n}).loose().superRefine((item, ctx) => {\n if (!item.image_url && !item.file_id) {\n ctx.addIssue({\n code: 'custom',\n message: 'input_image requires image_url or file_id',\n })\n }\n})\n\nconst responsesInputFileSchema = z.object({\n type: z.literal('input_file'),\n file_id: z.string().nullable().optional(),\n file_url: z.string().nullable().optional(),\n file_data: z.string().nullable().optional(),\n filename: z.string().nullable().optional(),\n}).loose().superRefine((item, ctx) => {\n if (!item.file_id && !item.file_url && !item.file_data) {\n ctx.addIssue({\n code: 'custom',\n message: 'input_file requires file_id, file_url, or file_data',\n })\n }\n\n if (item.file_data && !item.filename) {\n ctx.addIssue({\n code: 'custom',\n message: 'input_file with file_data requires filename',\n })\n }\n})\n\nconst responsesUnknownContentSchema = z.object({\n type: z.string().min(1),\n}).catchall(z.unknown()).superRefine((item, ctx) => {\n if (['input_text', 'output_text', 'input_image', 'input_file'].includes(item.type)) {\n ctx.addIssue({\n code: 'custom',\n message: `content item type ${item.type} must match the explicit schema`,\n })\n }\n})\n\nconst responsesInputContentSchema = z.union([\n responsesInputTextSchema,\n responsesInputImageSchema,\n responsesInputFileSchema,\n responsesUnknownContentSchema,\n])\n\nconst responsesMessageSchema = z.object({\n type: z.literal('message').optional(),\n role: z.enum(['user', 'assistant', 'system', 'developer']),\n content: z.union([\n z.string(),\n z.array(responsesInputContentSchema),\n ]).optional(),\n status: z.string().optional(),\n phase: z.enum(['commentary', 'final_answer']).optional(),\n}).loose()\n\nconst responsesFunctionCallSchema = z.object({\n type: z.literal('function_call'),\n call_id: z.string().min(1),\n name: z.string().min(1),\n arguments: z.string(),\n status: z.enum(['in_progress', 'completed', 'incomplete']).optional(),\n}).loose()\n\nconst responsesFunctionCallOutputSchema = z.object({\n type: z.literal('function_call_output'),\n call_id: z.string().min(1),\n output: z.union([\n z.string(),\n z.array(responsesInputContentSchema),\n ]),\n status: z.enum(['in_progress', 'completed', 'incomplete']).optional(),\n}).loose()\n\nconst responsesReasoningSummarySchema = z.object({\n type: z.literal('summary_text'),\n text: z.string(),\n}).loose()\n\nconst responsesReasoningInputSchema = z.object({\n id: z.string().optional(),\n type: z.literal('reasoning'),\n summary: z.array(responsesReasoningSummarySchema),\n encrypted_content: z.string().min(1),\n}).loose()\n\nconst responsesCompactionInputSchema = z.object({\n id: z.string().min(1),\n type: z.literal('compaction'),\n encrypted_content: z.string().min(1),\n}).loose()\n\nconst responsesItemReferenceInputSchema = z.object({\n type: z.literal('item_reference'),\n id: z.string().min(1),\n}).loose()\n\nconst responsesUnknownInputItemSchema = z.object({\n type: z.string().min(1),\n}).catchall(z.unknown()).superRefine((item, ctx) => {\n if (['message', 'function_call', 'function_call_output', 'reasoning', 'compaction', 'item_reference'].includes(item.type)) {\n ctx.addIssue({\n code: 'custom',\n message: `input item type ${item.type} must match the explicit schema`,\n })\n }\n})\n\nconst responsesInputItemSchema = z.union([\n responsesMessageSchema,\n responsesFunctionCallSchema,\n responsesFunctionCallOutputSchema,\n responsesReasoningInputSchema,\n responsesCompactionInputSchema,\n responsesItemReferenceInputSchema,\n responsesUnknownInputItemSchema,\n])\n\nconst responsesFunctionToolSchema = z.object({\n type: z.literal('function'),\n name: z.string().min(1),\n parameters: jsonObjectSchema.nullable().optional(),\n strict: z.boolean().nullable().optional(),\n description: z.string().nullable().optional(),\n}).loose()\n\nconst responsesUnknownToolSchema = z.object({\n type: z.string().min(1),\n}).catchall(z.unknown()).superRefine((tool, ctx) => {\n if (tool.type === 'function') {\n ctx.addIssue({\n code: 'custom',\n message: 'tool type function must match the explicit schema',\n })\n }\n})\n\nconst responsesToolSchema = z.union([\n responsesFunctionToolSchema,\n responsesUnknownToolSchema,\n])\n\nconst responsesToolChoiceSchema = z.union([\n z.literal('none'),\n z.literal('auto'),\n z.literal('required'),\n z.object({\n type: z.literal('function'),\n name: z.string().min(1),\n }).loose(),\n])\n\nconst responsesReasoningConfigSchema = z.object({\n effort: z.enum(['none', 'minimal', 'low', 'medium', 'high', 'xhigh']).nullable().optional(),\n summary: z.enum(['auto', 'concise', 'detailed']).nullable().optional(),\n}).loose()\n\nconst responsesTextFormatTextSchema = z.object({\n type: z.literal('text'),\n}).loose()\n\nconst responsesTextFormatJsonObjectSchema = z.object({\n type: z.literal('json_object'),\n}).loose()\n\nconst responsesTextFormatJsonSchemaSchema = z.object({\n type: z.literal('json_schema'),\n name: z.string().min(1),\n schema: jsonObjectSchema,\n description: z.string().nullable().optional(),\n strict: z.boolean().nullable().optional(),\n}).loose()\n\nconst responsesTextConfigSchema = z.object({\n format: z.union([\n responsesTextFormatTextSchema,\n responsesTextFormatJsonObjectSchema,\n responsesTextFormatJsonSchemaSchema,\n ]).nullable().optional(),\n verbosity: z.enum(['low', 'medium', 'high']).nullable().optional(),\n}).loose()\n\nconst responsesContextManagementSchema = z.object({\n type: z.literal('compaction'),\n compact_threshold: nonNegativeIntegerSchema,\n}).loose()\n\nconst responsesConversationSchema = z.union([\n z.string().min(1),\n z.object({\n id: z.string().nullable().optional(),\n }).loose(),\n])\n\nfunction createResponsesPayloadSchema(options: {\n requireModel: boolean\n}) {\n return z.object({\n model: options.requireModel\n ? z.string().min(1)\n : z.string().min(1).nullable().optional(),\n instructions: z.string().nullable().optional(),\n input: z.union([\n z.string(),\n z.array(responsesInputItemSchema),\n z.null(),\n ]).optional(),\n conversation: responsesConversationSchema.nullable().optional(),\n previous_response_id: z.string().nullable().optional(),\n tools: z.array(responsesToolSchema).nullable().optional(),\n tool_choice: responsesToolChoiceSchema.nullable().optional(),\n temperature: finiteNumberSchema.min(0).max(2).nullable().optional(),\n top_p: finiteNumberSchema.min(0).max(1).nullable().optional(),\n max_output_tokens: nonNegativeIntegerSchema.nullable().optional(),\n max_tool_calls: nonNegativeIntegerSchema.nullable().optional(),\n metadata: z.record(z.string(), z.string()).nullable().optional(),\n stream: z.boolean().nullable().optional(),\n safety_identifier: z.string().nullable().optional(),\n prompt_cache_key: z.string().nullable().optional(),\n truncation: z.enum(['auto', 'disabled']).nullable().optional(),\n parallel_tool_calls: z.boolean().nullable().optional(),\n store: z.boolean().nullable().optional(),\n user: z.string().nullable().optional(),\n prompt: z.union([z.string().min(1), jsonObjectSchema]).nullable().optional(),\n text: responsesTextConfigSchema.nullable().optional(),\n reasoning: responsesReasoningConfigSchema.nullable().optional(),\n context_management: z.array(responsesContextManagementSchema).nullable().optional(),\n include: z.array(z.string().min(1)).nullable().optional(),\n service_tier: z.string().nullable().optional(),\n }).loose().superRefine((payload, ctx) => {\n const toolChoice = payload.tool_choice\n if (\n toolChoice\n && typeof toolChoice === 'object'\n && 'name' in toolChoice\n && typeof toolChoice.name === 'string'\n && Array.isArray(payload.tools)\n ) {\n const declaredFunctionNames = payload.tools\n .filter((tool) => {\n if (tool.type === 'function' && typeof tool.name === 'string') {\n return true\n }\n return shouldUseFunctionApplyPatch()\n && tool.type === 'custom'\n && tool.name === 'apply_patch'\n })\n .map(tool => tool.name)\n if (!declaredFunctionNames.includes(toolChoice.name)) {\n ctx.addIssue({\n code: 'custom',\n message: 'tool_choice.name must reference a declared function tool',\n path: ['tool_choice', 'name'],\n })\n }\n }\n })\n}\n\nconst responsesPayloadSchema = createResponsesPayloadSchema({ requireModel: true })\nconst responsesInputTokensPayloadSchema = createResponsesPayloadSchema({ requireModel: false })\n\nconst openAIChatPayloadSchema = z.object({\n model: z.string().min(1),\n messages: z.array(openAIMessageSchema).min(1),\n temperature: finiteNumberSchema.min(0).max(2).nullable().optional(),\n top_p: finiteNumberSchema.min(0).max(1).nullable().optional(),\n max_tokens: nonNegativeIntegerSchema.nullable().optional(),\n stop: z.union([z.string(), z.array(z.string())]).nullable().optional(),\n n: z.number().int().positive().nullable().optional(),\n stream: z.boolean().nullable().optional(),\n frequency_penalty: openAIPenaltySchema.nullable().optional(),\n presence_penalty: openAIPenaltySchema.nullable().optional(),\n logit_bias: z.record(openAILogitBiasKeySchema, openAILogitBiasValueSchema).nullable().optional(),\n logprobs: z.boolean().nullable().optional(),\n response_format: openAIResponseFormatSchema.nullable().optional(),\n seed: z.number().int().nullable().optional(),\n tools: z.array(openAIToolSchema).nullable().optional(),\n tool_choice: openAIToolChoiceSchema.nullable().optional(),\n user: z.string().nullable().optional(),\n reasoning_effort: z.enum(REASONING_EFFORT_VALUES).nullable().optional(),\n thinking_budget: z.number().int().positive().nullable().optional(),\n}).loose().superRefine((payload, ctx) => {\n const toolChoice = payload.tool_choice\n\n if (\n toolChoice\n && typeof toolChoice === 'object'\n && 'function' in toolChoice\n && !payload.tools?.some(tool => tool.function.name === toolChoice.function.name)\n ) {\n ctx.addIssue({\n code: 'custom',\n message: 'tool_choice.function.name must reference a declared tool',\n path: ['tool_choice', 'function', 'name'],\n })\n }\n})\n\nconst anthropicTextBlockSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n}).loose()\n\nconst anthropicImageBlockSchema = z.object({\n type: z.literal('image'),\n source: z.object({\n type: z.literal('base64'),\n media_type: z.enum(['image/jpeg', 'image/png', 'image/gif', 'image/webp']),\n data: z.string().min(1),\n }).loose(),\n}).loose()\n\nconst anthropicThinkingBlockSchema = z.object({\n type: z.literal('thinking'),\n thinking: z.string(),\n signature: z.string().optional(),\n}).loose()\n\nconst anthropicToolUseBlockSchema = z.object({\n type: z.literal('tool_use'),\n id: z.string().min(1),\n name: z.string().min(1),\n input: jsonObjectSchema,\n}).loose()\n\nconst anthropicToolResultContentBlockSchema = z.union([\n anthropicTextBlockSchema,\n anthropicImageBlockSchema,\n])\n\nconst anthropicToolResultBlockSchema = z.object({\n type: z.literal('tool_result'),\n tool_use_id: z.string().min(1),\n content: z.union([\n z.string(),\n z.array(anthropicToolResultContentBlockSchema),\n ]),\n is_error: z.boolean().optional(),\n}).loose()\n\nconst anthropicUserMessageSchema = z.object({\n role: z.literal('user'),\n content: z.union([\n z.string(),\n z.array(z.union([\n anthropicTextBlockSchema,\n anthropicImageBlockSchema,\n anthropicToolResultBlockSchema,\n ])),\n ]),\n}).loose()\n\nconst anthropicAssistantMessageSchema = z.object({\n role: z.literal('assistant'),\n content: z.union([\n z.string(),\n z.array(z.union([\n anthropicTextBlockSchema,\n anthropicThinkingBlockSchema,\n anthropicToolUseBlockSchema,\n ])),\n ]),\n}).loose()\n\nconst anthropicMessageSchema = z.union([\n anthropicUserMessageSchema,\n anthropicAssistantMessageSchema,\n])\n\nconst anthropicToolSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n input_schema: createObjectSchemaDefinitionSchema('tool input_schema must describe an object'),\n}).loose()\n\nconst anthropicToolChoiceSchema = z.union([\n z.object({\n type: z.literal('auto'),\n }).loose(),\n z.object({\n type: z.literal('any'),\n }).loose(),\n z.object({\n type: z.literal('none'),\n }).loose(),\n z.object({\n type: z.literal('tool'),\n name: z.string().min(1),\n }).loose(),\n])\n\nconst anthropicThinkingSchema = z.union([\n z.object({\n type: z.literal('disabled'),\n }).loose(),\n z.object({\n type: z.literal('adaptive'),\n }).loose(),\n z.object({\n type: z.literal('enabled'),\n budget_tokens: z.number().int().positive(),\n }).loose(),\n])\n\nconst anthropicMessagesBasePayloadSchema = z.object({\n model: z.string().min(1),\n messages: z.array(anthropicMessageSchema).min(1),\n system: z.union([\n z.string(),\n z.array(anthropicTextBlockSchema),\n ]).optional(),\n metadata: z.object({\n user_id: z.string().optional(),\n }).loose().optional(),\n stop_sequences: z.array(z.string()).optional(),\n stream: z.boolean().optional(),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n top_k: z.number().int().positive().optional(),\n tools: z.array(anthropicToolSchema).optional(),\n tool_choice: anthropicToolChoiceSchema.optional(),\n thinking: anthropicThinkingSchema.optional(),\n service_tier: z.enum(['auto', 'standard_only']).optional(),\n}).loose().superRefine((payload, ctx) => {\n if (payload.tool_choice?.type === 'tool' && !payload.tools?.some(tool => tool.name === payload.tool_choice?.name)) {\n ctx.addIssue({\n code: 'custom',\n message: 'tool_choice.name must reference a declared tool',\n path: ['tool_choice', 'name'],\n })\n }\n})\n\nconst anthropicMessagesPayloadSchema = anthropicMessagesBasePayloadSchema.extend({\n max_tokens: z.number().int().nonnegative(),\n})\n\nconst anthropicCountTokensPayloadSchema = anthropicMessagesBasePayloadSchema.extend({\n max_tokens: z.number().int().nonnegative().optional(),\n})\n\nconst embeddingRequestSchema = z.object({\n input: z.union([z.string(), z.array(z.string())]),\n model: z.string().min(1),\n}).loose()\n\nfunction throwInvalidPayload(context: string, issues: Array<z.core.$ZodIssue>): never {\n consola.warn('Invalid request payload', { context, issues })\n throw new HTTPError(400, {\n error: {\n message: 'Invalid request payload',\n type: 'invalid_request_error',\n param: context,\n details: issues.map(i => ({ path: i.path, message: i.message })),\n },\n })\n}\n\nexport function parseOpenAIChatPayload(payload: unknown): ChatCompletionsPayload {\n const result = openAIChatPayloadSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('openai.chat', result.error.issues)\n }\n return result.data as ChatCompletionsPayload\n}\n\nexport function parseAnthropicMessagesPayload(payload: unknown): AnthropicMessagesPayload {\n const result = anthropicMessagesPayloadSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('anthropic.messages', result.error.issues)\n }\n return result.data as AnthropicMessagesPayload\n}\n\nexport function parseAnthropicCountTokensPayload(payload: unknown): AnthropicCountTokensPayload {\n const result = anthropicCountTokensPayloadSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('anthropic.messages.count_tokens', result.error.issues)\n }\n return result.data as AnthropicCountTokensPayload\n}\n\nexport function parseEmbeddingRequest(payload: unknown): EmbeddingRequest {\n const result = embeddingRequestSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('openai.embeddings', result.error.issues)\n }\n return result.data as EmbeddingRequest\n}\n\nexport function parseResponsesPayload(payload: unknown): ResponsesPayload {\n const result = responsesPayloadSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('openai.responses', result.error.issues)\n }\n return result.data as ResponsesPayload\n}\n\nexport function parseResponsesInputTokensPayload(payload: unknown): ResponsesInputTokensPayload {\n const result = responsesInputTokensPayloadSchema.safeParse(payload)\n if (!result.success) {\n throwInvalidPayload('openai.responses.input_tokens', result.error.issues)\n }\n return result.data as ResponsesInputTokensPayload\n}\n","import type { CopilotTransport, OpenAIChatAdapter } from '~/adapters'\nimport type { CapiChatCompletionChunk, CapiExecutionPlan } from '~/core/capi'\nimport type { ExecutionStrategy, SSEStreamChunk } from '~/lib/execution-strategy'\n\nimport consola from 'consola'\nimport { isNonStreamingResponse } from '~/clients'\nimport { passthroughSSEChunk } from '~/lib/execution-strategy'\n\ntype ChatCompletionsResult = Awaited<ReturnType<CopilotTransport['execute']>>\n\nexport function createChatCompletionsStrategy(\n transport: CopilotTransport,\n adapter: OpenAIChatAdapter,\n plan: CapiExecutionPlan,\n signal: AbortSignal,\n): ExecutionStrategy<ChatCompletionsResult, SSEStreamChunk> {\n return {\n execute() {\n return transport.execute(plan, { signal })\n },\n\n isStream(result): result is ChatCompletionsResult & AsyncIterable<SSEStreamChunk> {\n return !isNonStreamingResponse(result)\n },\n\n translateResult(result) {\n consola.debug('Non-streaming response:', JSON.stringify(result))\n return adapter.fromCapiResponse(result as Exclude<ChatCompletionsResult, AsyncIterable<SSEStreamChunk>>)\n },\n\n translateStreamChunk(chunk) {\n consola.debug('Streaming chunk:', JSON.stringify(chunk))\n if (chunk.data === '[DONE]') {\n return passthroughSSEChunk(chunk, chunk.data)\n }\n\n if (!chunk.data) {\n return null\n }\n\n const sanitizedChunk = adapter.serializeStreamChunk(\n JSON.parse(chunk.data) as CapiChatCompletionChunk,\n )\n return passthroughSSEChunk(chunk, JSON.stringify(sanitizedChunk))\n },\n }\n}\n","import type { ExecutionResult } from '~/lib/execution-strategy'\nimport type { ModelMappingInfo } from '~/lib/request-logger'\nimport consola from 'consola'\n\nimport { CopilotTransport, OpenAIChatAdapter } from '~/adapters'\nimport { readCapiRequestContext } from '~/core/capi'\nimport { runStrategy } from '~/lib/execution-strategy'\nimport { findModelById } from '~/lib/model-capabilities'\nimport { createCopilotClient } from '~/lib/state'\nimport { getTokenCount } from '~/lib/tokenizer'\nimport { createUpstreamSignalFromConfig } from '~/lib/upstream-signal'\nimport { parseOpenAIChatPayload } from '~/lib/validation'\n\nimport { createChatCompletionsStrategy } from './strategy'\n\nexport interface CompletionCoreParams {\n body: unknown\n signal: AbortSignal\n headers: Headers\n}\n\nexport interface CompletionCoreResult {\n result: ExecutionResult\n modelMapping?: ModelMappingInfo\n}\n\n/**\n * Core handler for chat completions.\n */\nexport async function handleCompletionCore(\n { body, signal, headers }: CompletionCoreParams,\n): Promise<CompletionCoreResult> {\n const adapter = new OpenAIChatAdapter()\n let payload = parseOpenAIChatPayload(body)\n consola.debug('Request payload:', JSON.stringify(payload).slice(-400))\n\n const originalModel = payload.model\n const selectedModel = findModelById(payload.model)\n\n try {\n if (selectedModel) {\n const tokenCount = await getTokenCount(payload, selectedModel)\n consola.info('Current token count:', tokenCount)\n }\n else {\n consola.warn('No model selected, skipping token count calculation')\n }\n }\n catch (error) {\n consola.warn('Failed to calculate token count:', error)\n }\n\n if (payload.max_tokens == null) {\n payload = {\n ...payload,\n max_tokens: selectedModel?.capabilities.limits.max_output_tokens,\n }\n consola.debug('Set max_tokens to:', JSON.stringify(payload.max_tokens))\n }\n\n const upstreamSignal = createUpstreamSignalFromConfig(signal)\n\n const plan = adapter.toCapiPlan(payload, {\n requestContext: readCapiRequestContext(headers),\n })\n\n const modelMapping: ModelMappingInfo = {\n originalModel,\n mappedModel: plan.resolvedModel,\n }\n\n const copilotClient = createCopilotClient()\n const transport = new CopilotTransport(copilotClient)\n\n consola.debug('Streaming response')\n const strategy = createChatCompletionsStrategy(transport, adapter, plan, upstreamSignal.signal)\n const result = await runStrategy(strategy, upstreamSignal)\n return { result, modelMapping }\n}\n","import { Elysia } from 'elysia'\n\nimport { sseAdapter } from '~/lib/sse-adapter'\nimport { requestGuardPlugin } from '~/routes/middleware/request-guard'\n\nimport { handleCompletionCore } from './handler'\n\nexport function createCompletionRoutes() {\n return new Elysia()\n .use(requestGuardPlugin)\n .post('/chat/completions', async function* (ctx) {\n const { body, request } = ctx\n const { result, modelMapping } = await handleCompletionCore({\n body,\n signal: request.signal,\n headers: request.headers,\n })\n if ('requestMeta' in ctx && ctx.requestMeta && typeof ctx.requestMeta === 'object') {\n (ctx.requestMeta as { modelMapping: unknown }).modelMapping = modelMapping\n }\n if (result.kind === 'json') {\n return result.data\n }\n yield* sseAdapter(result.generator)\n }, { guarded: true })\n}\n","import { createCopilotClient } from '~/lib/state'\nimport { parseEmbeddingRequest } from '~/lib/validation'\n\n/**\n * Core handler for creating embeddings.\n */\nexport async function handleEmbeddingsCore(body: unknown): Promise<object> {\n const payload = parseEmbeddingRequest(body)\n const copilotClient = createCopilotClient()\n return await copilotClient.createEmbeddings(payload)\n}\n","import { Elysia } from 'elysia'\n\nimport { handleEmbeddingsCore } from './handler'\n\nexport function createEmbeddingRoutes() {\n return new Elysia()\n .post('/embeddings', async ({ body }) => {\n return handleEmbeddingsCore(body)\n })\n}\n","import process from 'node:process'\n\nimport { getCachedConfig } from './config'\n\nexport interface ModelFallbackConfig {\n claudeOpus: string\n claudeSonnet: string\n claudeHaiku: string\n}\n\nexport const DEFAULT_FALLBACKS: ModelFallbackConfig = {\n claudeOpus: 'claude-opus-4.6',\n claudeSonnet: 'claude-sonnet-4.6',\n claudeHaiku: 'claude-haiku-4.5',\n}\n\nexport function getModelFallbackConfig(): ModelFallbackConfig {\n const cachedConfig = getCachedConfig()\n return {\n claudeOpus:\n process.env.MODEL_FALLBACK_CLAUDE_OPUS\n || cachedConfig.modelFallback?.claudeOpus\n || DEFAULT_FALLBACKS.claudeOpus,\n claudeSonnet:\n process.env.MODEL_FALLBACK_CLAUDE_SONNET\n || cachedConfig.modelFallback?.claudeSonnet\n || DEFAULT_FALLBACKS.claudeSonnet,\n claudeHaiku:\n process.env.MODEL_FALLBACK_CLAUDE_HAIKU\n || cachedConfig.modelFallback?.claudeHaiku\n || DEFAULT_FALLBACKS.claudeHaiku,\n }\n}\n\nexport function resolveModel(\n modelId: string,\n knownModelIds: Set<string> | undefined,\n config: ModelFallbackConfig,\n): string {\n if (knownModelIds?.has(modelId)) {\n return modelId\n }\n if (modelId.startsWith('claude-opus-'))\n return config.claudeOpus\n if (modelId.startsWith('claude-sonnet-'))\n return config.claudeSonnet\n if (modelId.startsWith('claude-haiku-'))\n return config.claudeHaiku\n return modelId\n}\n","import { AnthropicMessagesAdapter } from '~/adapters'\nimport { getModelFallbackConfig, resolveModel } from '~/lib/model-resolver'\nimport { state } from '~/lib/state'\n\n/**\n * Creates a shared AnthropicMessagesAdapter with standard model resolution\n * and capability detection. Used by both messages handler and count-tokens handler.\n */\nexport function createAnthropicAdapter(): AnthropicMessagesAdapter {\n const knownModelIds = state.cache.models\n ? new Set(state.cache.models.data.map(model => model.id))\n : undefined\n const fallbackConfig = getModelFallbackConfig()\n\n return new AnthropicMessagesAdapter({\n modelResolver: (model: string) => resolveModel(model, knownModelIds, fallbackConfig),\n getModelCapabilities: model => ({\n supportsThinkingBudget: model.startsWith('claude'),\n }),\n })\n}\n","import consola from 'consola'\n\nimport { fromTranslationFailure, HTTPError } from '~/lib/error'\nimport { state } from '~/lib/state'\nimport { getTokenCount } from '~/lib/tokenizer'\nimport { parseAnthropicCountTokensPayload } from '~/lib/validation'\nimport { TranslationFailure } from '~/translator/anthropic/translation-issue'\n\nimport { createAnthropicAdapter } from './shared'\n\n// Token estimation constants\nconst CLAUDE_TOOL_OVERHEAD_TOKENS = 346\nconst GROK_TOOL_OVERHEAD_TOKENS = 480\nconst CLAUDE_ESTIMATION_FACTOR = 1.15\nconst GROK_ESTIMATION_FACTOR = 1.03\n\nexport interface CountTokensCoreParams {\n body: unknown\n headers: Headers\n}\n\n/**\n * Core handler for counting tokens.\n */\nexport async function handleCountTokensCore(\n { body, headers }: CountTokensCoreParams,\n): Promise<{ input_tokens: number }> {\n const anthropicBeta = headers.get('anthropic-beta') ?? undefined\n const anthropicPayload = parseAnthropicCountTokensPayload(body)\n\n const adapter = createAnthropicAdapter()\n\n let openAIPayload\n try {\n openAIPayload = adapter.toTokenCountPayload(anthropicPayload)\n }\n catch (error) {\n if (error instanceof TranslationFailure) {\n throw fromTranslationFailure(error)\n }\n throw error\n }\n\n const selectedModel = state.cache.models?.data.find(\n model => model.id === openAIPayload.model,\n )\n\n if (!selectedModel) {\n throw new HTTPError(400, {\n error: {\n message: `Model not found for token counting: \"${openAIPayload.model}\"`,\n type: 'invalid_request_error',\n },\n })\n }\n\n const tokenCount = await getTokenCount(openAIPayload, selectedModel)\n\n if (anthropicPayload.tools && anthropicPayload.tools.length > 0) {\n let mcpToolExist = false\n if (anthropicBeta?.startsWith('claude-code')) {\n mcpToolExist = anthropicPayload.tools.some(tool =>\n tool.name.startsWith('mcp__'),\n )\n }\n if (!mcpToolExist) {\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 + CLAUDE_TOOL_OVERHEAD_TOKENS\n }\n else if (anthropicPayload.model.startsWith('grok')) {\n tokenCount.input = tokenCount.input + GROK_TOOL_OVERHEAD_TOKENS\n }\n }\n }\n\n let finalTokenCount = tokenCount.input + tokenCount.output\n if (anthropicPayload.model.startsWith('claude')) {\n finalTokenCount = Math.round(finalTokenCount * CLAUDE_ESTIMATION_FACTOR)\n }\n else if (anthropicPayload.model.startsWith('grok')) {\n finalTokenCount = Math.round(finalTokenCount * GROK_ESTIMATION_FACTOR)\n }\n\n consola.info('Token count:', finalTokenCount)\n\n return {\n input_tokens: finalTokenCount,\n }\n}\n","import type { AnthropicMessagesPayload } from '~/translator'\nimport type { Model } from '~/types'\n\nimport { getSmallModel, shouldCompactUseSmallModel, shouldWarmupUseSmallModel } from './config'\nimport {\n findModelById,\n modelSupportsAdaptiveThinking,\n modelSupportsToolCalls,\n modelSupportsVision,\n} from './model-capabilities'\n\nconst COMPACT_SYSTEM_PROMPT_START\n = 'You are a helpful AI assistant tasked with summarizing conversations'\nconst WARMUP_BETA_MARKERS = ['warmup', 'probe', 'preflight']\n\nexport interface ModelRoutingResult {\n originalModel: string\n routedModel: string\n reason?: 'compact' | 'warmup'\n}\n\nexport function applyMessagesModelPolicy(\n payload: AnthropicMessagesPayload,\n anthropicBetaHeader: string | undefined,\n): ModelRoutingResult {\n const originalModel = payload.model\n const smallModel = getSmallModel()\n if (!smallModel) {\n return { originalModel, routedModel: originalModel }\n }\n\n const originalSelection = findModelById(originalModel)\n const smallSelection = findModelById(smallModel)\n\n if (\n shouldCompactUseSmallModel()\n && isCompactRequest(payload)\n && canRouteToSmallModel(payload, originalSelection, smallSelection)\n ) {\n payload.model = smallModel\n return {\n originalModel,\n routedModel: smallModel,\n reason: 'compact',\n }\n }\n\n if (\n shouldWarmupUseSmallModel()\n && isWarmupRequest(payload, anthropicBetaHeader)\n && canRouteToSmallModel(payload, originalSelection, smallSelection)\n ) {\n payload.model = smallModel\n return {\n originalModel,\n routedModel: smallModel,\n reason: 'warmup',\n }\n }\n\n return { originalModel, routedModel: originalModel }\n}\n\nexport function isCompactRequest(payload: AnthropicMessagesPayload): boolean {\n if (typeof payload.system === 'string') {\n return payload.system.startsWith(COMPACT_SYSTEM_PROMPT_START)\n }\n if (!Array.isArray(payload.system)) {\n return false\n }\n return payload.system.some(\n block => typeof block.text === 'string'\n && block.text.startsWith(COMPACT_SYSTEM_PROMPT_START),\n )\n}\n\nexport function isWarmupRequest(\n payload: AnthropicMessagesPayload,\n anthropicBetaHeader: string | undefined,\n): boolean {\n if (!anthropicBetaHeader || isCompactRequest(payload)) {\n return false\n }\n\n const normalizedBeta = anthropicBetaHeader.toLowerCase()\n if (!WARMUP_BETA_MARKERS.some(marker => normalizedBeta.includes(marker))) {\n return false\n }\n\n if (payload.system !== undefined || payload.thinking !== undefined) {\n return false\n }\n\n if (payload.tools && payload.tools.length > 0) {\n return false\n }\n\n if (payload.max_tokens > 64) {\n return false\n }\n\n return hasSingleShortUserTextMessage(payload)\n}\n\nfunction canRouteToSmallModel(\n payload: AnthropicMessagesPayload,\n originalModel: Model | undefined,\n smallModel: Model | undefined,\n): boolean {\n if (!originalModel || !smallModel) {\n return false\n }\n\n const originalEndpoints = new Set(originalModel.supported_endpoints ?? [])\n const smallEndpoints = new Set(smallModel.supported_endpoints ?? [])\n for (const endpoint of originalEndpoints) {\n if (!smallEndpoints.has(endpoint)) {\n return false\n }\n }\n\n if (payload.tools?.length && !modelSupportsToolCalls(smallModel)) {\n return false\n }\n\n if (payload.thinking && !modelSupportsAdaptiveThinking(smallModel)) {\n return false\n }\n\n if (hasVisionInput(payload) && !modelSupportsVision(smallModel)) {\n return false\n }\n\n return true\n}\n\nfunction hasSingleShortUserTextMessage(payload: AnthropicMessagesPayload): boolean {\n if (payload.messages.length !== 1) {\n return false\n }\n\n const [message] = payload.messages\n if (message.role !== 'user') {\n return false\n }\n\n if (typeof message.content === 'string') {\n return message.content.trim().length > 0 && message.content.length <= 64\n }\n\n if (message.content.length !== 1 || message.content[0]?.type !== 'text') {\n return false\n }\n\n const text = message.content[0].text.trim()\n return text.length > 0 && text.length <= 64\n}\n\nfunction hasVisionInput(payload: AnthropicMessagesPayload): boolean {\n return payload.messages.some(message => containsVisionContent(message.content))\n}\n\nfunction containsVisionContent(content: AnthropicMessagesPayload['messages'][number]['content']): boolean {\n if (!Array.isArray(content)) {\n return false\n }\n\n return content.some(block => block.type === 'image')\n}\n","const COMPACTION_PREFIX = 'cm1#'\nconst SEPARATOR = '@'\n\ninterface CompactionCarrier {\n id: string\n encrypted_content: string\n}\n\nfunction encodeCompaction(carrier: CompactionCarrier): string {\n return `${COMPACTION_PREFIX}${carrier.encrypted_content}${SEPARATOR}${carrier.id}`\n}\n\nfunction decodeCompaction(signature: string): CompactionCarrier | undefined {\n if (!signature.startsWith(COMPACTION_PREFIX)) {\n return undefined\n }\n\n const raw = signature.slice(COMPACTION_PREFIX.length)\n const separatorIndex = raw.indexOf(SEPARATOR)\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 if (!encrypted_content) {\n return undefined\n }\n\n return { id, encrypted_content }\n}\n\nfunction encodeReasoning(item: { id: string, encrypted_content?: string | null }): string {\n return `${item.encrypted_content ?? ''}${SEPARATOR}${item.id}`\n}\n\nfunction decodeReasoning(signature: string): { encryptedContent: string, id: string } {\n const splitIndex = signature.lastIndexOf(SEPARATOR)\n if (splitIndex <= 0 || splitIndex === signature.length - 1) {\n return { encryptedContent: signature, id: '' }\n }\n return {\n encryptedContent: signature.slice(0, splitIndex),\n id: signature.slice(splitIndex + 1),\n }\n}\n\nfunction isCompactionSignature(signature: string): boolean {\n return signature.startsWith(COMPACTION_PREFIX)\n}\n\nfunction isReasoningSignature(signature: string): boolean {\n return !isCompactionSignature(signature) && signature.includes(SEPARATOR)\n}\n\nexport const SignatureCodec = {\n encodeCompaction,\n decodeCompaction,\n encodeReasoning,\n decodeReasoning,\n isCompactionSignature,\n isReasoningSignature,\n} as const\n\nexport type { CompactionCarrier }\n","import type {\n AnthropicAssistantContentBlock,\n AnthropicAssistantMessage,\n AnthropicImageBlock,\n AnthropicMessage,\n AnthropicMessagesPayload,\n AnthropicTextBlock,\n AnthropicThinkingBlock,\n AnthropicTool,\n AnthropicToolResultBlock,\n AnthropicToolUseBlock,\n AnthropicUserContentBlock,\n AnthropicUserMessage,\n} from '~/translator'\nimport type {\n ResponseFunctionCallOutputItem,\n ResponseFunctionToolCallItem,\n ResponseInputCompaction,\n ResponseInputContent,\n ResponseInputImage,\n ResponseInputItem,\n ResponseInputMessage,\n ResponseInputReasoning,\n ResponseInputText,\n ResponsesPayload,\n ResponseTool,\n ToolChoiceFunction,\n ToolChoiceOptions,\n} from '~/types'\nimport { TranslationFailure } from '~/translator/anthropic/translation-issue'\n\nimport { SignatureCodec } from './signature-codec'\n\nconst MESSAGE_TYPE = 'message'\n\nconst USER_ID_ACCOUNT_RE = /user_([^_]+)_account/\nconst USER_ID_SESSION_RE = /_session_(.+)$/\n\nexport const THINKING_TEXT = 'Thinking...'\n\nexport interface AnthropicToResponsesOptions {\n reasoningEffortResolver?: (model: string) => string\n}\n\nexport function translateAnthropicToResponsesPayload(\n payload: AnthropicMessagesPayload,\n options?: AnthropicToResponsesOptions,\n): ResponsesPayload {\n assertResponsesCompatibleRequest(payload)\n\n const input: Array<ResponseInputItem> = []\n\n for (const message of payload.messages) {\n input.push(...translateMessage(message))\n }\n\n const { safetyIdentifier, promptCacheKey } = parseUserId(payload.metadata?.user_id)\n const reasoning = resolveResponsesReasoningConfig(payload, options)\n\n return {\n model: payload.model,\n input,\n instructions: translateSystemPrompt(payload.system),\n temperature: payload.temperature ?? null,\n top_p: payload.top_p ?? null,\n max_output_tokens: payload.max_tokens,\n tools: convertAnthropicTools(payload.tools),\n tool_choice: convertAnthropicToolChoice(payload.tool_choice),\n metadata: payload.metadata ? { ...payload.metadata } : null,\n safety_identifier: safetyIdentifier,\n prompt_cache_key: promptCacheKey,\n stream: payload.stream ?? null,\n store: false,\n parallel_tool_calls: true,\n ...(reasoning\n ? {\n reasoning,\n include: ['reasoning.encrypted_content'],\n }\n : {}),\n }\n}\n\nexport function encodeCompactionCarrierSignature(compaction: { id: string, encrypted_content: string }): string {\n return SignatureCodec.encodeCompaction(compaction)\n}\n\nexport function decodeCompactionCarrierSignature(\n signature: string,\n): { id: string, encrypted_content: string } | undefined {\n return SignatureCodec.decodeCompaction(signature)\n}\n\nfunction translateMessage(message: AnthropicMessage): Array<ResponseInputItem> {\n if (message.role === 'user') {\n return translateUserMessage(message)\n }\n return translateAssistantMessage(message)\n}\n\nfunction translateUserMessage(\n message: AnthropicUserMessage,\n): Array<ResponseInputItem> {\n if (typeof message.content === 'string') {\n return [createMessage('user', message.content)]\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(createFunctionCallOutput(block))\n continue\n }\n\n const converted = translateUserContentBlock(block)\n if (converted) {\n pendingContent.push(converted)\n }\n }\n\n flushPendingContent(pendingContent, items, { role: 'user' })\n return items\n}\n\nfunction translateAssistantMessage(\n message: AnthropicAssistantMessage,\n): Array<ResponseInputItem> {\n const assistantPhase = resolveAssistantPhase(message.content)\n if (typeof message.content === 'string') {\n return [createMessage('assistant', message.content, assistantPhase)]\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 flushPendingContent(pendingContent, items, { role: 'assistant', phase: assistantPhase })\n items.push(createFunctionToolCall(block))\n continue\n }\n\n if (block.type === 'thinking' && block.signature) {\n const compaction = createCompactionContent(block)\n if (compaction) {\n flushPendingContent(pendingContent, items, { role: 'assistant', phase: assistantPhase })\n items.push(compaction)\n continue\n }\n\n if (SignatureCodec.isReasoningSignature(block.signature)) {\n flushPendingContent(pendingContent, items, { role: 'assistant', phase: assistantPhase })\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, { role: 'assistant', phase: assistantPhase })\n return items\n}\n\nfunction translateUserContentBlock(\n block: AnthropicUserContentBlock,\n): ResponseInputContent | undefined {\n switch (block.type) {\n case 'text':\n return createTextContent(block.text)\n case 'image':\n return createImageContent(block)\n default:\n return undefined\n }\n}\n\nfunction translateAssistantContentBlock(\n block: AnthropicAssistantContentBlock,\n): ResponseInputContent | undefined {\n switch (block.type) {\n case 'text':\n return createOutputTextContent(block.text)\n default:\n return undefined\n }\n}\n\nfunction 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 target.push(createMessage(message.role, [...pendingContent], message.phase))\n pendingContent.length = 0\n}\n\nfunction createMessage(\n role: ResponseInputMessage['role'],\n content: string | Array<ResponseInputContent>,\n phase?: ResponseInputMessage['phase'],\n): ResponseInputMessage {\n return {\n type: MESSAGE_TYPE,\n role,\n content,\n ...(role === 'assistant' && phase ? { phase } : {}),\n }\n}\n\nfunction resolveAssistantPhase(\n content: AnthropicAssistantMessage['content'],\n): ResponseInputMessage['phase'] | undefined {\n if (typeof content === 'string') {\n return 'final_answer'\n }\n if (!Array.isArray(content)) {\n return undefined\n }\n\n let hasText = false\n let hasToolUse = false\n for (const block of content) {\n if (block.type === 'text')\n hasText = true\n else if (block.type === 'tool_use')\n hasToolUse = true\n if (hasText && hasToolUse)\n break\n }\n\n if (!hasText) {\n return undefined\n }\n return hasToolUse ? 'commentary' : 'final_answer'\n}\n\nfunction createTextContent(text: string): ResponseInputText {\n return { type: 'input_text', text }\n}\n\nfunction createOutputTextContent(text: string): ResponseInputText {\n return { type: 'output_text', text }\n}\n\nfunction createImageContent(block: AnthropicImageBlock): ResponseInputImage {\n return {\n type: 'input_image',\n image_url: `data:${block.source.media_type};base64,${block.source.data}`,\n detail: 'auto',\n }\n}\n\nfunction createReasoningContent(\n block: AnthropicThinkingBlock,\n): ResponseInputReasoning {\n const { encryptedContent, id } = SignatureCodec.decodeReasoning(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\nfunction createCompactionContent(\n block: AnthropicThinkingBlock,\n): ResponseInputCompaction | undefined {\n const compaction = decodeCompactionCarrierSignature(block.signature ?? '')\n if (!compaction) {\n return undefined\n }\n return {\n id: compaction.id,\n type: 'compaction',\n encrypted_content: compaction.encrypted_content,\n }\n}\n\nfunction createFunctionToolCall(\n block: AnthropicToolUseBlock,\n): ResponseFunctionToolCallItem {\n return {\n type: 'function_call',\n call_id: block.id,\n name: block.name,\n arguments: JSON.stringify(block.input),\n status: 'completed',\n }\n}\n\nfunction createFunctionCallOutput(\n block: AnthropicToolResultBlock,\n): ResponseFunctionCallOutputItem {\n return {\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}\n\nfunction translateSystemPrompt(\n system: string | Array<AnthropicTextBlock> | undefined,\n): string | null {\n if (!system) {\n return null\n }\n if (typeof system === 'string') {\n return system\n }\n const text = system.map(block => block.text).join(' ')\n return text.length > 0 ? text : null\n}\n\nfunction convertAnthropicTools(\n tools: Array<AnthropicTool> | undefined,\n): Array<ResponseTool> | null {\n if (!tools || tools.length === 0) {\n return null\n }\n return tools.map(tool => ({\n type: 'function',\n name: tool.name,\n parameters: tool.input_schema,\n strict: false,\n ...(tool.description ? { description: tool.description } : {}),\n }))\n}\n\nfunction convertAnthropicToolChoice(\n choice: AnthropicMessagesPayload['tool_choice'],\n): ToolChoiceOptions | ToolChoiceFunction {\n if (!choice) {\n return 'auto'\n }\n switch (choice.type) {\n case 'auto':\n return 'auto'\n case 'any':\n return 'required'\n case 'tool':\n return choice.name ? { type: 'function', name: choice.name } : 'auto'\n case 'none':\n return 'none'\n }\n}\n\nfunction resolveResponsesReasoningConfig(\n payload: AnthropicMessagesPayload,\n options?: AnthropicToResponsesOptions,\n): ResponsesPayload['reasoning'] | undefined {\n const effort = resolveResponsesReasoningEffort(payload, options)\n if (!effort) {\n return undefined\n }\n\n return {\n effort,\n summary: effort === 'none' ? null : 'detailed',\n }\n}\n\nfunction resolveResponsesReasoningEffort(\n payload: AnthropicMessagesPayload,\n options?: AnthropicToResponsesOptions,\n): NonNullable<ResponsesPayload['reasoning']>['effort'] | undefined {\n if (payload.thinking?.type === 'disabled') {\n return 'none'\n }\n\n if (payload.output_config?.effort) {\n return mapAnthropicEffortToResponses(payload.output_config.effort)\n }\n\n if (payload.thinking?.type === 'adaptive') {\n return 'medium'\n }\n\n if (payload.thinking?.type === 'enabled') {\n return (options?.reasoningEffortResolver?.(payload.model) ?? 'medium') as NonNullable<ResponsesPayload['reasoning']>['effort']\n }\n\n return undefined\n}\n\nfunction mapAnthropicEffortToResponses(\n effort: NonNullable<AnthropicMessagesPayload['output_config']>['effort'],\n): NonNullable<ResponsesPayload['reasoning']>['effort'] {\n if (effort === 'max') {\n return 'xhigh'\n }\n return effort\n}\n\nfunction assertResponsesCompatibleRequest(\n payload: AnthropicMessagesPayload,\n) {\n if (payload.stop_sequences?.length) {\n throw new TranslationFailure(\n 'Anthropic stop_sequences cannot be forwarded through the Responses execution path.',\n {\n status: 400,\n kind: 'unsupported_stop_sequences',\n },\n )\n }\n\n if (payload.top_k !== undefined) {\n throw new TranslationFailure(\n 'Anthropic top_k is not supported on the Responses execution path.',\n {\n status: 400,\n kind: 'unsupported_top_k',\n },\n )\n }\n\n if (payload.service_tier !== undefined) {\n throw new TranslationFailure(\n 'Anthropic service_tier is not supported on the Responses execution path.',\n {\n status: 400,\n kind: 'unsupported_service_tier',\n },\n )\n }\n}\n\nfunction parseUserId(\n userId: string | undefined,\n): { safetyIdentifier: string | null, promptCacheKey: string | null } {\n if (!userId) {\n return { safetyIdentifier: null, promptCacheKey: null }\n }\n\n const userMatch = userId.match(USER_ID_ACCOUNT_RE)\n const sessionMatch = userId.match(USER_ID_SESSION_RE)\n\n return {\n safetyIdentifier: userMatch ? userMatch[1] : null,\n promptCacheKey: sessionMatch ? sessionMatch[1] : null,\n }\n}\n\nfunction convertToolResultContent(\n content: string | Array<AnthropicTextBlock | AnthropicImageBlock>,\n): string | Array<ResponseInputContent> {\n if (typeof content === 'string') {\n return content\n }\n\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 case 'image':\n result.push(createImageContent(block))\n break\n default:\n break\n }\n }\n\n return result\n}\n","import type {\n ResponseContextManagementCompactionItem,\n ResponseInputItem,\n ResponsesPayload,\n} from '~/types'\n\nimport { isResponsesApiContextManagementModel } from '~/lib/config'\n\n/** Default token threshold when model limits are unknown. */\nconst DEFAULT_COMPACT_THRESHOLD = 50_000\n/** Fraction of max prompt tokens to use as compact threshold. */\nconst COMPACT_THRESHOLD_RATIO = 0.9\n\nexport function getResponsesRequestOptions(\n payload: ResponsesPayload,\n): { vision: boolean, initiator: 'user' | 'agent' } {\n return {\n vision: hasVisionInput(payload),\n initiator: hasAgentInitiator(payload) ? 'agent' : 'user',\n }\n}\n\nexport function hasAgentInitiator(payload: ResponsesPayload): boolean {\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 return String(lastItem.role).toLowerCase() === 'assistant'\n}\n\nexport function hasVisionInput(payload: ResponsesPayload): boolean {\n return getPayloadItems(payload).some(item => containsVisionContent(item))\n}\n\nexport function resolveResponsesCompactThreshold(\n maxPromptTokens?: number,\n): number {\n if (typeof maxPromptTokens === 'number' && maxPromptTokens > 0) {\n return Math.floor(maxPromptTokens * COMPACT_THRESHOLD_RATIO)\n }\n return DEFAULT_COMPACT_THRESHOLD\n}\n\nfunction createCompactionContextManagement(\n compactThreshold: number,\n): Array<ResponseContextManagementCompactionItem> {\n return [{\n type: 'compaction',\n compact_threshold: compactThreshold,\n }]\n}\n\nexport function applyContextManagement(\n payload: ResponsesPayload,\n maxPromptTokens?: number,\n): void {\n if (payload.context_management !== undefined) {\n return\n }\n if (!isResponsesApiContextManagementModel(payload.model)) {\n return\n }\n\n payload.context_management = createCompactionContextManagement(\n resolveResponsesCompactThreshold(maxPromptTokens),\n )\n}\n\nexport function compactInputByLatestCompaction(\n payload: ResponsesPayload,\n): void {\n if (!Array.isArray(payload.input) || payload.input.length === 0) {\n return\n }\n\n const latestCompactionMessageIndex = getLatestCompactionMessageIndex(payload.input)\n if (latestCompactionMessageIndex === undefined) {\n return\n }\n\n payload.input = payload.input.slice(latestCompactionMessageIndex)\n}\n\nfunction getLatestCompactionMessageIndex(\n input: Array<ResponseInputItem>,\n): number | undefined {\n for (let index = input.length - 1; index >= 0; index--) {\n if (isCompactionInputItem(input[index])) {\n return index\n }\n }\n}\n\nfunction isCompactionInputItem(value: ResponseInputItem): boolean {\n return 'type' in value && value.type === 'compaction'\n}\n\nfunction getPayloadItems(payload: ResponsesPayload): Array<ResponseInputItem> {\n return Array.isArray(payload.input) ? payload.input : []\n}\n\nfunction containsVisionContent(value: unknown): boolean {\n if (!value) {\n return false\n }\n if (Array.isArray(value)) {\n return value.some(entry => containsVisionContent(entry))\n }\n if (typeof value !== 'object') {\n return false\n }\n\n const record = value as Record<string, unknown>\n if (record.type === 'input_image') {\n return true\n }\n if (Array.isArray(record.content)) {\n return record.content.some(entry => containsVisionContent(entry))\n }\n return false\n}\n","import type { AnthropicMessagesAdapter, CopilotTransport } from '~/adapters'\nimport type { CapiChatCompletionChunk, CapiExecutionPlan } from '~/core/capi'\nimport type { ExecutionStrategy, SSEOutput, SSEStreamChunk } from '~/lib/execution-strategy'\n\nimport consola from 'consola'\nimport { isNonStreamingResponse } from '~/clients'\n\ntype ChatCompletionsResult = Awaited<ReturnType<CopilotTransport['execute']>>\n\nexport function createMessagesViaChatCompletionsStrategy(\n transport: CopilotTransport,\n adapter: AnthropicMessagesAdapter,\n plan: CapiExecutionPlan,\n signal: AbortSignal,\n): ExecutionStrategy<ChatCompletionsResult, SSEStreamChunk> {\n let streamTranslator: ReturnType<AnthropicMessagesAdapter['createStreamSerializer']>\n let done = false\n\n return {\n execute() {\n return transport.execute(plan, { signal })\n },\n\n isStream(result): result is ChatCompletionsResult & AsyncIterable<SSEStreamChunk> {\n return !isNonStreamingResponse(result)\n },\n\n translateResult(result) {\n consola.debug(\n 'Non-streaming response from Copilot (full):',\n JSON.stringify(result, null, 2),\n )\n const anthropicResponse = adapter.fromCapiResponse(\n result as Exclude<ChatCompletionsResult, AsyncIterable<SSEStreamChunk>>,\n )\n consola.debug(\n 'Translated Anthropic response:',\n JSON.stringify(anthropicResponse),\n )\n return anthropicResponse\n },\n\n translateStreamChunk(chunk): SSEOutput | SSEOutput[] | null {\n if (!streamTranslator) {\n streamTranslator = adapter.createStreamSerializer()\n }\n\n consola.debug('Copilot raw stream event:', JSON.stringify(chunk))\n\n if (chunk.data === '[DONE]') {\n const finalEvents = streamTranslator.onDone()\n done = true\n return finalEvents.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n }\n\n if (!chunk.data) {\n return null\n }\n\n const parsed = JSON.parse(chunk.data) as CapiChatCompletionChunk\n const events = streamTranslator.onChunk(parsed)\n\n return events.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n },\n\n shouldBreakStream() {\n return done\n },\n\n onStreamError(error) {\n consola.error('Error streaming Anthropic response:', error)\n if (!streamTranslator) {\n streamTranslator = adapter.createStreamSerializer()\n }\n const errorEvents = streamTranslator.onError(error)\n return errorEvents.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n },\n }\n}\n","export function isAsyncIterable<T>(value: unknown): value is AsyncIterable<T> {\n return Boolean(value)\n && typeof (value as AsyncIterable<T>)[Symbol.asyncIterator] === 'function'\n}\n","import type { CopilotClient } from '~/clients'\nimport type { CapiRequestContext } from '~/core/capi'\nimport type { ExecutionStrategy } from '~/lib/execution-strategy'\nimport type { AnthropicMessagesPayload } from '~/translator'\n\nimport { isAsyncIterable } from '~/lib/async-iterable'\n\ninterface MessagesStreamChunk {\n event?: string\n data?: string\n}\n\ntype NativeMessagesResult = Awaited<ReturnType<CopilotClient['createMessages']>>\n\nexport function createNativeMessagesStrategy(\n copilotClient: CopilotClient,\n payload: AnthropicMessagesPayload,\n anthropicBetaHeader: string | undefined,\n options: {\n signal: AbortSignal\n requestContext: Partial<CapiRequestContext>\n },\n): ExecutionStrategy<NativeMessagesResult, MessagesStreamChunk> {\n return {\n execute() {\n return copilotClient.createMessages(payload, anthropicBetaHeader, options)\n },\n\n isStream(result): result is NativeMessagesResult & AsyncIterable<MessagesStreamChunk> {\n return isAsyncIterable(result)\n },\n\n translateResult(result) {\n return result\n },\n\n translateStreamChunk(chunk) {\n return {\n ...(chunk.event ? { event: chunk.event } : {}),\n data: chunk.data ?? '',\n }\n },\n }\n}\n","import type {\n AnthropicAssistantContentBlock,\n AnthropicResponse,\n AnthropicToolUseBlock,\n} from '~/translator'\nimport type {\n ResponseOutputContentBlock,\n ResponseOutputFunctionCall,\n ResponseOutputReasoning,\n ResponseOutputRefusal,\n ResponseOutputText,\n ResponseReasoningBlock,\n ResponsesResult,\n} from '~/types'\n\nimport consola from 'consola'\n\nimport { THINKING_TEXT } from './anthropic-to-responses'\nimport { SignatureCodec } from './signature-codec'\n\nexport function translateResponsesToAnthropic(\n response: ResponsesResult,\n): AnthropicResponse {\n const contentBlocks = mapOutputToAnthropicContent(response.output)\n return {\n id: response.id,\n type: 'message',\n role: 'assistant',\n content: contentBlocks.length > 0 ? contentBlocks : fallbackContentBlocks(response.output_text),\n model: response.model,\n stop_reason: mapResponsesStopReason(response),\n stop_sequence: null,\n usage: mapResponsesUsage(response),\n }\n}\n\nfunction mapOutputToAnthropicContent(\n output: ResponsesResult['output'],\n): Array<AnthropicAssistantContentBlock> {\n const blocks: Array<AnthropicAssistantContentBlock> = []\n\n for (const item of output) {\n switch (item.type) {\n case 'reasoning': {\n const thinking = extractReasoningText(item)\n if (thinking) {\n blocks.push({\n type: 'thinking',\n thinking,\n signature: SignatureCodec.encodeReasoning(item),\n })\n }\n break\n }\n case 'function_call': {\n const toolUseBlock = createToolUseContentBlock(item)\n if (toolUseBlock) {\n blocks.push(toolUseBlock)\n }\n break\n }\n case 'message': {\n const text = combineMessageTextContent(item.content)\n if (text) {\n blocks.push({ type: 'text', text })\n }\n break\n }\n case 'compaction': {\n if (item.id && item.encrypted_content) {\n blocks.push({\n type: 'thinking',\n thinking: THINKING_TEXT,\n signature: SignatureCodec.encodeCompaction({\n id: item.id,\n encrypted_content: item.encrypted_content,\n }),\n })\n }\n break\n }\n }\n }\n\n return blocks\n}\n\nfunction combineMessageTextContent(\n content: Array<ResponseOutputContentBlock> | undefined,\n): string {\n if (!Array.isArray(content)) {\n return ''\n }\n\n let aggregated = ''\n for (const block of content) {\n if (isResponseOutputText(block)) {\n aggregated += block.text\n continue\n }\n if (isResponseOutputRefusal(block)) {\n aggregated += block.refusal\n continue\n }\n if (typeof (block as { text?: unknown }).text === 'string') {\n aggregated += (block as { text: string }).text\n }\n }\n return aggregated\n}\n\nfunction extractReasoningText(item: ResponseOutputReasoning): string {\n if (!item.summary || item.summary.length === 0) {\n return THINKING_TEXT\n }\n\n const segments: Array<string> = []\n collectReasoningSegments(item.summary, segments)\n return segments.join('').trim()\n}\n\nfunction collectReasoningSegments(\n blocks: Array<ResponseReasoningBlock>,\n segments: Array<string>,\n) {\n for (const block of blocks) {\n if (typeof block.text === 'string') {\n segments.push(block.text)\n }\n }\n}\n\nfunction createToolUseContentBlock(\n call: ResponseOutputFunctionCall,\n): AnthropicToolUseBlock | null {\n if (!call.name || !call.call_id) {\n return null\n }\n\n return {\n type: 'tool_use',\n id: call.call_id,\n name: call.name,\n input: parseFunctionCallArguments(call.arguments),\n }\n}\n\nfunction parseFunctionCallArguments(\n rawArguments: string,\n): Record<string, unknown> {\n if (!rawArguments.trim()) {\n return {}\n }\n\n try {\n const parsed = JSON.parse(rawArguments) as unknown\n if (Array.isArray(parsed)) {\n return { arguments: parsed }\n }\n if (parsed && typeof parsed === 'object') {\n return parsed as Record<string, unknown>\n }\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\nfunction fallbackContentBlocks(\n outputText: string,\n): Array<AnthropicAssistantContentBlock> {\n if (!outputText) {\n return []\n }\n return [{\n type: 'text',\n text: outputText,\n }]\n}\n\nfunction mapResponsesStopReason(\n response: ResponsesResult,\n): AnthropicResponse['stop_reason'] {\n if (response.status === 'completed') {\n return response.output.some(item => item.type === 'function_call')\n ? 'tool_use'\n : 'end_turn'\n }\n\n if (response.status === 'incomplete') {\n if (response.incomplete_details?.reason === 'max_output_tokens') {\n return 'max_tokens'\n }\n if (response.incomplete_details?.reason === 'content_filter') {\n return 'end_turn'\n }\n }\n\n return null\n}\n\nfunction 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 cachedTokens = response.usage?.input_tokens_details?.cached_tokens\n\n return {\n input_tokens: inputTokens - (cachedTokens ?? 0),\n output_tokens: outputTokens,\n ...(cachedTokens !== undefined ? { cache_read_input_tokens: cachedTokens } : {}),\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isResponseOutputText(\n block: ResponseOutputContentBlock,\n): block is ResponseOutputText {\n return isRecord(block) && block.type === 'output_text'\n}\n\nfunction isResponseOutputRefusal(\n block: ResponseOutputContentBlock,\n): block is ResponseOutputRefusal {\n return isRecord(block) && block.type === 'refusal'\n}\n","import type { FunctionCallStreamState, ResponsesStreamState } from './types'\nimport type { AnthropicStreamEventData } from '~/translator'\nimport type {\n ResponseCompletedEvent,\n ResponseCreatedEvent,\n ResponseErrorEvent,\n ResponseFailedEvent,\n ResponseFunctionCallArgumentsDeltaEvent,\n ResponseFunctionCallArgumentsDoneEvent,\n ResponseIncompleteEvent,\n ResponseOutputItemAddedEvent,\n ResponseOutputItemDoneEvent,\n ResponseReasoningSummaryTextDeltaEvent,\n ResponseReasoningSummaryTextDoneEvent,\n ResponseStreamEvent,\n ResponseTextDeltaEvent,\n ResponseTextDoneEvent,\n} from '~/types'\nimport { THINKING_TEXT } from './anthropic-to-responses'\nimport { translateResponsesToAnthropic } from './responses-to-anthropic'\nimport { SignatureCodec } from './signature-codec'\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\nfunction updateWhitespaceRunState(\n previousCount: number,\n chunk: string,\n): { nextCount: number, exceeded: boolean } {\n let count = previousCount\n\n for (const char of chunk) {\n if (char === ' ' || 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 count = 0\n }\n\n return { nextCount: count, exceeded: false }\n}\n\nexport class ResponsesStreamTranslator {\n private readonly state: ResponsesStreamState = {\n messageStartSent: false,\n messageCompleted: false,\n nextContentBlockIndex: 0,\n activeScalarBlockKey: null,\n activeScalarBlockIndex: null,\n blockHasDelta: new Set(),\n functionCallStateByOutputIndex: new Map(),\n }\n\n get isCompleted(): boolean {\n return this.state.messageCompleted\n }\n\n onEvent(rawEvent: ResponseStreamEvent): Array<AnthropicStreamEventData> {\n switch (rawEvent.type) {\n case 'response.created':\n return this.handleResponseCreated(rawEvent)\n case 'response.output_item.added':\n return this.handleOutputItemAdded(rawEvent)\n case 'response.output_item.done':\n return this.handleOutputItemDone(rawEvent)\n case 'response.output_text.delta':\n return this.handleOutputTextDelta(rawEvent)\n case 'response.output_text.done':\n return this.handleOutputTextDone(rawEvent)\n case 'response.reasoning_summary_text.delta':\n return this.handleReasoningSummaryTextDelta(rawEvent)\n case 'response.reasoning_summary_text.done':\n return this.handleReasoningSummaryTextDone(rawEvent)\n case 'response.function_call_arguments.delta':\n return this.handleFunctionCallArgumentsDelta(rawEvent)\n case 'response.function_call_arguments.done':\n return this.handleFunctionCallArgumentsDone(rawEvent)\n case 'response.completed':\n case 'response.incomplete':\n return this.handleResponseCompleted(rawEvent)\n case 'response.failed':\n return this.handleResponseFailed(rawEvent)\n case 'error':\n return this.handleErrorEvent(rawEvent)\n default:\n return []\n }\n }\n\n onDone(): Array<AnthropicStreamEventData> {\n if (this.state.messageCompleted) {\n return []\n }\n\n this.state.messageCompleted = true\n return [buildErrorEvent('Responses stream ended without completion')]\n }\n\n onError(error?: unknown): Array<AnthropicStreamEventData> {\n this.state.messageCompleted = true\n return [buildErrorEvent(error instanceof Error ? error.message : 'Responses stream failed')]\n }\n\n private handleResponseCreated(\n rawEvent: ResponseCreatedEvent,\n ): Array<AnthropicStreamEventData> {\n this.state.messageStartSent = true\n const cachedTokens = rawEvent.response.usage?.input_tokens_details?.cached_tokens ?? 0\n\n return [{\n type: 'message_start',\n message: {\n id: rawEvent.response.id,\n type: 'message',\n role: 'assistant',\n content: [],\n model: rawEvent.response.model,\n stop_reason: null,\n stop_sequence: null,\n usage: {\n input_tokens: (rawEvent.response.usage?.input_tokens ?? 0) - cachedTokens,\n output_tokens: 0,\n cache_read_input_tokens: cachedTokens,\n },\n },\n }]\n }\n\n private handleOutputItemAdded(\n rawEvent: ResponseOutputItemAddedEvent,\n ): Array<AnthropicStreamEventData> {\n if (rawEvent.item.type !== 'function_call') {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openFunctionCallBlock({\n outputIndex: rawEvent.output_index,\n toolCallId: rawEvent.item.call_id,\n name: rawEvent.item.name,\n events,\n })\n\n if (rawEvent.item.arguments) {\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'input_json_delta',\n partial_json: rawEvent.item.arguments,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n }\n\n return events\n }\n\n private handleOutputItemDone(\n rawEvent: ResponseOutputItemDoneEvent,\n ): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n\n if (rawEvent.item.type === 'compaction') {\n if (!rawEvent.item.id || !rawEvent.item.encrypted_content) {\n return events\n }\n\n const blockIndex = this.openThinkingBlock(rawEvent.output_index, events)\n if (!this.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: SignatureCodec.encodeCompaction({\n id: rawEvent.item.id,\n encrypted_content: rawEvent.item.encrypted_content,\n }),\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n this.closeScalarBlock(`thinking:${rawEvent.output_index}`, events)\n return events\n }\n\n if (rawEvent.item.type === 'reasoning') {\n const blockIndex = this.openThinkingBlock(rawEvent.output_index, events)\n if ((!rawEvent.item.summary || rawEvent.item.summary.length === 0) && !this.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 events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'signature_delta',\n signature: SignatureCodec.encodeReasoning(rawEvent.item),\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n this.closeScalarBlock(`thinking:${rawEvent.output_index}`, events)\n }\n\n if (rawEvent.item.type === 'function_call') {\n const blockIndex = this.openFunctionCallBlock({\n outputIndex: rawEvent.output_index,\n toolCallId: rawEvent.item.call_id,\n name: rawEvent.item.name,\n events,\n })\n if (rawEvent.item.arguments && !this.state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'input_json_delta',\n partial_json: rawEvent.item.arguments,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n }\n this.closeFunctionCallBlock(rawEvent.output_index, events)\n }\n\n return events\n }\n\n private handleOutputTextDelta(\n rawEvent: ResponseTextDeltaEvent,\n ): Array<AnthropicStreamEventData> {\n if (!rawEvent.delta) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openTextBlock(rawEvent.output_index, rawEvent.content_index, events)\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'text_delta',\n text: rawEvent.delta,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n return events\n }\n\n private handleOutputTextDone(\n rawEvent: ResponseTextDoneEvent,\n ): Array<AnthropicStreamEventData> {\n if (!rawEvent.text) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openTextBlock(rawEvent.output_index, rawEvent.content_index, events)\n if (!this.state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'text_delta',\n text: rawEvent.text,\n },\n })\n }\n this.closeScalarBlock(`text:${rawEvent.output_index}:${rawEvent.content_index}`, events)\n return events\n }\n\n private handleReasoningSummaryTextDelta(\n rawEvent: ResponseReasoningSummaryTextDeltaEvent,\n ): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openThinkingBlock(rawEvent.output_index, events)\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'thinking_delta',\n thinking: rawEvent.delta,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n return events\n }\n\n private handleReasoningSummaryTextDone(\n rawEvent: ResponseReasoningSummaryTextDoneEvent,\n ): Array<AnthropicStreamEventData> {\n if (!rawEvent.text) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openThinkingBlock(rawEvent.output_index, events)\n if (!this.state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'thinking_delta',\n thinking: rawEvent.text,\n },\n })\n }\n this.closeScalarBlock(`thinking:${rawEvent.output_index}`, events)\n return events\n }\n\n private handleFunctionCallArgumentsDelta(\n rawEvent: ResponseFunctionCallArgumentsDeltaEvent,\n ): Array<AnthropicStreamEventData> {\n if (!rawEvent.delta) {\n return []\n }\n\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openFunctionCallBlock({\n outputIndex: rawEvent.output_index,\n events,\n })\n\n const functionCallState = this.state.functionCallStateByOutputIndex.get(rawEvent.output_index)\n if (!functionCallState) {\n return this.handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError('Received function call arguments delta without an open tool call block.'),\n )\n }\n if (functionCallState.closed) {\n return this.handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError('Received function call arguments delta after the tool call block was already completed.'),\n )\n }\n\n const { nextCount, exceeded } = updateWhitespaceRunState(\n functionCallState.consecutiveWhitespaceCount,\n rawEvent.delta,\n )\n if (exceeded) {\n return this.handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError('Received function call arguments delta containing more than 20 consecutive whitespace characters.'),\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: rawEvent.delta,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n return events\n }\n\n private handleFunctionCallArgumentsDone(\n rawEvent: ResponseFunctionCallArgumentsDoneEvent,\n ): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n const blockIndex = this.openFunctionCallBlock({\n outputIndex: rawEvent.output_index,\n events,\n })\n\n if (rawEvent.arguments && !this.state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: 'content_block_delta',\n index: blockIndex,\n delta: {\n type: 'input_json_delta',\n partial_json: rawEvent.arguments,\n },\n })\n this.state.blockHasDelta.add(blockIndex)\n }\n\n this.closeFunctionCallBlock(rawEvent.output_index, events)\n return events\n }\n\n private handleResponseCompleted(\n rawEvent: ResponseCompletedEvent | ResponseIncompleteEvent,\n ): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n this.closeAllOpenBlocks(events)\n const anthropic = translateResponsesToAnthropic(rawEvent.response)\n events.push({\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 events.push({ type: 'message_stop' })\n this.state.messageCompleted = true\n return events\n }\n\n private handleResponseFailed(\n rawEvent: ResponseFailedEvent,\n ): Array<AnthropicStreamEventData> {\n this.state.messageCompleted = true\n return [buildErrorEvent(rawEvent.response.error?.message ?? 'The response failed due to an unknown error.')]\n }\n\n private handleErrorEvent(\n rawEvent: ResponseErrorEvent,\n ): Array<AnthropicStreamEventData> {\n this.state.messageCompleted = true\n return [buildErrorEvent(rawEvent.message || 'An unexpected error occurred during streaming.')]\n }\n\n private handleFunctionCallArgumentsValidationError(\n error: FunctionCallArgumentsValidationError,\n ): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n this.closeAllOpenBlocks(events)\n this.state.messageCompleted = true\n events.push(buildErrorEvent(error.message))\n return events\n }\n\n private openTextBlock(\n outputIndex: number,\n contentIndex: number,\n events: Array<AnthropicStreamEventData>,\n ): number {\n return this.openScalarBlock({\n key: `text:${outputIndex}:${contentIndex}`,\n contentBlock: {\n type: 'text',\n text: '',\n },\n events,\n })\n }\n\n private openThinkingBlock(\n outputIndex: number,\n events: Array<AnthropicStreamEventData>,\n ): number {\n return this.openScalarBlock({\n key: `thinking:${outputIndex}`,\n contentBlock: {\n type: 'thinking',\n thinking: '',\n },\n events,\n })\n }\n\n private openFunctionCallBlock(params: {\n outputIndex: number\n toolCallId?: string\n name?: string\n events: Array<AnthropicStreamEventData>\n }): number {\n let state = this.state.functionCallStateByOutputIndex.get(params.outputIndex)\n if (!state) {\n const blockIndex = this.state.nextContentBlockIndex++\n state = {\n blockIndex,\n toolCallId: params.toolCallId ?? `tool_call_${blockIndex}`,\n name: params.name ?? 'function',\n consecutiveWhitespaceCount: 0,\n started: false,\n closed: false,\n }\n this.state.functionCallStateByOutputIndex.set(params.outputIndex, state)\n }\n else if (state.closed) {\n throw new FunctionCallArgumentsValidationError('Cannot reopen a completed tool call block.')\n }\n\n if (!state.started) {\n params.events.push({\n type: 'content_block_start',\n index: state.blockIndex,\n content_block: {\n type: 'tool_use',\n id: state.toolCallId,\n name: state.name,\n input: {},\n },\n })\n state.started = true\n }\n\n return state.blockIndex\n }\n\n private openScalarBlock(params: {\n key: string\n contentBlock: Extract<\n AnthropicStreamEventData,\n { type: 'content_block_start' }\n >['content_block']\n events: Array<AnthropicStreamEventData>\n }): number {\n if (this.state.activeScalarBlockKey === params.key && this.state.activeScalarBlockIndex !== null) {\n return this.state.activeScalarBlockIndex\n }\n\n this.closeActiveScalarBlock(params.events)\n\n const blockIndex = this.state.nextContentBlockIndex++\n params.events.push({\n type: 'content_block_start',\n index: blockIndex,\n content_block: params.contentBlock,\n })\n this.state.activeScalarBlockKey = params.key\n this.state.activeScalarBlockIndex = blockIndex\n return blockIndex\n }\n\n private closeScalarBlock(\n key: string,\n events: Array<AnthropicStreamEventData>,\n ) {\n if (this.state.activeScalarBlockKey !== key) {\n return\n }\n this.closeActiveScalarBlock(events)\n }\n\n private closeActiveScalarBlock(events: Array<AnthropicStreamEventData>) {\n if (this.state.activeScalarBlockIndex === null) {\n return\n }\n\n events.push({\n type: 'content_block_stop',\n index: this.state.activeScalarBlockIndex,\n })\n this.state.blockHasDelta.delete(this.state.activeScalarBlockIndex)\n this.state.activeScalarBlockKey = null\n this.state.activeScalarBlockIndex = null\n }\n\n private closeFunctionCallBlock(\n outputIndex: number,\n events: Array<AnthropicStreamEventData>,\n ) {\n const state = this.state.functionCallStateByOutputIndex.get(outputIndex)\n if (!state || !state.started || state.closed) {\n return\n }\n\n events.push({\n type: 'content_block_stop',\n index: state.blockIndex,\n })\n this.state.blockHasDelta.delete(state.blockIndex)\n state.closed = true\n }\n\n private closeAllOpenBlocks(events: Array<AnthropicStreamEventData>) {\n this.closeActiveScalarBlock(events)\n\n const openBlocks: Array<FunctionCallStreamState> = []\n for (const fnState of this.state.functionCallStateByOutputIndex.values()) {\n if (fnState.started && !fnState.closed) {\n openBlocks.push(fnState)\n }\n }\n openBlocks.sort((left, right) => left.blockIndex - right.blockIndex)\n\n for (const fnState of openBlocks) {\n events.push({\n type: 'content_block_stop',\n index: fnState.blockIndex,\n })\n this.state.blockHasDelta.delete(fnState.blockIndex)\n fnState.closed = true\n }\n }\n}\n\nexport function buildErrorEvent(message: string): AnthropicStreamEventData {\n return {\n type: 'error',\n error: {\n type: 'api_error',\n message,\n },\n }\n}\n","import type { CopilotClient } from '~/clients'\nimport type { CapiRequestContext } from '~/core/capi'\nimport type { ExecutionStrategy, SSEOutput, SSEStreamChunk } from '~/lib/execution-strategy'\nimport type { ResponsesPayload, ResponsesResult, ResponseStreamEvent } from '~/types'\n\nimport consola from 'consola'\nimport { isAsyncIterable } from '~/lib/async-iterable'\nimport { ResponsesStreamTranslator } from '~/translator/responses/responses-stream-translator'\nimport { translateResponsesToAnthropic } from '~/translator/responses/responses-to-anthropic'\n\ntype ResponsesApiResult = ResponsesResult | AsyncIterable<SSEStreamChunk>\n\nexport function createMessagesViaResponsesStrategy(\n copilotClient: CopilotClient,\n responsesPayload: ResponsesPayload,\n options: {\n vision: boolean\n initiator: 'user' | 'agent'\n signal: AbortSignal\n requestContext: Partial<CapiRequestContext>\n },\n): ExecutionStrategy<ResponsesApiResult, SSEStreamChunk> {\n const translator = new ResponsesStreamTranslator()\n\n return {\n execute() {\n return copilotClient.createResponses(responsesPayload, options) as Promise<ResponsesApiResult>\n },\n\n isStream(result): result is AsyncIterable<SSEStreamChunk> {\n return Boolean(responsesPayload.stream) && isAsyncIterable(result)\n },\n\n translateResult(result) {\n return translateResponsesToAnthropic(result as ResponsesResult)\n },\n\n translateStreamChunk(chunk): SSEOutput | SSEOutput[] | null {\n if (chunk.event === 'ping') {\n return {\n event: 'ping',\n data: '{\"type\":\"ping\"}',\n }\n }\n\n if (!chunk.data) {\n return null\n }\n\n const events = translator.onEvent(\n JSON.parse(chunk.data) as ResponseStreamEvent,\n )\n\n return events.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n },\n\n shouldBreakStream() {\n return translator.isCompleted\n },\n\n onStreamDone() {\n if (translator.isCompleted) {\n return null\n }\n const events = translator.onDone()\n return events.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n },\n\n onStreamError(error) {\n consola.error('Error streaming Anthropic response via Responses API:', error)\n const events = translator.onError(error)\n return events.map(event => ({\n event: event.type,\n data: JSON.stringify(event),\n }))\n },\n }\n}\n","import type { ExecutionResult } from '~/lib/execution-strategy'\nimport type { ModelMappingInfo } from '~/lib/request-logger'\nimport type { Model } from '~/types'\nimport consola from 'consola'\n\nimport { CopilotTransport } from '~/adapters'\nimport { readCapiRequestContext } from '~/core/capi'\nimport { getReasoningEffortForModel } from '~/lib/config'\nimport { fromTranslationFailure } from '~/lib/error'\nimport { runStrategy } from '~/lib/execution-strategy'\nimport {\n findModelById,\n MESSAGES_ENDPOINT,\n modelSupportsEndpoint,\n RESPONSES_ENDPOINT,\n} from '~/lib/model-capabilities'\nimport { applyMessagesModelPolicy } from '~/lib/request-model-policy'\nimport { createCopilotClient } from '~/lib/state'\nimport { createUpstreamSignalFromConfig } from '~/lib/upstream-signal'\nimport { parseAnthropicMessagesPayload } from '~/lib/validation'\nimport { TranslationFailure } from '~/translator/anthropic/translation-issue'\nimport { translateAnthropicToResponsesPayload } from '~/translator/responses/anthropic-to-responses'\nimport { SignatureCodec } from '~/translator/responses/signature-codec'\n\nimport { applyContextManagement, compactInputByLatestCompaction, getResponsesRequestOptions } from '../responses/context-management'\nimport { createAnthropicAdapter } from './shared'\nimport { createMessagesViaChatCompletionsStrategy } from './strategies/chat-completions'\nimport { createNativeMessagesStrategy } from './strategies/native-messages'\nimport { createMessagesViaResponsesStrategy } from './strategies/responses-api'\n\nexport interface MessagesCoreParams {\n body: unknown\n signal: AbortSignal\n headers: Headers\n}\n\nexport interface MessagesCoreResult {\n result: ExecutionResult\n modelMapping?: ModelMappingInfo\n}\n\n/**\n * Core handler for Anthropic messages endpoint.\n * Returns both the execution result and model mapping info.\n */\nexport async function handleMessagesCore(\n { body, signal, headers }: MessagesCoreParams,\n): Promise<MessagesCoreResult> {\n const anthropicPayload = parseAnthropicMessagesPayload(body)\n if (consola.level >= 4)\n consola.debug('Anthropic request payload:', JSON.stringify(anthropicPayload))\n\n const anthropicBetaHeader = headers.get('anthropic-beta') ?? undefined\n const modelRouting = applyMessagesModelPolicy(\n anthropicPayload,\n anthropicBetaHeader,\n )\n let modelMapping: ModelMappingInfo = {\n originalModel: modelRouting.originalModel,\n mappedModel: modelRouting.routedModel,\n }\n\n if (modelRouting.reason) {\n consola.debug(\n `Routed anthropic request to small model via ${modelRouting.reason}:`,\n `${modelRouting.originalModel} -> ${modelRouting.routedModel}`,\n )\n }\n\n const selectedModel = findModelById(anthropicPayload.model)\n\n const upstreamSignal = createUpstreamSignalFromConfig(signal)\n\n const copilotClient = createCopilotClient()\n\n if (shouldUseMessagesApi(selectedModel)) {\n filterThinkingBlocksForNativeMessages(anthropicPayload)\n\n const strategy = createNativeMessagesStrategy(\n copilotClient,\n anthropicPayload,\n anthropicBetaHeader,\n {\n signal: upstreamSignal.signal,\n requestContext: readCapiRequestContext(headers),\n },\n )\n const result = await runStrategy(strategy, upstreamSignal)\n return { result, modelMapping }\n }\n\n if (shouldUseResponsesApi(selectedModel)) {\n let responsesPayload\n try {\n responsesPayload = translateAnthropicToResponsesPayload(anthropicPayload, {\n reasoningEffortResolver: getReasoningEffortForModel,\n })\n }\n catch (error) {\n if (error instanceof TranslationFailure) {\n throw fromTranslationFailure(error)\n }\n throw error\n }\n modelMapping = {\n originalModel: modelRouting.originalModel,\n mappedModel: responsesPayload.model,\n }\n\n applyContextManagement(\n responsesPayload,\n selectedModel?.capabilities.limits.max_prompt_tokens,\n )\n compactInputByLatestCompaction(responsesPayload)\n\n const { vision, initiator } = getResponsesRequestOptions(responsesPayload)\n const strategy = createMessagesViaResponsesStrategy(\n copilotClient,\n responsesPayload,\n {\n vision,\n initiator,\n signal: upstreamSignal.signal,\n requestContext: readCapiRequestContext(headers),\n },\n )\n const result = await runStrategy(strategy, upstreamSignal)\n return { result, modelMapping }\n }\n\n const adapter = createAnthropicAdapter()\n let plan\n try {\n plan = adapter.toCapiPlan(anthropicPayload, {\n requestContext: readCapiRequestContext(headers),\n })\n }\n catch (error) {\n if (error instanceof TranslationFailure) {\n throw fromTranslationFailure(error)\n }\n throw error\n }\n\n modelMapping = {\n originalModel: modelRouting.originalModel,\n mappedModel: plan.resolvedModel,\n }\n consola.debug(\n 'Claude Code requested model:',\n anthropicPayload.model,\n '-> Copilot model:',\n plan.resolvedModel,\n )\n if (consola.level >= 4) {\n consola.debug(\n 'Planned Copilot request payload:',\n JSON.stringify(plan.payload),\n )\n }\n\n const transport = new CopilotTransport(copilotClient)\n const strategy = createMessagesViaChatCompletionsStrategy(\n transport,\n adapter,\n plan,\n upstreamSignal.signal,\n )\n const result = await runStrategy(strategy, upstreamSignal)\n return { result, modelMapping }\n}\n\nfunction filterThinkingBlocksForNativeMessages(\n anthropicPayload: ReturnType<typeof parseAnthropicMessagesPayload>,\n) {\n for (const message of anthropicPayload.messages) {\n if (message.role !== 'assistant' || !Array.isArray(message.content)) {\n continue\n }\n message.content = message.content.filter((block) => {\n if (block.type !== 'thinking') {\n return true\n }\n return Boolean(\n block.thinking\n && block.thinking !== 'Thinking...'\n && block.signature\n && !SignatureCodec.isReasoningSignature(block.signature)\n && !SignatureCodec.isCompactionSignature(block.signature),\n )\n })\n }\n}\n\nfunction shouldUseResponsesApi(\n selectedModel: Model | undefined,\n): boolean {\n return modelSupportsEndpoint(selectedModel, RESPONSES_ENDPOINT)\n}\n\nfunction shouldUseMessagesApi(\n selectedModel: Model | undefined,\n): boolean {\n return modelSupportsEndpoint(selectedModel, MESSAGES_ENDPOINT)\n}\n","import { Elysia } from 'elysia'\n\nimport { sseAdapter } from '~/lib/sse-adapter'\nimport { requestGuardPlugin } from '~/routes/middleware/request-guard'\n\nimport { handleCountTokensCore } from './count-tokens-handler'\nimport { handleMessagesCore } from './handler'\n\nexport function createMessageRoutes() {\n return new Elysia()\n .use(requestGuardPlugin)\n .post('/messages', async function* (ctx) {\n const { body, request } = ctx\n const { result, modelMapping } = await handleMessagesCore({\n body,\n signal: request.signal,\n headers: request.headers,\n })\n if ('requestMeta' in ctx && ctx.requestMeta && typeof ctx.requestMeta === 'object') {\n (ctx.requestMeta as { modelMapping: unknown }).modelMapping = modelMapping\n }\n if (result.kind === 'json') {\n return result.data\n }\n yield* sseAdapter(result.generator)\n }, { guarded: true })\n .post('/messages/count_tokens', async ({ body, request }) => {\n return handleCountTokensCore({\n body,\n headers: request.headers,\n })\n }, { guarded: true })\n}\n","import { cacheModels, createCopilotClient, state } from '~/lib/state'\n\n/**\n * Core handler for listing models.\n */\nexport async function handleModelsCore(): Promise<object> {\n if (!state.cache.models) {\n // This should be handled by startup logic, but as a fallback.\n const copilotClient = createCopilotClient()\n await cacheModels(copilotClient)\n }\n\n const models = state.cache.models?.data.map(model => ({\n id: 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 return {\n object: 'list',\n data: models,\n has_more: false,\n }\n}\n","import { Elysia } from 'elysia'\n\nimport { handleModelsCore } from './handler'\n\nexport function createModelRoutes() {\n return new Elysia()\n .get('/models', async () => {\n return handleModelsCore()\n })\n}\n","import type { CopilotClient } from '~/clients'\nimport type { CapiRequestContext } from '~/core/capi'\nimport type { ExecutionStrategy, SSEStreamChunk } from '~/lib/execution-strategy'\nimport type { ResponsesPayload, ResponsesResult } from '~/types'\n\nimport { isAsyncIterable } from '~/lib/async-iterable'\nimport { passthroughSSEChunk } from '~/lib/execution-strategy'\n\ninterface StreamIdState {\n responseId?: string\n itemIdsByOutputIndex: Map<number, string>\n}\n\nfunction createStreamIdTracker(): StreamIdState {\n return {\n itemIdsByOutputIndex: new Map(),\n }\n}\n\nfunction fixStreamIds(\n rawData: string,\n eventName: string | undefined,\n state: StreamIdState,\n): string {\n if (!rawData) {\n return rawData\n }\n\n let parsed: Record<string, unknown>\n try {\n parsed = JSON.parse(rawData) as Record<string, unknown>\n }\n catch {\n return rawData\n }\n\n if (eventName === 'response.created' || eventName === 'response.completed' || eventName === 'response.incomplete') {\n const response = parsed.response as Record<string, unknown> | undefined\n if (response?.id && typeof response.id === 'string') {\n state.responseId = response.id\n }\n }\n\n if (eventName === 'response.output_item.added' || eventName === 'response.output_item.done') {\n const outputIndex = typeof parsed.output_index === 'number' ? parsed.output_index : undefined\n const item = parsed.item as Record<string, unknown> | undefined\n if (outputIndex !== undefined && typeof item?.id === 'string') {\n state.itemIdsByOutputIndex.set(outputIndex, item.id)\n }\n }\n\n if (\n (eventName === 'response.function_call_arguments.delta'\n || eventName === 'response.function_call_arguments.done'\n || eventName === 'response.output_text.delta'\n || eventName === 'response.output_text.done'\n || eventName === 'response.reasoning_summary_text.delta'\n || eventName === 'response.reasoning_summary_text.done')\n && typeof parsed.output_index === 'number'\n ) {\n const stableId = state.itemIdsByOutputIndex.get(parsed.output_index)\n if (stableId && parsed.item_id !== stableId) {\n parsed.item_id = stableId\n }\n }\n\n if (state.responseId && parsed.response && typeof parsed.response === 'object') {\n const response = parsed.response as Record<string, unknown>\n if (response.id !== state.responseId) {\n response.id = state.responseId\n }\n }\n\n return JSON.stringify(parsed)\n}\n\nexport function createResponsesPassthroughStrategy(\n copilotClient: CopilotClient,\n payload: ResponsesPayload,\n options: {\n vision: boolean\n initiator: 'user' | 'agent'\n requestContext: Partial<CapiRequestContext>\n signal: AbortSignal\n },\n): ExecutionStrategy<ResponsesResult | AsyncIterable<SSEStreamChunk>, SSEStreamChunk> {\n const tracker = createStreamIdTracker()\n\n return {\n execute() {\n return copilotClient.createResponses(payload, options) as Promise<ResponsesResult | AsyncIterable<SSEStreamChunk>>\n },\n\n isStream(result): result is AsyncIterable<SSEStreamChunk> {\n return Boolean(payload.stream) && isAsyncIterable(result)\n },\n\n translateResult(result) {\n return result as ResponsesResult\n },\n\n translateStreamChunk(chunk) {\n return passthroughSSEChunk(chunk, fixStreamIds(chunk.data ?? '', chunk.event, tracker))\n },\n }\n}\n","import type { ExecutionResult } from '~/lib/execution-strategy'\n\nimport type { ResponsesPayload } from '~/types'\nimport { readCapiRequestContext } from '~/core/capi'\nimport { shouldUseFunctionApplyPatch } from '~/lib/config'\nimport { throwInvalidRequestError } from '~/lib/error'\nimport { runStrategy } from '~/lib/execution-strategy'\nimport { findModelById, modelSupportsEndpoint, RESPONSES_ENDPOINT } from '~/lib/model-capabilities'\nimport { createCopilotClient } from '~/lib/state'\nimport { createUpstreamSignalFromConfig } from '~/lib/upstream-signal'\nimport { parseResponsesPayload } from '~/lib/validation'\n\nimport { applyContextManagement, compactInputByLatestCompaction, getResponsesRequestOptions } from './context-management'\nimport { createResponsesPassthroughStrategy } from './strategy'\n\nexport interface ResponsesCoreParams {\n body: unknown\n signal: AbortSignal\n headers: Headers\n}\n\n/**\n * Core handler for responses endpoint.\n */\nexport async function handleResponsesCore(\n { body, signal, headers }: ResponsesCoreParams,\n): Promise<ExecutionResult> {\n const payload = parseResponsesPayload(body)\n\n applyResponsesToolTransforms(payload)\n applyResponsesInputPolicies(payload)\n compactInputByLatestCompaction(payload)\n\n const selectedModel = findModelById(payload.model)\n if (!selectedModel) {\n throwInvalidRequestError(\n 'The selected model could not be resolved.',\n 'model',\n )\n }\n if (!modelSupportsEndpoint(selectedModel, RESPONSES_ENDPOINT)) {\n throwInvalidRequestError(\n 'The selected model does not support the responses endpoint.',\n 'model',\n )\n }\n\n applyContextManagement(\n payload,\n selectedModel.capabilities.limits.max_prompt_tokens,\n )\n\n const { vision, initiator } = getResponsesRequestOptions(payload)\n const upstreamSignal = createUpstreamSignalFromConfig(signal)\n const copilotClient = createCopilotClient()\n\n const strategy = createResponsesPassthroughStrategy(copilotClient, payload, {\n vision,\n initiator,\n requestContext: readCapiRequestContext(headers),\n signal: upstreamSignal.signal,\n })\n\n return runStrategy(strategy, upstreamSignal)\n}\n\nfunction applyResponsesToolTransforms(payload: ResponsesPayload): void {\n applyFunctionApplyPatch(payload)\n rejectUnsupportedBuiltinTools(payload)\n}\n\nfunction applyFunctionApplyPatch(payload: ResponsesPayload): void {\n if (!shouldUseFunctionApplyPatch() || !Array.isArray(payload.tools)) {\n return\n }\n\n payload.tools = payload.tools.map((tool) => {\n if (\n tool.type === 'custom'\n && typeof tool.name === 'string'\n && tool.name === 'apply_patch'\n ) {\n return {\n type: 'function',\n name: tool.name,\n description: 'Use the `apply_patch` tool to edit files',\n parameters: {\n type: 'object',\n properties: {\n input: {\n type: 'string',\n description: 'The entire contents of the apply_patch command',\n },\n },\n required: ['input'],\n },\n strict: false,\n }\n }\n\n return tool\n })\n}\n\nfunction rejectUnsupportedBuiltinTools(payload: ResponsesPayload): void {\n if (!Array.isArray(payload.tools)) {\n return\n }\n\n for (const tool of payload.tools) {\n if (tool.type === 'web_search') {\n throwInvalidRequestError(\n 'The selected Copilot endpoint does not support the Responses web_search tool.',\n 'tools',\n 'unsupported_tool_web_search',\n )\n }\n }\n}\n\nfunction applyResponsesInputPolicies(payload: ResponsesPayload): void {\n rejectUnsupportedRemoteImageUrls(payload)\n}\n\nfunction rejectUnsupportedRemoteImageUrls(payload: ResponsesPayload): void {\n if (!Array.isArray(payload.input) || !containsRemoteImageUrl(payload.input)) {\n return\n }\n\n throwInvalidRequestError(\n 'The selected Copilot endpoint does not support external image URLs on the Responses API. Use file_id or data URL image input instead.',\n 'input',\n 'unsupported_input_image_remote_url',\n )\n}\n\nfunction containsRemoteImageUrl(value: unknown): boolean {\n if (!value) {\n return false\n }\n if (Array.isArray(value)) {\n return value.some(entry => containsRemoteImageUrl(entry))\n }\n if (typeof value !== 'object') {\n return false\n }\n\n const record = value as Record<string, unknown>\n if (\n record.type === 'input_image'\n && typeof record.image_url === 'string'\n && /^https?:\\/\\//i.test(record.image_url)\n ) {\n return true\n }\n\n return Object.values(record).some(entry => containsRemoteImageUrl(entry))\n}\n","import type {\n ResponseInputItemsListParams,\n ResponseRetrieveParams,\n ResponsesInputTokensPayload,\n} from '~/types'\n\nimport { readCapiRequestContext } from '~/core/capi'\nimport { throwInvalidRequestError } from '~/lib/error'\nimport { createCopilotClient } from '~/lib/state'\nimport { parseResponsesInputTokensPayload } from '~/lib/validation'\n\n// --- Core request parameter interfaces ---\n\nexport interface ResourceHandlerParams {\n params: { responseId?: string }\n url: string\n headers: Headers\n signal: AbortSignal\n}\n\nexport interface ResourceHandlerBodyParams {\n body: unknown\n headers: Headers\n signal: AbortSignal\n}\n\n// --- Core functions ---\n\nexport async function handleRetrieveResponseCore(\n { params, url, headers, signal }: ResourceHandlerParams,\n): Promise<object> {\n const responseId = requireResponseId(params.responseId)\n const copilotClient = createCopilotClient()\n return await copilotClient.getResponse(responseId, {\n params: getRetrieveParamsFromUrl(url),\n requestContext: readCapiRequestContext(headers),\n signal,\n })\n}\n\nexport async function handleListResponseInputItemsCore(\n { params, url, headers, signal }: ResourceHandlerParams,\n): Promise<object> {\n const responseId = requireResponseId(params.responseId)\n const copilotClient = createCopilotClient()\n return await copilotClient.getResponseInputItems(\n responseId,\n getInputItemsParamsFromUrl(url),\n {\n requestContext: readCapiRequestContext(headers),\n signal,\n },\n )\n}\n\nexport async function handleCreateResponseInputTokensCore(\n { body, headers, signal }: ResourceHandlerBodyParams,\n): Promise<object> {\n const payload = parseResponsesInputTokensPayload(body) as ResponsesInputTokensPayload\n const copilotClient = createCopilotClient()\n return await copilotClient.createResponseInputTokens(payload, {\n requestContext: readCapiRequestContext(headers),\n signal,\n })\n}\n\nexport async function handleDeleteResponseCore(\n { params, headers, signal }: Omit<ResourceHandlerParams, 'url'>,\n): Promise<object> {\n const responseId = requireResponseId(params.responseId)\n const copilotClient = createCopilotClient()\n return await copilotClient.deleteResponse(responseId, {\n requestContext: readCapiRequestContext(headers),\n signal,\n })\n}\n\n// --- Shared helpers ---\n\nfunction requireResponseId(responseId: string | undefined): string {\n if (!responseId) {\n throwInvalidRequestError('Response id is required.', 'response_id')\n }\n return responseId\n}\n\nfunction getRetrieveParamsFromUrl(rawUrl: string): ResponseRetrieveParams {\n const url = new URL(rawUrl)\n const params: ResponseRetrieveParams = {\n include: getIncludeParams(url),\n }\n\n const startingAfter = url.searchParams.get('starting_after')\n if (startingAfter !== null) {\n const parsed = Number(startingAfter)\n if (!Number.isInteger(parsed) || parsed < 0) {\n throwInvalidRequestError(\n 'Query parameter starting_after must be a non-negative integer.',\n 'starting_after',\n )\n }\n params.starting_after = parsed\n }\n\n const includeObfuscation = url.searchParams.get('include_obfuscation')\n if (includeObfuscation !== null) {\n const parsed = parseBooleanParam(includeObfuscation)\n if (parsed === undefined) {\n throwInvalidRequestError(\n 'Query parameter include_obfuscation must be true or false.',\n 'include_obfuscation',\n )\n }\n params.include_obfuscation = parsed\n }\n\n const stream = url.searchParams.get('stream')\n if (stream !== null) {\n const parsed = parseBooleanParam(stream)\n if (parsed === undefined) {\n throwInvalidRequestError(\n 'Query parameter stream must be true or false.',\n 'stream',\n )\n }\n params.stream = parsed\n }\n\n return params\n}\n\nfunction getInputItemsParamsFromUrl(rawUrl: string): ResponseInputItemsListParams {\n const url = new URL(rawUrl)\n const limit = url.searchParams.get('limit')\n const order = url.searchParams.get('order')\n const params: ResponseInputItemsListParams = {\n after: url.searchParams.get('after') ?? undefined,\n include: getIncludeParams(url),\n }\n\n if (limit !== null) {\n const parsed = Number(limit)\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) {\n throwInvalidRequestError(\n 'Query parameter limit must be an integer between 1 and 100.',\n 'limit',\n )\n }\n params.limit = parsed\n }\n\n if (order !== null) {\n if (order !== 'asc' && order !== 'desc') {\n throwInvalidRequestError(\n 'Query parameter order must be \"asc\" or \"desc\".',\n 'order',\n )\n }\n params.order = order\n }\n\n return params\n}\n\nfunction getIncludeParams(url: URL): Array<string> | undefined {\n const includes = url.searchParams.getAll('include')\n .flatMap(value => value.split(','))\n .map(value => value.trim())\n .filter(Boolean)\n\n return includes.length > 0 ? includes : undefined\n}\n\nfunction parseBooleanParam(value: string): boolean | undefined {\n if (value === 'true') {\n return true\n }\n if (value === 'false') {\n return false\n }\n return undefined\n}\n","import { Elysia } from 'elysia'\n\nimport { sseAdapter } from '~/lib/sse-adapter'\nimport { requestGuardPlugin } from '~/routes/middleware/request-guard'\n\nimport { handleResponsesCore } from './handler'\nimport {\n handleCreateResponseInputTokensCore,\n handleDeleteResponseCore,\n handleListResponseInputItemsCore,\n handleRetrieveResponseCore,\n} from './resource-handler'\n\nexport function createResponsesRoutes() {\n return new Elysia()\n .use(requestGuardPlugin)\n .post('/responses', async function* ({ body, request }) {\n const result = await handleResponsesCore({\n body,\n signal: request.signal,\n headers: request.headers,\n })\n if (result.kind === 'json') {\n return result.data\n }\n yield* sseAdapter(result.generator)\n }, { guarded: true })\n .post('/responses/input_tokens', async ({ body, request }) => {\n return handleCreateResponseInputTokensCore({\n body,\n headers: request.headers,\n signal: request.signal,\n })\n }, { guarded: true })\n .get('/responses/:responseId/input_items', async ({ params, request }) => {\n return handleListResponseInputItemsCore({\n params,\n url: request.url,\n headers: request.headers,\n signal: request.signal,\n })\n })\n .get('/responses/:responseId', async ({ params, request }) => {\n return handleRetrieveResponseCore({\n params,\n url: request.url,\n headers: request.headers,\n signal: request.signal,\n })\n })\n .delete('/responses/:responseId', async ({ params, request }) => {\n return handleDeleteResponseCore({\n params,\n headers: request.headers,\n signal: request.signal,\n })\n })\n}\n","import { state } from '~/lib/state'\n\n/**\n * Core handler for retrieving the token.\n */\nexport function handleTokenCore(): object {\n return {\n token: state.auth.copilotToken,\n }\n}\n","import { Elysia } from 'elysia'\n\nimport { handleTokenCore } from './handler'\n\nexport function createTokenRoute() {\n return new Elysia()\n .get('/token', () => handleTokenCore())\n}\n","import { GitHubClient } from '~/clients'\nimport { getClientConfig, state } from '~/lib/state'\n\n/**\n * Core handler for retrieving usage data.\n */\nexport async function handleUsageCore(): Promise<object> {\n const githubClient = new GitHubClient(state.auth, getClientConfig())\n return await githubClient.getCopilotUsage()\n}\n","import { Elysia } from 'elysia'\n\nimport { handleUsageCore } from './handler'\n\nexport function createUsageRoute() {\n return new Elysia()\n .get('/usage', async () => handleUsageCore())\n}\n","import type { ModelMappingInfo } from './lib/request-logger'\n\nimport { cors } from '@elysiajs/cors'\nimport { node } from '@elysiajs/node'\nimport { Elysia } from 'elysia'\n\nimport { HTTPError } from './lib/error'\nimport { formatElapsed, logRequest } from './lib/request-logger'\nimport { createCompletionRoutes } from './routes/chat-completions/route'\nimport { createEmbeddingRoutes } from './routes/embeddings/route'\nimport { createMessageRoutes } from './routes/messages/route'\nimport { createModelRoutes } from './routes/models/route'\nimport { createResponsesRoutes } from './routes/responses/route'\nimport { createTokenRoute } from './routes/token/route'\nimport { createUsageRoute } from './routes/usage/route'\n\nconst isBun = typeof globalThis.Bun !== 'undefined'\n\nexport interface ServerOptions {\n idleTimeout?: number\n}\n\nexport function createServer(options?: ServerOptions) {\n return new Elysia({\n adapter: isBun ? undefined : node(),\n serve: options?.idleTimeout !== undefined\n ? { idleTimeout: options.idleTimeout }\n : undefined,\n })\n .use(cors())\n .error({ HTTP: HTTPError })\n .derive(() => {\n return {\n requestStart: Date.now(),\n requestMeta: {\n modelMapping: undefined as ModelMappingInfo | undefined,\n },\n }\n })\n .onAfterHandle(({ request, requestStart, requestMeta, set }) => {\n const elapsed = formatElapsed(requestStart)\n const status = typeof set.status === 'number' ? set.status : 200\n logRequest(request.method, request.url, status, elapsed, requestMeta.modelMapping)\n })\n .onError(({ code, error }) => {\n // HTTPError is auto-handled via toResponse() — just let it through\n if (code === 'HTTP')\n return\n\n if (error instanceof Error && error.name === 'AbortError') {\n return Response.json(\n { error: { message: 'Upstream request was aborted', type: 'timeout_error' } },\n { status: 504 },\n )\n }\n\n const message = error instanceof Error ? error.message : String(error)\n return Response.json(\n { error: { message, type: 'error' } },\n { status: 500 },\n )\n })\n .get('/', () => 'Server running')\n .use(createCompletionRoutes())\n .use(createModelRoutes())\n .use(createEmbeddingRoutes())\n .use(createResponsesRoutes())\n .use(createTokenRoute())\n .use(createUsageRoute())\n .group('/v1', (app) => {\n return app\n .use(createCompletionRoutes())\n .use(createModelRoutes())\n .use(createEmbeddingRoutes())\n .use(createResponsesRoutes())\n .use(createMessageRoutes())\n })\n}\n","#!/usr/bin/env node\n\nimport type { RuntimeConfig } from './lib/state'\nimport { defineCommand } from 'citty'\nimport clipboard from 'clipboardy'\nimport consola from 'consola'\n\nimport { readConfig } from './lib/config'\nimport { ensurePaths } from './lib/paths'\nimport { initProxyFromEnv } from './lib/proxy'\nimport { generateEnvScript } from './lib/shell'\nimport { cacheModels, cacheVSCodeVersion, createCopilotClient, state } from './lib/state'\nimport { setupCopilotToken, setupGitHubToken } from './lib/token'\nimport { createServer } from './server'\n\ninterface RunServerOptions {\n port: number\n verbose: boolean\n accountType: string\n manual: boolean\n rateLimit?: number\n rateLimitWait: boolean\n githubToken?: string\n claudeCode: boolean\n showToken: boolean\n proxyEnv: boolean\n idleTimeoutSeconds?: number\n upstreamTimeoutSeconds?: number\n}\n\nasync function maybeCopyClaudeCodeCommand(serverUrl: string): Promise<void> {\n if (!state.cache.models) {\n return\n }\n\n const selectableModels = state.cache.models.data.filter(\n model => model.model_picker_enabled,\n )\n const modelOptions\n = selectableModels.length > 0 ? selectableModels : state.cache.models.data\n\n const selectedModel = await consola.prompt(\n 'Select a model to use with Claude Code',\n {\n type: 'select',\n options: modelOptions.map(model => model.id),\n },\n )\n\n const selectedSmallModel = await consola.prompt(\n 'Select a small model to use with Claude Code',\n {\n type: 'select',\n options: modelOptions.map(model => model.id),\n },\n )\n\n const command = generateEnvScript(\n {\n ANTHROPIC_BASE_URL: serverUrl,\n ANTHROPIC_AUTH_TOKEN: 'dummy',\n ANTHROPIC_MODEL: selectedModel,\n ANTHROPIC_DEFAULT_SONNET_MODEL: selectedModel,\n ANTHROPIC_SMALL_FAST_MODEL: selectedSmallModel,\n ANTHROPIC_DEFAULT_HAIKU_MODEL: selectedSmallModel,\n DISABLE_NON_ESSENTIAL_MODEL_CALLS: '1',\n CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',\n },\n 'claude',\n )\n\n try {\n clipboard.writeSync(command)\n consola.success('Copied Claude Code command to clipboard!')\n }\n catch {\n consola.warn(\n 'Failed to copy to clipboard. Here is the Claude Code command:',\n )\n consola.log(command)\n }\n}\n\nexport async function runServer(options: RunServerOptions): Promise<void> {\n const accountType: RuntimeConfig['accountType']\n = (\n options.accountType === 'individual'\n || options.accountType === 'business'\n || options.accountType === 'enterprise'\n )\n ? options.accountType\n : 'individual'\n\n if (accountType !== options.accountType) {\n consola.warn(\n `Unknown account type \"${options.accountType}\". Falling back to \"individual\".`,\n )\n }\n\n if (options.proxyEnv) {\n initProxyFromEnv()\n }\n\n if (options.verbose) {\n consola.level = 5\n consola.info('Verbose logging enabled')\n }\n\n state.config.accountType = accountType\n if (accountType !== 'individual') {\n consola.info(`Using ${accountType} plan GitHub account`)\n }\n\n if (options.githubToken) {\n state.auth.githubToken = options.githubToken\n consola.info('Using provided GitHub token')\n }\n\n state.config.manualApprove = options.manual\n state.config.rateLimitSeconds = options.rateLimit\n state.config.rateLimitWait = options.rateLimitWait\n state.config.showToken = options.showToken\n state.config.upstreamTimeoutSeconds = options.upstreamTimeoutSeconds\n\n await ensurePaths()\n await readConfig()\n await cacheVSCodeVersion()\n\n if (!options.githubToken) {\n await setupGitHubToken()\n }\n\n await setupCopilotToken()\n\n const copilotClient = createCopilotClient()\n await cacheModels(copilotClient)\n\n consola.info(\n `Available models: \\n${state.cache.models?.data.map(model => `- ${model.id}`).join('\\n')}`,\n )\n\n const serverUrl = `http://localhost:${options.port}`\n\n if (options.claudeCode) {\n if (!state.cache.models) {\n throw new Error('Models should be loaded by now')\n }\n await maybeCopyClaudeCodeCommand(serverUrl)\n }\n\n const app = createServer({ idleTimeout: options.idleTimeoutSeconds })\n app.listen(options.port)\n}\n\nfunction parseIntArg(raw: string | undefined, name: string, fallbackMsg: string): number | undefined {\n if (raw === undefined)\n return undefined\n const n = Number.parseInt(raw, 10)\n if (Number.isNaN(n) || n < 0) {\n consola.warn(`Invalid --${name} value \"${raw}\". ${fallbackMsg}`)\n return undefined\n }\n return n\n}\n\nexport const start = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the Copilot API server',\n },\n args: {\n 'port': {\n alias: 'p',\n type: 'string',\n default: '4141',\n description: 'Port to listen on',\n },\n 'verbose': {\n alias: 'v',\n type: 'boolean',\n default: false,\n description: 'Enable verbose logging',\n },\n 'account-type': {\n alias: 'a',\n type: 'string',\n default: 'individual',\n description: 'Account type to use (individual, business, enterprise)',\n },\n 'manual': {\n type: 'boolean',\n default: false,\n description: 'Enable manual request approval',\n },\n 'rate-limit': {\n alias: 'r',\n type: 'string',\n description: 'Rate limit in seconds between requests',\n },\n 'wait': {\n alias: 'w',\n type: 'boolean',\n default: false,\n description:\n 'Wait instead of error when rate limit is hit. Has no effect if rate limit is not set',\n },\n 'github-token': {\n alias: 'g',\n type: 'string',\n description:\n 'Provide GitHub token directly (must be generated using the `auth` subcommand)',\n },\n 'claude-code': {\n alias: 'c',\n type: 'boolean',\n default: false,\n description:\n 'Generate a command to launch Claude Code with Copilot API config',\n },\n 'show-token': {\n type: 'boolean',\n default: false,\n description: 'Show GitHub and Copilot tokens on fetch and refresh',\n },\n 'proxy-env': {\n type: 'boolean',\n default: false,\n description: 'Initialize proxy from environment variables',\n },\n 'idle-timeout': {\n type: 'string',\n default: '120',\n description: 'Bun server idle timeout in seconds',\n },\n 'upstream-timeout': {\n type: 'string',\n default: '1800',\n description: 'Upstream request timeout in seconds (0 to disable)',\n },\n },\n run({ args }) {\n const rateLimit = parseIntArg(args['rate-limit'], 'rate-limit', 'Rate limiting disabled.')\n const idleTimeoutSeconds = parseIntArg(args['idle-timeout'], 'idle-timeout', 'Falling back to Bun default.')\n const upstreamTimeoutSeconds = parseIntArg(args['upstream-timeout'], 'upstream-timeout', 'Falling back to default (300s).')\n\n return runServer({\n port: Number.parseInt(args.port, 10),\n verbose: args.verbose,\n accountType: args['account-type'],\n manual: args.manual,\n rateLimit,\n rateLimitWait: args.wait,\n githubToken: args['github-token'],\n claudeCode: args['claude-code'],\n showToken: args['show-token'],\n proxyEnv: args['proxy-env'],\n idleTimeoutSeconds,\n upstreamTimeoutSeconds,\n })\n },\n})\n","#!/usr/bin/env bun\n\nimport process from 'node:process'\nimport { defineCommand, runMain } from 'citty'\nimport consola from 'consola'\n\nimport { auth } from './auth'\nimport { checkUsage } from './check-usage'\nimport { debug } from './debug'\nimport { VERSION } from './lib/version'\nimport { start } from './start'\n\nconst main = defineCommand({\n meta: {\n name: 'ghc-proxy',\n version: VERSION,\n description:\n 'A wrapper around GitHub Copilot API to make it OpenAI compatible, making it usable for other tools.',\n },\n subCommands: { auth, start, 'check-usage': checkUsage, debug },\n})\n\nrunMain(main).catch((error) => {\n consola.error('Failed to start CLI:', error)\n process.exitCode = 1\n})\n"],"mappings":"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"}
|