@absolutejs/ai 0.0.17 → 0.0.19

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.
@@ -43,6 +43,111 @@ async function* tapStream(source, params, providerName) {
43
43
  }
44
44
  }
45
45
 
46
+ // src/ai/providers/reasoning.ts
47
+ var EFFORT_ORDER = [
48
+ "minimal",
49
+ "low",
50
+ "medium",
51
+ "high",
52
+ "max"
53
+ ];
54
+ var ANTHROPIC_EFFORT = [
55
+ /opus-4-[5-8]/,
56
+ /sonnet-4-6/,
57
+ /fable-5/,
58
+ /mythos-5/
59
+ ];
60
+ var ANTHROPIC_ADAPTIVE_ONLY = [];
61
+ var ANTHROPIC_LEGACY_THINKING = [
62
+ /sonnet-4-5/,
63
+ /sonnet-4-0/,
64
+ /sonnet-4-2025/,
65
+ /opus-4-0/,
66
+ /opus-4-1/,
67
+ /opus-4-2025/,
68
+ /3-7-sonnet/
69
+ ];
70
+ var ANTHROPIC_NO_SAMPLING = [/opus-4-[78]/, /fable-5/, /mythos-5/];
71
+ var ANTHROPIC_MAX_EFFORT = [
72
+ /opus-4-[678]/,
73
+ /sonnet-4-6/,
74
+ /fable-5/,
75
+ /mythos-5/
76
+ ];
77
+ var OPENAI_REASONING = [/(^|[^a-z])o[1345](-|$)/, /gpt-5/];
78
+ var OPENAI_MINIMAL_EFFORT = [/gpt-5/];
79
+ var matches = (model, patterns) => patterns.some((pattern) => pattern.test(model));
80
+ var anthropicReasoningMode = (model) => {
81
+ if (matches(model, ANTHROPIC_EFFORT))
82
+ return "effort";
83
+ if (matches(model, ANTHROPIC_ADAPTIVE_ONLY))
84
+ return "adaptive";
85
+ if (matches(model, ANTHROPIC_LEGACY_THINKING))
86
+ return "legacy";
87
+ return "none";
88
+ };
89
+ var anthropicSupportsSampling = (model) => !matches(model, ANTHROPIC_NO_SAMPLING);
90
+ var isOpenAIReasoningModel = (model) => matches(model, OPENAI_REASONING);
91
+ var EFFORT_BUDGET = {
92
+ high: 16384,
93
+ low: 2048,
94
+ max: 32768,
95
+ medium: 8192,
96
+ minimal: 1024
97
+ };
98
+ var budgetToEffort = (budget) => {
99
+ if (budget <= 2048)
100
+ return "low";
101
+ if (budget <= 8192)
102
+ return "medium";
103
+ if (budget <= 16384)
104
+ return "high";
105
+ return "max";
106
+ };
107
+ var resolveEffort = (reasoning) => {
108
+ if (reasoning.effort)
109
+ return reasoning.effort;
110
+ if (typeof reasoning.budgetTokens === "number") {
111
+ return budgetToEffort(reasoning.budgetTokens);
112
+ }
113
+ return null;
114
+ };
115
+ var resolveBudgetTokens = (reasoning) => {
116
+ if (typeof reasoning.budgetTokens === "number")
117
+ return reasoning.budgetTokens;
118
+ if (reasoning.effort)
119
+ return EFFORT_BUDGET[reasoning.effort];
120
+ return null;
121
+ };
122
+ var clampEffort = (effort, allowed) => {
123
+ if (allowed.includes(effort))
124
+ return effort;
125
+ const idx = EFFORT_ORDER.indexOf(effort);
126
+ for (let lower = idx - 1;lower >= 0; lower -= 1) {
127
+ const candidate = EFFORT_ORDER[lower];
128
+ if (candidate && allowed.includes(candidate))
129
+ return candidate;
130
+ }
131
+ return allowed[0] ?? effort;
132
+ };
133
+ var anthropicEffortValue = (model, reasoning) => {
134
+ const effort = resolveEffort(reasoning);
135
+ if (!effort)
136
+ return null;
137
+ const allowed = matches(model, ANTHROPIC_MAX_EFFORT) ? ["low", "medium", "high", "max"] : ["low", "medium", "high"];
138
+ return clampEffort(effort, allowed);
139
+ };
140
+ var openaiEffortValue = (model, reasoning) => {
141
+ if (!isOpenAIReasoningModel(model))
142
+ return null;
143
+ const effort = resolveEffort(reasoning);
144
+ if (!effort)
145
+ return null;
146
+ const allowed = matches(model, OPENAI_MINIMAL_EFFORT) ? ["minimal", "low", "medium", "high"] : ["low", "medium", "high"];
147
+ const requested = effort === "max" ? "high" : effort;
148
+ return clampEffort(requested, allowed);
149
+ };
150
+
46
151
  // src/ai/providers/anthropic.ts
47
152
  var h2IfHttps = (url) => url.startsWith("https://") ? { protocol: "http2" } : {};
48
153
  var DEFAULT_BASE_URL = "https://api.anthropic.com";
@@ -125,18 +230,33 @@ var buildRequestBody = (params) => {
125
230
  body.tool_choice = { name: params.toolChoice.name, type: "tool" };
126
231
  }
127
232
  }
128
- if (typeof params.temperature === "number")
129
- body.temperature = params.temperature;
130
- if (typeof params.topP === "number")
131
- body.top_p = params.topP;
132
233
  if (typeof params.maxTokens === "number")
133
234
  body.max_tokens = params.maxTokens;
134
235
  if (params.stopSequences && params.stopSequences.length > 0) {
135
236
  body.stop_sequences = params.stopSequences;
136
237
  }
137
- if (params.thinking) {
138
- body.thinking = params.thinking;
139
- body.max_tokens = Math.max(typeof body.max_tokens === "number" ? body.max_tokens : MAX_TOKENS, params.thinking.budget_tokens + MAX_TOKENS);
238
+ const mode = params.reasoning ? anthropicReasoningMode(params.model) : "none";
239
+ const thinkingActive = mode !== "none";
240
+ if (!thinkingActive && anthropicSupportsSampling(params.model)) {
241
+ if (typeof params.temperature === "number") {
242
+ body.temperature = params.temperature;
243
+ }
244
+ if (typeof params.topP === "number")
245
+ body.top_p = params.topP;
246
+ }
247
+ if (mode === "effort" || mode === "adaptive") {
248
+ body.thinking = { type: "adaptive" };
249
+ if (mode === "effort" && params.reasoning) {
250
+ const effort = anthropicEffortValue(params.model, params.reasoning);
251
+ if (effort)
252
+ body.output_config = { effort };
253
+ }
254
+ } else if (mode === "legacy" && params.reasoning) {
255
+ const budget = resolveBudgetTokens(params.reasoning);
256
+ if (budget) {
257
+ body.thinking = { budget_tokens: budget, type: "enabled" };
258
+ body.max_tokens = Math.max(typeof body.max_tokens === "number" ? body.max_tokens : MAX_TOKENS, budget + MAX_TOKENS);
259
+ }
140
260
  }
141
261
  return body;
142
262
  };
@@ -438,5 +558,5 @@ export {
438
558
  anthropic
439
559
  };
440
560
 
