@kenkaiiii/gg-ai 4.2.50 → 4.2.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -185,6 +185,7 @@ function toAnthropicMessages(messages, cacheControl) {
185
185
  if (msg.role === "assistant") {
186
186
  const content = typeof msg.content === "string" ? msg.content : msg.content.filter((part) => {
187
187
  if (part.type === "thinking" && !part.signature) return false;
188
+ if (part.type === "text" && !part.text) return false;
188
189
  return true;
189
190
  }).map((part) => {
190
191
  if (part.type === "text") return { type: "text", text: part.text };
@@ -207,8 +208,8 @@ function toAnthropicMessages(messages, cacheControl) {
207
208
  if (part.type === "server_tool_result")
208
209
  return part.data;
209
210
  if (part.type === "raw") return part.data;
210
- return { type: "text", text: "" };
211
- });
211
+ return null;
212
+ }).filter(Boolean);
212
213
  out.push({ role: "assistant", content });
213
214
  continue;
214
215
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/utils/event-stream.ts","../src/providers/anthropic.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"],"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","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 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 * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(isOAuth\n ? {\n defaultHeaders: {\n \"user-agent\": \"claude-cli/2.1.75\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\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 ...(options.compaction\n ? { context_management: { edits: [{ type: \"compact_20260112\" }] } }\n : {}),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for\n * provider tool parameter definitions.\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = z.toJSONSchema(schema);\n // Remove $schema and other meta keys providers don't want\n const { $schema: _schema, ...rest } = jsonSchema as Record<string, unknown>;\n return rest;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part) => {\n // Strip thinking blocks without a valid signature (e.g. from GLM/OpenAI)\n // — Anthropic rejects empty signatures\n if (part.type === \"thinking\" && !part.signature) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\")\n return { type: \"thinking\", thinking: part.text, signature: part.signature! };\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // image content shouldn't appear in assistant messages\n return { type: \"text\", text: \"\" };\n });\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match OpenAI's expected prefix.\n * Anthropic uses `toolu_*` IDs which OpenAI rejects — we need `call_*` prefixed IDs.\n * The mapping is consistent within a single conversion so assistant tool_call IDs\n * match their corresponding tool result references.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"call_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string },\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 assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n const providerName = options.provider ?? \"openai\";\n runStream(options, result).catch((err) => result.abort(toError(err, providerName)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages, { provider: options.provider });\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: true,\n ...(options.maxTokens ? { max_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 stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown, 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 // 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 StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport 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 { 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 has two API systems — some accounts work on one, some on the other. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\nconst GLM_REGULAR_BASE_URL = \"https://api.z.ai/api/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\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 if (options.baseUrl) return streamOpenAI(options);\n return streamGLMWithFallback(options);\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\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\n// ── GLM fallback logic ────────────────────────────────────\n\n/**\n * Try the coding endpoint first; if it fails for any reason, retry with the\n * regular endpoint. Z.AI inconsistently provisions accounts — some work on\n * /api/coding/paas/v4, others on /api/paas/v4, even on the same plan.\n */\nfunction streamGLMWithFallback(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n\n runGLMWithFallback(options, result).catch((err) => {\n result.abort(err instanceof Error ? err : new Error(String(err)));\n });\n\n return result;\n}\n\nasync function runGLMWithFallback(options: StreamOptions, result: StreamResult): Promise<void> {\n const codingResult = streamOpenAI({ ...options, baseUrl: GLM_CODING_BASE_URL });\n\n try {\n for await (const event of codingResult) {\n result.push(event);\n }\n result.complete(await codingResult.response);\n } catch {\n // Coding endpoint failed — try regular endpoint\n const regularResult = streamOpenAI({ ...options, baseUrl: GLM_REGULAR_BASE_URL });\n try {\n for await (const event of regularResult) {\n result.push(event);\n }\n result.complete(await regularResult.response);\n } catch (fallbackErr) {\n result.abort(fallbackErr instanceof Error ? fallbackErr : new Error(String(fallbackErr)));\n }\n }\n}\n"],"mappings":"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","names":["Anthropic","stream","runStream","toError","OpenAI","stream","runStream","toError","os"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/utils/event-stream.ts","../src/providers/anthropic.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"],"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","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 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 * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(isOAuth\n ? {\n defaultHeaders: {\n \"user-agent\": \"claude-cli/2.1.75\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\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 ...(options.compaction\n ? { context_management: { edits: [{ type: \"compact_20260112\" }] } }\n : {}),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import { 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 out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match OpenAI's expected prefix.\n * Anthropic uses `toolu_*` IDs which OpenAI rejects — we need `call_*` prefixed IDs.\n * The mapping is consistent within a single conversion so assistant tool_call IDs\n * match their corresponding tool result references.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"call_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string },\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 assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n const providerName = options.provider ?? \"openai\";\n runStream(options, result).catch((err) => result.abort(toError(err, providerName)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages, { provider: options.provider });\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: true,\n ...(options.maxTokens ? { max_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 stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown, 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 // 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 StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport 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 { 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 has two API systems — some accounts work on one, some on the other. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\nconst GLM_REGULAR_BASE_URL = \"https://api.z.ai/api/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\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 if (options.baseUrl) return streamOpenAI(options);\n return streamGLMWithFallback(options);\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\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\n// ── GLM fallback logic ────────────────────────────────────\n\n/**\n * Try the coding endpoint first; if it fails for any reason, retry with the\n * regular endpoint. Z.AI inconsistently provisions accounts — some work on\n * /api/coding/paas/v4, others on /api/paas/v4, even on the same plan.\n */\nfunction streamGLMWithFallback(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n\n runGLMWithFallback(options, result).catch((err) => {\n result.abort(err instanceof Error ? err : new Error(String(err)));\n });\n\n return result;\n}\n\nasync function runGLMWithFallback(options: StreamOptions, result: StreamResult): Promise<void> {\n const codingResult = streamOpenAI({ ...options, baseUrl: GLM_CODING_BASE_URL });\n\n try {\n for await (const event of codingResult) {\n result.push(event);\n }\n result.complete(await codingResult.response);\n } catch {\n // Coding endpoint failed — try regular endpoint\n const regularResult = streamOpenAI({ ...options, baseUrl: GLM_REGULAR_BASE_URL });\n try {\n for await (const event of regularResult) {\n result.push(event);\n }\n result.complete(await regularResult.response);\n } catch (fallbackErr) {\n result.abort(fallbackErr instanceof Error ? fallbackErr : new Error(String(fallbackErr)));\n }\n }\n}\n"],"mappings":"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","names":["Anthropic","stream","runStream","toError","OpenAI","stream","runStream","toError","os"]}
package/dist/index.js CHANGED
@@ -144,6 +144,7 @@ function toAnthropicMessages(messages, cacheControl) {
144
144
  if (msg.role === "assistant") {
145
145
  const content = typeof msg.content === "string" ? msg.content : msg.content.filter((part) => {
146
146
  if (part.type === "thinking" && !part.signature) return false;
147
+ if (part.type === "text" && !part.text) return false;
147
148
  return true;
148
149
  }).map((part) => {
149
150
  if (part.type === "text") return { type: "text", text: part.text };
@@ -166,8 +167,8 @@ function toAnthropicMessages(messages, cacheControl) {
166
167
  if (part.type === "server_tool_result")
167
168
  return part.data;
168
169
  if (part.type === "raw") return part.data;
169
- return { type: "text", text: "" };
170
- });
170
+ return null;
171
+ }).filter(Boolean);
171
172
  out.push({ role: "assistant", content });
172
173
  continue;
173
174
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/utils/event-stream.ts","../src/providers/anthropic.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"],"sourcesContent":["export class GGAIError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"GGAIError\";\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: { statusCode?: number; cause?: unknown },\n ) {\n super(`[${provider}] ${message}`, { cause: options?.cause });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n }\n}\n","import 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 * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(isOAuth\n ? {\n defaultHeaders: {\n \"user-agent\": \"claude-cli/2.1.75\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\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 ...(options.compaction\n ? { context_management: { edits: [{ type: \"compact_20260112\" }] } }\n : {}),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for\n * provider tool parameter definitions.\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = z.toJSONSchema(schema);\n // Remove $schema and other meta keys providers don't want\n const { $schema: _schema, ...rest } = jsonSchema as Record<string, unknown>;\n return rest;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part) => {\n // Strip thinking blocks without a valid signature (e.g. from GLM/OpenAI)\n // — Anthropic rejects empty signatures\n if (part.type === \"thinking\" && !part.signature) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\")\n return { type: \"thinking\", thinking: part.text, signature: part.signature! };\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // image content shouldn't appear in assistant messages\n return { type: \"text\", text: \"\" };\n });\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match OpenAI's expected prefix.\n * Anthropic uses `toolu_*` IDs which OpenAI rejects — we need `call_*` prefixed IDs.\n * The mapping is consistent within a single conversion so assistant tool_call IDs\n * match their corresponding tool result references.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"call_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string },\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 assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n const providerName = options.provider ?? \"openai\";\n runStream(options, result).catch((err) => result.abort(toError(err, providerName)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages, { provider: options.provider });\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: true,\n ...(options.maxTokens ? { max_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 stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown, 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 // 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 StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport 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 { 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 has two API systems — some accounts work on one, some on the other. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\nconst GLM_REGULAR_BASE_URL = \"https://api.z.ai/api/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\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 if (options.baseUrl) return streamOpenAI(options);\n return streamGLMWithFallback(options);\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\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\n// ── GLM fallback logic ────────────────────────────────────\n\n/**\n * Try the coding endpoint first; if it fails for any reason, retry with the\n * regular endpoint. Z.AI inconsistently provisions accounts — some work on\n * /api/coding/paas/v4, others on /api/paas/v4, even on the same plan.\n */\nfunction streamGLMWithFallback(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n\n runGLMWithFallback(options, result).catch((err) => {\n result.abort(err instanceof Error ? err : new Error(String(err)));\n });\n\n return result;\n}\n\nasync function runGLMWithFallback(options: StreamOptions, result: StreamResult): Promise<void> {\n const codingResult = streamOpenAI({ ...options, baseUrl: GLM_CODING_BASE_URL });\n\n try {\n for await (const event of codingResult) {\n result.push(event);\n }\n result.complete(await codingResult.response);\n } catch {\n // Coding endpoint failed — try regular endpoint\n const regularResult = streamOpenAI({ ...options, baseUrl: GLM_REGULAR_BASE_URL });\n try {\n for await (const event of regularResult) {\n result.push(event);\n }\n result.complete(await regularResult.response);\n } catch (fallbackErr) {\n result.abort(fallbackErr instanceof Error ? fallbackErr : new Error(String(fallbackErr)));\n }\n }\n}\n"],"mappings":"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","names":["stream","runStream","toError","stream","runStream","toError"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/utils/event-stream.ts","../src/providers/anthropic.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"],"sourcesContent":["export class GGAIError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"GGAIError\";\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: { statusCode?: number; cause?: unknown },\n ) {\n super(`[${provider}] ${message}`, { cause: options?.cause });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n }\n}\n","import 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 * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(isOAuth\n ? {\n defaultHeaders: {\n \"user-agent\": \"claude-cli/2.1.75\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\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 ...(options.compaction\n ? { context_management: { edits: [{ type: \"compact_20260112\" }] } }\n : {}),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import { 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 out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match OpenAI's expected prefix.\n * Anthropic uses `toolu_*` IDs which OpenAI rejects — we need `call_*` prefixed IDs.\n * The mapping is consistent within a single conversion so assistant tool_call IDs\n * match their corresponding tool result references.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"call_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string },\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 assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n const providerName = options.provider ?? \"openai\";\n runStream(options, result).catch((err) => result.abort(toError(err, providerName)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages, { provider: options.provider });\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: true,\n ...(options.maxTokens ? { max_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 stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown, 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 // 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 StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport 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 { 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 has two API systems — some accounts work on one, some on the other. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\nconst GLM_REGULAR_BASE_URL = \"https://api.z.ai/api/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\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 if (options.baseUrl) return streamOpenAI(options);\n return streamGLMWithFallback(options);\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\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\n// ── GLM fallback logic ────────────────────────────────────\n\n/**\n * Try the coding endpoint first; if it fails for any reason, retry with the\n * regular endpoint. Z.AI inconsistently provisions accounts — some work on\n * /api/coding/paas/v4, others on /api/paas/v4, even on the same plan.\n */\nfunction streamGLMWithFallback(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n\n runGLMWithFallback(options, result).catch((err) => {\n result.abort(err instanceof Error ? err : new Error(String(err)));\n });\n\n return result;\n}\n\nasync function runGLMWithFallback(options: StreamOptions, result: StreamResult): Promise<void> {\n const codingResult = streamOpenAI({ ...options, baseUrl: GLM_CODING_BASE_URL });\n\n try {\n for await (const event of codingResult) {\n result.push(event);\n }\n result.complete(await codingResult.response);\n } catch {\n // Coding endpoint failed — try regular endpoint\n const regularResult = streamOpenAI({ ...options, baseUrl: GLM_REGULAR_BASE_URL });\n try {\n for await (const event of regularResult) {\n result.push(event);\n }\n result.complete(await regularResult.response);\n } catch (fallbackErr) {\n result.abort(fallbackErr instanceof Error ? fallbackErr : new Error(String(fallbackErr)));\n }\n }\n}\n"],"mappings":"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","names":["stream","runStream","toError","stream","runStream","toError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kenkaiiii/gg-ai",
3
- "version": "4.2.50",
3
+ "version": "4.2.52",
4
4
  "type": "module",
5
5
  "description": "Unified LLM streaming API for Anthropic and OpenAI",
6
6
  "license": "MIT",