@kenkaiiii/gg-ai 4.2.12 → 4.2.13

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/index.cjs CHANGED
@@ -312,8 +312,17 @@ function toAnthropicThinking(level, maxTokens, model) {
312
312
  maxTokens: maxTokens + budget
313
313
  };
314
314
  }
315
+ function remapToolCallId(id, idMap) {
316
+ if (id.startsWith("call_")) return id;
317
+ const existing = idMap.get(id);
318
+ if (existing) return existing;
319
+ const mapped = `call_${id.replace(/^toolu_/, "")}`;
320
+ idMap.set(id, mapped);
321
+ return mapped;
322
+ }
315
323
  function toOpenAIMessages(messages) {
316
324
  const out = [];
325
+ const idMap = /* @__PURE__ */ new Map();
317
326
  for (const msg of messages) {
318
327
  if (msg.role === "system") {
319
328
  out.push({ role: "system", content: msg.content });
@@ -346,7 +355,7 @@ function toOpenAIMessages(messages) {
346
355
  (p) => p.type === "tool_call"
347
356
  ).map(
348
357
  (tc) => ({
349
- id: tc.id,
358
+ id: remapToolCallId(tc.id, idMap),
350
359
  type: "function",
351
360
  function: { name: tc.name, arguments: JSON.stringify(tc.args) }
352
361
  })
@@ -368,7 +377,7 @@ function toOpenAIMessages(messages) {
368
377
  for (const result of msg.content) {
369
378
  out.push({
370
379
  role: "tool",
371
- tool_call_id: result.toolCallId,
380
+ tool_call_id: remapToolCallId(result.toolCallId, idMap),
372
381
  content: result.content
373
382
  });
374
383
  }
@@ -975,9 +984,18 @@ async function* parseSSE(body) {
975
984
  reader.releaseLock();
976
985
  }
977
986
  }
987
+ function remapCodexId(id, idMap) {
988
+ if (id.startsWith("fc_") || id.startsWith("fc-")) return id;
989
+ const existing = idMap.get(id);
990
+ if (existing) return existing;
991
+ const mapped = `fc_${id.replace(/^toolu_/, "")}`;
992
+ idMap.set(id, mapped);
993
+ return mapped;
994
+ }
978
995
  function toCodexInput(messages) {
979
996
  let system;
980
997
  const input = [];
998
+ const idMap = /* @__PURE__ */ new Map();
981
999
  for (const msg of messages) {
982
1000
  if (msg.role === "system") {
983
1001
  system = msg.content;
@@ -1017,8 +1035,8 @@ function toCodexInput(messages) {
1017
1035
  const [callId, itemId] = part.id.includes("|") ? part.id.split("|", 2) : [part.id, part.id];
1018
1036
  input.push({
1019
1037
  type: "function_call",
1020
- id: itemId,
1021
- call_id: callId,
1038
+ id: remapCodexId(itemId, idMap),
1039
+ call_id: remapCodexId(callId, idMap),
1022
1040
  name: part.name,
1023
1041
  arguments: JSON.stringify(part.args)
1024
1042
  });
@@ -1031,7 +1049,7 @@ function toCodexInput(messages) {
1031
1049
  const [callId] = result.toolCallId.includes("|") ? result.toolCallId.split("|", 2) : [result.toolCallId];
1032
1050
  input.push({
1033
1051
  type: "function_call_output",
1034
- call_id: callId,
1052
+ call_id: remapCodexId(callId, idMap),
1035
1053
  output: result.content
1036
1054
  });
1037
1055
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/providers/anthropic.ts","../src/utils/event-stream.ts","../src/utils/zod-to-json-schema.ts","../src/providers/transform.ts","../src/providers/openai.ts","../src/providers/openai-codex.ts","../src/stream.ts"],"sourcesContent":["// Core entry point\nexport { stream } from \"./stream.js\";\n\n// Types\nexport type {\n Provider,\n ThinkingLevel,\n CacheRetention,\n TextContent,\n ThinkingContent,\n ImageContent,\n ToolCall,\n ToolResult,\n ServerToolCall,\n ServerToolResult,\n ServerToolDefinition,\n RawContent,\n ContentPart,\n SystemMessage,\n UserMessage,\n AssistantMessage,\n ToolResultMessage,\n Message,\n Tool,\n ToolChoice,\n TextDeltaEvent,\n ThinkingDeltaEvent,\n ToolCallDeltaEvent,\n ToolCallDoneEvent,\n ServerToolCallEvent,\n ServerToolResultEvent,\n DoneEvent,\n ErrorEvent,\n StreamEvent,\n StopReason,\n StreamResponse,\n Usage,\n StreamOptions,\n} from \"./types.js\";\n\n// Classes\nexport { StreamResult, EventStream } from \"./utils/event-stream.js\";\nexport { GGAIError, ProviderError } from \"./errors.js\";\n","export class GGAIError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"GGAIError\";\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: { statusCode?: number; cause?: unknown },\n ) {\n super(`[${provider}] ${message}`, { cause: options?.cause });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n });\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const { system, messages } = toAnthropicMessages(options.messages, cacheControl);\n\n let maxTokens = options.maxTokens ?? 4096;\n let thinking: Anthropic.ThinkingConfigParam | undefined;\n let outputConfig: Record<string, unknown> | undefined;\n\n if (options.thinking) {\n const t = toAnthropicThinking(options.thinking, maxTokens, options.model);\n thinking = t.thinking;\n maxTokens = t.maxTokens;\n if (t.outputConfig) {\n outputConfig = t.outputConfig;\n }\n }\n\n const params: Anthropic.MessageCreateParams = {\n model: options.model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system: system as Anthropic.MessageCreateParams[\"system\"] } : {}),\n ...(thinking ? { thinking } : {}),\n ...(outputConfig\n ? { output_config: outputConfig as unknown as Anthropic.MessageCreateParams[\"output_config\"] }\n : {}),\n ...(options.temperature != null && !thinking ? { temperature: options.temperature } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop_sequences: options.stop } : {}),\n ...(options.tools?.length || options.serverTools?.length || options.webSearch\n ? {\n tools: [\n ...(options.tools?.length ? toAnthropicTools(options.tools) : []),\n ...(options.serverTools ?? []),\n ...(options.webSearch ? [{ type: \"web_search_20250305\", name: \"web_search\" }] : []),\n ] as Anthropic.MessageCreateParams[\"tools\"],\n }\n : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toAnthropicToolChoice(options.toolChoice) }\n : {}),\n ...(options.compaction\n ? { context_management: { edits: [{ type: \"compact_20260112\" }] } }\n : {}),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import type { StreamEvent, StreamResponse } from \"../types.js\";\n\n/**\n * Push-based async iterable. Producers push events, consumers\n * iterate with `for await`. Also supports thenable so you can\n * `await stream(...)` directly to get the final response.\n */\nexport class EventStream<T = StreamEvent> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolve: (() => void) | null = null;\n private done = false;\n private error: Error | null = null;\n\n push(event: T): void {\n // Safety valve: if queue grows beyond 50k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 50_000) {\n this.queue.splice(0, this.queue.length - 25_000);\n }\n this.queue.push(event);\n this.resolve?.();\n this.resolve = null;\n }\n\n close(): void {\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n abort(error: Error): void {\n this.error = error;\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let index = 0;\n while (true) {\n while (index < this.queue.length) {\n yield this.queue[index++]!;\n }\n // Reset to avoid holding references to already-yielded events\n this.queue.splice(0, index);\n index = 0;\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolve = r;\n });\n }\n }\n}\n\n/**\n * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for\n * provider tool parameter definitions.\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = z.toJSONSchema(schema);\n // Remove $schema and other meta keys providers don't want\n const { $schema: _schema, ...rest } = jsonSchema as Record<string, unknown>;\n return rest;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part) => {\n // Strip thinking blocks without a valid signature (e.g. from GLM/OpenAI)\n // — Anthropic rejects empty signatures\n if (part.type === \"thinking\" && !part.signature) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\")\n return { type: \"thinking\", thinking: part.text, signature: part.signature! };\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // image content shouldn't appear in assistant messages\n return { type: \"text\", text: \"\" };\n });\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\nexport function toOpenAIMessages(messages: Message[]): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n out.push({ role: \"system\", content: msg.content });\n continue;\n }\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n out.push({ role: \"user\", content: msg.content });\n } else {\n out.push({\n role: \"user\",\n content: msg.content.map(\n (\n part,\n ): OpenAI.ChatCompletionContentPartImage | OpenAI.ChatCompletionContentPartText => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n };\n },\n ),\n });\n }\n continue;\n }\n if (msg.role === \"assistant\") {\n const parts = typeof msg.content === \"string\" ? msg.content : undefined;\n const toolCalls =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter(\n (p): p is Extract<ContentPart, { type: \"tool_call\" }> => p.type === \"tool_call\",\n )\n .map(\n (tc): OpenAI.ChatCompletionMessageToolCall => ({\n id: tc.id,\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.args) },\n }),\n )\n : undefined;\n const textParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n // Roundtrip thinking content as reasoning_content (GLM, Moonshot)\n const thinkingParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is ThinkingContent => p.type === \"thinking\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: result.toolCallId,\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages);\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: true,\n ...(options.maxTokens ? { max_tokens: options.maxTokens } : {}),\n ...(options.temperature != null && !options.thinking\n ? { temperature: options.temperature }\n : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop: options.stop } : {}),\n ...(options.thinking && !usesThinkingParam\n ? { reasoning_effort: toOpenAIReasoningEffort(options.thinking) }\n : {}),\n ...(options.tools?.length ? { tools: toOpenAITools(options.tools) } : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toOpenAIToolChoice(options.toolChoice) }\n : {}),\n stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof OpenAI.APIError) {\n // Include full error body for debugging — GLM/Moonshot use non-standard error shapes\n let msg = err.message;\n const body = err.error as Record<string, unknown> | undefined;\n if (body) {\n // Append raw error body so debug logs capture the exact API response\n msg += ` | body: ${JSON.stringify(body)}`;\n }\n return new ProviderError(\"openai\", msg, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n Message,\n StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: itemId,\n call_id: callId,\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: callId,\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport { GGAIError } from \"./errors.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\nimport { streamAnthropic } from \"./providers/anthropic.js\";\nimport { streamOpenAI } from \"./providers/openai.js\";\nimport { streamOpenAICodex } from \"./providers/openai-codex.js\";\n\n/**\n * Unified streaming entry point. Returns a StreamResult that is both\n * an async iterable (for streaming events) and thenable (await for\n * the final response).\n *\n * ```ts\n * // Stream events\n * for await (const event of stream({ provider: \"anthropic\", model: \"claude-sonnet-4-6\", messages })) {\n * if (event.type === \"text_delta\") process.stdout.write(event.text);\n * }\n *\n * // Or just await the final message\n * const response = await stream({ provider: \"openai\", model: \"gpt-4.1\", messages });\n * ```\n */\nexport function stream(options: StreamOptions): StreamResult {\n switch (options.provider) {\n case \"anthropic\":\n return streamAnthropic(options);\n case \"openai\":\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n case \"glm\":\n return streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.z.ai/api/paas/v4\",\n });\n case \"moonshot\":\n return streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n });\n default:\n throw new GGAIError(\n `Unknown provider: ${options.provider as string}. Supported: \"anthropic\", \"openai\", \"glm\", \"moonshot\"`,\n );\n }\n}\n"],"mappings":"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","names":["Anthropic","stream","runStream","toError","OpenAI","stream","runStream","toError","os"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/providers/anthropic.ts","../src/utils/event-stream.ts","../src/utils/zod-to-json-schema.ts","../src/providers/transform.ts","../src/providers/openai.ts","../src/providers/openai-codex.ts","../src/stream.ts"],"sourcesContent":["// Core entry point\nexport { stream } from \"./stream.js\";\n\n// Types\nexport type {\n Provider,\n ThinkingLevel,\n CacheRetention,\n TextContent,\n ThinkingContent,\n ImageContent,\n ToolCall,\n ToolResult,\n ServerToolCall,\n ServerToolResult,\n ServerToolDefinition,\n RawContent,\n ContentPart,\n SystemMessage,\n UserMessage,\n AssistantMessage,\n ToolResultMessage,\n Message,\n Tool,\n ToolChoice,\n TextDeltaEvent,\n ThinkingDeltaEvent,\n ToolCallDeltaEvent,\n ToolCallDoneEvent,\n ServerToolCallEvent,\n ServerToolResultEvent,\n DoneEvent,\n ErrorEvent,\n StreamEvent,\n StopReason,\n StreamResponse,\n Usage,\n StreamOptions,\n} from \"./types.js\";\n\n// Classes\nexport { StreamResult, EventStream } from \"./utils/event-stream.js\";\nexport { GGAIError, ProviderError } from \"./errors.js\";\n","export class GGAIError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"GGAIError\";\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: { statusCode?: number; cause?: unknown },\n ) {\n super(`[${provider}] ${message}`, { cause: options?.cause });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n });\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const { system, messages } = toAnthropicMessages(options.messages, cacheControl);\n\n let maxTokens = options.maxTokens ?? 4096;\n let thinking: Anthropic.ThinkingConfigParam | undefined;\n let outputConfig: Record<string, unknown> | undefined;\n\n if (options.thinking) {\n const t = toAnthropicThinking(options.thinking, maxTokens, options.model);\n thinking = t.thinking;\n maxTokens = t.maxTokens;\n if (t.outputConfig) {\n outputConfig = t.outputConfig;\n }\n }\n\n const params: Anthropic.MessageCreateParams = {\n model: options.model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system: system as Anthropic.MessageCreateParams[\"system\"] } : {}),\n ...(thinking ? { thinking } : {}),\n ...(outputConfig\n ? { output_config: outputConfig as unknown as Anthropic.MessageCreateParams[\"output_config\"] }\n : {}),\n ...(options.temperature != null && !thinking ? { temperature: options.temperature } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop_sequences: options.stop } : {}),\n ...(options.tools?.length || options.serverTools?.length || options.webSearch\n ? {\n tools: [\n ...(options.tools?.length ? toAnthropicTools(options.tools) : []),\n ...(options.serverTools ?? []),\n ...(options.webSearch ? [{ type: \"web_search_20250305\", name: \"web_search\" }] : []),\n ] as Anthropic.MessageCreateParams[\"tools\"],\n }\n : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toAnthropicToolChoice(options.toolChoice) }\n : {}),\n ...(options.compaction\n ? { context_management: { edits: [{ type: \"compact_20260112\" }] } }\n : {}),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import type { StreamEvent, StreamResponse } from \"../types.js\";\n\n/**\n * Push-based async iterable. Producers push events, consumers\n * iterate with `for await`. Also supports thenable so you can\n * `await stream(...)` directly to get the final response.\n */\nexport class EventStream<T = StreamEvent> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolve: (() => void) | null = null;\n private done = false;\n private error: Error | null = null;\n\n push(event: T): void {\n // Safety valve: if queue grows beyond 50k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 50_000) {\n this.queue.splice(0, this.queue.length - 25_000);\n }\n this.queue.push(event);\n this.resolve?.();\n this.resolve = null;\n }\n\n close(): void {\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n abort(error: Error): void {\n this.error = error;\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let index = 0;\n while (true) {\n while (index < this.queue.length) {\n yield this.queue[index++]!;\n }\n // Reset to avoid holding references to already-yielded events\n this.queue.splice(0, index);\n index = 0;\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolve = r;\n });\n }\n }\n}\n\n/**\n * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for\n * provider tool parameter definitions.\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = z.toJSONSchema(schema);\n // Remove $schema and other meta keys providers don't want\n const { $schema: _schema, ...rest } = jsonSchema as Record<string, unknown>;\n return rest;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part) => {\n // Strip thinking blocks without a valid signature (e.g. from GLM/OpenAI)\n // — Anthropic rejects empty signatures\n if (part.type === \"thinking\" && !part.signature) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\")\n return { type: \"thinking\", thinking: part.text, signature: part.signature! };\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // image content shouldn't appear in assistant messages\n return { type: \"text\", text: \"\" };\n });\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match OpenAI's expected prefix.\n * Anthropic uses `toolu_*` IDs which OpenAI rejects — we need `call_*` prefixed IDs.\n * The mapping is consistent within a single conversion so assistant tool_call IDs\n * match their corresponding tool result references.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"call_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(messages: Message[]): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n out.push({ role: \"system\", content: msg.content });\n continue;\n }\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n out.push({ role: \"user\", content: msg.content });\n } else {\n out.push({\n role: \"user\",\n content: msg.content.map(\n (\n part,\n ): OpenAI.ChatCompletionContentPartImage | OpenAI.ChatCompletionContentPartText => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n };\n },\n ),\n });\n }\n continue;\n }\n if (msg.role === \"assistant\") {\n const parts = typeof msg.content === \"string\" ? msg.content : undefined;\n const toolCalls =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter(\n (p): p is Extract<ContentPart, { type: \"tool_call\" }> => p.type === \"tool_call\",\n )\n .map(\n (tc): OpenAI.ChatCompletionMessageToolCall => ({\n id: remapToolCallId(tc.id, idMap),\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.args) },\n }),\n )\n : undefined;\n const textParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n // Roundtrip thinking content as reasoning_content (GLM, Moonshot)\n const thinkingParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is ThinkingContent => p.type === \"thinking\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages);\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: true,\n ...(options.maxTokens ? { max_tokens: options.maxTokens } : {}),\n ...(options.temperature != null && !options.thinking\n ? { temperature: options.temperature }\n : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop: options.stop } : {}),\n ...(options.thinking && !usesThinkingParam\n ? { reasoning_effort: toOpenAIReasoningEffort(options.thinking) }\n : {}),\n ...(options.tools?.length ? { tools: toOpenAITools(options.tools) } : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toOpenAIToolChoice(options.toolChoice) }\n : {}),\n stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof OpenAI.APIError) {\n // Include full error body for debugging — GLM/Moonshot use non-standard error shapes\n let msg = err.message;\n const body = err.error as Record<string, unknown> | undefined;\n if (body) {\n // Append raw error body so debug logs capture the exact API response\n msg += ` | body: ${JSON.stringify(body)}`;\n }\n return new ProviderError(\"openai\", msg, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n Message,\n StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport { GGAIError } from \"./errors.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\nimport { streamAnthropic } from \"./providers/anthropic.js\";\nimport { streamOpenAI } from \"./providers/openai.js\";\nimport { streamOpenAICodex } from \"./providers/openai-codex.js\";\n\n/**\n * Unified streaming entry point. Returns a StreamResult that is both\n * an async iterable (for streaming events) and thenable (await for\n * the final response).\n *\n * ```ts\n * // Stream events\n * for await (const event of stream({ provider: \"anthropic\", model: \"claude-sonnet-4-6\", messages })) {\n * if (event.type === \"text_delta\") process.stdout.write(event.text);\n * }\n *\n * // Or just await the final message\n * const response = await stream({ provider: \"openai\", model: \"gpt-4.1\", messages });\n * ```\n */\nexport function stream(options: StreamOptions): StreamResult {\n switch (options.provider) {\n case \"anthropic\":\n return streamAnthropic(options);\n case \"openai\":\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n case \"glm\":\n return streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.z.ai/api/paas/v4\",\n });\n case \"moonshot\":\n return streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n });\n default:\n throw new GGAIError(\n `Unknown provider: ${options.provider as string}. Supported: \"anthropic\", \"openai\", \"glm\", \"moonshot\"`,\n );\n }\n}\n"],"mappings":"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","names":["Anthropic","stream","runStream","toError","OpenAI","stream","runStream","toError","os"]}
package/dist/index.js CHANGED
@@ -272,8 +272,17 @@ function toAnthropicThinking(level, maxTokens, model) {
272
272
  maxTokens: maxTokens + budget
273
273
  };
274
274
  }
275
+ function remapToolCallId(id, idMap) {
276
+ if (id.startsWith("call_")) return id;
277
+ const existing = idMap.get(id);
278
+ if (existing) return existing;
279
+ const mapped = `call_${id.replace(/^toolu_/, "")}`;
280
+ idMap.set(id, mapped);
281
+ return mapped;
282
+ }
275
283
  function toOpenAIMessages(messages) {
276
284
  const out = [];
285
+ const idMap = /* @__PURE__ */ new Map();
277
286
  for (const msg of messages) {
278
287
  if (msg.role === "system") {
279
288
  out.push({ role: "system", content: msg.content });
@@ -306,7 +315,7 @@ function toOpenAIMessages(messages) {
306
315
  (p) => p.type === "tool_call"
307
316
  ).map(
308
317
  (tc) => ({
309
- id: tc.id,
318
+ id: remapToolCallId(tc.id, idMap),
310
319
  type: "function",
311
320
  function: { name: tc.name, arguments: JSON.stringify(tc.args) }
312
321
  })
@@ -328,7 +337,7 @@ function toOpenAIMessages(messages) {
328
337
  for (const result of msg.content) {
329
338
  out.push({
330
339
  role: "tool",
331
- tool_call_id: result.toolCallId,
340
+ tool_call_id: remapToolCallId(result.toolCallId, idMap),
332
341
  content: result.content
333
342
  });
334
343
  }
@@ -935,9 +944,18 @@ async function* parseSSE(body) {
935
944
  reader.releaseLock();
936
945
  }
937
946
  }
947
+ function remapCodexId(id, idMap) {
948
+ if (id.startsWith("fc_") || id.startsWith("fc-")) return id;
949
+ const existing = idMap.get(id);
950
+ if (existing) return existing;
951
+ const mapped = `fc_${id.replace(/^toolu_/, "")}`;
952
+ idMap.set(id, mapped);
953
+ return mapped;
954
+ }
938
955
  function toCodexInput(messages) {
939
956
  let system;
940
957
  const input = [];
958
+ const idMap = /* @__PURE__ */ new Map();
941
959
  for (const msg of messages) {
942
960
  if (msg.role === "system") {
943
961
  system = msg.content;
@@ -977,8 +995,8 @@ function toCodexInput(messages) {
977
995
  const [callId, itemId] = part.id.includes("|") ? part.id.split("|", 2) : [part.id, part.id];
978
996
  input.push({
979
997
  type: "function_call",
980
- id: itemId,
981
- call_id: callId,
998
+ id: remapCodexId(itemId, idMap),
999
+ call_id: remapCodexId(callId, idMap),
982
1000
  name: part.name,
983
1001
  arguments: JSON.stringify(part.args)
984
1002
  });
@@ -991,7 +1009,7 @@ function toCodexInput(messages) {
991
1009
  const [callId] = result.toolCallId.includes("|") ? result.toolCallId.split("|", 2) : [result.toolCallId];
992
1010
  input.push({
993
1011
  type: "function_call_output",
994
- call_id: callId,
1012
+ call_id: remapCodexId(callId, idMap),
995
1013
  output: result.content
996
1014
  });
997
1015
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/providers/anthropic.ts","../src/utils/event-stream.ts","../src/utils/zod-to-json-schema.ts","../src/providers/transform.ts","../src/providers/openai.ts","../src/providers/openai-codex.ts","../src/stream.ts"],"sourcesContent":["export class GGAIError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"GGAIError\";\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: { statusCode?: number; cause?: unknown },\n ) {\n super(`[${provider}] ${message}`, { cause: options?.cause });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n });\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const { system, messages } = toAnthropicMessages(options.messages, cacheControl);\n\n let maxTokens = options.maxTokens ?? 4096;\n let thinking: Anthropic.ThinkingConfigParam | undefined;\n let outputConfig: Record<string, unknown> | undefined;\n\n if (options.thinking) {\n const t = toAnthropicThinking(options.thinking, maxTokens, options.model);\n thinking = t.thinking;\n maxTokens = t.maxTokens;\n if (t.outputConfig) {\n outputConfig = t.outputConfig;\n }\n }\n\n const params: Anthropic.MessageCreateParams = {\n model: options.model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system: system as Anthropic.MessageCreateParams[\"system\"] } : {}),\n ...(thinking ? { thinking } : {}),\n ...(outputConfig\n ? { output_config: outputConfig as unknown as Anthropic.MessageCreateParams[\"output_config\"] }\n : {}),\n ...(options.temperature != null && !thinking ? { temperature: options.temperature } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop_sequences: options.stop } : {}),\n ...(options.tools?.length || options.serverTools?.length || options.webSearch\n ? {\n tools: [\n ...(options.tools?.length ? toAnthropicTools(options.tools) : []),\n ...(options.serverTools ?? []),\n ...(options.webSearch ? [{ type: \"web_search_20250305\", name: \"web_search\" }] : []),\n ] as Anthropic.MessageCreateParams[\"tools\"],\n }\n : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toAnthropicToolChoice(options.toolChoice) }\n : {}),\n ...(options.compaction\n ? { context_management: { edits: [{ type: \"compact_20260112\" }] } }\n : {}),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import type { StreamEvent, StreamResponse } from \"../types.js\";\n\n/**\n * Push-based async iterable. Producers push events, consumers\n * iterate with `for await`. Also supports thenable so you can\n * `await stream(...)` directly to get the final response.\n */\nexport class EventStream<T = StreamEvent> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolve: (() => void) | null = null;\n private done = false;\n private error: Error | null = null;\n\n push(event: T): void {\n // Safety valve: if queue grows beyond 50k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 50_000) {\n this.queue.splice(0, this.queue.length - 25_000);\n }\n this.queue.push(event);\n this.resolve?.();\n this.resolve = null;\n }\n\n close(): void {\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n abort(error: Error): void {\n this.error = error;\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let index = 0;\n while (true) {\n while (index < this.queue.length) {\n yield this.queue[index++]!;\n }\n // Reset to avoid holding references to already-yielded events\n this.queue.splice(0, index);\n index = 0;\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolve = r;\n });\n }\n }\n}\n\n/**\n * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for\n * provider tool parameter definitions.\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = z.toJSONSchema(schema);\n // Remove $schema and other meta keys providers don't want\n const { $schema: _schema, ...rest } = jsonSchema as Record<string, unknown>;\n return rest;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part) => {\n // Strip thinking blocks without a valid signature (e.g. from GLM/OpenAI)\n // — Anthropic rejects empty signatures\n if (part.type === \"thinking\" && !part.signature) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\")\n return { type: \"thinking\", thinking: part.text, signature: part.signature! };\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // image content shouldn't appear in assistant messages\n return { type: \"text\", text: \"\" };\n });\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\nexport function toOpenAIMessages(messages: Message[]): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n out.push({ role: \"system\", content: msg.content });\n continue;\n }\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n out.push({ role: \"user\", content: msg.content });\n } else {\n out.push({\n role: \"user\",\n content: msg.content.map(\n (\n part,\n ): OpenAI.ChatCompletionContentPartImage | OpenAI.ChatCompletionContentPartText => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n };\n },\n ),\n });\n }\n continue;\n }\n if (msg.role === \"assistant\") {\n const parts = typeof msg.content === \"string\" ? msg.content : undefined;\n const toolCalls =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter(\n (p): p is Extract<ContentPart, { type: \"tool_call\" }> => p.type === \"tool_call\",\n )\n .map(\n (tc): OpenAI.ChatCompletionMessageToolCall => ({\n id: tc.id,\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.args) },\n }),\n )\n : undefined;\n const textParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n // Roundtrip thinking content as reasoning_content (GLM, Moonshot)\n const thinkingParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is ThinkingContent => p.type === \"thinking\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: result.toolCallId,\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages);\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: true,\n ...(options.maxTokens ? { max_tokens: options.maxTokens } : {}),\n ...(options.temperature != null && !options.thinking\n ? { temperature: options.temperature }\n : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop: options.stop } : {}),\n ...(options.thinking && !usesThinkingParam\n ? { reasoning_effort: toOpenAIReasoningEffort(options.thinking) }\n : {}),\n ...(options.tools?.length ? { tools: toOpenAITools(options.tools) } : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toOpenAIToolChoice(options.toolChoice) }\n : {}),\n stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof OpenAI.APIError) {\n // Include full error body for debugging — GLM/Moonshot use non-standard error shapes\n let msg = err.message;\n const body = err.error as Record<string, unknown> | undefined;\n if (body) {\n // Append raw error body so debug logs capture the exact API response\n msg += ` | body: ${JSON.stringify(body)}`;\n }\n return new ProviderError(\"openai\", msg, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n Message,\n StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: itemId,\n call_id: callId,\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: callId,\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport { GGAIError } from \"./errors.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\nimport { streamAnthropic } from \"./providers/anthropic.js\";\nimport { streamOpenAI } from \"./providers/openai.js\";\nimport { streamOpenAICodex } from \"./providers/openai-codex.js\";\n\n/**\n * Unified streaming entry point. Returns a StreamResult that is both\n * an async iterable (for streaming events) and thenable (await for\n * the final response).\n *\n * ```ts\n * // Stream events\n * for await (const event of stream({ provider: \"anthropic\", model: \"claude-sonnet-4-6\", messages })) {\n * if (event.type === \"text_delta\") process.stdout.write(event.text);\n * }\n *\n * // Or just await the final message\n * const response = await stream({ provider: \"openai\", model: \"gpt-4.1\", messages });\n * ```\n */\nexport function stream(options: StreamOptions): StreamResult {\n switch (options.provider) {\n case \"anthropic\":\n return streamAnthropic(options);\n case \"openai\":\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n case \"glm\":\n return streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.z.ai/api/paas/v4\",\n });\n case \"moonshot\":\n return streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n });\n default:\n throw new GGAIError(\n `Unknown provider: ${options.provider as string}. Supported: \"anthropic\", \"openai\", \"glm\", \"moonshot\"`,\n );\n }\n}\n"],"mappings":"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","names":["stream","runStream","toError","stream","runStream","toError"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/providers/anthropic.ts","../src/utils/event-stream.ts","../src/utils/zod-to-json-schema.ts","../src/providers/transform.ts","../src/providers/openai.ts","../src/providers/openai-codex.ts","../src/stream.ts"],"sourcesContent":["export class GGAIError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"GGAIError\";\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: { statusCode?: number; cause?: unknown },\n ) {\n super(`[${provider}] ${message}`, { cause: options?.cause });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n });\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const { system, messages } = toAnthropicMessages(options.messages, cacheControl);\n\n let maxTokens = options.maxTokens ?? 4096;\n let thinking: Anthropic.ThinkingConfigParam | undefined;\n let outputConfig: Record<string, unknown> | undefined;\n\n if (options.thinking) {\n const t = toAnthropicThinking(options.thinking, maxTokens, options.model);\n thinking = t.thinking;\n maxTokens = t.maxTokens;\n if (t.outputConfig) {\n outputConfig = t.outputConfig;\n }\n }\n\n const params: Anthropic.MessageCreateParams = {\n model: options.model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system: system as Anthropic.MessageCreateParams[\"system\"] } : {}),\n ...(thinking ? { thinking } : {}),\n ...(outputConfig\n ? { output_config: outputConfig as unknown as Anthropic.MessageCreateParams[\"output_config\"] }\n : {}),\n ...(options.temperature != null && !thinking ? { temperature: options.temperature } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop_sequences: options.stop } : {}),\n ...(options.tools?.length || options.serverTools?.length || options.webSearch\n ? {\n tools: [\n ...(options.tools?.length ? toAnthropicTools(options.tools) : []),\n ...(options.serverTools ?? []),\n ...(options.webSearch ? [{ type: \"web_search_20250305\", name: \"web_search\" }] : []),\n ] as Anthropic.MessageCreateParams[\"tools\"],\n }\n : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toAnthropicToolChoice(options.toolChoice) }\n : {}),\n ...(options.compaction\n ? { context_management: { edits: [{ type: \"compact_20260112\" }] } }\n : {}),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import type { StreamEvent, StreamResponse } from \"../types.js\";\n\n/**\n * Push-based async iterable. Producers push events, consumers\n * iterate with `for await`. Also supports thenable so you can\n * `await stream(...)` directly to get the final response.\n */\nexport class EventStream<T = StreamEvent> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolve: (() => void) | null = null;\n private done = false;\n private error: Error | null = null;\n\n push(event: T): void {\n // Safety valve: if queue grows beyond 50k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 50_000) {\n this.queue.splice(0, this.queue.length - 25_000);\n }\n this.queue.push(event);\n this.resolve?.();\n this.resolve = null;\n }\n\n close(): void {\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n abort(error: Error): void {\n this.error = error;\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let index = 0;\n while (true) {\n while (index < this.queue.length) {\n yield this.queue[index++]!;\n }\n // Reset to avoid holding references to already-yielded events\n this.queue.splice(0, index);\n index = 0;\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolve = r;\n });\n }\n }\n}\n\n/**\n * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for\n * provider tool parameter definitions.\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = z.toJSONSchema(schema);\n // Remove $schema and other meta keys providers don't want\n const { $schema: _schema, ...rest } = jsonSchema as Record<string, unknown>;\n return rest;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part) => {\n // Strip thinking blocks without a valid signature (e.g. from GLM/OpenAI)\n // — Anthropic rejects empty signatures\n if (part.type === \"thinking\" && !part.signature) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\")\n return { type: \"thinking\", thinking: part.text, signature: part.signature! };\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // image content shouldn't appear in assistant messages\n return { type: \"text\", text: \"\" };\n });\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match OpenAI's expected prefix.\n * Anthropic uses `toolu_*` IDs which OpenAI rejects — we need `call_*` prefixed IDs.\n * The mapping is consistent within a single conversion so assistant tool_call IDs\n * match their corresponding tool result references.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"call_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(messages: Message[]): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n out.push({ role: \"system\", content: msg.content });\n continue;\n }\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n out.push({ role: \"user\", content: msg.content });\n } else {\n out.push({\n role: \"user\",\n content: msg.content.map(\n (\n part,\n ): OpenAI.ChatCompletionContentPartImage | OpenAI.ChatCompletionContentPartText => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n };\n },\n ),\n });\n }\n continue;\n }\n if (msg.role === \"assistant\") {\n const parts = typeof msg.content === \"string\" ? msg.content : undefined;\n const toolCalls =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter(\n (p): p is Extract<ContentPart, { type: \"tool_call\" }> => p.type === \"tool_call\",\n )\n .map(\n (tc): OpenAI.ChatCompletionMessageToolCall => ({\n id: remapToolCallId(tc.id, idMap),\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.args) },\n }),\n )\n : undefined;\n const textParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n // Roundtrip thinking content as reasoning_content (GLM, Moonshot)\n const thinkingParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is ThinkingContent => p.type === \"thinking\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages);\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: true,\n ...(options.maxTokens ? { max_tokens: options.maxTokens } : {}),\n ...(options.temperature != null && !options.thinking\n ? { temperature: options.temperature }\n : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop: options.stop } : {}),\n ...(options.thinking && !usesThinkingParam\n ? { reasoning_effort: toOpenAIReasoningEffort(options.thinking) }\n : {}),\n ...(options.tools?.length ? { tools: toOpenAITools(options.tools) } : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toOpenAIToolChoice(options.toolChoice) }\n : {}),\n stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof OpenAI.APIError) {\n // Include full error body for debugging — GLM/Moonshot use non-standard error shapes\n let msg = err.message;\n const body = err.error as Record<string, unknown> | undefined;\n if (body) {\n // Append raw error body so debug logs capture the exact API response\n msg += ` | body: ${JSON.stringify(body)}`;\n }\n return new ProviderError(\"openai\", msg, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n Message,\n StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport { GGAIError } from \"./errors.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\nimport { streamAnthropic } from \"./providers/anthropic.js\";\nimport { streamOpenAI } from \"./providers/openai.js\";\nimport { streamOpenAICodex } from \"./providers/openai-codex.js\";\n\n/**\n * Unified streaming entry point. Returns a StreamResult that is both\n * an async iterable (for streaming events) and thenable (await for\n * the final response).\n *\n * ```ts\n * // Stream events\n * for await (const event of stream({ provider: \"anthropic\", model: \"claude-sonnet-4-6\", messages })) {\n * if (event.type === \"text_delta\") process.stdout.write(event.text);\n * }\n *\n * // Or just await the final message\n * const response = await stream({ provider: \"openai\", model: \"gpt-4.1\", messages });\n * ```\n */\nexport function stream(options: StreamOptions): StreamResult {\n switch (options.provider) {\n case \"anthropic\":\n return streamAnthropic(options);\n case \"openai\":\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n case \"glm\":\n return streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.z.ai/api/paas/v4\",\n });\n case \"moonshot\":\n return streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n });\n default:\n throw new GGAIError(\n `Unknown provider: ${options.provider as string}. Supported: \"anthropic\", \"openai\", \"glm\", \"moonshot\"`,\n );\n }\n}\n"],"mappings":";AAAO,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnC,YAAY,SAAiB,SAAwB;AACnD,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gBAAN,cAA4B,UAAU;AAAA,EAClC;AAAA,EACA;AAAA,EAET,YACE,UACA,SACA,SACA;AACA,UAAM,IAAI,QAAQ,KAAK,OAAO,IAAI,EAAE,OAAO,SAAS,MAAM,CAAC;AAC3D,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,aAAa,SAAS;AAAA,EAC7B;AACF;;;ACrBA,OAAO,eAAe;;;ACOf,IAAM,cAAN,MAA+D;AAAA,EAC5D,QAAa,CAAC;AAAA,EACd,UAA+B;AAAA,EAC/B,OAAO;AAAA,EACP,QAAsB;AAAA,EAE9B,KAAK,OAAgB;AAGnB,QAAI,KAAK,MAAM,SAAS,KAAQ;AAC9B,WAAK,MAAM,OAAO,GAAG,KAAK,MAAM,SAAS,IAAM;AAAA,IACjD;AACA,SAAK,MAAM,KAAK,KAAK;AACrB,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,QAAc;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,OAAoB;AACxB,SAAK,QAAQ;AACb,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,QAAQ,OAAO,aAAa,IAAsB;AAChD,QAAI,QAAQ;AACZ,WAAO,MAAM;AACX,aAAO,QAAQ,KAAK,MAAM,QAAQ;AAChC,cAAM,KAAK,MAAM,OAAO;AAAA,MAC1B;AAEA,WAAK,MAAM,OAAO,GAAG,KAAK;AAC1B,cAAQ;AACR,UAAI,KAAK,MAAO,OAAM,KAAK;AAC3B,UAAI,KAAK,KAAM;AACf,YAAM,IAAI,QAAc,CAAC,MAAM;AAC7B,aAAK,UAAU;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AASO,IAAM,eAAN,MAAyD;AAAA,EACrD;AAAA,EACA;AAAA,EACD;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EAEtB,cAAc;AACZ,SAAK,SAAS,IAAI,YAAyB;AAC3C,SAAK,WAAW,IAAI,QAAwB,CAAC,SAAS,WAAW;AAC/D,WAAK,kBAAkB;AACvB,WAAK,iBAAiB;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,OAA0B;AAC7B,SAAK,OAAO,KAAK,KAAK;AAAA,EACxB;AAAA,EAEA,SAAS,UAAgC;AACvC,SAAK,OAAO,MAAM;AAClB,SAAK,gBAAgB,QAAQ;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAoB;AACxB,SAAK,OAAO,MAAM,KAAK;AACvB,SAAK,eAAe,KAAK;AAAA,EAC3B;AAAA,EAEA,CAAC,OAAO,aAAa,IAAgC;AACnD,SAAK,cAAc;AACnB,WAAO,KAAK,OAAO,OAAO,aAAa,EAAE;AAAA,EAC3C;AAAA,EAEA,KACE,aACA,YAC8B;AAE9B,SAAK,YAAY,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACjC,WAAO,KAAK,SAAS,KAAK,aAAa,UAAU;AAAA,EACnD;AAAA,EAEA,MAAc,cAA6B;AACzC,QAAI,KAAK,YAAa;AACtB,SAAK,cAAc;AACnB,qBAAiB,KAAK,KAAK,QAAQ;AAAA,IAEnC;AAAA,EACF;AACF;;;AChHA,SAAS,SAAS;AAMX,SAAS,gBAAgB,QAA4C;AAC1E,QAAM,aAAa,EAAE,aAAa,MAAM;AAExC,QAAM,EAAE,SAAS,SAAS,GAAG,KAAK,IAAI;AACtC,SAAO;AACT;;;ACMO,SAAS,wBACd,WACA,SAC+C;AAC/C,QAAM,WAAW,aAAa;AAC9B,MAAI,aAAa,OAAQ,QAAO;AAChC,QAAM,MACJ,aAAa,WAAW,CAAC,WAAW,QAAQ,SAAS,mBAAmB,KAAK,OAAO;AACtF,SAAO,EAAE,MAAM,aAAa,GAAI,OAAO,EAAE,IAAI,EAAG;AAClD;AAEO,SAAS,oBACd,UACA,cAIA;AACA,MAAI;AACJ,QAAM,MAAgC,CAAC;AAEvC,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,UAAU;AACzB,mBAAa,IAAI;AACjB;AAAA,IACF;AACA,QAAI,IAAI,SAAS,QAAQ;AACvB,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,SACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,IAAI,QAAQ,IAAI,CAAC,SAAS;AACxB,cAAI,KAAK,SAAS,OAAQ,QAAO,EAAE,MAAM,QAAiB,MAAM,KAAK,KAAK;AAC1E,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,YAAY,KAAK;AAAA,cAKjB,MAAM,KAAK;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACT,CAAC;AACD;AAAA,IACF;AACA,QAAI,IAAI,SAAS,aAAa;AAC5B,YAAM,UACJ,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,IAAI,QACD,OAAO,CAAC,SAAS;AAGhB,YAAI,KAAK,SAAS,cAAc,CAAC,KAAK,UAAW,QAAO;AACxD,eAAO;AAAA,MACT,CAAC,EACA,IAAI,CAAC,SAAsC;AAC1C,YAAI,KAAK,SAAS,OAAQ,QAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AACjE,YAAI,KAAK,SAAS;AAChB,iBAAO,EAAE,MAAM,YAAY,UAAU,KAAK,MAAM,WAAW,KAAK,UAAW;AAC7E,YAAI,KAAK,SAAS;AAChB,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,IAAI,KAAK;AAAA,YACT,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,UACd;AACF,YAAI,KAAK,SAAS;AAChB,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,IAAI,KAAK;AAAA,YACT,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,UACd;AACF,YAAI,KAAK,SAAS;AAChB,iBAAO,KAAK;AACd,YAAI,KAAK,SAAS,MAAO,QAAO,KAAK;AAErC,eAAO,EAAE,MAAM,QAAQ,MAAM,GAAG;AAAA,MAClC,CAAC;AACT,UAAI,KAAK,EAAE,MAAM,aAAa,QAAQ,CAAC;AACvC;AAAA,IACF;AACA,QAAI,IAAI,SAAS,QAAQ;AACvB,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,SAAS,IAAI,QAAQ,IAAI,CAAC,YAAY;AAAA,UACpC,MAAM;AAAA,UACN,aAAa,OAAO;AAAA,UACpB,SAAS,OAAO;AAAA,UAChB,UAAU,OAAO;AAAA,QACnB,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,gBAAgB,IAAI,SAAS,GAAG;AAClC,aAAS,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AACxC,UAAI,IAAI,CAAC,EAAE,SAAS,QAAQ;AAC1B,cAAM,UAAU,IAAI,CAAC,EAAE;AACvB,YAAI,OAAO,YAAY,UAAU;AAC/B,cAAI,CAAC,IAAI;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,eAAe;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF,WAAW,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AACvD,gBAAM,OAAO,QAAQ,QAAQ,SAAS,CAAC;AACvC,kBAAQ,QAAQ,SAAS,CAAC,IAAI;AAAA,YAC5B,GAAG;AAAA,YACH,eAAe;AAAA,UACjB;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,MAAI;AACJ,MAAI,YAAY;AACd,UAAM,SAAS;AACf,UAAM,YAAY,WAAW,QAAQ,MAAM;AAC3C,QAAI,cAAc,MAAM,cAAc;AACpC,YAAM,aAAa,WAAW,MAAM,GAAG,SAAS,EAAE,QAAQ;AAC1D,YAAM,eAAe,WAAW,MAAM,YAAY,OAAO,MAAM,EAAE,UAAU;AAC3E,eAAS;AAAA,QACP,EAAE,MAAM,QAAiB,MAAM,YAAY,eAAe,aAAa;AAAA,QACvE,GAAI,eAAe,CAAC,EAAE,MAAM,QAAiB,MAAM,aAAa,CAAC,IAAI,CAAC;AAAA,MACxE;AAAA,IACF,OAAO;AACL,eAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,GAAI,gBAAgB,EAAE,eAAe,aAAa;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,UAAU,IAAI;AACjC;AAEO,SAAS,iBAAiB,OAAiC;AAChE,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,cAAe,KAAK,kBAClB,gBAAgB,KAAK,UAAU;AAAA,EACnC,EAAE;AACJ;AAEO,SAAS,sBAAsB,QAA0C;AAC9E,MAAI,WAAW,OAAQ,QAAO,EAAE,MAAM,OAAO;AAC7C,MAAI,WAAW,OAAQ,QAAO,EAAE,MAAM,OAAO;AAC7C,MAAI,WAAW,WAAY,QAAO,EAAE,MAAM,MAAM;AAChD,SAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,KAAK;AAC3C;AAEA,SAAS,yBAAyB,OAAwB;AACxD,SAAO,sBAAsB,KAAK,KAAK;AACzC;AAEO,SAAS,oBACd,OACA,WACA,OAKA;AACA,MAAI,yBAAyB,KAAK,GAAG;AAInC,QAAI,SAAiB;AACrB,QAAI,UAAU,SAAS,CAAC,MAAM,SAAS,MAAM,GAAG;AAC9C,eAAS;AAAA,IACX;AACA,WAAO;AAAA,MACL,UAAU,EAAE,MAAM,WAAW;AAAA,MAC7B;AAAA,MACA,cAAc,EAAE,OAAO;AAAA,IACzB;AAAA,EACF;AAGA,QAAM,iBAAiB,UAAU,QAAQ,SAAS;AAClD,QAAM,YAAuD;AAAA,IAC3D,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,YAAY,IAAI,CAAC;AAAA,IAChD,QAAQ,KAAK,IAAI,MAAM,KAAK,MAAM,YAAY,GAAG,CAAC;AAAA,IAClD,MAAM,KAAK,IAAI,MAAM,SAAS;AAAA,EAChC;AACA,QAAM,SAAS,UAAU,cAAc;AACvC,SAAO;AAAA,IACL,UAAU,EAAE,MAAM,WAAW,eAAe,OAAO;AAAA,IACnD,WAAW,YAAY;AAAA,EACzB;AACF;AAUA,SAAS,gBAAgB,IAAY,OAAoC;AACvE,MAAI,GAAG,WAAW,OAAO,EAAG,QAAO;AACnC,QAAM,WAAW,MAAM,IAAI,EAAE;AAC7B,MAAI,SAAU,QAAO;AACrB,QAAM,SAAS,QAAQ,GAAG,QAAQ,WAAW,EAAE,CAAC;AAChD,QAAM,IAAI,IAAI,MAAM;AACpB,SAAO;AACT;AAEO,SAAS,iBAAiB,UAA0D;AACzF,QAAM,MAA2C,CAAC;AAClD,QAAM,QAAQ,oBAAI,IAAoB;AAEtC,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,UAAU;AACzB,UAAI,KAAK,EAAE,MAAM,UAAU,SAAS,IAAI,QAAQ,CAAC;AACjD;AAAA,IACF;AACA,QAAI,IAAI,SAAS,QAAQ;AACvB,UAAI,OAAO,IAAI,YAAY,UAAU;AACnC,YAAI,KAAK,EAAE,MAAM,QAAQ,SAAS,IAAI,QAAQ,CAAC;AAAA,MACjD,OAAO;AACL,YAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,SAAS,IAAI,QAAQ;AAAA,YACnB,CACE,SACiF;AACjF,kBAAI,KAAK,SAAS,OAAQ,QAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AACjE,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,WAAW;AAAA,kBACT,KAAK,QAAQ,KAAK,SAAS,WAAW,KAAK,IAAI;AAAA,gBACjD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,QAAI,IAAI,SAAS,aAAa;AAC5B,YAAM,QAAQ,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAC9D,YAAM,YACJ,OAAO,IAAI,YAAY,WACnB,IAAI,QACD;AAAA,QACC,CAAC,MAAwD,EAAE,SAAS;AAAA,MACtE,EACC;AAAA,QACC,CAAC,QAA8C;AAAA,UAC7C,IAAI,gBAAgB,GAAG,IAAI,KAAK;AAAA,UAChC,MAAM;AAAA,UACN,UAAU,EAAE,MAAM,GAAG,MAAM,WAAW,KAAK,UAAU,GAAG,IAAI,EAAE;AAAA,QAChE;AAAA,MACF,IACF;AACN,YAAM,YACJ,OAAO,IAAI,YAAY,WACnB,IAAI,QACD,OAAO,CAAC,MAAwB,EAAE,SAAS,MAAM,EACjD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE,IACV;AAEN,YAAM,gBACJ,OAAO,IAAI,YAAY,WACnB,IAAI,QACD,OAAO,CAAC,MAA4B,EAAE,SAAS,UAAU,EACzD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE,IACV;AAEN,YAAM,eAA2D;AAAA,QAC/D,MAAM;AAAA,QACN,SAAS,SAAS,aAAa;AAAA,QAC/B,GAAI,WAAW,SAAS,EAAE,YAAY,UAAU,IAAI,CAAC;AAAA,MACvD;AAIA,UAAI,iBAAiB,WAAW,QAAQ;AACtC,QAAC,aAAoD,oBACnD,iBAAiB;AAAA,MACrB;AACA,UAAI,KAAK,YAAY;AACrB;AAAA,IACF;AACA,QAAI,IAAI,SAAS,QAAQ;AACvB,iBAAW,UAAU,IAAI,SAAS;AAChC,YAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,cAAc,gBAAgB,OAAO,YAAY,KAAK;AAAA,UACtD,SAAS,OAAO;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,OAA4C;AACxE,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK,kBAAkB,gBAAgB,KAAK,UAAU;AAAA,IACpE;AAAA,EACF,EAAE;AACJ;AAEO,SAAS,mBAAmB,QAA2D;AAC5F,MAAI,WAAW,OAAQ,QAAO;AAC9B,MAAI,WAAW,OAAQ,QAAO;AAC9B,MAAI,WAAW,WAAY,QAAO;AAClC,SAAO,EAAE,MAAM,YAAY,UAAU,EAAE,MAAM,OAAO,KAAK,EAAE;AAC7D;AAEO,SAAS,wBAAwB,OAAiD;AACvF,SAAO,UAAU,QAAQ,SAAS;AACpC;AAIO,SAAS,6BAA6B,QAAmC;AAC9E,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,0BAA0B,QAAmC;AAC3E,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AHrXO,SAAS,gBAAgB,SAAsC;AACpE,QAAM,SAAS,IAAI,aAAa;AAChC,YAAU,SAAS,MAAM,EAAE,MAAM,CAAC,QAAQ,OAAO,MAAM,QAAQ,GAAG,CAAC,CAAC;AACpE,SAAO;AACT;AAEA,eAAe,UAAU,SAAwB,QAAqC;AACpF,QAAM,UAAU,QAAQ,QAAQ,WAAW,YAAY;AAEvD,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,GAAI,UACA,EAAE,QAAQ,MAA2B,WAAW,QAAQ,OAAO,IAC/D,EAAE,QAAQ,QAAQ,OAAO;AAAA,IAC7B,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,EACxD,CAAC;AAED,QAAM,eAAe,wBAAwB,QAAQ,gBAAgB,QAAQ,OAAO;AACpF,QAAM,EAAE,QAAQ,SAAS,IAAI,oBAAoB,QAAQ,UAAU,YAAY;AAE/E,MAAI,YAAY,QAAQ,aAAa;AACrC,MAAI;AACJ,MAAI;AAEJ,MAAI,QAAQ,UAAU;AACpB,UAAM,IAAI,oBAAoB,QAAQ,UAAU,WAAW,QAAQ,KAAK;AACxE,eAAW,EAAE;AACb,gBAAY,EAAE;AACd,QAAI,EAAE,cAAc;AAClB,qBAAe,EAAE;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,SAAwC;AAAA,IAC5C,OAAO,QAAQ;AAAA,IACf,YAAY;AAAA,IACZ;AAAA,IACA,GAAI,SAAS,EAAE,OAA0D,IAAI,CAAC;AAAA,IAC9E,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/B,GAAI,eACA,EAAE,eAAe,aAA0E,IAC3F,CAAC;AAAA,IACL,GAAI,QAAQ,eAAe,QAAQ,CAAC,WAAW,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,IACvF,GAAI,QAAQ,QAAQ,OAAO,EAAE,OAAO,QAAQ,KAAK,IAAI,CAAC;AAAA,IACtD,GAAI,QAAQ,OAAO,EAAE,gBAAgB,QAAQ,KAAK,IAAI,CAAC;AAAA,IACvD,GAAI,QAAQ,OAAO,UAAU,QAAQ,aAAa,UAAU,QAAQ,YAChE;AAAA,MACE,OAAO;AAAA,QACL,GAAI,QAAQ,OAAO,SAAS,iBAAiB,QAAQ,KAAK,IAAI,CAAC;AAAA,QAC/D,GAAI,QAAQ,eAAe,CAAC;AAAA,QAC5B,GAAI,QAAQ,YAAY,CAAC,EAAE,MAAM,uBAAuB,MAAM,aAAa,CAAC,IAAI,CAAC;AAAA,MACnF;AAAA,IACF,IACA,CAAC;AAAA,IACL,GAAI,QAAQ,cAAc,QAAQ,OAAO,SACrC,EAAE,aAAa,sBAAsB,QAAQ,UAAU,EAAE,IACzD,CAAC;AAAA,IACL,GAAI,QAAQ,aACR,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,MAAM,mBAAmB,CAAC,EAAE,EAAE,IAChE,CAAC;AAAA,IACL,QAAQ;AAAA,EACV;AAEA,QAAM,cAAc;AAAA,IAClB,GAAI,UAAU,CAAC,kBAAkB,IAAI,CAAC;AAAA,IACtC,GAAI,QAAQ,aAAa,CAAC,oBAAoB,IAAI,CAAC;AAAA,EACrD;AAEA,QAAMA,UAAS,OAAO,SAAS,OAAO,QAAQ;AAAA,IAC5C,QAAQ,QAAQ,UAAU;AAAA,IAC1B,GAAI,YAAY,SAAS,EAAE,SAAS,EAAE,kBAAkB,YAAY,KAAK,GAAG,EAAE,EAAE,IAAI,CAAC;AAAA,EACvF,CAAC;AAED,QAAM,eAA8B,CAAC;AAErC,MAAI,gBAAgB;AACpB,MAAI,kBAAkB;AAEtB,EAAAA,QAAO,GAAG,QAAQ,CAAC,SAAS;AAC1B,WAAO,KAAK,EAAE,MAAM,cAAc,KAAK,CAAC;AAAA,EAC1C,CAAC;AAED,EAAAA,QAAO,GAAG,YAAY,CAAC,kBAAkB;AACvC,WAAO,KAAK,EAAE,MAAM,kBAAkB,MAAM,cAAc,CAAC;AAAA,EAC7D,CAAC;AAED,EAAAA,QAAO,GAAG,eAAe,CAAC,UAAU;AAClC,QAAI,MAAM,SAAS,uBAAuB;AAExC,UAAI,MAAM,cAAc,SAAS,YAAY;AAC3C,wBAAgB,MAAM,cAAc;AACpC,0BAAkB,MAAM,cAAc;AAAA,MACxC;AAEA,UAAI,MAAM,cAAc,SAAS,mBAAmB;AAClD,wBAAgB,MAAM,cAAc;AACpC,0BAAkB,MAAM,cAAc;AAAA,MACxC;AAAA,IACF;AAAA,EACF,CAAC;AAED,EAAAA,QAAO,GAAG,aAAa,CAAC,UAAU;AAChC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AAED,EAAAA,QAAO,GAAG,gBAAgB,CAAC,UAAU;AACnC,QAAI,MAAM,SAAS,QAAQ;AACzB,mBAAa,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAAA,IACtD,WAAW,MAAM,SAAS,YAAY;AACpC,mBAAa,KAAK,EAAE,MAAM,YAAY,MAAM,MAAM,UAAU,WAAW,MAAM,UAAU,CAAC;AAAA,IAC1F,WAAW,MAAM,SAAS,YAAY;AACpC,YAAM,KAAe;AAAA,QACnB,MAAM;AAAA,QACN,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,MACd;AACA,mBAAa,KAAK,EAAE;AACpB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI,GAAG;AAAA,QACP,MAAM,GAAG;AAAA,QACT,MAAM,GAAG;AAAA,MACX,CAAC;AAAA,IACH,WAAW,MAAM,SAAS,mBAAmB;AAC3C,YAAM,MAAsB;AAAA,QAC1B,MAAM;AAAA,QACN,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,MACf;AACA,mBAAa,KAAK,GAAG;AACrB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI,IAAI;AAAA,QACR,MAAM,IAAI;AAAA,QACV,OAAO,IAAI;AAAA,MACb,CAAC;AAAA,IACH,OAAO;AACL,YAAM,MAAM;AACZ,YAAM,YAAY,IAAI;AACtB,UAAI,cAAc,0BAA0B;AAE1C,cAAM,MAAwB;AAAA,UAC5B,MAAM;AAAA,UACN,WAAW,IAAI;AAAA,UACf,YAAY;AAAA,UACZ,MAAM;AAAA,QACR;AACA,qBAAa,KAAK,GAAG;AACrB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,WAAW,IAAI;AAAA,UACf,YAAY,IAAI;AAAA,UAChB,MAAM,IAAI;AAAA,QACZ,CAAC;AAAA,MACH,OAAO;AAEL,qBAAa,KAAK,EAAE,MAAM,OAAO,MAAM,IAAI,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI;AACF,UAAM,eAAe,MAAMA,QAAO,aAAa;AAC/C,UAAM,aAAa,6BAA6B,aAAa,WAAW;AAExE,UAAM,WAA2B;AAAA,MAC/B,SAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS,aAAa,SAAS,IAAI,eAAe;AAAA,MACpD;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,aAAa,aAAa,MAAM;AAAA,QAChC,cAAc,aAAa,MAAM;AAAA,QACjC,GAAK,aAAa,MAA6C,2BAC7D,QAAQ;AAAA,UACR,WAAY,aAAa,MACtB;AAAA,QACL;AAAA,QACA,GAAK,aAAa,MACf,+BAA+B,QAAQ;AAAA,UACxC,YAAa,aAAa,MACvB;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,EAAE,MAAM,QAAQ,WAAW,CAAC;AACxC,WAAO,SAAS,QAAQ;AAAA,EAC1B,SAAS,KAAK;AACZ,UAAM,QAAQ,QAAQ,GAAG;AACzB,WAAO,KAAK,EAAE,MAAM,SAAS,MAAM,CAAC;AACpC,WAAO,MAAM,KAAK;AAAA,EACpB;AACF;AAEA,SAAS,QAAQ,KAA6B;AAC5C,MAAI,eAAe,UAAU,UAAU;AACrC,WAAO,IAAI,cAAc,aAAa,IAAI,SAAS;AAAA,MACjD,YAAY,IAAI;AAAA,MAChB,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,eAAe,OAAO;AACxB,WAAO,IAAI,cAAc,aAAa,IAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EACnE;AACA,SAAO,IAAI,cAAc,aAAa,OAAO,GAAG,CAAC;AACnD;;;AIzOA,OAAO,YAAY;AAYZ,SAAS,aAAa,SAAsC;AACjE,QAAM,SAAS,IAAI,aAAa;AAChC,EAAAC,WAAU,SAAS,MAAM,EAAE,MAAM,CAAC,QAAQ,OAAO,MAAMC,SAAQ,GAAG,CAAC,CAAC;AACpE,SAAO;AACT;AAEA,eAAeD,WAAU,SAAwB,QAAqC;AACpF,QAAM,SAAS,IAAI,OAAO;AAAA,IACxB,QAAQ,QAAQ;AAAA,IAChB,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,EACxD,CAAC;AAGD,QAAM,oBAAoB,QAAQ,aAAa,SAAS,QAAQ,aAAa;AAE7E,QAAM,WAAW,iBAAiB,QAAQ,QAAQ;AAElD,QAAM,SAA4C;AAAA,IAChD,OAAO,QAAQ;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,IACR,GAAI,QAAQ,YAAY,EAAE,YAAY,QAAQ,UAAU,IAAI,CAAC;AAAA,IAC7D,GAAI,QAAQ,eAAe,QAAQ,CAAC,QAAQ,WACxC,EAAE,aAAa,QAAQ,YAAY,IACnC,CAAC;AAAA,IACL,GAAI,QAAQ,QAAQ,OAAO,EAAE,OAAO,QAAQ,KAAK,IAAI,CAAC;AAAA,IACtD,GAAI,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC7C,GAAI,QAAQ,YAAY,CAAC,oBACrB,EAAE,kBAAkB,wBAAwB,QAAQ,QAAQ,EAAE,IAC9D,CAAC;AAAA,IACL,GAAI,QAAQ,OAAO,SAAS,EAAE,OAAO,cAAc,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,IACvE,GAAI,QAAQ,cAAc,QAAQ,OAAO,SACrC,EAAE,aAAa,mBAAmB,QAAQ,UAAU,EAAE,IACtD,CAAC;AAAA,IACL,gBAAgB,EAAE,eAAe,KAAK;AAAA,EACxC;AAGA,MAAI,QAAQ,WAAW;AACrB,QAAI,QAAQ,aAAa,YAAY;AACnC,YAAM,MAAM;AACZ,YAAM,SAAU,IAAI,SAAuB,CAAC,GAAG,MAAM;AACrD,YAAM,KAAK,EAAE,MAAM,oBAAoB,UAAU,EAAE,MAAM,cAAc,EAAE,CAAC;AAC1E,UAAI,QAAQ;AAAA,IACd;AAAA,EAGF;AAGA,MAAI,mBAAmB;AACrB,IAAC,OAA8C,WAAW,QAAQ,WAC9D,EAAE,MAAM,UAAU,IAClB,EAAE,MAAM,WAAW;AAAA,EACzB;AAEA,QAAME,UAAS,MAAM,OAAO,KAAK,YAAY,OAAO,QAAQ;AAAA,IAC1D,QAAQ,QAAQ,UAAU;AAAA,EAC5B,CAAC;AAED,QAAM,eAA8B,CAAC;AACrC,QAAM,gBAAgB,oBAAI,IAA4D;AACtF,MAAI,YAAY;AAChB,MAAI,gBAAgB;AACpB,MAAI,cAAc;AAClB,MAAI,eAAe;AACnB,MAAI,YAAY;AAChB,MAAI,eAA8B;AAElC,mBAAiB,SAASA,SAAqD;AAC7E,UAAM,SAAS,MAAM,UAAU,CAAC;AAEhC,QAAI,MAAM,OAAO;AACf,oBAAc,MAAM,MAAM;AAC1B,qBAAe,MAAM,MAAM;AAC3B,YAAM,UAAU,MAAM,MAAM;AAC5B,UAAI,SAAS,eAAe;AAC1B,oBAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAEA,QAAI,CAAC,OAAQ;AAEb,QAAI,OAAO,eAAe;AACxB,qBAAe,OAAO;AAAA,IACxB;AAEA,UAAM,QAAQ,OAAO;AAGrB,UAAM,mBAAoB,MAAkC;AAC5D,QAAI,OAAO,qBAAqB,YAAY,kBAAkB;AAC5D,uBAAiB;AACjB,aAAO,KAAK,EAAE,MAAM,kBAAkB,MAAM,iBAAiB,CAAC;AAAA,IAChE;AAGA,QAAI,MAAM,SAAS;AACjB,mBAAa,MAAM;AACnB,aAAO,KAAK,EAAE,MAAM,cAAc,MAAM,MAAM,QAAQ,CAAC;AAAA,IACzD;AAGA,QAAI,MAAM,YAAY;AACpB,iBAAW,MAAM,MAAM,YAAY;AACjC,YAAI,QAAQ,cAAc,IAAI,GAAG,KAAK;AACtC,YAAI,CAAC,OAAO;AACV,kBAAQ;AAAA,YACN,IAAI,GAAG,MAAM;AAAA,YACb,MAAM,GAAG,UAAU,QAAQ;AAAA,YAC3B,UAAU;AAAA,UACZ;AACA,wBAAc,IAAI,GAAG,OAAO,KAAK;AAAA,QACnC;AACA,YAAI,GAAG,GAAI,OAAM,KAAK,GAAG;AACzB,YAAI,GAAG,UAAU,KAAM,OAAM,OAAO,GAAG,SAAS;AAChD,YAAI,GAAG,UAAU,WAAW;AAC1B,gBAAM,YAAY,GAAG,SAAS;AAC9B,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,IAAI,MAAM;AAAA,YACV,MAAM,MAAM;AAAA,YACZ,UAAU,GAAG,SAAS;AAAA,UACxB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,eAAe;AACjB,iBAAa,KAAK,EAAE,MAAM,YAAY,MAAM,cAAc,CAAC;AAAA,EAC7D;AAGA,MAAI,WAAW;AACb,iBAAa,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC;AAAA,EACrD;AAGA,aAAW,CAAC,EAAE,EAAE,KAAK,eAAe;AAClC,QAAI,OAAgC,CAAC;AACrC,QAAI;AACF,aAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,IAC/B,QAAQ;AAAA,IAER;AACA,UAAM,WAAqB;AAAA,MACzB,MAAM;AAAA,MACN,IAAI,GAAG;AAAA,MACP,MAAM,GAAG;AAAA,MACT;AAAA,IACF;AACA,iBAAa,KAAK,QAAQ;AAC1B,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI,GAAG;AAAA,MACP,MAAM,GAAG;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,0BAA0B,YAAY;AAEzD,QAAM,WAA2B;AAAA,IAC/B,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS,aAAa,SAAS,IAAI,eAAe,aAAa;AAAA,IACjE;AAAA,IACA;AAAA,IACA,OAAO,EAAE,aAAa,cAAc,GAAI,YAAY,KAAK,EAAE,UAAU,EAAG;AAAA,EAC1E;AAEA,SAAO,KAAK,EAAE,MAAM,QAAQ,WAAW,CAAC;AACxC,SAAO,SAAS,QAAQ;AAC1B;AAEA,SAASD,SAAQ,KAA6B;AAC5C,MAAI,eAAe,OAAO,UAAU;AAElC,QAAI,MAAM,IAAI;AACd,UAAM,OAAO,IAAI;AACjB,QAAI,MAAM;AAER,aAAO,YAAY,KAAK,UAAU,IAAI,CAAC;AAAA,IACzC;AACA,WAAO,IAAI,cAAc,UAAU,KAAK;AAAA,MACtC,YAAY,IAAI;AAAA,MAChB,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,eAAe,OAAO;AACxB,WAAO,IAAI,cAAc,UAAU,IAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAChE;AACA,SAAO,IAAI,cAAc,UAAU,OAAO,GAAG,CAAC;AAChD;;;AC/MA,OAAO,QAAQ;AAaf,IAAM,mBAAmB;AAElB,SAAS,kBAAkB,SAAsC;AACtE,QAAM,SAAS,IAAI,aAAa;AAChC,EAAAE,WAAU,SAAS,MAAM,EAAE,MAAM,CAAC,QAAQ,OAAO,MAAMC,SAAQ,GAAG,CAAC,CAAC;AACpE,SAAO;AACT;AAEA,eAAeD,WAAU,SAAwB,QAAqC;AACpF,QAAM,WAAW,QAAQ,WAAW,kBAAkB,QAAQ,QAAQ,EAAE;AACxE,QAAM,MAAM,GAAG,OAAO;AAEtB,QAAM,EAAE,QAAQ,MAAM,IAAI,aAAa,QAAQ,QAAQ;AAEvD,QAAM,OAAgC;AAAA,IACpC,OAAO,QAAQ;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd;AAAA,IACA,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,SAAS,CAAC,6BAA6B;AAAA,EACzC;AAEA,MAAI,QAAQ,OAAO,QAAQ;AACzB,SAAK,QAAQ,aAAa,QAAQ,KAAK;AAAA,EACzC;AACA,MAAI,QAAQ,eAAe,QAAQ,CAAC,QAAQ,UAAU;AACpD,SAAK,cAAc,QAAQ;AAAA,EAC7B;AACA,MAAI,QAAQ,UAAU;AACpB,SAAK,YAAY;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,eAAe,UAAU,QAAQ,MAAM;AAAA,IACvC,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,cAAc,YAAY,GAAG,SAAS,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;AAAA,EACvE;AAEA,MAAI,QAAQ,WAAW;AACrB,YAAQ,oBAAoB,IAAI,QAAQ;AAAA,EAC1C;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,QAAI,UAAU,oBAAoB,SAAS,MAAM,MAAM,IAAI;AAG3D,QAAI,SAAS,WAAW,OAAO,KAAK,SAAS,eAAe,GAAG;AAC7D,iBACE;AAAA;AAAA;AAAA,IAGJ;AAEA,UAAM,IAAI,cAAc,UAAU,SAAS;AAAA,MACzC,YAAY,SAAS;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,SAAS,MAAM;AAClB,UAAM,IAAI,cAAc,UAAU,iCAAiC;AAAA,EACrE;AAEA,QAAM,eAA8B,CAAC;AACrC,MAAI,YAAY;AAChB,QAAM,YAAY,oBAAI,IAA4D;AAClF,MAAI,cAAc;AAClB,MAAI,eAAe;AAEnB,mBAAiB,SAAS,SAAS,SAAS,IAAI,GAAG;AACjD,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,KAAM;AAEX,QAAI,SAAS,SAAS;AACpB,YAAM,MAAO,MAAM,WAAsB,KAAK,UAAU,KAAK;AAC7D,YAAM,IAAI,cAAc,UAAU,gBAAgB,GAAG,EAAE;AAAA,IACzD;AAEA,QAAI,SAAS,mBAAmB;AAC9B,YAAM,MACF,MAAM,OAAmC,WAAsB;AACnE,YAAM,IAAI,cAAc,UAAU,GAAG;AAAA,IACvC;AAGA,QAAI,SAAS,8BAA8B;AACzC,YAAM,QAAQ,MAAM;AACpB,mBAAa;AACb,aAAO,KAAK,EAAE,MAAM,cAAc,MAAM,MAAM,CAAC;AAAA,IACjD;AAGA,QAAI,SAAS,yCAAyC;AACpD,YAAM,QAAQ,MAAM;AACpB,aAAO,KAAK,EAAE,MAAM,kBAAkB,MAAM,MAAM,CAAC;AAAA,IACrD;AAGA,QAAI,SAAS,8BAA8B;AACzC,YAAM,OAAO,MAAM;AACnB,UAAI,MAAM,SAAS,iBAAiB;AAClC,cAAM,SAAS,KAAK;AACpB,cAAM,SAAS,KAAK;AACpB,cAAM,KAAK,GAAG,MAAM,IAAI,MAAM;AAC9B,cAAM,OAAO,KAAK;AAClB,kBAAU,IAAI,IAAI,EAAE,IAAI,MAAM,UAAW,KAAK,aAAwB,GAAG,CAAC;AAAA,MAC5E;AAAA,IACF;AAGA,QAAI,SAAS,0CAA0C;AACrD,YAAM,QAAQ,MAAM;AACpB,YAAM,SAAS,MAAM;AAErB,iBAAW,CAAC,KAAK,EAAE,KAAK,WAAW;AACjC,YAAI,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG;AAC9B,aAAG,YAAY;AACf,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,IAAI,GAAG;AAAA,YACP,MAAM,GAAG;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,yCAAyC;AACpD,YAAM,SAAS,MAAM;AACrB,YAAM,UAAU,MAAM;AACtB,iBAAW,CAAC,KAAK,EAAE,KAAK,WAAW;AACjC,YAAI,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG;AAC9B,aAAG,WAAW;AACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,6BAA6B;AACxC,YAAM,OAAO,MAAM;AACnB,UAAI,MAAM,SAAS,iBAAiB;AAClC,cAAM,SAAS,KAAK;AACpB,cAAM,SAAS,KAAK;AACpB,cAAM,KAAK,GAAG,MAAM,IAAI,MAAM;AAC9B,cAAM,KAAK,UAAU,IAAI,EAAE;AAC3B,YAAI,IAAI;AACN,cAAI,OAAgC,CAAC;AACrC,cAAI;AACF,mBAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,UAC/B,QAAQ;AAAA,UAER;AACA,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,IAAI,GAAG;AAAA,YACP,MAAM,GAAG;AAAA,YACT;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,wBAAwB,SAAS,iBAAiB;AAC7D,YAAM,OAAO,MAAM;AACnB,YAAM,QAAQ,MAAM;AACpB,UAAI,OAAO;AACT,sBAAc,MAAM,gBAAgB;AACpC,uBAAe,MAAM,iBAAiB;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAGA,MAAI,WAAW;AACb,iBAAa,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC;AAAA,EACrD;AAEA,aAAW,CAAC,EAAE,EAAE,KAAK,WAAW;AAC9B,QAAI,OAAgC,CAAC;AACrC,QAAI;AACF,aAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,IAC/B,QAAQ;AAAA,IAER;AACA,UAAM,WAAqB;AAAA,MACzB,MAAM;AAAA,MACN,IAAI,GAAG;AAAA,MACP,MAAM,GAAG;AAAA,MACT;AAAA,IACF;AACA,iBAAa,KAAK,QAAQ;AAAA,EAC5B;AAEA,QAAM,eAAe,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AACpE,QAAM,aAAa,eAAe,aAAa;AAE/C,QAAM,iBAAiC;AAAA,IACrC,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS,aAAa,SAAS,IAAI,eAAe,aAAa;AAAA,IACjE;AAAA,IACA;AAAA,IACA,OAAO,EAAE,aAAa,aAAa;AAAA,EACrC;AAEA,SAAO,KAAK,EAAE,MAAM,QAAQ,WAAW,CAAC;AACxC,SAAO,SAAS,cAAc;AAChC;AAIA,gBAAgB,SACd,MACyC;AACzC,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAEhD,UAAI,MAAM,OAAO,QAAQ,MAAM;AAC/B,aAAO,QAAQ,IAAI;AACjB,cAAM,QAAQ,OAAO,MAAM,GAAG,GAAG;AACjC,iBAAS,OAAO,MAAM,MAAM,CAAC;AAE7B,cAAM,YAAY,MACf,MAAM,IAAI,EACV,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC,EACnC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC;AAE/B,YAAI,UAAU,SAAS,GAAG;AACxB,gBAAM,OAAO,UAAU,KAAK,IAAI,EAAE,KAAK;AACvC,cAAI,QAAQ,SAAS,UAAU;AAC7B,gBAAI;AACF,oBAAM,KAAK,MAAM,IAAI;AAAA,YACvB,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AACA,cAAM,OAAO,QAAQ,MAAM;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;AAQA,SAAS,aAAa,IAAY,OAAoC;AACpE,MAAI,GAAG,WAAW,KAAK,KAAK,GAAG,WAAW,KAAK,EAAG,QAAO;AACzD,QAAM,WAAW,MAAM,IAAI,EAAE;AAC7B,MAAI,SAAU,QAAO;AACrB,QAAM,SAAS,MAAM,GAAG,QAAQ,WAAW,EAAE,CAAC;AAC9C,QAAM,IAAI,IAAI,MAAM;AACpB,SAAO;AACT;AAEA,SAAS,aAAa,UAAuE;AAC3F,MAAI;AACJ,QAAM,QAAmB,CAAC;AAC1B,QAAM,QAAQ,oBAAI,IAAoB;AAEtC,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,UAAU;AACzB,eAAS,IAAI;AACb;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,QAAQ;AACvB,YAAM,UACJ,OAAO,IAAI,YAAY,WACnB,CAAC,EAAE,MAAM,cAAc,MAAM,IAAI,QAAQ,CAAC,IAC1C,IAAI,QAAQ,IAAI,CAAC,SAAS;AACxB,YAAI,KAAK,SAAS,OAAQ,QAAO,EAAE,MAAM,cAAc,MAAM,KAAK,KAAK;AACvE,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,WAAW,QAAQ,KAAK,SAAS,WAAW,KAAK,IAAI;AAAA,QACvD;AAAA,MACF,CAAC;AACP,YAAM,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AACpC;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,aAAa;AAC5B,UAAI,OAAO,IAAI,YAAY,UAAU;AACnC,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,CAAC,EAAE,MAAM,eAAe,MAAM,IAAI,SAAS,aAAa,CAAC,EAAE,CAAC;AAAA,UACrE,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF;AAEA,iBAAW,QAAQ,IAAI,SAAS;AAC9B,YAAI,KAAK,SAAS,QAAQ;AACxB,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,CAAC,EAAE,MAAM,eAAe,MAAM,KAAK,MAAM,aAAa,CAAC,EAAE,CAAC;AAAA,YACnE,QAAQ;AAAA,UACV,CAAC;AAAA,QACH,WAAW,KAAK,SAAS,aAAa;AACpC,gBAAM,CAAC,QAAQ,MAAM,IAAI,KAAK,GAAG,SAAS,GAAG,IACzC,KAAK,GAAG,MAAM,KAAK,CAAC,IACpB,CAAC,KAAK,IAAI,KAAK,EAAE;AACrB,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,IAAI,aAAa,QAAQ,KAAK;AAAA,YAC9B,SAAS,aAAa,QAAQ,KAAK;AAAA,YACnC,MAAM,KAAK;AAAA,YACX,WAAW,KAAK,UAAU,KAAK,IAAI;AAAA,UACrC,CAAC;AAAA,QACH;AAAA,MAEF;AACA;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,QAAQ;AACvB,iBAAW,UAAU,IAAI,SAAS;AAChC,cAAM,CAAC,MAAM,IAAI,OAAO,WAAW,SAAS,GAAG,IAC3C,OAAO,WAAW,MAAM,KAAK,CAAC,IAC9B,CAAC,OAAO,UAAU;AACtB,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,SAAS,aAAa,QAAQ,KAAK;AAAA,UACnC,QAAQ,OAAO;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,MAAM;AACzB;AAIA,SAAS,aAAa,OAA0B;AAC9C,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,MAAM;AAAA,IACN,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,YAAY,KAAK,kBAAkB,gBAAgB,KAAK,UAAU;AAAA,IAClE,QAAQ;AAAA,EACV,EAAE;AACJ;AAIA,SAASC,SAAQ,KAA6B;AAC5C,MAAI,eAAe,cAAe,QAAO;AACzC,MAAI,eAAe,OAAO;AACxB,WAAO,IAAI,cAAc,UAAU,IAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAChE;AACA,SAAO,IAAI,cAAc,UAAU,OAAO,GAAG,CAAC;AAChD;;;AC1XO,SAAS,OAAO,SAAsC;AAC3D,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,aAAO,gBAAgB,OAAO;AAAA,IAChC,KAAK;AAEH,UAAI,QAAQ,WAAW;AACrB,eAAO,kBAAkB,OAAO;AAAA,MAClC;AACA,aAAO,aAAa,OAAO;AAAA,IAC7B,KAAK;AACH,aAAO,aAAa;AAAA,QAClB,GAAG;AAAA,QACH,SAAS,QAAQ,WAAW;AAAA,MAC9B,CAAC;AAAA,IACH,KAAK;AACH,aAAO,aAAa;AAAA,QAClB,GAAG;AAAA,QACH,SAAS,QAAQ,WAAW;AAAA,MAC9B,CAAC;AAAA,IACH;AACE,YAAM,IAAI;AAAA,QACR,qBAAqB,QAAQ,QAAkB;AAAA,MACjD;AAAA,EACJ;AACF;","names":["stream","runStream","toError","stream","runStream","toError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kenkaiiii/gg-ai",
3
- "version": "4.2.12",
3
+ "version": "4.2.13",
4
4
  "type": "module",
5
5
  "description": "Unified LLM streaming API for Anthropic and OpenAI",
6
6
  "license": "MIT",