441
- //# debugId=D88B2AE187E974A664756E2164756E21
561
+ //# debugId=A60C1AE81683C8E664756E2164756E21
442
562
  //# sourceMappingURL=anthropic.js.map
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/ai/providers/instrumentation.ts", "../src/ai/providers/anthropic.ts"],
3
+ "sources": ["../src/ai/providers/instrumentation.ts", "../src/ai/providers/reasoning.ts", "../src/ai/providers/anthropic.ts"],
4
4
  "sourcesContent": [
5
5
  "import type {\n AIChunk,\n AIProviderConfig,\n AIProviderStreamParams,\n AIUsage,\n} from \"../../../types/ai\";\n\nexport const instrumentAIProvider = (\n provider: AIProviderConfig,\n providerName?: string,\n): AIProviderConfig => ({\n stream: (params: AIProviderStreamParams) => {\n if (!params.onUsage && !params.onSpan) {\n return provider.stream(params);\n }\n return tapStream(provider.stream(params), params, providerName);\n },\n});\n\nasync function* tapStream(\n source: AsyncIterable<AIChunk>,\n params: AIProviderStreamParams,\n providerName?: string,\n): AsyncIterable<AIChunk> {\n const startedAt = Date.now();\n let lastUsage: AIUsage | undefined;\n try {\n for await (const chunk of source) {\n if (chunk.type === \"done\" && chunk.usage) {\n lastUsage = chunk.usage;\n }\n yield chunk;\n }\n } finally {\n if (lastUsage && params.onUsage) {\n try {\n params.onUsage({\n ...lastUsage,\n model: params.model,\n provider: providerName,\n });\n } catch {\n // operator-supplied callback errors must not affect stream consumers\n }\n }\n if (params.onSpan) {\n try {\n params.onSpan({\n durationMs: Date.now() - startedAt,\n model: params.model,\n provider: providerName,\n usage: lastUsage,\n });\n } catch {\n // same\n }\n }\n }\n}\n",
6
- "import type {\n AIChunk,\n AIProviderConfig,\n AIProviderContentBlock,\n AIProviderMessage,\n AIProviderStreamParams,\n AIProviderToolDefinition,\n AIUsage,\n} from \"../../../types/ai\";\nimport type {\n AnthropicConfig,\n AnthropicMessage,\n AnthropicSSEState,\n} from \"../../../types/anthropic\";\n\n// Opportunistic HTTP/2 multiplexing for outbound HTTPS (Bun 1.3.14+).\n// The `protocol` option lands in @types/bun 1.3.14; widen locally for now.\n// Hard-skip on non-HTTPS — Bun's h2 client throws HTTP2Unsupported on h2c.\ntype H2Init = RequestInit & { protocol?: \"http2\" };\nconst h2IfHttps = (url: string): H2Init =>\n url.startsWith(\"https://\") ? { protocol: \"http2\" } : {};\n\nimport { instrumentAIProvider } from \"./instrumentation\";\n\nconst DEFAULT_BASE_URL = \"https://api.anthropic.com\";\nconst API_VERSION = \"2023-06-01\";\nconst MAX_TOKENS = 8192;\nconst EVENT_PREFIX_LENGTH = 7;\nconst DATA_PREFIX_LENGTH = 6;\n\nconst EMPTY_CHUNKS: AIChunk[] = [];\n\nconst isRecord = (val: unknown): val is Record<string, unknown> =>\n typeof val === \"object\" && val !== null;\n\nconst mapContentBlock = (block: AIProviderContentBlock) => {\n if (block.type === \"thinking\") {\n return {\n signature: block.signature,\n thinking: block.thinking,\n type: \"thinking\",\n };\n }\n\n if (block.type === \"image\") {\n return {\n source: block.source,\n type: \"image\",\n };\n }\n\n if (block.type === \"document\") {\n return {\n source: block.source,\n type: \"document\",\n };\n }\n\n if (block.type === \"tool_result\") {\n return {\n content: block.content,\n tool_use_id: block.tool_use_id,\n type: \"tool_result\",\n };\n }\n\n if (block.type === \"tool_use\") {\n return {\n id: block.id,\n input: block.input,\n name: block.name,\n type: \"tool_use\",\n };\n }\n\n return { text: block.content, type: \"text\" };\n};\n\nconst mapMessage = (msg: AIProviderMessage): AnthropicMessage => ({\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map(mapContentBlock),\n role: msg.role === \"system\" ? \"user\" : msg.role,\n});\n\nconst mapToolDefinition = (tool: AIProviderToolDefinition) => ({\n description: tool.description,\n input_schema: tool.input_schema,\n name: tool.name,\n});\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n const messages: AnthropicMessage[] = params.messages\n .filter((msg) => msg.role !== \"system\")\n .map(mapMessage);\n\n const body: Record<string, unknown> = {\n max_tokens: MAX_TOKENS,\n messages,\n model: params.model,\n stream: true,\n };\n\n if (params.systemPrompt) {\n body.system = params.cacheSystemPrompt\n ? [\n {\n cache_control: { type: \"ephemeral\" },\n text: params.systemPrompt,\n type: \"text\",\n },\n ]\n : params.systemPrompt;\n }\n\n if (params.tools && params.tools.length > 0) {\n body.tools = params.tools.map(mapToolDefinition);\n if (params.toolChoice === \"auto\" || params.toolChoice === \"none\") {\n body.tool_choice = { type: params.toolChoice };\n } else if (params.toolChoice === \"required\") {\n body.tool_choice = { type: \"any\" };\n } else if (params.toolChoice && typeof params.toolChoice === \"object\") {\n body.tool_choice = { name: params.toolChoice.name, type: \"tool\" };\n }\n }\n\n if (typeof params.temperature === \"number\") body.temperature = params.temperature;\n if (typeof params.topP === \"number\") body.top_p = params.topP;\n if (typeof params.maxTokens === \"number\") body.max_tokens = params.maxTokens;\n if (params.stopSequences && params.stopSequences.length > 0) {\n body.stop_sequences = params.stopSequences;\n }\n\n if (params.thinking) {\n body.thinking = params.thinking;\n // When thinking is enabled, max_tokens must be higher\n body.max_tokens = Math.max(\n typeof body.max_tokens === \"number\" ? body.max_tokens : MAX_TOKENS,\n params.thinking.budget_tokens + MAX_TOKENS,\n );\n }\n\n return body;\n};\n\nconst classifyLine = (line: string) => {\n if (line.startsWith(\"event: \")) {\n return {\n field: \"event\" as const,\n value: line.slice(EVENT_PREFIX_LENGTH),\n };\n }\n\n if (line.startsWith(\"data: \")) {\n return {\n field: \"data\" as const,\n value: line.slice(DATA_PREFIX_LENGTH),\n };\n }\n\n return undefined;\n};\n\nconst applyClassified = (\n acc: { eventData: string; eventType: string },\n classified: { field: \"event\" | \"data\"; value: string } | undefined,\n) => {\n if (!classified) {\n return acc;\n }\n\n if (classified.field === \"event\") {\n return { eventData: acc.eventData, eventType: classified.value };\n }\n\n return { eventData: classified.value, eventType: acc.eventType };\n};\n\nconst parseEventLines = (event: string) =>\n event\n .split(\"\\n\")\n .reduce((acc, line) => applyClassified(acc, classifyLine(line)), {\n eventData: \"\",\n eventType: \"\",\n });\n\nconst safeParse = (text: string) => {\n try {\n const result: unknown = JSON.parse(text);\n\n return result;\n } catch {\n return undefined;\n }\n};\n\nconst tryParseJson = (text: string) => {\n const result = safeParse(text);\n\n if (isRecord(result)) {\n return result;\n }\n\n return undefined;\n};\n\nconst getRecord = (obj: Record<string, unknown>, key: string) => {\n const val = obj[key];\n\n if (isRecord(val)) {\n return val;\n }\n\n return undefined;\n};\n\nconst getString = (obj: Record<string, unknown>, key: string) => {\n const val = obj[key];\n\n if (typeof val === \"string\") {\n return val;\n }\n\n return \"\";\n};\n\nconst getNumber = (obj: Record<string, unknown>, key: string) => {\n const val = obj[key];\n\n if (typeof val === \"number\") {\n return val;\n }\n\n return 0;\n};\n\nconst handleContentBlockStart = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const block = getRecord(parsed, \"content_block\");\n\n if (block && block.type === \"tool_use\") {\n state.currentToolId = getString(block, \"id\");\n state.currentToolName = getString(block, \"name\");\n state.toolInputJson = \"\";\n state.isThinkingBlock = false;\n } else if (block && block.type === \"thinking\") {\n state.isThinkingBlock = true;\n state.thinkingSignature = \"\";\n } else {\n state.isThinkingBlock = false;\n }\n};\n\nconst handleContentBlockDelta = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const delta = getRecord(parsed, \"delta\");\n\n if (!delta) {\n return undefined;\n }\n\n if (delta.type === \"thinking_delta\") {\n return {\n content: getString(delta, \"thinking\"),\n type: \"thinking\",\n } satisfies AIChunk;\n }\n\n if (delta.type === \"text_delta\") {\n return {\n content: getString(delta, \"text\"),\n type: \"text\",\n } satisfies AIChunk;\n }\n\n if (delta.type === \"input_json_delta\") {\n state.toolInputJson += getString(delta, \"partial_json\");\n }\n\n if (delta.type === \"signature_delta\") {\n state.thinkingSignature += getString(delta, \"signature\");\n }\n\n return undefined;\n};\n\nconst handleContentBlockStop = (state: AnthropicSSEState) => {\n // Emit thinking signature when thinking block completes\n if (state.isThinkingBlock && state.thinkingSignature) {\n state.isThinkingBlock = false;\n const signature = state.thinkingSignature;\n state.thinkingSignature = \"\";\n\n return {\n content: \"\",\n signature,\n type: \"thinking\",\n } satisfies AIChunk;\n }\n\n if (!state.currentToolId) {\n return undefined;\n }\n\n const input = tryParseJson(state.toolInputJson) ?? state.toolInputJson;\n\n const chunk: AIChunk = {\n id: state.currentToolId,\n input,\n name: state.currentToolName,\n type: \"tool_use\",\n };\n\n state.currentToolId = \"\";\n state.currentToolName = \"\";\n state.toolInputJson = \"\";\n\n return chunk;\n};\n\nconst extractUsage = (\n usageRecord: Record<string, unknown> | undefined,\n existingUsage: AIUsage | undefined,\n) => {\n if (!usageRecord) {\n return existingUsage;\n }\n\n return {\n cacheReadInputTokens:\n getNumber(usageRecord, \"cache_read_input_tokens\") ||\n existingUsage?.cacheReadInputTokens ||\n 0,\n cacheWriteInputTokens:\n getNumber(usageRecord, \"cache_creation_input_tokens\") ||\n existingUsage?.cacheWriteInputTokens ||\n 0,\n inputTokens:\n getNumber(usageRecord, \"input_tokens\") || existingUsage?.inputTokens || 0,\n outputTokens:\n getNumber(usageRecord, \"output_tokens\") ||\n existingUsage?.outputTokens ||\n 0,\n };\n};\n\nconst handleMessageDelta = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const deltaUsage = getRecord(parsed, \"usage\");\n state.usage = extractUsage(deltaUsage, state.usage);\n};\n\nconst handleMessageStart = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const message = getRecord(parsed, \"message\");\n\n if (!message) {\n return;\n }\n\n const startUsage = getRecord(message, \"usage\");\n state.usage = extractUsage(startUsage, state.usage);\n};\n\nconst handleError = (parsed: Record<string, unknown>) => {\n const error = getRecord(parsed, \"error\");\n const errorMessage = error ? getString(error, \"message\") : \"\";\n\n throw new Error(errorMessage || \"Anthropic API error\");\n};\n\nconst processEvent = (\n eventType: string,\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n switch (eventType) {\n case \"content_block_start\": {\n handleContentBlockStart(parsed, state);\n\n return undefined;\n }\n\n case \"content_block_delta\": {\n return handleContentBlockDelta(parsed, state);\n }\n\n case \"content_block_stop\": {\n return handleContentBlockStop(state);\n }\n\n case \"message_delta\": {\n handleMessageDelta(parsed, state);\n\n return undefined;\n }\n\n case \"message_start\": {\n handleMessageStart(parsed, state);\n\n return undefined;\n }\n\n case \"message_stop\": {\n return { type: \"done\" as const, usage: state.usage };\n }\n\n case \"error\": {\n handleError(parsed);\n\n return undefined;\n }\n\n default: {\n return undefined;\n }\n }\n};\n\nconst processSingleEvent = (event: string, state: AnthropicSSEState) => {\n if (!event.trim()) {\n return undefined;\n }\n\n const { eventData, eventType } = parseEventLines(event);\n\n if (!eventData) {\n return undefined;\n }\n\n const parsed = tryParseJson(eventData);\n\n if (!parsed) {\n return undefined;\n }\n\n return processEvent(eventType, parsed, state);\n};\n\nconst collectChunk = (event: string, state: AnthropicSSEState) => {\n const chunk = processSingleEvent(event, state);\n\n return chunk ? [chunk] : [];\n};\n\nconst processBufferedEvents = (\n eventsText: string,\n state: AnthropicSSEState,\n) => {\n const events = eventsText.split(\"\\n\\n\");\n state.buffer = events.pop() ?? \"\";\n\n return events.flatMap((event) => collectChunk(event, state));\n};\n\nconst readNextChunks = async (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: AnthropicSSEState,\n signal?: AbortSignal,\n) => {\n if (signal?.aborted) {\n return { chunks: EMPTY_CHUNKS, done: true };\n }\n\n const { done, value } = await reader.read();\n\n if (done) {\n return { chunks: EMPTY_CHUNKS, done: true };\n }\n\n const rawText = state.buffer + decoder.decode(value, { stream: true });\n const chunks = processBufferedEvents(rawText, state);\n\n return { chunks, done: false };\n};\n\nconst findDoneChunk = (chunks: AIChunk[]) =>\n chunks.findIndex((c) => c.type === \"done\");\n\nconst sseStreamLoop = async (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: AnthropicSSEState,\n signal?: AbortSignal,\n) => {\n const result = await readNextChunks(reader, decoder, state, signal);\n\n if (result.done) {\n return { chunks: result.chunks, finished: true };\n }\n\n const doneIdx = findDoneChunk(result.chunks);\n\n if (doneIdx >= 0) {\n return { chunks: result.chunks.slice(0, doneIdx + 1), finished: true };\n }\n\n return { chunks: result.chunks, finished: false };\n};\n\n// eslint-disable-next-line func-style\nasync function* streamChunks(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: AnthropicSSEState,\n signal?: AbortSignal,\n) {\n let finished = false;\n\n while (!finished) {\n // eslint-disable-next-line no-await-in-loop\n const result = await sseStreamLoop(reader, decoder, state, signal);\n ({ finished } = result);\n yield* result.chunks;\n }\n}\n\n// eslint-disable-next-line func-style\nasync function* parseSSEStream(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n\n const state: AnthropicSSEState = {\n buffer: \"\",\n currentToolId: \"\",\n currentToolName: \"\",\n isThinkingBlock: false,\n thinkingSignature: \"\",\n toolInputJson: \"\",\n usage: undefined,\n };\n\n try {\n yield* streamChunks(reader, decoder, state, signal);\n } finally {\n reader.releaseLock();\n }\n}\n\nconst fetchAndStream = async function* (\n baseUrl: string,\n config: AnthropicConfig,\n params: AIProviderStreamParams,\n) {\n const body = buildRequestBody(params);\n\n const target = `${baseUrl}/v1/messages`;\n const response = await fetch(target, {\n ...h2IfHttps(target),\n body: JSON.stringify(body),\n headers: {\n \"anthropic-version\": API_VERSION,\n \"Content-Type\": \"application/json\",\n \"x-api-key\": config.apiKey,\n },\n method: \"POST\",\n signal: params.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n throw new Error(`Anthropic API error ${response.status}: ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error(\"Anthropic API returned no response body\");\n }\n\n yield* parseSSEStream(response.body, params.signal);\n};\n\nexport const anthropic = (config: AnthropicConfig): AIProviderConfig => {\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n return instrumentAIProvider(\n {\n stream: (params: AIProviderStreamParams) =>\n fetchAndStream(baseUrl, config, params),\n },\n \"anthropic\",\n );\n};\n"
6
+ "// Provider-agnostic reasoning translation. Consumers set one portable knob —\n// `reasoning: { effort }` — and each provider maps it to the wire shape the\n// NAMED MODEL accepts. This is where the per-model API divergence lives:\n//\n// - Modern Anthropic (Opus 4.5–4.8, Sonnet 4.6, Fable/Mythos 5): adaptive\n// thinking + `output_config.effort`. `budget_tokens` 400s here.\n// - Haiku 4.5: adaptive thinking only (no `effort`).\n// - Legacy Anthropic (Sonnet 4.5/4, Opus 4/4.1, 3.7 Sonnet): extended\n// thinking with `budget_tokens`. `output_config.effort` 400s here.\n// - OpenAI reasoning models (o-series, GPT-5): `reasoning.effort`. Non-reasoning\n// models (gpt-4.1, gpt-4o) have no effort dial — ignored.\n// - Gemini 2.5: `thinkingConfig.thinkingBudget`.\n//\n// Model classification is by ID pattern (a Models-API capability lookup would be\n// a network round-trip per request). THIS TABLE IS THE MAINTENANCE POINT — add\n// new model families here as they ship.\n\nimport type { ReasoningConfig, ReasoningEffort } from \"../../../types/ai\";\n\nconst EFFORT_ORDER: ReasoningEffort[] = [\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"max\",\n];\n\n// Anthropic models that take adaptive thinking + output_config.effort.\nconst ANTHROPIC_EFFORT = [\n /opus-4-[5-8]/,\n /sonnet-4-6/,\n /fable-5/,\n /mythos-5/,\n];\n// Anthropic models with adaptive thinking but NO effort parameter. Reserved:\n// only add a model here once it's CONFIRMED to accept adaptive thinking without\n// `output_config.effort`. Unconfirmed models fall through to \"none\" (no-op) so\n// we never risk a 400 — Haiku 4.5, for instance, rejects `effort` and is not\n// confirmed for adaptive, so it stays out.\nconst ANTHROPIC_ADAPTIVE_ONLY: RegExp[] = [];\n// Anthropic models that use legacy extended thinking (budget_tokens).\nconst ANTHROPIC_LEGACY_THINKING = [\n /sonnet-4-5/,\n /sonnet-4-0/,\n /sonnet-4-2025/,\n /opus-4-0/,\n /opus-4-1/,\n /opus-4-2025/,\n /3-7-sonnet/,\n];\n// Anthropic models that REMOVED temperature/top_p/top_k (sending them 400s).\nconst ANTHROPIC_NO_SAMPLING = [/opus-4-[78]/, /fable-5/, /mythos-5/];\n// Anthropic models that support the `max` effort tier (others clamp max→high).\nconst ANTHROPIC_MAX_EFFORT = [\n /opus-4-[678]/,\n /sonnet-4-6/,\n /fable-5/,\n /mythos-5/,\n];\n// OpenAI reasoning models (effort-capable); everything else ignores effort.\nconst OPENAI_REASONING = [/(^|[^a-z])o[1345](-|$)/, /gpt-5/];\n// OpenAI reasoning models that support the `minimal` tier (others clamp →low).\nconst OPENAI_MINIMAL_EFFORT = [/gpt-5/];\n\nconst matches = (model: string, patterns: RegExp[]) =>\n patterns.some((pattern) => pattern.test(model));\n\nexport type AnthropicReasoningMode = \"effort\" | \"adaptive\" | \"legacy\" | \"none\";\n\nexport const anthropicReasoningMode = (model: string): AnthropicReasoningMode => {\n if (matches(model, ANTHROPIC_EFFORT)) return \"effort\";\n if (matches(model, ANTHROPIC_ADAPTIVE_ONLY)) return \"adaptive\";\n if (matches(model, ANTHROPIC_LEGACY_THINKING)) return \"legacy\";\n\n return \"none\";\n};\n\n/** Modern Anthropic + Fable/Mythos reject temperature/top_p/top_k entirely. */\nexport const anthropicSupportsSampling = (model: string) =>\n !matches(model, ANTHROPIC_NO_SAMPLING);\n\nexport const isOpenAIReasoningModel = (model: string) =>\n matches(model, OPENAI_REASONING);\n\n// effort → legacy thinking budget (tokens). Kept under typical max_tokens; the\n// Anthropic provider raises max_tokens to fit when thinking is enabled.\nconst EFFORT_BUDGET: Record<ReasoningEffort, number> = {\n high: 16384,\n low: 2048,\n max: 32768,\n medium: 8192,\n minimal: 1024,\n};\n\n// budget tokens → nearest effort (when a caller gave only budgetTokens but the\n// target model is effort-based).\nconst budgetToEffort = (budget: number): ReasoningEffort => {\n if (budget <= 2048) return \"low\";\n if (budget <= 8192) return \"medium\";\n if (budget <= 16384) return \"high\";\n\n return \"max\";\n};\n\n/** The portable effort a config asks for, deriving from budgetTokens if needed. */\nexport const resolveEffort = (\n reasoning: ReasoningConfig,\n): ReasoningEffort | null => {\n if (reasoning.effort) return reasoning.effort;\n if (typeof reasoning.budgetTokens === \"number\") {\n return budgetToEffort(reasoning.budgetTokens);\n }\n\n return null;\n};\n\n/** The budget a config asks for, deriving from effort if needed. */\nexport const resolveBudgetTokens = (\n reasoning: ReasoningConfig,\n): number | null => {\n if (typeof reasoning.budgetTokens === \"number\") return reasoning.budgetTokens;\n if (reasoning.effort) return EFFORT_BUDGET[reasoning.effort];\n\n return null;\n};\n\nconst clampEffort = (\n effort: ReasoningEffort,\n allowed: ReasoningEffort[],\n): ReasoningEffort => {\n if (allowed.includes(effort)) return effort;\n // Walk DOWN the order to the nearest allowed tier (never silently escalate).\n const idx = EFFORT_ORDER.indexOf(effort);\n for (let lower = idx - 1; lower >= 0; lower -= 1) {\n const candidate = EFFORT_ORDER[lower];\n if (candidate && allowed.includes(candidate)) return candidate;\n }\n\n return allowed[0] ?? effort;\n};\n\n/** Anthropic `output_config.effort` value for an effort-capable model, or null. */\nexport const anthropicEffortValue = (\n model: string,\n reasoning: ReasoningConfig,\n) => {\n const effort = resolveEffort(reasoning);\n if (!effort) return null;\n const allowed: ReasoningEffort[] = matches(model, ANTHROPIC_MAX_EFFORT)\n ? [\"low\", \"medium\", \"high\", \"max\"]\n : [\"low\", \"medium\", \"high\"];\n\n return clampEffort(effort, allowed);\n};\n\n/** OpenAI `reasoning.effort` value for a reasoning model, or null. */\nexport const openaiEffortValue = (model: string, reasoning: ReasoningConfig) => {\n if (!isOpenAIReasoningModel(model)) return null;\n const effort = resolveEffort(reasoning);\n if (!effort) return null;\n const allowed: ReasoningEffort[] = matches(model, OPENAI_MINIMAL_EFFORT)\n ? [\"minimal\", \"low\", \"medium\", \"high\"]\n : [\"low\", \"medium\", \"high\"];\n // OpenAI has no `max`; clamp it to `high`.\n const requested = effort === \"max\" ? \"high\" : effort;\n\n return clampEffort(requested, allowed);\n};\n",
7
+ "import type {\n AIChunk,\n AIProviderConfig,\n AIProviderContentBlock,\n AIProviderMessage,\n AIProviderStreamParams,\n AIProviderToolDefinition,\n AIUsage,\n} from \"../../../types/ai\";\nimport type {\n AnthropicConfig,\n AnthropicMessage,\n AnthropicSSEState,\n} from \"../../../types/anthropic\";\n\n// Opportunistic HTTP/2 multiplexing for outbound HTTPS (Bun 1.3.14+).\n// The `protocol` option lands in @types/bun 1.3.14; widen locally for now.\n// Hard-skip on non-HTTPS — Bun's h2 client throws HTTP2Unsupported on h2c.\ntype H2Init = RequestInit & { protocol?: \"http2\" };\nconst h2IfHttps = (url: string): H2Init =>\n url.startsWith(\"https://\") ? { protocol: \"http2\" } : {};\n\nimport { instrumentAIProvider } from \"./instrumentation\";\nimport {\n anthropicEffortValue,\n anthropicReasoningMode,\n anthropicSupportsSampling,\n resolveBudgetTokens,\n} from \"./reasoning\";\n\nconst DEFAULT_BASE_URL = \"https://api.anthropic.com\";\nconst API_VERSION = \"2023-06-01\";\nconst MAX_TOKENS = 8192;\nconst EVENT_PREFIX_LENGTH = 7;\nconst DATA_PREFIX_LENGTH = 6;\n\nconst EMPTY_CHUNKS: AIChunk[] = [];\n\nconst isRecord = (val: unknown): val is Record<string, unknown> =>\n typeof val === \"object\" && val !== null;\n\nconst mapContentBlock = (block: AIProviderContentBlock) => {\n if (block.type === \"thinking\") {\n return {\n signature: block.signature,\n thinking: block.thinking,\n type: \"thinking\",\n };\n }\n\n if (block.type === \"image\") {\n return {\n source: block.source,\n type: \"image\",\n };\n }\n\n if (block.type === \"document\") {\n return {\n source: block.source,\n type: \"document\",\n };\n }\n\n if (block.type === \"tool_result\") {\n return {\n content: block.content,\n tool_use_id: block.tool_use_id,\n type: \"tool_result\",\n };\n }\n\n if (block.type === \"tool_use\") {\n return {\n id: block.id,\n input: block.input,\n name: block.name,\n type: \"tool_use\",\n };\n }\n\n return { text: block.content, type: \"text\" };\n};\n\nconst mapMessage = (msg: AIProviderMessage): AnthropicMessage => ({\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map(mapContentBlock),\n role: msg.role === \"system\" ? \"user\" : msg.role,\n});\n\nconst mapToolDefinition = (tool: AIProviderToolDefinition) => ({\n description: tool.description,\n input_schema: tool.input_schema,\n name: tool.name,\n});\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n const messages: AnthropicMessage[] = params.messages\n .filter((msg) => msg.role !== \"system\")\n .map(mapMessage);\n\n const body: Record<string, unknown> = {\n max_tokens: MAX_TOKENS,\n messages,\n model: params.model,\n stream: true,\n };\n\n if (params.systemPrompt) {\n body.system = params.cacheSystemPrompt\n ? [\n {\n cache_control: { type: \"ephemeral\" },\n text: params.systemPrompt,\n type: \"text\",\n },\n ]\n : params.systemPrompt;\n }\n\n if (params.tools && params.tools.length > 0) {\n body.tools = params.tools.map(mapToolDefinition);\n if (params.toolChoice === \"auto\" || params.toolChoice === \"none\") {\n body.tool_choice = { type: params.toolChoice };\n } else if (params.toolChoice === \"required\") {\n body.tool_choice = { type: \"any\" };\n } else if (params.toolChoice && typeof params.toolChoice === \"object\") {\n body.tool_choice = { name: params.toolChoice.name, type: \"tool\" };\n }\n }\n\n if (typeof params.maxTokens === \"number\") body.max_tokens = params.maxTokens;\n if (params.stopSequences && params.stopSequences.length > 0) {\n body.stop_sequences = params.stopSequences;\n }\n\n const mode = params.reasoning\n ? anthropicReasoningMode(params.model)\n : \"none\";\n const thinkingActive = mode !== \"none\";\n\n // Sampling params (temperature/top_p) are rejected outright by Opus 4.7/4.8 and\n // Fable/Mythos, and conflict with thinking on the models that do accept them —\n // so only send them when the model allows sampling AND thinking is off.\n if (!thinkingActive && anthropicSupportsSampling(params.model)) {\n if (typeof params.temperature === \"number\") {\n body.temperature = params.temperature;\n }\n if (typeof params.topP === \"number\") body.top_p = params.topP;\n }\n\n if (mode === \"effort\" || mode === \"adaptive\") {\n body.thinking = { type: \"adaptive\" };\n if (mode === \"effort\" && params.reasoning) {\n const effort = anthropicEffortValue(params.model, params.reasoning);\n if (effort) body.output_config = { effort };\n }\n } else if (mode === \"legacy\" && params.reasoning) {\n const budget = resolveBudgetTokens(params.reasoning);\n if (budget) {\n body.thinking = { budget_tokens: budget, type: \"enabled\" };\n // Extended thinking requires headroom: budget tokens + room to answer.\n body.max_tokens = Math.max(\n typeof body.max_tokens === \"number\" ? body.max_tokens : MAX_TOKENS,\n budget + MAX_TOKENS,\n );\n }\n }\n\n return body;\n};\n\nconst classifyLine = (line: string) => {\n if (line.startsWith(\"event: \")) {\n return {\n field: \"event\" as const,\n value: line.slice(EVENT_PREFIX_LENGTH),\n };\n }\n\n if (line.startsWith(\"data: \")) {\n return {\n field: \"data\" as const,\n value: line.slice(DATA_PREFIX_LENGTH),\n };\n }\n\n return undefined;\n};\n\nconst applyClassified = (\n acc: { eventData: string; eventType: string },\n classified: { field: \"event\" | \"data\"; value: string } | undefined,\n) => {\n if (!classified) {\n return acc;\n }\n\n if (classified.field === \"event\") {\n return { eventData: acc.eventData, eventType: classified.value };\n }\n\n return { eventData: classified.value, eventType: acc.eventType };\n};\n\nconst parseEventLines = (event: string) =>\n event\n .split(\"\\n\")\n .reduce((acc, line) => applyClassified(acc, classifyLine(line)), {\n eventData: \"\",\n eventType: \"\",\n });\n\nconst safeParse = (text: string) => {\n try {\n const result: unknown = JSON.parse(text);\n\n return result;\n } catch {\n return undefined;\n }\n};\n\nconst tryParseJson = (text: string) => {\n const result = safeParse(text);\n\n if (isRecord(result)) {\n return result;\n }\n\n return undefined;\n};\n\nconst getRecord = (obj: Record<string, unknown>, key: string) => {\n const val = obj[key];\n\n if (isRecord(val)) {\n return val;\n }\n\n return undefined;\n};\n\nconst getString = (obj: Record<string, unknown>, key: string) => {\n const val = obj[key];\n\n if (typeof val === \"string\") {\n return val;\n }\n\n return \"\";\n};\n\nconst getNumber = (obj: Record<string, unknown>, key: string) => {\n const val = obj[key];\n\n if (typeof val === \"number\") {\n return val;\n }\n\n return 0;\n};\n\nconst handleContentBlockStart = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const block = getRecord(parsed, \"content_block\");\n\n if (block && block.type === \"tool_use\") {\n state.currentToolId = getString(block, \"id\");\n state.currentToolName = getString(block, \"name\");\n state.toolInputJson = \"\";\n state.isThinkingBlock = false;\n } else if (block && block.type === \"thinking\") {\n state.isThinkingBlock = true;\n state.thinkingSignature = \"\";\n } else {\n state.isThinkingBlock = false;\n }\n};\n\nconst handleContentBlockDelta = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const delta = getRecord(parsed, \"delta\");\n\n if (!delta) {\n return undefined;\n }\n\n if (delta.type === \"thinking_delta\") {\n return {\n content: getString(delta, \"thinking\"),\n type: \"thinking\",\n } satisfies AIChunk;\n }\n\n if (delta.type === \"text_delta\") {\n return {\n content: getString(delta, \"text\"),\n type: \"text\",\n } satisfies AIChunk;\n }\n\n if (delta.type === \"input_json_delta\") {\n state.toolInputJson += getString(delta, \"partial_json\");\n }\n\n if (delta.type === \"signature_delta\") {\n state.thinkingSignature += getString(delta, \"signature\");\n }\n\n return undefined;\n};\n\nconst handleContentBlockStop = (state: AnthropicSSEState) => {\n // Emit thinking signature when thinking block completes\n if (state.isThinkingBlock && state.thinkingSignature) {\n state.isThinkingBlock = false;\n const signature = state.thinkingSignature;\n state.thinkingSignature = \"\";\n\n return {\n content: \"\",\n signature,\n type: \"thinking\",\n } satisfies AIChunk;\n }\n\n if (!state.currentToolId) {\n return undefined;\n }\n\n const input = tryParseJson(state.toolInputJson) ?? state.toolInputJson;\n\n const chunk: AIChunk = {\n id: state.currentToolId,\n input,\n name: state.currentToolName,\n type: \"tool_use\",\n };\n\n state.currentToolId = \"\";\n state.currentToolName = \"\";\n state.toolInputJson = \"\";\n\n return chunk;\n};\n\nconst extractUsage = (\n usageRecord: Record<string, unknown> | undefined,\n existingUsage: AIUsage | undefined,\n) => {\n if (!usageRecord) {\n return existingUsage;\n }\n\n return {\n cacheReadInputTokens:\n getNumber(usageRecord, \"cache_read_input_tokens\") ||\n existingUsage?.cacheReadInputTokens ||\n 0,\n cacheWriteInputTokens:\n getNumber(usageRecord, \"cache_creation_input_tokens\") ||\n existingUsage?.cacheWriteInputTokens ||\n 0,\n inputTokens:\n getNumber(usageRecord, \"input_tokens\") || existingUsage?.inputTokens || 0,\n outputTokens:\n getNumber(usageRecord, \"output_tokens\") ||\n existingUsage?.outputTokens ||\n 0,\n };\n};\n\nconst handleMessageDelta = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const deltaUsage = getRecord(parsed, \"usage\");\n state.usage = extractUsage(deltaUsage, state.usage);\n};\n\nconst handleMessageStart = (\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n const message = getRecord(parsed, \"message\");\n\n if (!message) {\n return;\n }\n\n const startUsage = getRecord(message, \"usage\");\n state.usage = extractUsage(startUsage, state.usage);\n};\n\nconst handleError = (parsed: Record<string, unknown>) => {\n const error = getRecord(parsed, \"error\");\n const errorMessage = error ? getString(error, \"message\") : \"\";\n\n throw new Error(errorMessage || \"Anthropic API error\");\n};\n\nconst processEvent = (\n eventType: string,\n parsed: Record<string, unknown>,\n state: AnthropicSSEState,\n) => {\n switch (eventType) {\n case \"content_block_start\": {\n handleContentBlockStart(parsed, state);\n\n return undefined;\n }\n\n case \"content_block_delta\": {\n return handleContentBlockDelta(parsed, state);\n }\n\n case \"content_block_stop\": {\n return handleContentBlockStop(state);\n }\n\n case \"message_delta\": {\n handleMessageDelta(parsed, state);\n\n return undefined;\n }\n\n case \"message_start\": {\n handleMessageStart(parsed, state);\n\n return undefined;\n }\n\n case \"message_stop\": {\n return { type: \"done\" as const, usage: state.usage };\n }\n\n case \"error\": {\n handleError(parsed);\n\n return undefined;\n }\n\n default: {\n return undefined;\n }\n }\n};\n\nconst processSingleEvent = (event: string, state: AnthropicSSEState) => {\n if (!event.trim()) {\n return undefined;\n }\n\n const { eventData, eventType } = parseEventLines(event);\n\n if (!eventData) {\n return undefined;\n }\n\n const parsed = tryParseJson(eventData);\n\n if (!parsed) {\n return undefined;\n }\n\n return processEvent(eventType, parsed, state);\n};\n\nconst collectChunk = (event: string, state: AnthropicSSEState) => {\n const chunk = processSingleEvent(event, state);\n\n return chunk ? [chunk] : [];\n};\n\nconst processBufferedEvents = (\n eventsText: string,\n state: AnthropicSSEState,\n) => {\n const events = eventsText.split(\"\\n\\n\");\n state.buffer = events.pop() ?? \"\";\n\n return events.flatMap((event) => collectChunk(event, state));\n};\n\nconst readNextChunks = async (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: AnthropicSSEState,\n signal?: AbortSignal,\n) => {\n if (signal?.aborted) {\n return { chunks: EMPTY_CHUNKS, done: true };\n }\n\n const { done, value } = await reader.read();\n\n if (done) {\n return { chunks: EMPTY_CHUNKS, done: true };\n }\n\n const rawText = state.buffer + decoder.decode(value, { stream: true });\n const chunks = processBufferedEvents(rawText, state);\n\n return { chunks, done: false };\n};\n\nconst findDoneChunk = (chunks: AIChunk[]) =>\n chunks.findIndex((c) => c.type === \"done\");\n\nconst sseStreamLoop = async (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: AnthropicSSEState,\n signal?: AbortSignal,\n) => {\n const result = await readNextChunks(reader, decoder, state, signal);\n\n if (result.done) {\n return { chunks: result.chunks, finished: true };\n }\n\n const doneIdx = findDoneChunk(result.chunks);\n\n if (doneIdx >= 0) {\n return { chunks: result.chunks.slice(0, doneIdx + 1), finished: true };\n }\n\n return { chunks: result.chunks, finished: false };\n};\n\n// eslint-disable-next-line func-style\nasync function* streamChunks(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: AnthropicSSEState,\n signal?: AbortSignal,\n) {\n let finished = false;\n\n while (!finished) {\n // eslint-disable-next-line no-await-in-loop\n const result = await sseStreamLoop(reader, decoder, state, signal);\n ({ finished } = result);\n yield* result.chunks;\n }\n}\n\n// eslint-disable-next-line func-style\nasync function* parseSSEStream(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n\n const state: AnthropicSSEState = {\n buffer: \"\",\n currentToolId: \"\",\n currentToolName: \"\",\n isThinkingBlock: false,\n thinkingSignature: \"\",\n toolInputJson: \"\",\n usage: undefined,\n };\n\n try {\n yield* streamChunks(reader, decoder, state, signal);\n } finally {\n reader.releaseLock();\n }\n}\n\nconst fetchAndStream = async function* (\n baseUrl: string,\n config: AnthropicConfig,\n params: AIProviderStreamParams,\n) {\n const body = buildRequestBody(params);\n\n const target = `${baseUrl}/v1/messages`;\n const response = await fetch(target, {\n ...h2IfHttps(target),\n body: JSON.stringify(body),\n headers: {\n \"anthropic-version\": API_VERSION,\n \"Content-Type\": \"application/json\",\n \"x-api-key\": config.apiKey,\n },\n method: \"POST\",\n signal: params.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n throw new Error(`Anthropic API error ${response.status}: ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error(\"Anthropic API returned no response body\");\n }\n\n yield* parseSSEStream(response.body, params.signal);\n};\n\nexport const anthropic = (config: AnthropicConfig): AIProviderConfig => {\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n return instrumentAIProvider(\n {\n stream: (params: AIProviderStreamParams) =>\n fetchAndStream(baseUrl, config, params),\n },\n \"anthropic\",\n );\n};\n"
7
8
  ],
