@kenkaiiii/gg-ai 4.3.38 → 4.3.40
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 +113 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -2
- package/dist/index.d.ts +7 -2
- package/dist/index.js +113 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -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/provider-registry.ts","../src/stream.ts","../src/providers/palsu.ts"],"sourcesContent":["// Core entry point\nexport { stream } from \"./stream.js\";\n\n// Provider registry\nexport { providerRegistry } from \"./provider-registry.js\";\nexport type { ProviderStreamFn, ProviderEntry } from \"./provider-registry.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\n// Palsu provider (testing)\nexport {\n registerPalsuProvider,\n palsuText,\n palsuThinking,\n palsuToolCall,\n palsuAssistantMessage,\n} from \"./providers/palsu.js\";\nexport type {\n PalsuProviderHandle,\n PalsuProviderConfig,\n PalsuProviderState,\n PalsuResponse,\n PalsuResponseFactory,\n PalsuModelConfig,\n PalsuModelHandle,\n} from \"./providers/palsu.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 StreamEvent,\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\nfunction createClient(options: StreamOptions): Anthropic {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n return 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 ...(options.fetch ? { fetch: options.fetch } : {}),\n // Allow SDK retries for connection-level failures (socket hang up, 500s,\n // connection refused). Our stall detection handles abort-initiated retries\n // separately — SDK retries only fire on genuine transport errors.\n maxRetries: 2,\n ...(isOAuth\n ? {\n defaultHeaders: {\n \"user-agent\": \"claude-cli/2.1.75\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\n}\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const client = createClient(options);\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n const useStreaming = options.streaming !== false;\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const { system: rawSystem, messages } = toAnthropicMessages(options.messages, cacheControl);\n\n // OAuth tokens require Claude Code identity in the system prompt\n const system = isOAuth\n ? [\n {\n type: \"text\" as const,\n text: \"You are Claude Code, Anthropic's official CLI for Claude.\",\n },\n ...(rawSystem ?? []),\n ]\n : rawSystem;\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 ...(() => {\n const contextEdits = [\n ...(options.compaction ? [{ type: \"compact_20260112\" }] : []),\n ...(options.clearToolUses ? [{ type: \"clear_tool_uses_20250919\" }] : []),\n ];\n return contextEdits.length ? { context_management: { edits: contextEdits } } : {};\n })(),\n stream: useStreaming,\n } as Anthropic.MessageCreateParams;\n\n // Adaptive thinking models (Opus 4.7, Opus 4.6, Sonnet 4.6) don't need the\n // interleaved-thinking beta — they have it built in.\n const hasAdaptiveThinking =\n options.model.includes(\"opus-4-7\") ||\n options.model.includes(\"opus-4.7\") ||\n options.model.includes(\"opus-4-6\") ||\n options.model.includes(\"opus-4.6\") ||\n options.model.includes(\"sonnet-4-6\") ||\n options.model.includes(\"sonnet-4.6\");\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ...(options.clearToolUses ? [\"context-management-2025-06-27\"] : []),\n \"fine-grained-tool-streaming-2025-05-14\",\n ...(!hasAdaptiveThinking ? [\"interleaved-thinking-2025-05-14\"] : []),\n ];\n\n const requestOptions = {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n };\n\n // Non-streaming fallback: issue a single request/response and synthesize\n // stream events from the final Message. Used by the agent loop after the\n // SSE stream has stalled repeatedly -- broken streaming connections often\n // recover when the request is replayed over a plain HTTP response.\n if (!useStreaming) {\n try {\n const message = (await client.messages.create(\n { ...params, stream: false } as Anthropic.MessageCreateParamsNonStreaming,\n requestOptions,\n )) as Anthropic.Message;\n yield* synthesizeEventsFromMessage(message);\n return messageToResponse(message);\n } catch (err) {\n throw toError(err);\n }\n }\n\n const stream = client.messages.stream(params, requestOptions);\n\n // ── Accumulation state ──────────────────────────────────\n const contentParts: ContentPart[] = [];\n\n // Per-block accumulators indexed by content_block_start index\n const blocks = new Map<\n number,\n {\n type: string;\n text: string;\n thinking: string;\n signature: string;\n toolId: string;\n toolName: string;\n argsJson: string;\n input: unknown;\n raw: Record<string, unknown> | null;\n }\n >();\n\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead: number | undefined;\n let cacheWrite: number | undefined;\n let stopReason: string | null = null;\n\n const keepalive = { type: \"keepalive\" as const };\n\n try {\n for await (const event of stream as AsyncIterable<Anthropic.MessageStreamEvent>) {\n switch (event.type) {\n case \"message_start\": {\n const usage = event.message.usage;\n inputTokens = usage.input_tokens;\n const usageAny = usage as unknown as Record<string, unknown>;\n if (usageAny.cache_read_input_tokens != null) {\n cacheRead = usageAny.cache_read_input_tokens as number;\n }\n if (usageAny.cache_creation_input_tokens != null) {\n cacheWrite = usageAny.cache_creation_input_tokens as number;\n }\n yield keepalive;\n break;\n }\n\n case \"content_block_start\": {\n const block = event.content_block;\n const idx = event.index;\n const accum = {\n type: block.type,\n text: \"\",\n thinking: \"\",\n signature: \"\",\n toolId: \"\",\n toolName: \"\",\n argsJson: \"\",\n input: undefined as unknown,\n raw: null as Record<string, unknown> | null,\n };\n\n if (block.type === \"tool_use\") {\n accum.toolId = block.id;\n accum.toolName = block.name;\n } else if (block.type === \"server_tool_use\") {\n accum.toolId = (block as unknown as { id: string }).id;\n accum.toolName = (block as unknown as { name: string }).name;\n accum.input = (block as unknown as { input: unknown }).input;\n } else if (block.type === \"redacted_thinking\") {\n // Encrypted thinking block — capture the raw data for round-tripping.\n // The API requires these to be sent back verbatim in multi-turn conversations.\n accum.raw = block as unknown as Record<string, unknown>;\n }\n\n blocks.set(idx, accum);\n yield keepalive;\n break;\n }\n\n case \"content_block_delta\": {\n const accum = blocks.get(event.index);\n if (!accum) break;\n\n const delta = event.delta as unknown as Record<string, unknown>;\n const deltaType = delta.type as string;\n\n if (deltaType === \"text_delta\") {\n const text = delta.text as string;\n accum.text += text;\n yield { type: \"text_delta\", text };\n } else if (deltaType === \"thinking_delta\") {\n const text = delta.thinking as string;\n accum.thinking += text;\n yield { type: \"thinking_delta\", text };\n } else if (deltaType === \"input_json_delta\") {\n const partialJson = delta.partial_json as string;\n accum.argsJson += partialJson;\n yield {\n type: \"toolcall_delta\",\n id: accum.toolId,\n name: accum.toolName,\n argsJson: partialJson,\n };\n } else if (deltaType === \"signature_delta\") {\n accum.signature = delta.signature as string;\n }\n break;\n }\n\n case \"content_block_stop\": {\n const accum = blocks.get(event.index);\n if (!accum) break;\n\n if (accum.type === \"text\") {\n contentParts.push({ type: \"text\", text: accum.text });\n } else if (accum.type === \"thinking\") {\n contentParts.push({\n type: \"thinking\",\n text: accum.thinking,\n signature: accum.signature,\n });\n yield keepalive;\n } else if (accum.type === \"tool_use\") {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(accum.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const tc: ToolCall = {\n type: \"tool_call\",\n id: accum.toolId,\n name: accum.toolName,\n args,\n };\n contentParts.push(tc);\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n };\n } else if (accum.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: accum.toolId,\n name: accum.toolName,\n input: accum.input,\n };\n contentParts.push(stc);\n yield {\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n };\n } else if (accum.type === \"redacted_thinking\" && accum.raw) {\n contentParts.push({ type: \"raw\", data: accum.raw });\n yield keepalive;\n } else {\n // Retrieve the full block from the SDK's accumulated message\n // for block types we don't explicitly accumulate (e.g. web_search_tool_result)\n const msg = stream.currentMessage;\n const rawBlock = msg?.content[event.index] as unknown as\n | Record<string, unknown>\n | undefined;\n if (rawBlock) {\n const blockType = rawBlock.type as string;\n if (blockType === \"web_search_tool_result\") {\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: rawBlock.tool_use_id as string,\n resultType: blockType,\n data: rawBlock,\n };\n contentParts.push(str);\n yield {\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: rawBlock });\n }\n }\n }\n\n blocks.delete(event.index);\n break;\n }\n\n case \"message_delta\": {\n const delta = event.delta as unknown as Record<string, unknown>;\n if (delta.stop_reason) {\n stopReason = delta.stop_reason as string;\n }\n const usage = event.usage as unknown as Record<string, unknown> | undefined;\n if (usage?.output_tokens != null) {\n outputTokens = usage.output_tokens as number;\n }\n yield keepalive;\n break;\n }\n\n // message_stop — loop exits naturally\n\n default:\n // Unhandled event types (e.g. \"ping\" heartbeats) — yield keepalive\n // so the idle timer in the agent loop resets on any API activity.\n yield keepalive;\n break;\n }\n }\n } catch (err) {\n throw toError(err);\n }\n\n const normalizedStop = normalizeAnthropicStopReason(stopReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason: normalizedStop,\n usage: {\n inputTokens,\n outputTokens,\n ...(cacheRead != null && { cacheRead }),\n ...(cacheWrite != null && { cacheWrite }),\n },\n };\n\n yield { type: \"done\", stopReason: normalizedStop };\n return response;\n}\n\n/**\n * Walk a non-streaming Anthropic Message and yield the same StreamEvents\n * that the streaming path would produce. Emits one large delta per block\n * rather than token-by-token -- the agent loop consumer doesn't care about\n * granularity, only completeness.\n */\nfunction* synthesizeEventsFromMessage(message: Anthropic.Message): Generator<StreamEvent, void> {\n for (const block of message.content) {\n const blk = block as unknown as Record<string, unknown>;\n const type = blk.type as string;\n\n if (type === \"text\") {\n const text = blk.text as string;\n if (text) yield { type: \"text_delta\", text };\n } else if (type === \"thinking\") {\n const text = blk.thinking as string;\n if (text) yield { type: \"thinking_delta\", text };\n } else if (type === \"tool_use\") {\n const argsJson = JSON.stringify(blk.input ?? {});\n yield {\n type: \"toolcall_delta\",\n id: blk.id as string,\n name: blk.name as string,\n argsJson,\n };\n yield {\n type: \"toolcall_done\",\n id: blk.id as string,\n name: blk.name as string,\n args: (blk.input as Record<string, unknown> | undefined) ?? {},\n };\n } else if (type === \"server_tool_use\") {\n yield {\n type: \"server_toolcall\",\n id: blk.id as string,\n name: blk.name as string,\n input: blk.input,\n };\n } else if (type === \"web_search_tool_result\") {\n yield {\n type: \"server_toolresult\",\n toolUseId: blk.tool_use_id as string,\n resultType: type,\n data: blk,\n };\n }\n // Other block types (redacted_thinking, compaction blocks) are preserved\n // in the response via messageToResponse but don't emit events.\n }\n yield { type: \"done\", stopReason: normalizeAnthropicStopReason(message.stop_reason) };\n}\n\n/** Convert a non-streaming Anthropic Message into our StreamResponse shape. */\nfunction messageToResponse(message: Anthropic.Message): StreamResponse {\n const contentParts: ContentPart[] = [];\n for (const block of message.content) {\n const blk = block as unknown as Record<string, unknown>;\n const type = blk.type as string;\n\n if (type === \"text\") {\n contentParts.push({ type: \"text\", text: blk.text as string });\n } else if (type === \"thinking\") {\n contentParts.push({\n type: \"thinking\",\n text: blk.thinking as string,\n signature: (blk.signature as string) ?? \"\",\n });\n } else if (type === \"tool_use\") {\n contentParts.push({\n type: \"tool_call\",\n id: blk.id as string,\n name: blk.name as string,\n args: (blk.input as Record<string, unknown> | undefined) ?? {},\n });\n } else if (type === \"server_tool_use\") {\n contentParts.push({\n type: \"server_tool_call\",\n id: blk.id as string,\n name: blk.name as string,\n input: blk.input,\n });\n } else if (type === \"web_search_tool_result\") {\n contentParts.push({\n type: \"server_tool_result\",\n toolUseId: blk.tool_use_id as string,\n resultType: type,\n data: blk,\n });\n } else {\n // Preserve unknown blocks (redacted_thinking, compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: blk });\n }\n }\n\n const usage = message.usage as unknown as Record<string, unknown>;\n const inputTokens = (usage.input_tokens as number) ?? 0;\n const outputTokens = (usage.output_tokens as number) ?? 0;\n const cacheRead = usage.cache_read_input_tokens as number | undefined;\n const cacheWrite = usage.cache_creation_input_tokens as number | undefined;\n\n return {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason: normalizeAnthropicStopReason(message.stop_reason),\n usage: {\n inputTokens,\n outputTokens,\n ...(cacheRead != null && { cacheRead }),\n ...(cacheWrite != null && { cacheWrite }),\n },\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 10k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 10_000) {\n this.queue.splice(0, this.queue.length - 5_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 * Pull-based stream result. Wraps an async generator that yields\n * StreamEvents and returns a StreamResponse. Also thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n *\n * The generator is pumped eagerly — events flow into an internal\n * buffer regardless of whether a consumer is iterating. This avoids\n * the push-based EventStream's stall bugs (lost wakeups, single\n * resolve field, iterator starvation).\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly response: Promise<StreamResponse>;\n private buffer: StreamEvent[] = [];\n private done = false;\n private error: Error | null = null;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private resolveWait: (() => void) | null = null;\n\n constructor(generator: AsyncGenerator<StreamEvent, StreamResponse>) {\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n this.pump(generator);\n }\n\n private async pump(generator: AsyncGenerator<StreamEvent, StreamResponse>): Promise<void> {\n try {\n let next = await generator.next();\n while (!next.done) {\n this.buffer.push(next.value);\n this.resolveWait?.();\n this.resolveWait = null;\n next = await generator.next();\n }\n this.done = true;\n this.resolveResponse(next.value);\n this.resolveWait?.();\n this.resolveWait = null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.error = error;\n this.done = true;\n this.rejectResponse(error);\n this.resolveWait?.();\n this.resolveWait = null;\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n let index = 0;\n while (true) {\n while (index < this.buffer.length) {\n yield this.buffer[index++]!;\n }\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolveWait = r;\n // Guard against race: pump may have advanced between the while-check\n // and this promise registration. Re-check and resolve immediately.\n if (this.buffer.length > index || this.done || this.error) {\n this.resolveWait = null;\n r();\n }\n });\n }\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 return this.response.then(onfulfilled, onrejected);\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 // Strip empty text blocks — Anthropic rejects text content blocks\n // with empty strings (can happen when the model returns tool_use\n // with an empty companion text block)\n if (part.type === \"text\" && !part.text) 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 // Unknown content type (e.g. image in assistant message) — skip\n // by returning a marker that will be filtered out below\n return null as unknown as Anthropic.ContentBlockParam;\n })\n .filter(Boolean);\n // Skip assistant messages with no content blocks (can happen when all\n // blocks are filtered — e.g. thinking-only responses from non-Anthropic\n // providers where signature is missing and text is empty)\n if (Array.isArray(content) && content.length === 0) continue;\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-7|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.7 / 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 Anthropic `toolu_*` tool call IDs to `call_*` so OpenAI accepts them.\n * Only Anthropic IDs need remapping — IDs from OpenAI-compatible providers\n * (Moonshot, GLM, Xiaomi, MiniMax) are passed through unchanged to avoid\n * breaking the provider's own ID validation.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (!id.startsWith(\"toolu_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.slice(5)}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string; thinking?: boolean },\n): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n const idMap = new Map<string, string>();\n // GLM drops reasoning_content when a user message follows tool results.\n // Merge user text into the last tool message to preserve thinking context.\n const mergeToolResultText = options?.provider === \"glm\";\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 // For GLM: if the previous message is a tool result, merge text into it\n // to avoid a standalone user message that causes reasoning_content to be dropped.\n if (mergeToolResultText && out.length > 0 && out[out.length - 1]!.role === \"tool\") {\n const userText =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n if (userText) {\n // Append text to the last tool message's content\n const lastTool = out[out.length - 1] as OpenAI.ChatCompletionToolMessageParam;\n lastTool.content = (lastTool.content ?? \"\") + \"\\n\\n\" + userText;\n continue;\n }\n }\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 contentValue = parts || textParts || null;\n const hasToolCalls = toolCalls && toolCalls.length > 0;\n // Skip assistant messages with no content and no tool_calls (can happen\n // with thinking-only responses) — providers like Xiaomi reject these.\n if (!contentValue && !hasToolCalls) continue;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: contentValue,\n ...(hasToolCalls ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn thinking coherence (non-standard field).\n // When thinking content exists, always include it for round-tripping.\n // When thinking is enabled but no content exists (e.g. after compaction),\n // Moonshot/Kimi requires reasoning_content on assistant tool_call messages —\n // default to empty string. GLM silently hangs on empty values, so skip it there.\n if (thinkingParts) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content = thinkingParts;\n } else if (options?.thinking && hasToolCalls && options.provider !== \"glm\") {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content = \" \";\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 {\n ContentPart,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} 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\nfunction createClient(options: StreamOptions): OpenAI {\n return new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n}\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const providerName = options.provider ?? \"openai\";\n const useStreaming = options.streaming !== false;\n\n const client = createClient(options);\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam =\n options.provider === \"glm\" || options.provider === \"moonshot\" || options.provider === \"xiaomi\";\n\n const messages = toOpenAIMessages(options.messages, {\n provider: options.provider,\n thinking: !!options.thinking,\n });\n\n // GLM models default to 0.6 temperature when not in thinking mode\n const defaultTemp = options.provider === \"glm\" ? 0.6 : undefined;\n const effectiveTemp = options.temperature ?? defaultTemp;\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: useStreaming,\n ...(options.maxTokens ? { max_completion_tokens: options.maxTokens } : {}),\n ...(effectiveTemp != null && !options.thinking ? { temperature: effectiveTemp } : {}),\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 ...(useStreaming ? { stream_options: { include_usage: true } } : {}),\n };\n\n // Native web search is disabled for OpenAI-compatible providers — ggcoder\n // provides its own web_search/web_fetch tools which handle results properly.\n // Moonshot's $web_search was previously injected here but it returns opaque\n // results and triggers reasoning_content validation errors with thinking mode.\n\n // prompt_cache_key helps bucket similar requests for better cache hit rates.\n // Only send to providers known to support it (OpenAI, Moonshot/Kimi) — unknown\n // params may cause errors on other OpenAI-compatible providers like GLM or Xiaomi.\n if (options.provider === \"openai\" || options.provider === \"moonshot\") {\n const paramsAny = params as unknown as Record<string, unknown>;\n paramsAny.prompt_cache_key = \"ggcoder\";\n\n // Map cacheRetention to OpenAI's prompt_cache_retention param.\n // \"long\" → \"24h\" keeps cached prefixes active up to 24 hours (OpenAI feature).\n const retention = options.cacheRetention ?? \"short\";\n if (retention === \"long\") {\n paramsAny.prompt_cache_retention = \"24h\";\n }\n }\n\n // Inject custom thinking param for GLM/Moonshot/Xiaomi (not part of OpenAI spec)\n if (usesThinkingParam) {\n if (options.thinking) {\n (params as unknown as Record<string, unknown>).thinking = { type: \"enabled\" };\n } else {\n // All providers (GLM, Moonshot, Xiaomi MiMo) support explicit disabled.\n // MiMo is an always-on reasoning model — without { type: \"disabled\" } it\n // returns reasoning_content and may produce thinking-only responses with\n // no actionable output, causing the agent loop to silently end.\n (params as unknown as Record<string, unknown>).thinking = { type: \"disabled\" };\n }\n }\n\n // Dump request body for stall diagnosis when GGAI_DUMP_REQUEST is set\n if (\n (globalThis as Record<string, unknown>).process &&\n ((globalThis as Record<string, unknown>).process as Record<string, Record<string, string>>).env\n ?.GGAI_DUMP_REQUEST\n ) {\n const fs = await import(\"fs\");\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n const dumpPath = `/tmp/ggai-request-${ts}.json`;\n fs.writeFileSync(dumpPath, JSON.stringify(params, null, 2));\n fs.appendFileSync(\n \"/tmp/ggai-requests.log\",\n `[${ts}] ${dumpPath} messages=${params.messages.length}\\n`,\n );\n }\n\n // Non-streaming fallback: issue a single request/response and synthesize\n // stream events from the final ChatCompletion. Used by the agent loop after\n // the streaming transport has stalled repeatedly -- flipping to a plain\n // request/response often recovers from broken SSE connections.\n if (!useStreaming) {\n try {\n const completion = (await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n })) as OpenAI.ChatCompletion;\n yield* synthesizeEventsFromCompletion(completion, !!options.thinking);\n return completionToResponse(completion);\n } catch (err) {\n throw toError(err, providerName);\n }\n }\n\n let stream: AsyncIterable<OpenAI.ChatCompletionChunk>;\n try {\n stream = (await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n })) as AsyncIterable<OpenAI.ChatCompletionChunk>;\n } catch (err) {\n throw toError(err, providerName);\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) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\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 // Kimi K2/K2.5 reports cached_tokens at the top level of usage\n // rather than nested under prompt_tokens_details.\n const usageAny = chunk.usage as unknown as Record<string, unknown>;\n if (!cacheRead && typeof usageAny.cached_tokens === \"number\" && usageAny.cached_tokens > 0) {\n cacheRead = usageAny.cached_tokens as number;\n }\n // OpenAI's prompt_tokens includes cached tokens; subtract to match\n // Anthropic's convention where inputTokens excludes cache hits.\n inputTokens = chunk.usage.prompt_tokens - cacheRead;\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, Xiaomi MiMo, DeepSeek)\n // Always accumulate reasoning_content for round-tripping in multi-turn\n // conversations (models like DeepSeek Reasoner require it on assistant\n // messages). Only yield thinking_delta to the UI when thinking is enabled\n // — reasoning models like MiMo always return reasoning_content even when\n // thinking is \"off\", which would cause a permanent \"Thinking\" indicator.\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n if (options.thinking) {\n yield { type: \"thinking_delta\", text: reasoningContent };\n }\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n yield { 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 yield {\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, Xiaomi reasoning_content)\n // Always include in response for multi-turn round-tripping, even when\n // thinking display is off — toOpenAIMessages sends it as 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 yield {\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 yield { type: \"done\", stopReason };\n return response;\n}\n\n/**\n * Walk a non-streaming OpenAI ChatCompletion and yield the same StreamEvents\n * that the streaming path would produce. Emits one large delta per field so\n * the agent loop consumer observes identical behaviour to streaming mode.\n */\nfunction* synthesizeEventsFromCompletion(\n completion: OpenAI.ChatCompletion,\n thinkingEnabled: boolean,\n): Generator<StreamEvent, void> {\n const choice = completion.choices?.[0];\n if (!choice) {\n yield { type: \"done\", stopReason: normalizeOpenAIStopReason(null) };\n return;\n }\n\n const msg = choice.message as unknown as Record<string, unknown>;\n\n // Reasoning / thinking content (GLM, Moonshot, DeepSeek)\n const reasoning = msg.reasoning_content;\n if (typeof reasoning === \"string\" && reasoning && thinkingEnabled) {\n yield { type: \"thinking_delta\", text: reasoning };\n }\n\n // Text content\n if (typeof msg.content === \"string\" && msg.content) {\n yield { type: \"text_delta\", text: msg.content };\n }\n\n // Tool calls\n const toolCalls = msg.tool_calls as\n | Array<{ id: string; function: { name: string; arguments: string } }>\n | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const argsJson = tc.function?.arguments ?? \"\";\n if (argsJson) {\n yield {\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.function?.name ?? \"\",\n argsJson,\n };\n }\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON -- keep empty\n }\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.function?.name ?? \"\",\n args,\n };\n }\n }\n\n yield { type: \"done\", stopReason: normalizeOpenAIStopReason(choice.finish_reason ?? null) };\n}\n\n/** Convert a non-streaming OpenAI ChatCompletion into our StreamResponse shape. */\nfunction completionToResponse(completion: OpenAI.ChatCompletion): StreamResponse {\n const choice = completion.choices?.[0];\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n\n if (choice) {\n const msg = choice.message as unknown as Record<string, unknown>;\n\n // Reasoning content -- always included for multi-turn round-tripping\n const reasoning = msg.reasoning_content;\n if (typeof reasoning === \"string\" && reasoning) {\n contentParts.push({ type: \"thinking\", text: reasoning });\n }\n\n if (typeof msg.content === \"string\" && msg.content) {\n textAccum = msg.content;\n contentParts.push({ type: \"text\", text: msg.content });\n }\n\n const toolCalls = msg.tool_calls as\n | Array<{ id: string; function: { name: string; arguments: string } }>\n | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function?.arguments ?? \"{}\") 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.function?.name ?? \"\",\n args,\n };\n contentParts.push(toolCall);\n }\n }\n }\n\n // Usage -- match streaming path accounting (inputTokens excludes cache hits).\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n if (completion.usage) {\n outputTokens = completion.usage.completion_tokens;\n const details = completion.usage.prompt_tokens_details;\n if (details?.cached_tokens) cacheRead = details.cached_tokens;\n const usageAny = completion.usage as unknown as Record<string, unknown>;\n if (!cacheRead && typeof usageAny.cached_tokens === \"number\" && usageAny.cached_tokens > 0) {\n cacheRead = usageAny.cached_tokens as number;\n }\n inputTokens = completion.usage.prompt_tokens - cacheRead;\n }\n\n const stopReason = normalizeOpenAIStopReason(choice?.finish_reason ?? null);\n\n return {\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\nfunction toError(err: unknown, provider: string = \"openai\"): 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 // Friendly message for codex-mini-latest requiring Pro/Max subscription\n const modelName = (body.model as string) || \"\";\n const _code = (body.code as string) || \"\";\n const message = (body.message as string) || \"\";\n if (modelName === \"codex-mini-latest\" || message.includes(\"codex-mini-latest\")) {\n msg = `codex-mini-latest requires an OpenAI Pro or Max subscription. You currently have access to GPT-5.4 and GPT-5.4 Mini with your account.`;\n }\n // Append raw error body so debug logs capture the exact API response\n msg += ` | body: ${JSON.stringify(body)}`;\n }\n return new ProviderError(provider, msg, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(provider, err.message, { cause: err });\n }\n return new ProviderError(provider, String(err));\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n Message,\n StreamEvent,\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 return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\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 // Friendly hint for codex-mini-latest requiring Pro/Max subscription\n if (response.status === 404 && text.includes(\"does not exist\")) {\n message +=\n `\\n\\nHint: codex-mini-latest requires an OpenAI Pro ($200/mo) or Max subscription. ` +\n `GPT-5.4 and GPT-5.4 Mini work with any active ChatGPT plan.`;\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 yield { 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 yield { 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 yield {\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 yield {\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 yield { type: \"done\", stopReason };\n return 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","import type { StreamOptions } from \"./types.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\n\n/**\n * A provider stream function. Takes StreamOptions and returns a StreamResult.\n * Each provider implements this to handle its specific API format.\n */\nexport type ProviderStreamFn = (options: StreamOptions) => StreamResult;\n\n/**\n * Registry entry for a provider. A provider can have a simple stream function\n * or a more complex setup with custom routing logic.\n */\nexport interface ProviderEntry {\n /** Main stream function for this provider */\n stream: ProviderStreamFn;\n}\n\n/**\n * Map-based provider registry. Built-in providers are registered at module load,\n * and extensions can register custom providers at runtime.\n */\nclass ProviderRegistryImpl {\n private providers = new Map<string, ProviderEntry>();\n\n /**\n * Register a provider. Overwrites any existing provider with the same name.\n *\n * ```ts\n * import { providerRegistry } from \"@kenkaiiii/gg-ai\";\n *\n * providerRegistry.register(\"deepseek\", {\n * stream: (options) => streamOpenAI({ ...options, baseUrl: \"https://api.deepseek.com/v1\" }),\n * });\n * ```\n */\n register(name: string, entry: ProviderEntry): void {\n this.providers.set(name, entry);\n }\n\n /** Remove a registered provider. */\n unregister(name: string): boolean {\n return this.providers.delete(name);\n }\n\n /** Get a provider entry by name. */\n get(name: string): ProviderEntry | undefined {\n return this.providers.get(name);\n }\n\n /** Check if a provider is registered. */\n has(name: string): boolean {\n return this.providers.has(name);\n }\n\n /** List all registered provider names. */\n list(): string[] {\n return [...this.providers.keys()];\n }\n}\n\n/** Global provider registry. Import this to register custom providers. */\nexport const providerRegistry = new ProviderRegistryImpl();\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\";\nimport { providerRegistry } from \"./provider-registry.js\";\n\n/** Z.AI coding API endpoint — the primary endpoint for all GLM models. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\n});\n\nproviderRegistry.register(\"xiaomi\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://token-plan-sgp.xiaomimimo.com/v1\",\n webSearch: false,\n }),\n});\n\nproviderRegistry.register(\"openai\", {\n stream: (options) => {\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n },\n});\n\nproviderRegistry.register(\"glm\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? GLM_CODING_BASE_URL,\n }),\n});\n\nproviderRegistry.register(\"moonshot\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n }),\n});\n\nproviderRegistry.register(\"openrouter\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://openrouter.ai/api/v1\",\n }),\n});\n\nproviderRegistry.register(\"minimax\", {\n stream: (options) =>\n streamAnthropic({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.minimax.io/anthropic\",\n // MiniMax's Anthropic-compatible API does not support Anthropic-specific\n // server tools (web_search), context_management, or server-side tools.\n webSearch: false,\n compaction: false,\n clearToolUses: false,\n serverTools: undefined,\n }),\n});\n\n// ── Public API ─────────────────────────────────────────────\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 * Providers are resolved via the provider registry. Built-in providers\n * (anthropic, openai, glm, moonshot) are registered at module load.\n * Extensions can register custom providers via `providerRegistry.register()`.\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 const entry = providerRegistry.get(options.provider);\n if (!entry) {\n throw new GGAIError(\n `Unknown provider: \"${options.provider}\". Registered: ${providerRegistry.list().join(\", \")}`,\n );\n }\n return entry.stream(options);\n}\n","import type {\n AssistantMessage,\n ContentPart,\n Message,\n StopReason,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n Usage,\n} from \"../types.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { providerRegistry } from \"../provider-registry.js\";\n\n// ── Response Types ────────────────────────────────────────\n\nexport interface PalsuProviderState {\n callCount: number;\n}\n\nexport type PalsuResponseFactory = (\n messages: Message[],\n options: StreamOptions,\n state: PalsuProviderState,\n) => AssistantMessage | Promise<AssistantMessage>;\n\nexport type PalsuResponse = AssistantMessage | PalsuResponseFactory;\n\n// ── Helper Constructors ──────────────��────────────────────\n\n/** Create an assistant message with a single text block. */\nexport function palsuText(text: string): AssistantMessage {\n return { role: \"assistant\", content: text ? [{ type: \"text\", text }] : [] };\n}\n\n/** Create an assistant message with a thinking block and optional text reply. */\nexport function palsuThinking(thinking: string, text?: string): AssistantMessage {\n const content: ContentPart[] = [{ type: \"thinking\", text: thinking }];\n if (text) content.push({ type: \"text\", text });\n return { role: \"assistant\", content };\n}\n\n/** Create an assistant message with a single tool call. */\nexport function palsuToolCall(\n name: string,\n args: Record<string, unknown>,\n id?: string,\n): AssistantMessage {\n return {\n role: \"assistant\",\n content: [{ type: \"tool_call\", id: id ?? `palsu_${name}_${Date.now()}`, name, args }],\n };\n}\n\n/** Create an assistant message from content parts with optional stop reason. */\nexport function palsuAssistantMessage(\n content: ContentPart[],\n options?: { stopReason?: StopReason },\n): AssistantMessage & { _stopReason?: StopReason } {\n return { role: \"assistant\", content, _stopReason: options?.stopReason };\n}\n\n// ── Streaming Simulation ────────────���─────────────────────\n\nconst DEFAULT_CHUNK_SIZE = 20;\n\nfunction chunkText(text: string, size: number): string[] {\n const chunks: string[] = [];\n for (let i = 0; i < text.length; i += size) {\n chunks.push(text.slice(i, i + size));\n }\n return chunks.length > 0 ? chunks : [\"\"];\n}\n\ninterface CacheUsage {\n cacheRead: number;\n cacheWrite: number;\n}\n\nasync function* simulateStream(\n message: AssistantMessage,\n stopReason: StopReason,\n signal?: AbortSignal,\n cacheUsage?: CacheUsage,\n): AsyncGenerator<StreamEvent, StreamResponse> {\n if (signal?.aborted) {\n throw new Error(\"aborted\");\n }\n\n const content =\n typeof message.content === \"string\"\n ? message.content\n ? [{ type: \"text\" as const, text: message.content }]\n : []\n : message.content;\n\n let outputChars = 0;\n\n for (const part of content) {\n if (signal?.aborted) {\n throw new Error(\"aborted\");\n }\n\n if (part.type === \"text\") {\n const chunks = chunkText(part.text, DEFAULT_CHUNK_SIZE);\n for (const chunk of chunks) {\n yield { type: \"text_delta\", text: chunk };\n outputChars += chunk.length;\n }\n } else if (part.type === \"thinking\") {\n yield { type: \"thinking_delta\", text: part.text };\n outputChars += part.text.length;\n } else if (part.type === \"tool_call\") {\n const argsJson = JSON.stringify(part.args);\n yield { type: \"toolcall_delta\", id: part.id, name: part.name, argsJson };\n yield { type: \"toolcall_done\", id: part.id, name: part.name, args: part.args };\n outputChars += argsJson.length;\n }\n }\n\n // Rough token estimate: ~4 chars per token\n const outputTokens = Math.max(1, Math.ceil(outputChars / 4));\n const usage: Usage = {\n inputTokens: 100,\n outputTokens,\n ...(cacheUsage?.cacheRead ? { cacheRead: cacheUsage.cacheRead } : {}),\n ...(cacheUsage?.cacheWrite ? { cacheWrite: cacheUsage.cacheWrite } : {}),\n };\n\n yield { type: \"done\", stopReason };\n return { message, stopReason, usage };\n}\n\n// ── Prompt Cache Simulation ���─────────────────────────────\n\nfunction computeCacheUsage(current: string, previous: string | null): CacheUsage {\n if (!previous) {\n // First call — everything is a cache write\n return { cacheRead: 0, cacheWrite: Math.ceil(current.length / 4) };\n }\n // Find common prefix length\n const maxLen = Math.min(current.length, previous.length);\n let commonLen = 0;\n for (let i = 0; i < maxLen; i++) {\n if (current[i] !== previous[i]) break;\n commonLen++;\n }\n return {\n cacheRead: Math.ceil(commonLen / 4),\n cacheWrite: Math.ceil((current.length - commonLen) / 4),\n };\n}\n\n// ── Model Config ─────────────────────────────────────────\n\nexport interface PalsuModelConfig {\n /** Default response for this model when its queue is empty. */\n defaultResponse?: PalsuResponse;\n}\n\ninterface ModelState {\n responses: PalsuResponse[];\n defaultResponse?: PalsuResponse;\n}\n\n// ── Registration Handle ───────────────────────────────────\n\nexport interface PalsuModelHandle {\n /** Replace this model's response queue. */\n setResponses(responses: PalsuResponse[]): void;\n /** Append responses to this model's queue. */\n appendResponses(...responses: PalsuResponse[]): void;\n /** Number of unconsumed responses in this model's queue. */\n getPendingResponseCount(): number;\n}\n\nexport interface PalsuProviderHandle {\n /** Replace the shared response queue entirely. */\n setResponses(responses: PalsuResponse[]): void;\n /** Append responses to the shared queue. */\n appendResponses(...responses: PalsuResponse[]): void;\n /** Number of unconsumed responses in the shared queue. */\n getPendingResponseCount(): number;\n /** Mutable state — tracks call count. */\n state: PalsuProviderState;\n /** Get a handle for a model-specific response queue. */\n getModel(name: string): PalsuModelHandle;\n /** Remove this provider from the registry. */\n unregister(): void;\n}\n\nexport interface PalsuProviderConfig {\n /** Provider name to register under. Default: \"palsu\". */\n name?: string;\n /** Response returned when all queues are empty. Default: empty text message. */\n defaultResponse?: PalsuResponse;\n /** Enable prompt cache simulation. Tracks common message prefixes across calls. */\n promptCache?: boolean;\n /** Model-specific configurations with per-model response queues. */\n models?: Record<string, PalsuModelConfig>;\n}\n\n// ── Main Registration Function ────────────────────────────\n\n/**\n * Register a palsu (mock) LLM provider for testing.\n * Returns a handle to control responses and inspect state.\n *\n * ```ts\n * const palsu = registerPalsuProvider();\n * palsu.appendResponses(palsuText(\"Hello!\"));\n *\n * const result = await stream({ provider: \"palsu\", model: \"test\", messages });\n * console.log(result.message); // { role: \"assistant\", content: [{ type: \"text\", text: \"Hello!\" }] }\n *\n * palsu.unregister(); // cleanup\n * ```\n */\nexport function registerPalsuProvider(config?: PalsuProviderConfig): PalsuProviderHandle {\n const name = config?.name ?? \"palsu\";\n const responses: PalsuResponse[] = [];\n const state: PalsuProviderState = { callCount: 0 };\n const defaultResponse = config?.defaultResponse ?? palsuText(\"\");\n const enableCache = config?.promptCache ?? false;\n let lastMessagesSerialized: string | null = null;\n\n // Initialize model-specific state\n const modelStates = new Map<string, ModelState>();\n if (config?.models) {\n for (const [modelName, modelConfig] of Object.entries(config.models)) {\n modelStates.set(modelName, {\n responses: [],\n defaultResponse: modelConfig.defaultResponse,\n });\n }\n }\n\n const handle: PalsuProviderHandle = {\n setResponses(r) {\n responses.length = 0;\n responses.push(...r);\n },\n appendResponses(...r) {\n responses.push(...r);\n },\n getPendingResponseCount() {\n return responses.length;\n },\n state,\n getModel(modelName: string): PalsuModelHandle {\n if (!modelStates.has(modelName)) {\n modelStates.set(modelName, { responses: [] });\n }\n const ms = modelStates.get(modelName)!;\n return {\n setResponses(r) {\n ms.responses.length = 0;\n ms.responses.push(...r);\n },\n appendResponses(...r) {\n ms.responses.push(...r);\n },\n getPendingResponseCount() {\n return ms.responses.length;\n },\n };\n },\n unregister() {\n providerRegistry.unregister(name);\n },\n };\n\n providerRegistry.register(name, {\n stream(options: StreamOptions): StreamResult {\n state.callCount++;\n\n // Resolve response: model-specific queue → shared queue → model default → shared default\n const ms = modelStates.get(options.model);\n const responseDef =\n (ms && ms.responses.length > 0 ? ms.responses.shift() : undefined) ??\n (responses.length > 0 ? responses.shift() : undefined) ??\n ms?.defaultResponse ??\n defaultResponse;\n\n // Compute cache usage before streaming (needs messages serialized)\n let cacheUsage: CacheUsage | undefined;\n if (enableCache) {\n const serialized = JSON.stringify(options.messages);\n cacheUsage = computeCacheUsage(serialized, lastMessagesSerialized);\n lastMessagesSerialized = serialized;\n }\n\n const gen = (async function* (): AsyncGenerator<StreamEvent, StreamResponse> {\n // Resolve factory (sync or async) then stream\n const rawMessage =\n typeof responseDef === \"function\"\n ? responseDef(options.messages, options, state)\n : responseDef;\n const message = await Promise.resolve(rawMessage);\n\n const hasToolCalls =\n Array.isArray(message.content) && message.content.some((p) => p.type === \"tool_call\");\n const explicitStop = (message as { _stopReason?: StopReason })._stopReason;\n const stopReason = explicitStop ?? (hasToolCalls ? \"tool_use\" : \"end_turn\");\n\n return yield* simulateStream(message, stopReason, options.signal, cacheUsage);\n })();\n\n return new StreamResult(gen);\n },\n });\n\n return handle;\n}\n"],"mappings":"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","names":["Anthropic","stream","createClient","OpenAI","runStream","toError","stream","runStream","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/provider-registry.ts","../src/stream.ts","../src/providers/palsu.ts"],"sourcesContent":["// Core entry point\nexport { stream } from \"./stream.js\";\n\n// Provider registry\nexport { providerRegistry } from \"./provider-registry.js\";\nexport type { ProviderStreamFn, ProviderEntry } from \"./provider-registry.js\";\n\n// Types\nexport type {\n Provider,\n ThinkingLevel,\n CacheRetention,\n TextContent,\n ThinkingContent,\n ImageContent,\n ToolCall,\n ToolResult,\n ToolResultContent,\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\n// Palsu provider (testing)\nexport {\n registerPalsuProvider,\n palsuText,\n palsuThinking,\n palsuToolCall,\n palsuAssistantMessage,\n} from \"./providers/palsu.js\";\nexport type {\n PalsuProviderHandle,\n PalsuProviderConfig,\n PalsuProviderState,\n PalsuResponse,\n PalsuResponseFactory,\n PalsuModelConfig,\n PalsuModelHandle,\n} from \"./providers/palsu.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 StreamEvent,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n downgradeUnsupportedImages,\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nfunction createClient(options: StreamOptions): Anthropic {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n return 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 ...(options.fetch ? { fetch: options.fetch } : {}),\n // Allow SDK retries for connection-level failures (socket hang up, 500s,\n // connection refused). Our stall detection handles abort-initiated retries\n // separately — SDK retries only fire on genuine transport errors.\n maxRetries: 2,\n ...(isOAuth\n ? {\n defaultHeaders: {\n \"user-agent\": \"claude-cli/2.1.75\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\n}\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const client = createClient(options);\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n const useStreaming = options.streaming !== false;\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const downgradedMessages = downgradeUnsupportedImages(options.messages, options.supportsImages);\n const { system: rawSystem, messages } = toAnthropicMessages(downgradedMessages, cacheControl);\n\n // OAuth tokens require Claude Code identity in the system prompt\n const system = isOAuth\n ? [\n {\n type: \"text\" as const,\n text: \"You are Claude Code, Anthropic's official CLI for Claude.\",\n },\n ...(rawSystem ?? []),\n ]\n : rawSystem;\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 ...(() => {\n const contextEdits = [\n ...(options.compaction ? [{ type: \"compact_20260112\" }] : []),\n ...(options.clearToolUses ? [{ type: \"clear_tool_uses_20250919\" }] : []),\n ];\n return contextEdits.length ? { context_management: { edits: contextEdits } } : {};\n })(),\n stream: useStreaming,\n } as Anthropic.MessageCreateParams;\n\n // Adaptive thinking models (Opus 4.7, Opus 4.6, Sonnet 4.6) don't need the\n // interleaved-thinking beta — they have it built in.\n const hasAdaptiveThinking =\n options.model.includes(\"opus-4-7\") ||\n options.model.includes(\"opus-4.7\") ||\n options.model.includes(\"opus-4-6\") ||\n options.model.includes(\"opus-4.6\") ||\n options.model.includes(\"sonnet-4-6\") ||\n options.model.includes(\"sonnet-4.6\");\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ...(options.clearToolUses ? [\"context-management-2025-06-27\"] : []),\n \"fine-grained-tool-streaming-2025-05-14\",\n ...(!hasAdaptiveThinking ? [\"interleaved-thinking-2025-05-14\"] : []),\n ];\n\n const requestOptions = {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n };\n\n // Non-streaming fallback: issue a single request/response and synthesize\n // stream events from the final Message. Used by the agent loop after the\n // SSE stream has stalled repeatedly -- broken streaming connections often\n // recover when the request is replayed over a plain HTTP response.\n if (!useStreaming) {\n try {\n const message = (await client.messages.create(\n { ...params, stream: false } as Anthropic.MessageCreateParamsNonStreaming,\n requestOptions,\n )) as Anthropic.Message;\n yield* synthesizeEventsFromMessage(message);\n return messageToResponse(message);\n } catch (err) {\n throw toError(err);\n }\n }\n\n const stream = client.messages.stream(params, requestOptions);\n\n // ── Accumulation state ──────────────────────────────────\n const contentParts: ContentPart[] = [];\n\n // Per-block accumulators indexed by content_block_start index\n const blocks = new Map<\n number,\n {\n type: string;\n text: string;\n thinking: string;\n signature: string;\n toolId: string;\n toolName: string;\n argsJson: string;\n input: unknown;\n raw: Record<string, unknown> | null;\n }\n >();\n\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead: number | undefined;\n let cacheWrite: number | undefined;\n let stopReason: string | null = null;\n\n const keepalive = { type: \"keepalive\" as const };\n\n try {\n for await (const event of stream as AsyncIterable<Anthropic.MessageStreamEvent>) {\n switch (event.type) {\n case \"message_start\": {\n const usage = event.message.usage;\n inputTokens = usage.input_tokens;\n const usageAny = usage as unknown as Record<string, unknown>;\n if (usageAny.cache_read_input_tokens != null) {\n cacheRead = usageAny.cache_read_input_tokens as number;\n }\n if (usageAny.cache_creation_input_tokens != null) {\n cacheWrite = usageAny.cache_creation_input_tokens as number;\n }\n yield keepalive;\n break;\n }\n\n case \"content_block_start\": {\n const block = event.content_block;\n const idx = event.index;\n const accum = {\n type: block.type,\n text: \"\",\n thinking: \"\",\n signature: \"\",\n toolId: \"\",\n toolName: \"\",\n argsJson: \"\",\n input: undefined as unknown,\n raw: null as Record<string, unknown> | null,\n };\n\n if (block.type === \"tool_use\") {\n accum.toolId = block.id;\n accum.toolName = block.name;\n } else if (block.type === \"server_tool_use\") {\n accum.toolId = (block as unknown as { id: string }).id;\n accum.toolName = (block as unknown as { name: string }).name;\n accum.input = (block as unknown as { input: unknown }).input;\n } else if (block.type === \"redacted_thinking\") {\n // Encrypted thinking block — capture the raw data for round-tripping.\n // The API requires these to be sent back verbatim in multi-turn conversations.\n accum.raw = block as unknown as Record<string, unknown>;\n }\n\n blocks.set(idx, accum);\n yield keepalive;\n break;\n }\n\n case \"content_block_delta\": {\n const accum = blocks.get(event.index);\n if (!accum) break;\n\n const delta = event.delta as unknown as Record<string, unknown>;\n const deltaType = delta.type as string;\n\n if (deltaType === \"text_delta\") {\n const text = delta.text as string;\n accum.text += text;\n yield { type: \"text_delta\", text };\n } else if (deltaType === \"thinking_delta\") {\n const text = delta.thinking as string;\n accum.thinking += text;\n yield { type: \"thinking_delta\", text };\n } else if (deltaType === \"input_json_delta\") {\n const partialJson = delta.partial_json as string;\n accum.argsJson += partialJson;\n yield {\n type: \"toolcall_delta\",\n id: accum.toolId,\n name: accum.toolName,\n argsJson: partialJson,\n };\n } else if (deltaType === \"signature_delta\") {\n accum.signature = delta.signature as string;\n }\n break;\n }\n\n case \"content_block_stop\": {\n const accum = blocks.get(event.index);\n if (!accum) break;\n\n if (accum.type === \"text\") {\n contentParts.push({ type: \"text\", text: accum.text });\n } else if (accum.type === \"thinking\") {\n contentParts.push({\n type: \"thinking\",\n text: accum.thinking,\n signature: accum.signature,\n });\n yield keepalive;\n } else if (accum.type === \"tool_use\") {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(accum.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const tc: ToolCall = {\n type: \"tool_call\",\n id: accum.toolId,\n name: accum.toolName,\n args,\n };\n contentParts.push(tc);\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n };\n } else if (accum.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: accum.toolId,\n name: accum.toolName,\n input: accum.input,\n };\n contentParts.push(stc);\n yield {\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n };\n } else if (accum.type === \"redacted_thinking\" && accum.raw) {\n contentParts.push({ type: \"raw\", data: accum.raw });\n yield keepalive;\n } else {\n // Retrieve the full block from the SDK's accumulated message\n // for block types we don't explicitly accumulate (e.g. web_search_tool_result)\n const msg = stream.currentMessage;\n const rawBlock = msg?.content[event.index] as unknown as\n | Record<string, unknown>\n | undefined;\n if (rawBlock) {\n const blockType = rawBlock.type as string;\n if (blockType === \"web_search_tool_result\") {\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: rawBlock.tool_use_id as string,\n resultType: blockType,\n data: rawBlock,\n };\n contentParts.push(str);\n yield {\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: rawBlock });\n }\n }\n }\n\n blocks.delete(event.index);\n break;\n }\n\n case \"message_delta\": {\n const delta = event.delta as unknown as Record<string, unknown>;\n if (delta.stop_reason) {\n stopReason = delta.stop_reason as string;\n }\n const usage = event.usage as unknown as Record<string, unknown> | undefined;\n if (usage?.output_tokens != null) {\n outputTokens = usage.output_tokens as number;\n }\n yield keepalive;\n break;\n }\n\n // message_stop — loop exits naturally\n\n default:\n // Unhandled event types (e.g. \"ping\" heartbeats) — yield keepalive\n // so the idle timer in the agent loop resets on any API activity.\n yield keepalive;\n break;\n }\n }\n } catch (err) {\n throw toError(err);\n }\n\n const normalizedStop = normalizeAnthropicStopReason(stopReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason: normalizedStop,\n usage: {\n inputTokens,\n outputTokens,\n ...(cacheRead != null && { cacheRead }),\n ...(cacheWrite != null && { cacheWrite }),\n },\n };\n\n yield { type: \"done\", stopReason: normalizedStop };\n return response;\n}\n\n/**\n * Walk a non-streaming Anthropic Message and yield the same StreamEvents\n * that the streaming path would produce. Emits one large delta per block\n * rather than token-by-token -- the agent loop consumer doesn't care about\n * granularity, only completeness.\n */\nfunction* synthesizeEventsFromMessage(message: Anthropic.Message): Generator<StreamEvent, void> {\n for (const block of message.content) {\n const blk = block as unknown as Record<string, unknown>;\n const type = blk.type as string;\n\n if (type === \"text\") {\n const text = blk.text as string;\n if (text) yield { type: \"text_delta\", text };\n } else if (type === \"thinking\") {\n const text = blk.thinking as string;\n if (text) yield { type: \"thinking_delta\", text };\n } else if (type === \"tool_use\") {\n const argsJson = JSON.stringify(blk.input ?? {});\n yield {\n type: \"toolcall_delta\",\n id: blk.id as string,\n name: blk.name as string,\n argsJson,\n };\n yield {\n type: \"toolcall_done\",\n id: blk.id as string,\n name: blk.name as string,\n args: (blk.input as Record<string, unknown> | undefined) ?? {},\n };\n } else if (type === \"server_tool_use\") {\n yield {\n type: \"server_toolcall\",\n id: blk.id as string,\n name: blk.name as string,\n input: blk.input,\n };\n } else if (type === \"web_search_tool_result\") {\n yield {\n type: \"server_toolresult\",\n toolUseId: blk.tool_use_id as string,\n resultType: type,\n data: blk,\n };\n }\n // Other block types (redacted_thinking, compaction blocks) are preserved\n // in the response via messageToResponse but don't emit events.\n }\n yield { type: \"done\", stopReason: normalizeAnthropicStopReason(message.stop_reason) };\n}\n\n/** Convert a non-streaming Anthropic Message into our StreamResponse shape. */\nfunction messageToResponse(message: Anthropic.Message): StreamResponse {\n const contentParts: ContentPart[] = [];\n for (const block of message.content) {\n const blk = block as unknown as Record<string, unknown>;\n const type = blk.type as string;\n\n if (type === \"text\") {\n contentParts.push({ type: \"text\", text: blk.text as string });\n } else if (type === \"thinking\") {\n contentParts.push({\n type: \"thinking\",\n text: blk.thinking as string,\n signature: (blk.signature as string) ?? \"\",\n });\n } else if (type === \"tool_use\") {\n contentParts.push({\n type: \"tool_call\",\n id: blk.id as string,\n name: blk.name as string,\n args: (blk.input as Record<string, unknown> | undefined) ?? {},\n });\n } else if (type === \"server_tool_use\") {\n contentParts.push({\n type: \"server_tool_call\",\n id: blk.id as string,\n name: blk.name as string,\n input: blk.input,\n });\n } else if (type === \"web_search_tool_result\") {\n contentParts.push({\n type: \"server_tool_result\",\n toolUseId: blk.tool_use_id as string,\n resultType: type,\n data: blk,\n });\n } else {\n // Preserve unknown blocks (redacted_thinking, compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: blk });\n }\n }\n\n const usage = message.usage as unknown as Record<string, unknown>;\n const inputTokens = (usage.input_tokens as number) ?? 0;\n const outputTokens = (usage.output_tokens as number) ?? 0;\n const cacheRead = usage.cache_read_input_tokens as number | undefined;\n const cacheWrite = usage.cache_creation_input_tokens as number | undefined;\n\n return {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason: normalizeAnthropicStopReason(message.stop_reason),\n usage: {\n inputTokens,\n outputTokens,\n ...(cacheRead != null && { cacheRead }),\n ...(cacheWrite != null && { cacheWrite }),\n },\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 10k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 10_000) {\n this.queue.splice(0, this.queue.length - 5_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 * Pull-based stream result. Wraps an async generator that yields\n * StreamEvents and returns a StreamResponse. Also thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n *\n * The generator is pumped eagerly — events flow into an internal\n * buffer regardless of whether a consumer is iterating. This avoids\n * the push-based EventStream's stall bugs (lost wakeups, single\n * resolve field, iterator starvation).\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly response: Promise<StreamResponse>;\n private buffer: StreamEvent[] = [];\n private done = false;\n private error: Error | null = null;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private resolveWait: (() => void) | null = null;\n\n constructor(generator: AsyncGenerator<StreamEvent, StreamResponse>) {\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n this.pump(generator);\n }\n\n private async pump(generator: AsyncGenerator<StreamEvent, StreamResponse>): Promise<void> {\n try {\n let next = await generator.next();\n while (!next.done) {\n this.buffer.push(next.value);\n this.resolveWait?.();\n this.resolveWait = null;\n next = await generator.next();\n }\n this.done = true;\n this.resolveResponse(next.value);\n this.resolveWait?.();\n this.resolveWait = null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.error = error;\n this.done = true;\n this.rejectResponse(error);\n this.resolveWait?.();\n this.resolveWait = null;\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n let index = 0;\n while (true) {\n while (index < this.buffer.length) {\n yield this.buffer[index++]!;\n }\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolveWait = r;\n // Guard against race: pump may have advanced between the while-check\n // and this promise registration. Re-check and resolve immediately.\n if (this.buffer.length > index || this.done || this.error) {\n this.resolveWait = null;\n r();\n }\n });\n }\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 return this.response.then(onfulfilled, onrejected);\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 ImageContent,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n ToolResultContent,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Shared helpers ─────────────────────────────────────────\n\nconst NON_VISION_USER_IMAGE_PLACEHOLDER = \"(image omitted: model does not support images)\";\nconst NON_VISION_TOOL_IMAGE_PLACEHOLDER = \"(tool image omitted: model does not support images)\";\n\n/** Replace image blocks with a text placeholder (deduping consecutive placeholders). */\nfunction stripImages(content: (TextContent | ImageContent)[], placeholder: string): TextContent[] {\n const out: TextContent[] = [];\n let lastWasPlaceholder = false;\n for (const block of content) {\n if (block.type === \"image\") {\n if (!lastWasPlaceholder) out.push({ type: \"text\", text: placeholder });\n lastWasPlaceholder = true;\n continue;\n }\n out.push(block);\n lastWasPlaceholder = block.text === placeholder;\n }\n return out;\n}\n\n/**\n * Pre-transform pass: when the target model doesn't support images, replace\n * image blocks in user messages and tool_result messages with a text placeholder.\n * Called before provider-specific transforms.\n */\nexport function downgradeUnsupportedImages(\n messages: Message[],\n supportsImages: boolean | undefined,\n): Message[] {\n if (supportsImages !== false) return messages;\n return messages.map((msg) => {\n if (msg.role === \"user\" && Array.isArray(msg.content)) {\n return { ...msg, content: stripImages(msg.content, NON_VISION_USER_IMAGE_PLACEHOLDER) };\n }\n if (msg.role === \"tool\") {\n return {\n ...msg,\n content: msg.content.map((tr) =>\n Array.isArray(tr.content)\n ? {\n ...tr,\n content: stripImages(tr.content, NON_VISION_TOOL_IMAGE_PLACEHOLDER),\n }\n : tr,\n ),\n };\n }\n return msg;\n });\n}\n\n/** Extract concatenated text from tool_result content (array or string). */\nfunction toolResultText(content: ToolResultContent): string {\n if (typeof content === \"string\") return content;\n return content\n .filter((b): b is TextContent => b.type === \"text\")\n .map((b) => b.text)\n .join(\"\\n\");\n}\n\n/** Extract image blocks from tool_result content. Returns empty array for string content. */\nfunction toolResultImages(content: ToolResultContent): ImageContent[] {\n if (typeof content === \"string\") return [];\n return content.filter((b): b is ImageContent => b.type === \"image\");\n}\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\ntype AnthropicImageSource = {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string;\n};\n\n/**\n * Convert tool_result content to Anthropic's wire format. Strings pass through;\n * arrays are mapped to Anthropic's (text | image) block format, which\n * tool_result.content accepts natively.\n */\nfunction toAnthropicToolResultContent(\n content: ToolResultContent,\n):\n | string\n | Array<{ type: \"text\"; text: string } | { type: \"image\"; source: AnthropicImageSource }> {\n if (typeof content === \"string\") return content;\n return content.map((block) => {\n if (block.type === \"text\") return { type: \"text\" as const, text: block.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: block.mediaType as AnthropicImageSource[\"media_type\"],\n data: block.data,\n },\n };\n });\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 // Strip empty text blocks — Anthropic rejects text content blocks\n // with empty strings (can happen when the model returns tool_use\n // with an empty companion text block)\n if (part.type === \"text\" && !part.text) 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 // Unknown content type (e.g. image in assistant message) — skip\n // by returning a marker that will be filtered out below\n return null as unknown as Anthropic.ContentBlockParam;\n })\n .filter(Boolean);\n // Skip assistant messages with no content blocks (can happen when all\n // blocks are filtered — e.g. thinking-only responses from non-Anthropic\n // providers where signature is missing and text is empty)\n if (Array.isArray(content) && content.length === 0) continue;\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: toAnthropicToolResultContent(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-7|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.7 / 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 Anthropic `toolu_*` tool call IDs to `call_*` so OpenAI accepts them.\n * Only Anthropic IDs need remapping — IDs from OpenAI-compatible providers\n * (Moonshot, GLM, Xiaomi, MiniMax) are passed through unchanged to avoid\n * breaking the provider's own ID validation.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (!id.startsWith(\"toolu_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.slice(5)}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string; thinking?: boolean; supportsImages?: boolean },\n): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n const idMap = new Map<string, string>();\n // GLM drops reasoning_content when a user message follows tool results.\n // Merge user text into the last tool message to preserve thinking context.\n const mergeToolResultText = options?.provider === \"glm\";\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 // For GLM: if the previous message is a tool result, merge text into it\n // to avoid a standalone user message that causes reasoning_content to be dropped.\n if (mergeToolResultText && out.length > 0 && out[out.length - 1]!.role === \"tool\") {\n const userText =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n if (userText) {\n // Append text to the last tool message's content\n const lastTool = out[out.length - 1] as OpenAI.ChatCompletionToolMessageParam;\n lastTool.content = (lastTool.content ?? \"\") + \"\\n\\n\" + userText;\n continue;\n }\n }\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 contentValue = parts || textParts || null;\n const hasToolCalls = toolCalls && toolCalls.length > 0;\n // Skip assistant messages with no content and no tool_calls (can happen\n // with thinking-only responses) — providers like Xiaomi reject these.\n if (!contentValue && !hasToolCalls) continue;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: contentValue,\n ...(hasToolCalls ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn thinking coherence (non-standard field).\n // When thinking content exists, always include it for round-tripping.\n // When thinking is enabled but no content exists (e.g. after compaction),\n // Moonshot/Kimi requires reasoning_content on assistant tool_call messages —\n // default to empty string. GLM silently hangs on empty values, so skip it there.\n if (thinkingParts) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content = thinkingParts;\n } else if (options?.thinking && hasToolCalls && options.provider !== \"glm\") {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content = \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n // OpenAI's `tool` role only accepts text. Emit the tool message with the\n // text content, then (if any tool results carried images and the model\n // supports vision) a follow-up `user` message carrying image_url blocks.\n const imageBlocks: OpenAI.ChatCompletionContentPartImage[] = [];\n for (const result of msg.content) {\n const text = toolResultText(result.content);\n const images = toolResultImages(result.content);\n const hasText = text.length > 0;\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: hasText ? text : \"(see attached image)\",\n });\n if (images.length > 0 && options?.supportsImages !== false) {\n for (const img of images) {\n imageBlocks.push({\n type: \"image_url\",\n image_url: { url: `data:${img.mediaType};base64,${img.data}` },\n });\n }\n }\n }\n if (imageBlocks.length > 0) {\n out.push({\n role: \"user\",\n content: [{ type: \"text\", text: \"Attached image(s) from tool result:\" }, ...imageBlocks],\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 {\n ContentPart,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n downgradeUnsupportedImages,\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nfunction createClient(options: StreamOptions): OpenAI {\n return new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n}\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const providerName = options.provider ?? \"openai\";\n const useStreaming = options.streaming !== false;\n\n const client = createClient(options);\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam =\n options.provider === \"glm\" || options.provider === \"moonshot\" || options.provider === \"xiaomi\";\n\n const downgradedMessages = downgradeUnsupportedImages(options.messages, options.supportsImages);\n const messages = toOpenAIMessages(downgradedMessages, {\n provider: options.provider,\n thinking: !!options.thinking,\n supportsImages: options.supportsImages,\n });\n\n // GLM models default to 0.6 temperature when not in thinking mode\n const defaultTemp = options.provider === \"glm\" ? 0.6 : undefined;\n const effectiveTemp = options.temperature ?? defaultTemp;\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: useStreaming,\n ...(options.maxTokens ? { max_completion_tokens: options.maxTokens } : {}),\n ...(effectiveTemp != null && !options.thinking ? { temperature: effectiveTemp } : {}),\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 ...(useStreaming ? { stream_options: { include_usage: true } } : {}),\n };\n\n // Native web search is disabled for OpenAI-compatible providers — ggcoder\n // provides its own web_search/web_fetch tools which handle results properly.\n // Moonshot's $web_search was previously injected here but it returns opaque\n // results and triggers reasoning_content validation errors with thinking mode.\n\n // prompt_cache_key helps bucket similar requests for better cache hit rates.\n // Only send to providers known to support it (OpenAI, Moonshot/Kimi) — unknown\n // params may cause errors on other OpenAI-compatible providers like GLM or Xiaomi.\n if (options.provider === \"openai\" || options.provider === \"moonshot\") {\n const paramsAny = params as unknown as Record<string, unknown>;\n paramsAny.prompt_cache_key = \"ggcoder\";\n\n // Map cacheRetention to OpenAI's prompt_cache_retention param.\n // \"long\" → \"24h\" keeps cached prefixes active up to 24 hours (OpenAI feature).\n const retention = options.cacheRetention ?? \"short\";\n if (retention === \"long\") {\n paramsAny.prompt_cache_retention = \"24h\";\n }\n }\n\n // Inject custom thinking param for GLM/Moonshot/Xiaomi (not part of OpenAI spec)\n if (usesThinkingParam) {\n if (options.thinking) {\n (params as unknown as Record<string, unknown>).thinking = { type: \"enabled\" };\n } else {\n // All providers (GLM, Moonshot, Xiaomi MiMo) support explicit disabled.\n // MiMo is an always-on reasoning model — without { type: \"disabled\" } it\n // returns reasoning_content and may produce thinking-only responses with\n // no actionable output, causing the agent loop to silently end.\n (params as unknown as Record<string, unknown>).thinking = { type: \"disabled\" };\n }\n }\n\n // Dump request body for stall diagnosis when GGAI_DUMP_REQUEST is set\n if (\n (globalThis as Record<string, unknown>).process &&\n ((globalThis as Record<string, unknown>).process as Record<string, Record<string, string>>).env\n ?.GGAI_DUMP_REQUEST\n ) {\n const fs = await import(\"fs\");\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n const dumpPath = `/tmp/ggai-request-${ts}.json`;\n fs.writeFileSync(dumpPath, JSON.stringify(params, null, 2));\n fs.appendFileSync(\n \"/tmp/ggai-requests.log\",\n `[${ts}] ${dumpPath} messages=${params.messages.length}\\n`,\n );\n }\n\n // Non-streaming fallback: issue a single request/response and synthesize\n // stream events from the final ChatCompletion. Used by the agent loop after\n // the streaming transport has stalled repeatedly -- flipping to a plain\n // request/response often recovers from broken SSE connections.\n if (!useStreaming) {\n try {\n const completion = (await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n })) as OpenAI.ChatCompletion;\n yield* synthesizeEventsFromCompletion(completion, !!options.thinking);\n return completionToResponse(completion);\n } catch (err) {\n throw toError(err, providerName);\n }\n }\n\n let stream: AsyncIterable<OpenAI.ChatCompletionChunk>;\n try {\n stream = (await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n })) as AsyncIterable<OpenAI.ChatCompletionChunk>;\n } catch (err) {\n throw toError(err, providerName);\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) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\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 // Kimi K2/K2.5 reports cached_tokens at the top level of usage\n // rather than nested under prompt_tokens_details.\n const usageAny = chunk.usage as unknown as Record<string, unknown>;\n if (!cacheRead && typeof usageAny.cached_tokens === \"number\" && usageAny.cached_tokens > 0) {\n cacheRead = usageAny.cached_tokens as number;\n }\n // OpenAI's prompt_tokens includes cached tokens; subtract to match\n // Anthropic's convention where inputTokens excludes cache hits.\n inputTokens = chunk.usage.prompt_tokens - cacheRead;\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, Xiaomi MiMo, DeepSeek)\n // Always accumulate reasoning_content for round-tripping in multi-turn\n // conversations (models like DeepSeek Reasoner require it on assistant\n // messages). Only yield thinking_delta to the UI when thinking is enabled\n // — reasoning models like MiMo always return reasoning_content even when\n // thinking is \"off\", which would cause a permanent \"Thinking\" indicator.\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n if (options.thinking) {\n yield { type: \"thinking_delta\", text: reasoningContent };\n }\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n yield { 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 yield {\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, Xiaomi reasoning_content)\n // Always include in response for multi-turn round-tripping, even when\n // thinking display is off — toOpenAIMessages sends it as 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 yield {\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 yield { type: \"done\", stopReason };\n return response;\n}\n\n/**\n * Walk a non-streaming OpenAI ChatCompletion and yield the same StreamEvents\n * that the streaming path would produce. Emits one large delta per field so\n * the agent loop consumer observes identical behaviour to streaming mode.\n */\nfunction* synthesizeEventsFromCompletion(\n completion: OpenAI.ChatCompletion,\n thinkingEnabled: boolean,\n): Generator<StreamEvent, void> {\n const choice = completion.choices?.[0];\n if (!choice) {\n yield { type: \"done\", stopReason: normalizeOpenAIStopReason(null) };\n return;\n }\n\n const msg = choice.message as unknown as Record<string, unknown>;\n\n // Reasoning / thinking content (GLM, Moonshot, DeepSeek)\n const reasoning = msg.reasoning_content;\n if (typeof reasoning === \"string\" && reasoning && thinkingEnabled) {\n yield { type: \"thinking_delta\", text: reasoning };\n }\n\n // Text content\n if (typeof msg.content === \"string\" && msg.content) {\n yield { type: \"text_delta\", text: msg.content };\n }\n\n // Tool calls\n const toolCalls = msg.tool_calls as\n | Array<{ id: string; function: { name: string; arguments: string } }>\n | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const argsJson = tc.function?.arguments ?? \"\";\n if (argsJson) {\n yield {\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.function?.name ?? \"\",\n argsJson,\n };\n }\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON -- keep empty\n }\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.function?.name ?? \"\",\n args,\n };\n }\n }\n\n yield { type: \"done\", stopReason: normalizeOpenAIStopReason(choice.finish_reason ?? null) };\n}\n\n/** Convert a non-streaming OpenAI ChatCompletion into our StreamResponse shape. */\nfunction completionToResponse(completion: OpenAI.ChatCompletion): StreamResponse {\n const choice = completion.choices?.[0];\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n\n if (choice) {\n const msg = choice.message as unknown as Record<string, unknown>;\n\n // Reasoning content -- always included for multi-turn round-tripping\n const reasoning = msg.reasoning_content;\n if (typeof reasoning === \"string\" && reasoning) {\n contentParts.push({ type: \"thinking\", text: reasoning });\n }\n\n if (typeof msg.content === \"string\" && msg.content) {\n textAccum = msg.content;\n contentParts.push({ type: \"text\", text: msg.content });\n }\n\n const toolCalls = msg.tool_calls as\n | Array<{ id: string; function: { name: string; arguments: string } }>\n | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function?.arguments ?? \"{}\") 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.function?.name ?? \"\",\n args,\n };\n contentParts.push(toolCall);\n }\n }\n }\n\n // Usage -- match streaming path accounting (inputTokens excludes cache hits).\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n if (completion.usage) {\n outputTokens = completion.usage.completion_tokens;\n const details = completion.usage.prompt_tokens_details;\n if (details?.cached_tokens) cacheRead = details.cached_tokens;\n const usageAny = completion.usage as unknown as Record<string, unknown>;\n if (!cacheRead && typeof usageAny.cached_tokens === \"number\" && usageAny.cached_tokens > 0) {\n cacheRead = usageAny.cached_tokens as number;\n }\n inputTokens = completion.usage.prompt_tokens - cacheRead;\n }\n\n const stopReason = normalizeOpenAIStopReason(choice?.finish_reason ?? null);\n\n return {\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\nfunction toError(err: unknown, provider: string = \"openai\"): 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 // Friendly message for codex-mini-latest requiring Pro/Max subscription\n const modelName = (body.model as string) || \"\";\n const _code = (body.code as string) || \"\";\n const message = (body.message as string) || \"\";\n if (modelName === \"codex-mini-latest\" || message.includes(\"codex-mini-latest\")) {\n msg = `codex-mini-latest requires an OpenAI Pro or Max subscription. You currently have access to GPT-5.4 and GPT-5.4 Mini with your account.`;\n }\n // Append raw error body so debug logs capture the exact API response\n msg += ` | body: ${JSON.stringify(body)}`;\n }\n return new ProviderError(provider, msg, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(provider, err.message, { cause: err });\n }\n return new ProviderError(provider, String(err));\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n ImageContent,\n Message,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n TextContent,\n Tool,\n ToolCall,\n ToolResultContent,\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\";\nimport { downgradeUnsupportedImages } from \"./transform.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const downgraded = downgradeUnsupportedImages(options.messages, options.supportsImages);\n const { system, input } = toCodexInput(downgraded, { supportsImages: options.supportsImages });\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 // Friendly hint for codex-mini-latest requiring Pro/Max subscription\n if (response.status === 404 && text.includes(\"does not exist\")) {\n message +=\n `\\n\\nHint: codex-mini-latest requires an OpenAI Pro ($200/mo) or Max subscription. ` +\n `GPT-5.4 and GPT-5.4 Mini work with any active ChatGPT plan.`;\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 yield { 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 yield { 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 yield {\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 yield {\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 yield { type: \"done\", stopReason };\n return 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 codexToolResultText(content: ToolResultContent): string {\n if (typeof content === \"string\") return content;\n return content\n .filter((b): b is TextContent => b.type === \"text\")\n .map((b) => b.text)\n .join(\"\\n\");\n}\n\nfunction toCodexInput(\n messages: Message[],\n options?: { supportsImages?: boolean },\n): { 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 const toolImages: ImageContent[] = [];\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n const text = codexToolResultText(result.content);\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: text.length > 0 ? text : \"(see attached image)\",\n });\n if (options?.supportsImages !== false && Array.isArray(result.content)) {\n for (const block of result.content) {\n if (block.type === \"image\") toolImages.push(block);\n }\n }\n }\n if (toolImages.length > 0) {\n input.push({\n type: \"message\",\n role: \"user\",\n content: [\n { type: \"input_text\", text: \"Attached image(s) from tool result:\" },\n ...toolImages.map((img) => ({\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${img.mediaType};base64,${img.data}`,\n })),\n ],\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","import type { StreamOptions } from \"./types.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\n\n/**\n * A provider stream function. Takes StreamOptions and returns a StreamResult.\n * Each provider implements this to handle its specific API format.\n */\nexport type ProviderStreamFn = (options: StreamOptions) => StreamResult;\n\n/**\n * Registry entry for a provider. A provider can have a simple stream function\n * or a more complex setup with custom routing logic.\n */\nexport interface ProviderEntry {\n /** Main stream function for this provider */\n stream: ProviderStreamFn;\n}\n\n/**\n * Map-based provider registry. Built-in providers are registered at module load,\n * and extensions can register custom providers at runtime.\n */\nclass ProviderRegistryImpl {\n private providers = new Map<string, ProviderEntry>();\n\n /**\n * Register a provider. Overwrites any existing provider with the same name.\n *\n * ```ts\n * import { providerRegistry } from \"@kenkaiiii/gg-ai\";\n *\n * providerRegistry.register(\"deepseek\", {\n * stream: (options) => streamOpenAI({ ...options, baseUrl: \"https://api.deepseek.com/v1\" }),\n * });\n * ```\n */\n register(name: string, entry: ProviderEntry): void {\n this.providers.set(name, entry);\n }\n\n /** Remove a registered provider. */\n unregister(name: string): boolean {\n return this.providers.delete(name);\n }\n\n /** Get a provider entry by name. */\n get(name: string): ProviderEntry | undefined {\n return this.providers.get(name);\n }\n\n /** Check if a provider is registered. */\n has(name: string): boolean {\n return this.providers.has(name);\n }\n\n /** List all registered provider names. */\n list(): string[] {\n return [...this.providers.keys()];\n }\n}\n\n/** Global provider registry. Import this to register custom providers. */\nexport const providerRegistry = new ProviderRegistryImpl();\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\";\nimport { providerRegistry } from \"./provider-registry.js\";\n\n/** Z.AI coding API endpoint — the primary endpoint for all GLM models. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\n});\n\nproviderRegistry.register(\"xiaomi\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://token-plan-sgp.xiaomimimo.com/v1\",\n webSearch: false,\n }),\n});\n\nproviderRegistry.register(\"openai\", {\n stream: (options) => {\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n },\n});\n\nproviderRegistry.register(\"glm\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? GLM_CODING_BASE_URL,\n }),\n});\n\nproviderRegistry.register(\"moonshot\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n }),\n});\n\nproviderRegistry.register(\"openrouter\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://openrouter.ai/api/v1\",\n }),\n});\n\nproviderRegistry.register(\"minimax\", {\n stream: (options) =>\n streamAnthropic({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.minimax.io/anthropic\",\n // MiniMax's Anthropic-compatible API does not support Anthropic-specific\n // server tools (web_search), context_management, or server-side tools.\n webSearch: false,\n compaction: false,\n clearToolUses: false,\n serverTools: undefined,\n }),\n});\n\n// ── Public API ─────────────────────────────────────────────\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 * Providers are resolved via the provider registry. Built-in providers\n * (anthropic, openai, glm, moonshot) are registered at module load.\n * Extensions can register custom providers via `providerRegistry.register()`.\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 const entry = providerRegistry.get(options.provider);\n if (!entry) {\n throw new GGAIError(\n `Unknown provider: \"${options.provider}\". Registered: ${providerRegistry.list().join(\", \")}`,\n );\n }\n return entry.stream(options);\n}\n","import type {\n AssistantMessage,\n ContentPart,\n Message,\n StopReason,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n Usage,\n} from \"../types.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { providerRegistry } from \"../provider-registry.js\";\n\n// ── Response Types ────────────────────────────────────────\n\nexport interface PalsuProviderState {\n callCount: number;\n}\n\nexport type PalsuResponseFactory = (\n messages: Message[],\n options: StreamOptions,\n state: PalsuProviderState,\n) => AssistantMessage | Promise<AssistantMessage>;\n\nexport type PalsuResponse = AssistantMessage | PalsuResponseFactory;\n\n// ── Helper Constructors ──────────────��────────────────────\n\n/** Create an assistant message with a single text block. */\nexport function palsuText(text: string): AssistantMessage {\n return { role: \"assistant\", content: text ? [{ type: \"text\", text }] : [] };\n}\n\n/** Create an assistant message with a thinking block and optional text reply. */\nexport function palsuThinking(thinking: string, text?: string): AssistantMessage {\n const content: ContentPart[] = [{ type: \"thinking\", text: thinking }];\n if (text) content.push({ type: \"text\", text });\n return { role: \"assistant\", content };\n}\n\n/** Create an assistant message with a single tool call. */\nexport function palsuToolCall(\n name: string,\n args: Record<string, unknown>,\n id?: string,\n): AssistantMessage {\n return {\n role: \"assistant\",\n content: [{ type: \"tool_call\", id: id ?? `palsu_${name}_${Date.now()}`, name, args }],\n };\n}\n\n/** Create an assistant message from content parts with optional stop reason. */\nexport function palsuAssistantMessage(\n content: ContentPart[],\n options?: { stopReason?: StopReason },\n): AssistantMessage & { _stopReason?: StopReason } {\n return { role: \"assistant\", content, _stopReason: options?.stopReason };\n}\n\n// ── Streaming Simulation ────────────���─────────────────────\n\nconst DEFAULT_CHUNK_SIZE = 20;\n\nfunction chunkText(text: string, size: number): string[] {\n const chunks: string[] = [];\n for (let i = 0; i < text.length; i += size) {\n chunks.push(text.slice(i, i + size));\n }\n return chunks.length > 0 ? chunks : [\"\"];\n}\n\ninterface CacheUsage {\n cacheRead: number;\n cacheWrite: number;\n}\n\nasync function* simulateStream(\n message: AssistantMessage,\n stopReason: StopReason,\n signal?: AbortSignal,\n cacheUsage?: CacheUsage,\n): AsyncGenerator<StreamEvent, StreamResponse> {\n if (signal?.aborted) {\n throw new Error(\"aborted\");\n }\n\n const content =\n typeof message.content === \"string\"\n ? message.content\n ? [{ type: \"text\" as const, text: message.content }]\n : []\n : message.content;\n\n let outputChars = 0;\n\n for (const part of content) {\n if (signal?.aborted) {\n throw new Error(\"aborted\");\n }\n\n if (part.type === \"text\") {\n const chunks = chunkText(part.text, DEFAULT_CHUNK_SIZE);\n for (const chunk of chunks) {\n yield { type: \"text_delta\", text: chunk };\n outputChars += chunk.length;\n }\n } else if (part.type === \"thinking\") {\n yield { type: \"thinking_delta\", text: part.text };\n outputChars += part.text.length;\n } else if (part.type === \"tool_call\") {\n const argsJson = JSON.stringify(part.args);\n yield { type: \"toolcall_delta\", id: part.id, name: part.name, argsJson };\n yield { type: \"toolcall_done\", id: part.id, name: part.name, args: part.args };\n outputChars += argsJson.length;\n }\n }\n\n // Rough token estimate: ~4 chars per token\n const outputTokens = Math.max(1, Math.ceil(outputChars / 4));\n const usage: Usage = {\n inputTokens: 100,\n outputTokens,\n ...(cacheUsage?.cacheRead ? { cacheRead: cacheUsage.cacheRead } : {}),\n ...(cacheUsage?.cacheWrite ? { cacheWrite: cacheUsage.cacheWrite } : {}),\n };\n\n yield { type: \"done\", stopReason };\n return { message, stopReason, usage };\n}\n\n// ── Prompt Cache Simulation ���─────────────────────────────\n\nfunction computeCacheUsage(current: string, previous: string | null): CacheUsage {\n if (!previous) {\n // First call — everything is a cache write\n return { cacheRead: 0, cacheWrite: Math.ceil(current.length / 4) };\n }\n // Find common prefix length\n const maxLen = Math.min(current.length, previous.length);\n let commonLen = 0;\n for (let i = 0; i < maxLen; i++) {\n if (current[i] !== previous[i]) break;\n commonLen++;\n }\n return {\n cacheRead: Math.ceil(commonLen / 4),\n cacheWrite: Math.ceil((current.length - commonLen) / 4),\n };\n}\n\n// ── Model Config ─────────────────────────────────────────\n\nexport interface PalsuModelConfig {\n /** Default response for this model when its queue is empty. */\n defaultResponse?: PalsuResponse;\n}\n\ninterface ModelState {\n responses: PalsuResponse[];\n defaultResponse?: PalsuResponse;\n}\n\n// ── Registration Handle ───────────────────────────────────\n\nexport interface PalsuModelHandle {\n /** Replace this model's response queue. */\n setResponses(responses: PalsuResponse[]): void;\n /** Append responses to this model's queue. */\n appendResponses(...responses: PalsuResponse[]): void;\n /** Number of unconsumed responses in this model's queue. */\n getPendingResponseCount(): number;\n}\n\nexport interface PalsuProviderHandle {\n /** Replace the shared response queue entirely. */\n setResponses(responses: PalsuResponse[]): void;\n /** Append responses to the shared queue. */\n appendResponses(...responses: PalsuResponse[]): void;\n /** Number of unconsumed responses in the shared queue. */\n getPendingResponseCount(): number;\n /** Mutable state — tracks call count. */\n state: PalsuProviderState;\n /** Get a handle for a model-specific response queue. */\n getModel(name: string): PalsuModelHandle;\n /** Remove this provider from the registry. */\n unregister(): void;\n}\n\nexport interface PalsuProviderConfig {\n /** Provider name to register under. Default: \"palsu\". */\n name?: string;\n /** Response returned when all queues are empty. Default: empty text message. */\n defaultResponse?: PalsuResponse;\n /** Enable prompt cache simulation. Tracks common message prefixes across calls. */\n promptCache?: boolean;\n /** Model-specific configurations with per-model response queues. */\n models?: Record<string, PalsuModelConfig>;\n}\n\n// ── Main Registration Function ────────────────────────────\n\n/**\n * Register a palsu (mock) LLM provider for testing.\n * Returns a handle to control responses and inspect state.\n *\n * ```ts\n * const palsu = registerPalsuProvider();\n * palsu.appendResponses(palsuText(\"Hello!\"));\n *\n * const result = await stream({ provider: \"palsu\", model: \"test\", messages });\n * console.log(result.message); // { role: \"assistant\", content: [{ type: \"text\", text: \"Hello!\" }] }\n *\n * palsu.unregister(); // cleanup\n * ```\n */\nexport function registerPalsuProvider(config?: PalsuProviderConfig): PalsuProviderHandle {\n const name = config?.name ?? \"palsu\";\n const responses: PalsuResponse[] = [];\n const state: PalsuProviderState = { callCount: 0 };\n const defaultResponse = config?.defaultResponse ?? palsuText(\"\");\n const enableCache = config?.promptCache ?? false;\n let lastMessagesSerialized: string | null = null;\n\n // Initialize model-specific state\n const modelStates = new Map<string, ModelState>();\n if (config?.models) {\n for (const [modelName, modelConfig] of Object.entries(config.models)) {\n modelStates.set(modelName, {\n responses: [],\n defaultResponse: modelConfig.defaultResponse,\n });\n }\n }\n\n const handle: PalsuProviderHandle = {\n setResponses(r) {\n responses.length = 0;\n responses.push(...r);\n },\n appendResponses(...r) {\n responses.push(...r);\n },\n getPendingResponseCount() {\n return responses.length;\n },\n state,\n getModel(modelName: string): PalsuModelHandle {\n if (!modelStates.has(modelName)) {\n modelStates.set(modelName, { responses: [] });\n }\n const ms = modelStates.get(modelName)!;\n return {\n setResponses(r) {\n ms.responses.length = 0;\n ms.responses.push(...r);\n },\n appendResponses(...r) {\n ms.responses.push(...r);\n },\n getPendingResponseCount() {\n return ms.responses.length;\n },\n };\n },\n unregister() {\n providerRegistry.unregister(name);\n },\n };\n\n providerRegistry.register(name, {\n stream(options: StreamOptions): StreamResult {\n state.callCount++;\n\n // Resolve response: model-specific queue → shared queue → model default → shared default\n const ms = modelStates.get(options.model);\n const responseDef =\n (ms && ms.responses.length > 0 ? ms.responses.shift() : undefined) ??\n (responses.length > 0 ? responses.shift() : undefined) ??\n ms?.defaultResponse ??\n defaultResponse;\n\n // Compute cache usage before streaming (needs messages serialized)\n let cacheUsage: CacheUsage | undefined;\n if (enableCache) {\n const serialized = JSON.stringify(options.messages);\n cacheUsage = computeCacheUsage(serialized, lastMessagesSerialized);\n lastMessagesSerialized = serialized;\n }\n\n const gen = (async function* (): AsyncGenerator<StreamEvent, StreamResponse> {\n // Resolve factory (sync or async) then stream\n const rawMessage =\n typeof responseDef === \"function\"\n ? responseDef(options.messages, options, state)\n : responseDef;\n const message = await Promise.resolve(rawMessage);\n\n const hasToolCalls =\n Array.isArray(message.content) && message.content.some((p) => p.type === \"tool_call\");\n const explicitStop = (message as { _stopReason?: StopReason })._stopReason;\n const stopReason = explicitStop ?? (hasToolCalls ? \"tool_use\" : \"end_turn\");\n\n return yield* simulateStream(message, stopReason, options.signal, cacheUsage);\n })();\n\n return new StreamResult(gen);\n },\n });\n\n return handle;\n}\n"],"mappings":"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","names":["Anthropic","stream","createClient","OpenAI","runStream","toError","stream","runStream","os"]}
|