8
- "mappings": "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",
9
- "debugId": "D88B2AE187E974A664756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "A60C1AE81683C8E664756E2164756E21",
10
11
  "names": []
11
12
  }
@@ -43,6 +43,111 @@ async function* tapStream(source, params, providerName) {
43
43
  }
44
44
  }
45
45
 
46
+ // src/ai/providers/reasoning.ts
47
+ var EFFORT_ORDER = [
48
+ "minimal",
49
+ "low",
50
+ "medium",
51
+ "high",
52
+ "max"
53
+ ];
54
+ var ANTHROPIC_EFFORT = [
55
+ /opus-4-[5-8]/,
56
+ /sonnet-4-6/,
57
+ /fable-5/,
58
+ /mythos-5/
59
+ ];
60
+ var ANTHROPIC_ADAPTIVE_ONLY = [];
61
+ var ANTHROPIC_LEGACY_THINKING = [
62
+ /sonnet-4-5/,
63
+ /sonnet-4-0/,
64
+ /sonnet-4-2025/,
65
+ /opus-4-0/,
66
+ /opus-4-1/,
67
+ /opus-4-2025/,
68
+ /3-7-sonnet/
69
+ ];
70
+ var ANTHROPIC_NO_SAMPLING = [/opus-4-[78]/, /fable-5/, /mythos-5/];
71
+ var ANTHROPIC_MAX_EFFORT = [
72
+ /opus-4-[678]/,
73
+ /sonnet-4-6/,
74
+ /fable-5/,
75
+ /mythos-5/
76
+ ];
77
+ var OPENAI_REASONING = [/(^|[^a-z])o[1345](-|$)/, /gpt-5/];
78
+ var OPENAI_MINIMAL_EFFORT = [/gpt-5/];
79
+ var matches = (model, patterns) => patterns.some((pattern) => pattern.test(model));
80
+ var anthropicReasoningMode = (model) => {
81
+ if (matches(model, ANTHROPIC_EFFORT))
82
+ return "effort";
83
+ if (matches(model, ANTHROPIC_ADAPTIVE_ONLY))
84
+ return "adaptive";
85
+ if (matches(model, ANTHROPIC_LEGACY_THINKING))
86
+ return "legacy";
87
+ return "none";
88
+ };
89
+ var anthropicSupportsSampling = (model) => !matches(model, ANTHROPIC_NO_SAMPLING);
90
+ var isOpenAIReasoningModel = (model) => matches(model, OPENAI_REASONING);
91
+ var EFFORT_BUDGET = {
92
+ high: 16384,
93
+ low: 2048,
94
+ max: 32768,
95
+ medium: 8192,
96
+ minimal: 1024
97
+ };
98
+ var budgetToEffort = (budget) => {
99
+ if (budget <= 2048)
100
+ return "low";
101
+ if (budget <= 8192)
102
+ return "medium";
103
+ if (budget <= 16384)
104
+ return "high";
105
+ return "max";
106
+ };
107
+ var resolveEffort = (reasoning) => {
108
+ if (reasoning.effort)
109
+ return reasoning.effort;
110
+ if (typeof reasoning.budgetTokens === "number") {
111
+ return budgetToEffort(reasoning.budgetTokens);
112
+ }
113
+ return null;
114
+ };
115
+ var resolveBudgetTokens = (reasoning) => {
116
+ if (typeof reasoning.budgetTokens === "number")
117
+ return reasoning.budgetTokens;
118
+ if (reasoning.effort)
119
+ return EFFORT_BUDGET[reasoning.effort];
120
+ return null;
121
+ };
122
+ var clampEffort = (effort, allowed) => {
123
+ if (allowed.includes(effort))
124
+ return effort;
125
+ const idx = EFFORT_ORDER.indexOf(effort);
126
+ for (let lower = idx - 1;lower >= 0; lower -= 1) {
127
+ const candidate = EFFORT_ORDER[lower];
128
+ if (candidate && allowed.includes(candidate))
129
+ return candidate;
130
+ }
131
+ return allowed[0] ?? effort;
132
+ };
133
+ var anthropicEffortValue = (model, reasoning) => {
134
+ const effort = resolveEffort(reasoning);
135
+ if (!effort)
136
+ return null;
137
+ const allowed = matches(model, ANTHROPIC_MAX_EFFORT) ? ["low", "medium", "high", "max"] : ["low", "medium", "high"];
138
+ return clampEffort(effort, allowed);
139
+ };
140
+ var openaiEffortValue = (model, reasoning) => {
141
+ if (!isOpenAIReasoningModel(model))
142
+ return null;
143
+ const effort = resolveEffort(reasoning);
144
+ if (!effort)
145
+ return null;
146
+ const allowed = matches(model, OPENAI_MINIMAL_EFFORT) ? ["minimal", "low", "medium", "high"] : ["low", "medium", "high"];
147
+ const requested = effort === "max" ? "high" : effort;
148
+ return clampEffort(requested, allowed);
149
+ };
150
+
46
151
  // src/ai/providers/openai.ts
47
152
  var h2IfHttps = (url) => url.startsWith("https://") ? { protocol: "http2" } : {};
48
153
  var DEFAULT_BASE_URL = "https://api.openai.com";
@@ -169,12 +274,24 @@ var buildRequestBody = (params) => {
169
274
  body.parallel_tool_calls = params.parallelToolCalls;
170
275
  }
171
276
  }
172
- if (typeof params.temperature === "number")
173
- body.temperature = params.temperature;
174
- if (typeof params.topP === "number")
175
- body.top_p = params.topP;
176
- if (typeof params.maxTokens === "number")
177
- body.max_tokens = params.maxTokens;
277
+ if (isOpenAIReasoningModel(params.model)) {
278
+ if (typeof params.maxTokens === "number") {
279
+ body.max_completion_tokens = params.maxTokens;
280
+ }
281
+ if (params.reasoning) {
282
+ const effort = openaiEffortValue(params.model, params.reasoning);
283
+ if (effort)
284
+ body.reasoning_effort = effort;
285
+ }
286
+ } else {
287
+ if (typeof params.temperature === "number") {
288
+ body.temperature = params.temperature;
289
+ }
290
+ if (typeof params.topP === "number")
291
+ body.top_p = params.topP;
292
+ if (typeof params.maxTokens === "number")
293
+ body.max_tokens = params.maxTokens;
294
+ }
178
295
  if (params.stopSequences && params.stopSequences.length > 0)
179
296
  body.stop = params.stopSequences;
180
297
  if (typeof params.seed === "number")
@@ -416,5 +533,5 @@ export {
416
533
  openai
417
534
  };
418
535
 
419
- //# debugId=FF865773151B9EF964756E2164756E21
536
+ //# debugId=9FDAF944E89004EF64756E2164756E21
420
537
  //# sourceMappingURL=openai.js.map
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/ai/providers/instrumentation.ts", "../src/ai/providers/openai.ts"],
3
+ "sources": ["../src/ai/providers/instrumentation.ts", "../src/ai/providers/reasoning.ts", "../src/ai/providers/openai.ts"],
4
4
  "sourcesContent": [
5
5
  "import type {\n AIChunk,\n AIProviderConfig,\n AIProviderStreamParams,\n AIUsage,\n} from \"../../../types/ai\";\n\nexport const instrumentAIProvider = (\n provider: AIProviderConfig,\n providerName?: string,\n): AIProviderConfig => ({\n stream: (params: AIProviderStreamParams) => {\n if (!params.onUsage && !params.onSpan) {\n return provider.stream(params);\n }\n return tapStream(provider.stream(params), params, providerName);\n },\n});\n\nasync function* tapStream(\n source: AsyncIterable<AIChunk>,\n params: AIProviderStreamParams,\n providerName?: string,\n): AsyncIterable<AIChunk> {\n const startedAt = Date.now();\n let lastUsage: AIUsage | undefined;\n try {\n for await (const chunk of source) {\n if (chunk.type === \"done\" && chunk.usage) {\n lastUsage = chunk.usage;\n }\n yield chunk;\n }\n } finally {\n if (lastUsage && params.onUsage) {\n try {\n params.onUsage({\n ...lastUsage,\n model: params.model,\n provider: providerName,\n });\n } catch {\n // operator-supplied callback errors must not affect stream consumers\n }\n }\n if (params.onSpan) {\n try {\n params.onSpan({\n durationMs: Date.now() - startedAt,\n model: params.model,\n provider: providerName,\n usage: lastUsage,\n });\n } catch {\n // same\n }\n }\n }\n}\n",
6
- "import type {\n AIProviderConfig,\n AIProviderContentBlock,\n AIProviderMessage,\n AIProviderStreamParams,\n AIProviderToolDefinition,\n AIUsage,\n} from \"../../../types/ai\";\n\n// Opportunistic HTTP/2 multiplexing for outbound HTTPS (Bun 1.3.14+).\n// The `protocol` option lands in @types/bun 1.3.14; widen locally for now.\nimport { instrumentAIProvider } from \"./instrumentation\";\n// Hard-skip on non-HTTPS — Bun's h2 client throws HTTP2Unsupported on h2c.\ntype H2Init = RequestInit & { protocol?: \"http2\" };\nconst h2IfHttps = (url: string): H2Init =>\n url.startsWith(\"https://\") ? { protocol: \"http2\" } : {};\n\ntype OpenAIConfig = {\n apiKey?: string;\n baseUrl?: string;\n tokenSource?: () => Promise<string> | string;\n};\n\ntype OpenAIMessage = {\n content: string | Array<Record<string, unknown>> | null;\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n tool_call_id?: string;\n tool_calls?: Array<{\n function: { arguments: string; name: string };\n id: string;\n type: \"function\";\n }>;\n};\n\ntype PendingToolCall = {\n arguments: string;\n id: string;\n name: string;\n};\n\ntype UsageRef = {\n current: AIUsage | undefined;\n};\n\ntype StreamState = {\n buffer: string;\n pendingToolCalls: Map<number, PendingToolCall>;\n usageRef: UsageRef;\n};\n\nconst DEFAULT_BASE_URL = \"https://api.openai.com\";\nconst SSE_DATA_PREFIX_LENGTH = 6;\nconst DONE_SENTINEL = \"[DONE]\";\nconst NOT_FOUND = -1;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst isRecordArray = (\n value: unknown,\n): value is Array<Record<string, unknown>> =>\n Array.isArray(value) && value.length > 0 && isRecord(value[0]);\n\nconst hasArrayContent = (\n msg: AIProviderMessage,\n): msg is AIProviderMessage & { content: AIProviderContentBlock[] } =>\n typeof msg.content !== \"string\" && Array.isArray(msg.content);\n\nconst buildToolMessages = (blocks: AIProviderContentBlock[]) => {\n const toolUseBlocks = blocks.filter((block) => block.type === \"tool_use\");\n const toolResultBlocks = blocks.filter(\n (block) => block.type === \"tool_result\",\n );\n const messages: OpenAIMessage[] = [];\n\n if (toolUseBlocks.length > 0) {\n messages.push({\n content: null,\n role: \"assistant\",\n tool_calls: toolUseBlocks.map((block) => ({\n function: {\n arguments:\n typeof block.input === \"string\"\n ? block.input\n : JSON.stringify(block.input),\n name: block.name,\n },\n id: block.id,\n type: \"function\" as const,\n })),\n });\n }\n\n for (const result of toolResultBlocks) {\n messages.push({\n content: typeof result.content === \"string\" ? result.content : \"\",\n role: \"tool\",\n tool_call_id: result.tool_use_id,\n });\n }\n\n return messages;\n};\n\nconst processMessageAtIndex = (\n result: OpenAIMessage[],\n msg: AIProviderMessage,\n idx: number,\n) => {\n if (!hasArrayContent(msg)) {\n return;\n }\n\n const hasToolBlocks = msg.content.some(\n (block) => block.type === \"tool_use\" || block.type === \"tool_result\",\n );\n\n if (!hasToolBlocks) {\n return;\n }\n\n const toolMessages = buildToolMessages(msg.content);\n result.splice(idx, 1, ...toolMessages);\n};\n\nconst convertSingleMessage = (\n result: OpenAIMessage[],\n msg: AIProviderMessage | undefined,\n idx: number,\n) => {\n if (!msg) {\n return;\n }\n\n processMessageAtIndex(result, msg, idx);\n};\n\nconst convertToolResultMessages = (\n messages: OpenAIMessage[],\n params: AIProviderStreamParams,\n) => {\n const result = [...messages];\n\n for (let idx = 0; idx < params.messages.length; idx++) {\n convertSingleMessage(result, params.messages[idx], idx);\n }\n\n return result;\n};\n\nconst mapToolDefinitions = (tools: AIProviderToolDefinition[]) =>\n tools.map((tool) => ({\n function: {\n description: tool.description,\n name: tool.name,\n parameters: tool.input_schema,\n },\n type: \"function\",\n }));\n\nconst mapContentBlockToOpenAI = (block: AIProviderContentBlock) => {\n if (block.type === \"image\") {\n return {\n image_url: {\n url: `data:${block.source.media_type};base64,${block.source.data}`,\n },\n type: \"image_url\",\n };\n }\n\n if (block.type === \"document\") {\n return {\n file: {\n file_data: `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.name ?? \"document.pdf\",\n },\n type: \"file\",\n };\n }\n\n if (block.type === \"text\") {\n return { text: block.content, type: \"text\" };\n }\n\n return null;\n};\n\nconst mapOpenAIContent = (msg: AIProviderStreamParams[\"messages\"][number]) => {\n if (typeof msg.content === \"string\") {\n return msg.content;\n }\n\n const hasMedia = msg.content.some(\n (block) => block.type === \"image\" || block.type === \"document\",\n );\n\n if (!hasMedia) {\n return null;\n }\n\n return msg.content\n .map(mapContentBlockToOpenAI)\n .filter((mapped) => mapped !== null);\n};\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n const messages = convertToolResultMessages(\n params.messages.map((msg) => ({\n content: mapOpenAIContent(msg),\n role: msg.role,\n })),\n params,\n );\n\n const body: Record<string, unknown> = {\n messages,\n model: params.model,\n stream: true,\n stream_options: { include_usage: true },\n };\n\n if (params.tools && params.tools.length > 0) {\n body.tools = mapToolDefinitions(params.tools);\n if (params.toolChoice === \"auto\" || params.toolChoice === \"none\" || params.toolChoice === \"required\") {\n body.tool_choice = params.toolChoice;\n } else if (params.toolChoice && typeof params.toolChoice === \"object\") {\n body.tool_choice = {\n function: { name: params.toolChoice.name },\n type: \"function\",\n };\n }\n if (typeof params.parallelToolCalls === \"boolean\") {\n body.parallel_tool_calls = params.parallelToolCalls;\n }\n }\n\n if (typeof params.temperature === \"number\") body.temperature = params.temperature;\n if (typeof params.topP === \"number\") body.top_p = params.topP;\n if (typeof params.maxTokens === \"number\") body.max_tokens = params.maxTokens;\n if (params.stopSequences && params.stopSequences.length > 0) body.stop = params.stopSequences;\n if (typeof params.seed === \"number\") body.seed = params.seed;\n if (typeof params.frequencyPenalty === \"number\") body.frequency_penalty = params.frequencyPenalty;\n if (typeof params.presencePenalty === \"number\") body.presence_penalty = params.presencePenalty;\n\n if (params.responseFormat) {\n if (params.responseFormat.type === \"text\" || params.responseFormat.type === \"json_object\") {\n body.response_format = { type: params.responseFormat.type };\n } else if (params.responseFormat.type === \"json_schema\") {\n body.response_format = {\n json_schema: {\n name: params.responseFormat.name,\n schema: params.responseFormat.schema,\n strict: params.responseFormat.strict ?? true,\n },\n type: \"json_schema\",\n };\n }\n }\n\n return body;\n};\n\nconst parseToolInput = (rawArguments: string) => {\n try {\n return JSON.parse(rawArguments);\n } catch {\n return rawArguments;\n }\n};\n\nconst flushPendingToolCalls = function* (\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n for (const [, tool] of pendingToolCalls) {\n const input = parseToolInput(tool.arguments);\n yield {\n id: tool.id,\n input,\n name: tool.name,\n type: \"tool_use\" as const,\n };\n }\n\n pendingToolCalls.clear();\n};\n\nconst extractUsage = (parsedUsage: Record<string, number>) => ({\n inputTokens: parsedUsage.prompt_tokens ?? 0,\n outputTokens: parsedUsage.completion_tokens ?? 0,\n});\n\nconst resolveToolCallIndex = (toolCall: Record<string, unknown>) => {\n const raw = typeof toolCall.index === \"number\" ? toolCall.index : NOT_FOUND;\n\n return raw < 0 ? undefined : raw;\n};\n\nconst initPendingToolCall = (\n toolCall: Record<string, unknown>,\n func: Record<string, unknown> | null,\n index: number,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n if (pendingToolCalls.has(index)) {\n return;\n }\n\n const toolId = typeof toolCall.id === \"string\" ? toolCall.id : \"\";\n const toolName = func && typeof func.name === \"string\" ? func.name : \"\";\n\n pendingToolCalls.set(index, {\n arguments: \"\",\n id: toolId,\n name: toolName,\n });\n};\n\nconst updatePendingToolCall = (\n toolCall: Record<string, unknown>,\n func: Record<string, unknown> | null,\n pending: PendingToolCall,\n) => {\n if (typeof toolCall.id === \"string\") {\n pending.id = toolCall.id;\n }\n\n if (func && typeof func.name === \"string\") {\n pending.name = func.name;\n }\n\n if (func && typeof func.arguments === \"string\") {\n pending.arguments += func.arguments;\n }\n};\n\nconst processToolCallDelta = (\n toolCall: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n const index = resolveToolCallIndex(toolCall);\n if (index === undefined) {\n return;\n }\n\n const func = isRecord(toolCall.function) ? toolCall.function : null;\n initPendingToolCall(toolCall, func, index, pendingToolCalls);\n\n const pending = pendingToolCalls.get(index);\n if (!pending) {\n return;\n }\n\n updatePendingToolCall(toolCall, func, pending);\n};\n\nconst processToolCallDeltas = (\n toolCalls: Array<Record<string, unknown>>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n for (const toolCall of toolCalls) {\n processToolCallDelta(toolCall, pendingToolCalls);\n }\n};\n\nconst processDelta = function* (\n delta: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n if (typeof delta.content === \"string\") {\n yield { content: delta.content, type: \"text\" as const };\n }\n\n if (isRecordArray(delta.tool_calls)) {\n processToolCallDeltas(delta.tool_calls, pendingToolCalls);\n }\n};\n\nconst processChoice = function* (\n choice: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n const delta = isRecord(choice.delta) ? choice.delta : null;\n if (delta) {\n yield* processDelta(delta, pendingToolCalls);\n }\n\n if (choice.finish_reason === \"tool_calls\") {\n yield* flushPendingToolCalls(pendingToolCalls);\n }\n};\n\nconst narrowUsageRecord = (parsed: Record<string, unknown>) => {\n if (!isRecord(parsed.usage)) {\n return undefined;\n }\n\n const { usage } = parsed;\n const promptTokens =\n typeof usage.prompt_tokens === \"number\" ? usage.prompt_tokens : 0;\n const completionTokens =\n typeof usage.completion_tokens === \"number\" ? usage.completion_tokens : 0;\n\n return extractUsage({\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n });\n};\n\nconst processSSELine = function* (\n line: string,\n pendingToolCalls: Map<number, PendingToolCall>,\n currentUsage: AIUsage | undefined,\n) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(\"data: \")) {\n return;\n }\n\n const data = trimmed.slice(SSE_DATA_PREFIX_LENGTH);\n if (data === DONE_SENTINEL) {\n yield* flushPendingToolCalls(pendingToolCalls);\n yield { type: \"done\" as const, usage: currentUsage };\n\n return;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(data);\n } catch {\n return;\n }\n\n const usageUpdate = narrowUsageRecord(parsed);\n if (usageUpdate) {\n yield { type: \"usage_update\" as const, usage: usageUpdate };\n }\n\n const { choices } = parsed;\n if (!isRecordArray(choices)) {\n return;\n }\n\n const [firstChoice] = choices;\n if (!firstChoice) {\n return;\n }\n\n yield* processChoice(firstChoice, pendingToolCalls);\n};\n\nconst isUsageUpdate = (chunk: {\n type: string;\n usage?: AIUsage;\n}): chunk is { type: \"usage_update\"; usage: AIUsage } =>\n chunk.type === \"usage_update\";\n\nconst collectYieldableChunks = (\n line: string,\n pendingToolCalls: Map<number, PendingToolCall>,\n usageRef: UsageRef,\n) => {\n const allChunks = Array.from(\n processSSELine(line, pendingToolCalls, usageRef.current),\n );\n const usageChunks = allChunks.filter(isUsageUpdate);\n const lastUsage = usageChunks.at(NOT_FOUND);\n\n if (lastUsage) {\n usageRef.current = lastUsage.usage;\n }\n\n return allChunks.filter((chunk) => !isUsageUpdate(chunk));\n};\n\nconst processSSELines = function* (\n lines: string[],\n pendingToolCalls: Map<number, PendingToolCall>,\n usageRef: UsageRef,\n) {\n for (const line of lines) {\n yield* collectYieldableChunks(line, pendingToolCalls, usageRef);\n }\n};\n\nconst processStreamValue = (\n value: Uint8Array,\n decoder: TextDecoder,\n state: StreamState,\n) => {\n state.buffer += decoder.decode(value, { stream: true });\n const lines = state.buffer.split(\"\\n\");\n state.buffer = lines.pop() ?? \"\";\n\n return lines;\n};\n\nconst drainReader = async function* (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: StreamState,\n signal?: AbortSignal,\n) {\n /* eslint-disable no-await-in-loop */\n for (\n let result = await reader.read();\n !result.done && !signal?.aborted;\n result = await reader.read()\n ) {\n /* eslint-enable no-await-in-loop */\n const lines = processStreamValue(result.value, decoder, state);\n yield* processSSELines(lines, state.pendingToolCalls, state.usageRef);\n }\n};\n\nconst parseSSEStream = async function* (\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const state: StreamState = {\n buffer: \"\",\n pendingToolCalls: new Map<number, PendingToolCall>(),\n usageRef: { current: undefined },\n };\n\n try {\n yield* drainReader(reader, decoder, state, signal);\n yield { type: \"done\" as const, usage: state.usageRef.current };\n } finally {\n reader.releaseLock();\n }\n};\n\nconst fetchOpenAIStream = async function* (\n baseUrl: string,\n apiKey: string,\n body: Record<string, unknown>,\n signal?: AbortSignal,\n) {\n const target = `${baseUrl}/v1/chat/completions`;\n const response = await fetch(target, {\n ...h2IfHttps(target),\n body: JSON.stringify(body),\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`OpenAI API error ${response.status}: ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error(\"OpenAI API returned no response body\");\n }\n\n yield* parseSSEStream(response.body, signal);\n};\n\nexport const openai = (config: OpenAIConfig): AIProviderConfig => {\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n if (!config.apiKey && !config.tokenSource) {\n throw new Error(\"openai() requires either apiKey or tokenSource\");\n }\n const resolveKey = async () => {\n if (config.tokenSource) {\n return await Promise.resolve(config.tokenSource());\n }\n return config.apiKey!;\n };\n\n return instrumentAIProvider(\n {\n stream: (params: AIProviderStreamParams) => {\n const body = buildRequestBody(params);\n return (async function* () {\n const apiKey = await resolveKey();\n yield* fetchOpenAIStream(baseUrl, apiKey, body, params.signal);\n })();\n },\n },\n \"openai\",\n );\n};\n"
6
+ "// Provider-agnostic reasoning translation. Consumers set one portable knob —\n// `reasoning: { effort }` — and each provider maps it to the wire shape the\n// NAMED MODEL accepts. This is where the per-model API divergence lives:\n//\n// - Modern Anthropic (Opus 4.5–4.8, Sonnet 4.6, Fable/Mythos 5): adaptive\n// thinking + `output_config.effort`. `budget_tokens` 400s here.\n// - Haiku 4.5: adaptive thinking only (no `effort`).\n// - Legacy Anthropic (Sonnet 4.5/4, Opus 4/4.1, 3.7 Sonnet): extended\n// thinking with `budget_tokens`. `output_config.effort` 400s here.\n// - OpenAI reasoning models (o-series, GPT-5): `reasoning.effort`. Non-reasoning\n// models (gpt-4.1, gpt-4o) have no effort dial — ignored.\n// - Gemini 2.5: `thinkingConfig.thinkingBudget`.\n//\n// Model classification is by ID pattern (a Models-API capability lookup would be\n// a network round-trip per request). THIS TABLE IS THE MAINTENANCE POINT — add\n// new model families here as they ship.\n\nimport type { ReasoningConfig, ReasoningEffort } from \"../../../types/ai\";\n\nconst EFFORT_ORDER: ReasoningEffort[] = [\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"max\",\n];\n\n// Anthropic models that take adaptive thinking + output_config.effort.\nconst ANTHROPIC_EFFORT = [\n /opus-4-[5-8]/,\n /sonnet-4-6/,\n /fable-5/,\n /mythos-5/,\n];\n// Anthropic models with adaptive thinking but NO effort parameter. Reserved:\n// only add a model here once it's CONFIRMED to accept adaptive thinking without\n// `output_config.effort`. Unconfirmed models fall through to \"none\" (no-op) so\n// we never risk a 400 — Haiku 4.5, for instance, rejects `effort` and is not\n// confirmed for adaptive, so it stays out.\nconst ANTHROPIC_ADAPTIVE_ONLY: RegExp[] = [];\n// Anthropic models that use legacy extended thinking (budget_tokens).\nconst ANTHROPIC_LEGACY_THINKING = [\n /sonnet-4-5/,\n /sonnet-4-0/,\n /sonnet-4-2025/,\n /opus-4-0/,\n /opus-4-1/,\n /opus-4-2025/,\n /3-7-sonnet/,\n];\n// Anthropic models that REMOVED temperature/top_p/top_k (sending them 400s).\nconst ANTHROPIC_NO_SAMPLING = [/opus-4-[78]/, /fable-5/, /mythos-5/];\n// Anthropic models that support the `max` effort tier (others clamp max→high).\nconst ANTHROPIC_MAX_EFFORT = [\n /opus-4-[678]/,\n /sonnet-4-6/,\n /fable-5/,\n /mythos-5/,\n];\n// OpenAI reasoning models (effort-capable); everything else ignores effort.\nconst OPENAI_REASONING = [/(^|[^a-z])o[1345](-|$)/, /gpt-5/];\n// OpenAI reasoning models that support the `minimal` tier (others clamp →low).\nconst OPENAI_MINIMAL_EFFORT = [/gpt-5/];\n\nconst matches = (model: string, patterns: RegExp[]) =>\n patterns.some((pattern) => pattern.test(model));\n\nexport type AnthropicReasoningMode = \"effort\" | \"adaptive\" | \"legacy\" | \"none\";\n\nexport const anthropicReasoningMode = (model: string): AnthropicReasoningMode => {\n if (matches(model, ANTHROPIC_EFFORT)) return \"effort\";\n if (matches(model, ANTHROPIC_ADAPTIVE_ONLY)) return \"adaptive\";\n if (matches(model, ANTHROPIC_LEGACY_THINKING)) return \"legacy\";\n\n return \"none\";\n};\n\n/** Modern Anthropic + Fable/Mythos reject temperature/top_p/top_k entirely. */\nexport const anthropicSupportsSampling = (model: string) =>\n !matches(model, ANTHROPIC_NO_SAMPLING);\n\nexport const isOpenAIReasoningModel = (model: string) =>\n matches(model, OPENAI_REASONING);\n\n// effort → legacy thinking budget (tokens). Kept under typical max_tokens; the\n// Anthropic provider raises max_tokens to fit when thinking is enabled.\nconst EFFORT_BUDGET: Record<ReasoningEffort, number> = {\n high: 16384,\n low: 2048,\n max: 32768,\n medium: 8192,\n minimal: 1024,\n};\n\n// budget tokens → nearest effort (when a caller gave only budgetTokens but the\n// target model is effort-based).\nconst budgetToEffort = (budget: number): ReasoningEffort => {\n if (budget <= 2048) return \"low\";\n if (budget <= 8192) return \"medium\";\n if (budget <= 16384) return \"high\";\n\n return \"max\";\n};\n\n/** The portable effort a config asks for, deriving from budgetTokens if needed. */\nexport const resolveEffort = (\n reasoning: ReasoningConfig,\n): ReasoningEffort | null => {\n if (reasoning.effort) return reasoning.effort;\n if (typeof reasoning.budgetTokens === \"number\") {\n return budgetToEffort(reasoning.budgetTokens);\n }\n\n return null;\n};\n\n/** The budget a config asks for, deriving from effort if needed. */\nexport const resolveBudgetTokens = (\n reasoning: ReasoningConfig,\n): number | null => {\n if (typeof reasoning.budgetTokens === \"number\") return reasoning.budgetTokens;\n if (reasoning.effort) return EFFORT_BUDGET[reasoning.effort];\n\n return null;\n};\n\nconst clampEffort = (\n effort: ReasoningEffort,\n allowed: ReasoningEffort[],\n): ReasoningEffort => {\n if (allowed.includes(effort)) return effort;\n // Walk DOWN the order to the nearest allowed tier (never silently escalate).\n const idx = EFFORT_ORDER.indexOf(effort);\n for (let lower = idx - 1; lower >= 0; lower -= 1) {\n const candidate = EFFORT_ORDER[lower];\n if (candidate && allowed.includes(candidate)) return candidate;\n }\n\n return allowed[0] ?? effort;\n};\n\n/** Anthropic `output_config.effort` value for an effort-capable model, or null. */\nexport const anthropicEffortValue = (\n model: string,\n reasoning: ReasoningConfig,\n) => {\n const effort = resolveEffort(reasoning);\n if (!effort) return null;\n const allowed: ReasoningEffort[] = matches(model, ANTHROPIC_MAX_EFFORT)\n ? [\"low\", \"medium\", \"high\", \"max\"]\n : [\"low\", \"medium\", \"high\"];\n\n return clampEffort(effort, allowed);\n};\n\n/** OpenAI `reasoning.effort` value for a reasoning model, or null. */\nexport const openaiEffortValue = (model: string, reasoning: ReasoningConfig) => {\n if (!isOpenAIReasoningModel(model)) return null;\n const effort = resolveEffort(reasoning);\n if (!effort) return null;\n const allowed: ReasoningEffort[] = matches(model, OPENAI_MINIMAL_EFFORT)\n ? [\"minimal\", \"low\", \"medium\", \"high\"]\n : [\"low\", \"medium\", \"high\"];\n // OpenAI has no `max`; clamp it to `high`.\n const requested = effort === \"max\" ? \"high\" : effort;\n\n return clampEffort(requested, allowed);\n};\n",
7
+ "import type {\n AIProviderConfig,\n AIProviderContentBlock,\n AIProviderMessage,\n AIProviderStreamParams,\n AIProviderToolDefinition,\n AIUsage,\n} from \"../../../types/ai\";\n\n// Opportunistic HTTP/2 multiplexing for outbound HTTPS (Bun 1.3.14+).\n// The `protocol` option lands in @types/bun 1.3.14; widen locally for now.\nimport { instrumentAIProvider } from \"./instrumentation\";\nimport { isOpenAIReasoningModel, openaiEffortValue } from \"./reasoning\";\n// Hard-skip on non-HTTPS — Bun's h2 client throws HTTP2Unsupported on h2c.\ntype H2Init = RequestInit & { protocol?: \"http2\" };\nconst h2IfHttps = (url: string): H2Init =>\n url.startsWith(\"https://\") ? { protocol: \"http2\" } : {};\n\ntype OpenAIConfig = {\n apiKey?: string;\n baseUrl?: string;\n tokenSource?: () => Promise<string> | string;\n};\n\ntype OpenAIMessage = {\n content: string | Array<Record<string, unknown>> | null;\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n tool_call_id?: string;\n tool_calls?: Array<{\n function: { arguments: string; name: string };\n id: string;\n type: \"function\";\n }>;\n};\n\ntype PendingToolCall = {\n arguments: string;\n id: string;\n name: string;\n};\n\ntype UsageRef = {\n current: AIUsage | undefined;\n};\n\ntype StreamState = {\n buffer: string;\n pendingToolCalls: Map<number, PendingToolCall>;\n usageRef: UsageRef;\n};\n\nconst DEFAULT_BASE_URL = \"https://api.openai.com\";\nconst SSE_DATA_PREFIX_LENGTH = 6;\nconst DONE_SENTINEL = \"[DONE]\";\nconst NOT_FOUND = -1;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst isRecordArray = (\n value: unknown,\n): value is Array<Record<string, unknown>> =>\n Array.isArray(value) && value.length > 0 && isRecord(value[0]);\n\nconst hasArrayContent = (\n msg: AIProviderMessage,\n): msg is AIProviderMessage & { content: AIProviderContentBlock[] } =>\n typeof msg.content !== \"string\" && Array.isArray(msg.content);\n\nconst buildToolMessages = (blocks: AIProviderContentBlock[]) => {\n const toolUseBlocks = blocks.filter((block) => block.type === \"tool_use\");\n const toolResultBlocks = blocks.filter(\n (block) => block.type === \"tool_result\",\n );\n const messages: OpenAIMessage[] = [];\n\n if (toolUseBlocks.length > 0) {\n messages.push({\n content: null,\n role: \"assistant\",\n tool_calls: toolUseBlocks.map((block) => ({\n function: {\n arguments:\n typeof block.input === \"string\"\n ? block.input\n : JSON.stringify(block.input),\n name: block.name,\n },\n id: block.id,\n type: \"function\" as const,\n })),\n });\n }\n\n for (const result of toolResultBlocks) {\n messages.push({\n content: typeof result.content === \"string\" ? result.content : \"\",\n role: \"tool\",\n tool_call_id: result.tool_use_id,\n });\n }\n\n return messages;\n};\n\nconst processMessageAtIndex = (\n result: OpenAIMessage[],\n msg: AIProviderMessage,\n idx: number,\n) => {\n if (!hasArrayContent(msg)) {\n return;\n }\n\n const hasToolBlocks = msg.content.some(\n (block) => block.type === \"tool_use\" || block.type === \"tool_result\",\n );\n\n if (!hasToolBlocks) {\n return;\n }\n\n const toolMessages = buildToolMessages(msg.content);\n result.splice(idx, 1, ...toolMessages);\n};\n\nconst convertSingleMessage = (\n result: OpenAIMessage[],\n msg: AIProviderMessage | undefined,\n idx: number,\n) => {\n if (!msg) {\n return;\n }\n\n processMessageAtIndex(result, msg, idx);\n};\n\nconst convertToolResultMessages = (\n messages: OpenAIMessage[],\n params: AIProviderStreamParams,\n) => {\n const result = [...messages];\n\n for (let idx = 0; idx < params.messages.length; idx++) {\n convertSingleMessage(result, params.messages[idx], idx);\n }\n\n return result;\n};\n\nconst mapToolDefinitions = (tools: AIProviderToolDefinition[]) =>\n tools.map((tool) => ({\n function: {\n description: tool.description,\n name: tool.name,\n parameters: tool.input_schema,\n },\n type: \"function\",\n }));\n\nconst mapContentBlockToOpenAI = (block: AIProviderContentBlock) => {\n if (block.type === \"image\") {\n return {\n image_url: {\n url: `data:${block.source.media_type};base64,${block.source.data}`,\n },\n type: \"image_url\",\n };\n }\n\n if (block.type === \"document\") {\n return {\n file: {\n file_data: `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.name ?? \"document.pdf\",\n },\n type: \"file\",\n };\n }\n\n if (block.type === \"text\") {\n return { text: block.content, type: \"text\" };\n }\n\n return null;\n};\n\nconst mapOpenAIContent = (msg: AIProviderStreamParams[\"messages\"][number]) => {\n if (typeof msg.content === \"string\") {\n return msg.content;\n }\n\n const hasMedia = msg.content.some(\n (block) => block.type === \"image\" || block.type === \"document\",\n );\n\n if (!hasMedia) {\n return null;\n }\n\n return msg.content\n .map(mapContentBlockToOpenAI)\n .filter((mapped) => mapped !== null);\n};\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n const messages = convertToolResultMessages(\n params.messages.map((msg) => ({\n content: mapOpenAIContent(msg),\n role: msg.role,\n })),\n params,\n );\n\n const body: Record<string, unknown> = {\n messages,\n model: params.model,\n stream: true,\n stream_options: { include_usage: true },\n };\n\n if (params.tools && params.tools.length > 0) {\n body.tools = mapToolDefinitions(params.tools);\n if (params.toolChoice === \"auto\" || params.toolChoice === \"none\" || params.toolChoice === \"required\") {\n body.tool_choice = params.toolChoice;\n } else if (params.toolChoice && typeof params.toolChoice === \"object\") {\n body.tool_choice = {\n function: { name: params.toolChoice.name },\n type: \"function\",\n };\n }\n if (typeof params.parallelToolCalls === \"boolean\") {\n body.parallel_tool_calls = params.parallelToolCalls;\n }\n }\n\n // Reasoning models (o-series, GPT-5) reject temperature/top_p and use\n // `max_completion_tokens`; they take a `reasoning_effort` dial instead. Other\n // models take the usual sampling params and ignore reasoning.\n if (isOpenAIReasoningModel(params.model)) {\n if (typeof params.maxTokens === \"number\") {\n body.max_completion_tokens = params.maxTokens;\n }\n if (params.reasoning) {\n const effort = openaiEffortValue(params.model, params.reasoning);\n if (effort) body.reasoning_effort = effort;\n }\n } else {\n if (typeof params.temperature === \"number\") {\n body.temperature = params.temperature;\n }\n if (typeof params.topP === \"number\") body.top_p = params.topP;\n if (typeof params.maxTokens === \"number\") body.max_tokens = params.maxTokens;\n }\n if (params.stopSequences && params.stopSequences.length > 0) body.stop = params.stopSequences;\n if (typeof params.seed === \"number\") body.seed = params.seed;\n if (typeof params.frequencyPenalty === \"number\") body.frequency_penalty = params.frequencyPenalty;\n if (typeof params.presencePenalty === \"number\") body.presence_penalty = params.presencePenalty;\n\n if (params.responseFormat) {\n if (params.responseFormat.type === \"text\" || params.responseFormat.type === \"json_object\") {\n body.response_format = { type: params.responseFormat.type };\n } else if (params.responseFormat.type === \"json_schema\") {\n body.response_format = {\n json_schema: {\n name: params.responseFormat.name,\n schema: params.responseFormat.schema,\n strict: params.responseFormat.strict ?? true,\n },\n type: \"json_schema\",\n };\n }\n }\n\n return body;\n};\n\nconst parseToolInput = (rawArguments: string) => {\n try {\n return JSON.parse(rawArguments);\n } catch {\n return rawArguments;\n }\n};\n\nconst flushPendingToolCalls = function* (\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n for (const [, tool] of pendingToolCalls) {\n const input = parseToolInput(tool.arguments);\n yield {\n id: tool.id,\n input,\n name: tool.name,\n type: \"tool_use\" as const,\n };\n }\n\n pendingToolCalls.clear();\n};\n\nconst extractUsage = (parsedUsage: Record<string, number>) => ({\n inputTokens: parsedUsage.prompt_tokens ?? 0,\n outputTokens: parsedUsage.completion_tokens ?? 0,\n});\n\nconst resolveToolCallIndex = (toolCall: Record<string, unknown>) => {\n const raw = typeof toolCall.index === \"number\" ? toolCall.index : NOT_FOUND;\n\n return raw < 0 ? undefined : raw;\n};\n\nconst initPendingToolCall = (\n toolCall: Record<string, unknown>,\n func: Record<string, unknown> | null,\n index: number,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n if (pendingToolCalls.has(index)) {\n return;\n }\n\n const toolId = typeof toolCall.id === \"string\" ? toolCall.id : \"\";\n const toolName = func && typeof func.name === \"string\" ? func.name : \"\";\n\n pendingToolCalls.set(index, {\n arguments: \"\",\n id: toolId,\n name: toolName,\n });\n};\n\nconst updatePendingToolCall = (\n toolCall: Record<string, unknown>,\n func: Record<string, unknown> | null,\n pending: PendingToolCall,\n) => {\n if (typeof toolCall.id === \"string\") {\n pending.id = toolCall.id;\n }\n\n if (func && typeof func.name === \"string\") {\n pending.name = func.name;\n }\n\n if (func && typeof func.arguments === \"string\") {\n pending.arguments += func.arguments;\n }\n};\n\nconst processToolCallDelta = (\n toolCall: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n const index = resolveToolCallIndex(toolCall);\n if (index === undefined) {\n return;\n }\n\n const func = isRecord(toolCall.function) ? toolCall.function : null;\n initPendingToolCall(toolCall, func, index, pendingToolCalls);\n\n const pending = pendingToolCalls.get(index);\n if (!pending) {\n return;\n }\n\n updatePendingToolCall(toolCall, func, pending);\n};\n\nconst processToolCallDeltas = (\n toolCalls: Array<Record<string, unknown>>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) => {\n for (const toolCall of toolCalls) {\n processToolCallDelta(toolCall, pendingToolCalls);\n }\n};\n\nconst processDelta = function* (\n delta: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n if (typeof delta.content === \"string\") {\n yield { content: delta.content, type: \"text\" as const };\n }\n\n if (isRecordArray(delta.tool_calls)) {\n processToolCallDeltas(delta.tool_calls, pendingToolCalls);\n }\n};\n\nconst processChoice = function* (\n choice: Record<string, unknown>,\n pendingToolCalls: Map<number, PendingToolCall>,\n) {\n const delta = isRecord(choice.delta) ? choice.delta : null;\n if (delta) {\n yield* processDelta(delta, pendingToolCalls);\n }\n\n if (choice.finish_reason === \"tool_calls\") {\n yield* flushPendingToolCalls(pendingToolCalls);\n }\n};\n\nconst narrowUsageRecord = (parsed: Record<string, unknown>) => {\n if (!isRecord(parsed.usage)) {\n return undefined;\n }\n\n const { usage } = parsed;\n const promptTokens =\n typeof usage.prompt_tokens === \"number\" ? usage.prompt_tokens : 0;\n const completionTokens =\n typeof usage.completion_tokens === \"number\" ? usage.completion_tokens : 0;\n\n return extractUsage({\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n });\n};\n\nconst processSSELine = function* (\n line: string,\n pendingToolCalls: Map<number, PendingToolCall>,\n currentUsage: AIUsage | undefined,\n) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(\"data: \")) {\n return;\n }\n\n const data = trimmed.slice(SSE_DATA_PREFIX_LENGTH);\n if (data === DONE_SENTINEL) {\n yield* flushPendingToolCalls(pendingToolCalls);\n yield { type: \"done\" as const, usage: currentUsage };\n\n return;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(data);\n } catch {\n return;\n }\n\n const usageUpdate = narrowUsageRecord(parsed);\n if (usageUpdate) {\n yield { type: \"usage_update\" as const, usage: usageUpdate };\n }\n\n const { choices } = parsed;\n if (!isRecordArray(choices)) {\n return;\n }\n\n const [firstChoice] = choices;\n if (!firstChoice) {\n return;\n }\n\n yield* processChoice(firstChoice, pendingToolCalls);\n};\n\nconst isUsageUpdate = (chunk: {\n type: string;\n usage?: AIUsage;\n}): chunk is { type: \"usage_update\"; usage: AIUsage } =>\n chunk.type === \"usage_update\";\n\nconst collectYieldableChunks = (\n line: string,\n pendingToolCalls: Map<number, PendingToolCall>,\n usageRef: UsageRef,\n) => {\n const allChunks = Array.from(\n processSSELine(line, pendingToolCalls, usageRef.current),\n );\n const usageChunks = allChunks.filter(isUsageUpdate);\n const lastUsage = usageChunks.at(NOT_FOUND);\n\n if (lastUsage) {\n usageRef.current = lastUsage.usage;\n }\n\n return allChunks.filter((chunk) => !isUsageUpdate(chunk));\n};\n\nconst processSSELines = function* (\n lines: string[],\n pendingToolCalls: Map<number, PendingToolCall>,\n usageRef: UsageRef,\n) {\n for (const line of lines) {\n yield* collectYieldableChunks(line, pendingToolCalls, usageRef);\n }\n};\n\nconst processStreamValue = (\n value: Uint8Array,\n decoder: TextDecoder,\n state: StreamState,\n) => {\n state.buffer += decoder.decode(value, { stream: true });\n const lines = state.buffer.split(\"\\n\");\n state.buffer = lines.pop() ?? \"\";\n\n return lines;\n};\n\nconst drainReader = async function* (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n state: StreamState,\n signal?: AbortSignal,\n) {\n /* eslint-disable no-await-in-loop */\n for (\n let result = await reader.read();\n !result.done && !signal?.aborted;\n result = await reader.read()\n ) {\n /* eslint-enable no-await-in-loop */\n const lines = processStreamValue(result.value, decoder, state);\n yield* processSSELines(lines, state.pendingToolCalls, state.usageRef);\n }\n};\n\nconst parseSSEStream = async function* (\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const state: StreamState = {\n buffer: \"\",\n pendingToolCalls: new Map<number, PendingToolCall>(),\n usageRef: { current: undefined },\n };\n\n try {\n yield* drainReader(reader, decoder, state, signal);\n yield { type: \"done\" as const, usage: state.usageRef.current };\n } finally {\n reader.releaseLock();\n }\n};\n\nconst fetchOpenAIStream = async function* (\n baseUrl: string,\n apiKey: string,\n body: Record<string, unknown>,\n signal?: AbortSignal,\n) {\n const target = `${baseUrl}/v1/chat/completions`;\n const response = await fetch(target, {\n ...h2IfHttps(target),\n body: JSON.stringify(body),\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`OpenAI API error ${response.status}: ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error(\"OpenAI API returned no response body\");\n }\n\n yield* parseSSEStream(response.body, signal);\n};\n\nexport const openai = (config: OpenAIConfig): AIProviderConfig => {\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n if (!config.apiKey && !config.tokenSource) {\n throw new Error(\"openai() requires either apiKey or tokenSource\");\n }\n const resolveKey = async () => {\n if (config.tokenSource) {\n return await Promise.resolve(config.tokenSource());\n }\n return config.apiKey!;\n };\n\n return instrumentAIProvider(\n {\n stream: (params: AIProviderStreamParams) => {\n const body = buildRequestBody(params);\n return (async function* () {\n const apiKey = await resolveKey();\n yield* fetchOpenAIStream(baseUrl, apiKey, body, params.signal);\n })();\n },\n },\n \"openai\",\n );\n};\n"
7
8
  ],
8
- "mappings": "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",
9
- "debugId": "FF865773151B9EF964756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "9FDAF944E89004EF64756E2164756E21",
10
11
  "names": []
11
12
  }