@ljoukov/llm 0.1.0
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/LICENSE +21 -0
- package/README.md +195 -0
- package/dist/index.cjs +3470 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +252 -0
- package/dist/index.d.ts +252 -0
- package/dist/index.js +3412 -0
- package/dist/index.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/llm.ts","../src/utils/asyncQueue.ts","../src/google/pricing.ts","../src/openai/pricing.ts","../src/utils/cost.ts","../src/openai/chatgpt-codex.ts","../src/openai/chatgpt-auth.ts","../src/utils/env.ts","../src/utils/scheduler.ts","../src/google/client.ts","../src/google/auth.ts","../src/google/calls.ts","../src/openai/client.ts","../src/openai/calls.ts"],"sourcesContent":["export {\n appendMarkdownSourcesSection,\n convertGooglePartsToLlmParts,\n estimateCallCostUsd,\n generateImageInBatches,\n generateImages,\n generateJson,\n generateText,\n getCurrentToolCallContext,\n LlmJsonCallError,\n parseJsonFromLlmText,\n runToolLoop,\n sanitisePartForLogging,\n streamText,\n stripCodexCitationMarkers,\n toGeminiJsonSchema,\n tool,\n} from \"./llm.js\";\n\nexport type {\n JsonSchema,\n LlmBaseRequest,\n LlmBlockedEvent,\n LlmContent,\n LlmContentPart,\n LlmExecutableTool,\n LlmImageData,\n LlmImageSize,\n LlmInput,\n LlmJsonRequest,\n LlmModelEvent,\n LlmProvider,\n LlmStreamEvent,\n LlmTextDeltaEvent,\n LlmTextRequest,\n LlmTextResult,\n LlmTextStream,\n LlmToolCallContext,\n LlmToolCallResult,\n LlmToolConfig,\n LlmToolLoopRequest,\n LlmToolLoopResult,\n LlmToolLoopStep,\n LlmToolSet,\n LlmUsageEvent,\n LlmUsageTokens,\n LlmWebSearchMode,\n} from \"./llm.js\";\n\nexport { loadEnvFromFile, loadLocalEnv } from \"./utils/env.js\";\n\nexport {\n encodeChatGptAuthJson,\n encodeChatGptAuthJsonB64,\n exchangeChatGptOauthCode,\n getChatGptAuthProfile,\n refreshChatGptOauthToken,\n} from \"./openai/chatgpt-auth.js\";\nexport type { ChatGptAuthProfile } from \"./openai/chatgpt-auth.js\";\n\nexport { configureGemini, isGeminiModelId } from \"./google/gemini.js\";\nexport type { GeminiModelId } from \"./google/gemini.js\";\n","import { Buffer } from \"node:buffer\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { randomBytes } from \"node:crypto\";\n\nimport {\n FinishReason,\n FunctionCallingConfigMode,\n type Content as GeminiContent,\n type GenerateContentConfig,\n type GroundingMetadata,\n type Part as GeminiPart,\n type Tool as GeminiTool,\n} from \"@google/genai\";\nimport { zodToJsonSchema } from \"@alcyone-labs/zod-to-json-schema\";\nimport { z } from \"zod\";\nimport type { ResponseTextConfig } from \"openai/resources/responses/responses\";\n\nimport { createAsyncQueue, type AsyncQueue } from \"./utils/asyncQueue.js\";\nimport { estimateCallCostUsd, type LlmUsageTokens } from \"./utils/cost.js\";\nimport { collectChatGptCodexResponse, type ChatGptInputItem } from \"./openai/chatgpt-codex.js\";\nimport { runGeminiCall } from \"./google/calls.js\";\nimport {\n runOpenAiCall,\n type OpenAiReasoningEffort,\n DEFAULT_OPENAI_REASONING_EFFORT,\n} from \"./openai/calls.js\";\n\nexport type { LlmUsageTokens } from \"./utils/cost.js\";\nexport { estimateCallCostUsd } from \"./utils/cost.js\";\n\nexport type LlmToolCallContext = {\n readonly toolName: string;\n readonly toolId: string;\n readonly turn: number;\n readonly toolIndex: number;\n};\n\nconst toolCallContextStorage = new AsyncLocalStorage<LlmToolCallContext>();\n\nexport function getCurrentToolCallContext(): LlmToolCallContext | null {\n return toolCallContextStorage.getStore() ?? null;\n}\n\nexport type JsonSchema = Record<string, unknown>;\n\nexport type LlmRole = \"user\" | \"model\" | \"system\" | \"tool\";\n\ntype LlmInlineDataPart = {\n type: \"inlineData\";\n data: string;\n mimeType?: string;\n};\n\nexport type LlmContentPart = { type: \"text\"; text: string; thought?: boolean } | LlmInlineDataPart;\n\nexport type LlmContent = {\n readonly role: LlmRole;\n readonly parts: readonly LlmContentPart[];\n};\n\nexport type LlmImageSize = \"1K\" | \"2K\" | \"4K\";\n\nexport type LlmWebSearchMode = \"cached\" | \"live\";\n\nexport type LlmToolConfig =\n | { readonly type: \"web-search\"; readonly mode?: LlmWebSearchMode }\n | { readonly type: \"code-execution\" };\n\nexport type LlmTextDeltaEvent =\n | { readonly type: \"delta\"; readonly channel: \"response\"; readonly text: string }\n | { readonly type: \"delta\"; readonly channel: \"thought\"; readonly text: string };\n\nexport type LlmUsageEvent = {\n readonly type: \"usage\";\n readonly usage: LlmUsageTokens;\n readonly costUsd: number;\n readonly modelVersion: string;\n};\n\nexport type LlmModelEvent = {\n readonly type: \"model\";\n readonly modelVersion: string;\n};\n\nexport type LlmBlockedEvent = {\n readonly type: \"blocked\";\n};\n\nexport type LlmStreamEvent = LlmTextDeltaEvent | LlmUsageEvent | LlmModelEvent | LlmBlockedEvent;\n\nexport type LlmProvider = \"openai\" | \"chatgpt\" | \"gemini\";\n\nexport type LlmTextResult = {\n readonly provider: LlmProvider;\n readonly model: string;\n readonly modelVersion: string;\n readonly content?: LlmContent;\n readonly text: string;\n readonly thoughts: string;\n readonly blocked: boolean;\n readonly usage?: LlmUsageTokens;\n readonly costUsd: number;\n readonly grounding?: GroundingMetadata;\n};\n\nexport type LlmTextStream = {\n readonly events: AsyncIterable<LlmStreamEvent>;\n readonly result: Promise<LlmTextResult>;\n readonly abort: () => void;\n};\n\nexport type LlmInput =\n | { readonly prompt: string; readonly systemPrompt?: string }\n | { readonly contents: readonly LlmContent[] };\n\nexport type LlmBaseRequest = {\n readonly model: string;\n readonly tools?: readonly LlmToolConfig[];\n readonly responseMimeType?: string;\n readonly responseJsonSchema?: JsonSchema;\n readonly responseModalities?: readonly string[];\n readonly imageAspectRatio?: string;\n readonly imageSize?: LlmImageSize;\n readonly openAiReasoningEffort?: OpenAiReasoningEffort;\n readonly openAiTextFormat?: ResponseTextConfig[\"format\"];\n readonly signal?: AbortSignal;\n};\n\nexport type LlmTextRequest = LlmInput & LlmBaseRequest;\n\nexport type LlmJsonRequest<T> = LlmInput &\n LlmBaseRequest & {\n readonly schema: z.ZodType<T>;\n readonly openAiSchemaName?: string;\n readonly maxAttempts?: number;\n readonly normalizeJson?: (value: unknown) => unknown;\n };\n\nexport class LlmJsonCallError extends Error {\n constructor(\n message: string,\n readonly attempts: ReadonlyArray<{\n readonly attempt: number;\n readonly rawText: string;\n readonly error: unknown;\n }>,\n ) {\n super(message);\n this.name = \"LlmJsonCallError\";\n }\n}\n\nexport type LlmImageData = {\n readonly mimeType?: string;\n readonly data: Buffer;\n};\n\nexport type LlmGenerateImagesRequest = {\n readonly model: string; // e.g. \"gemini-3-pro-image-preview\"\n readonly stylePrompt: string;\n readonly styleImages?: readonly LlmImageData[];\n readonly imagePrompts: readonly string[];\n readonly imageGradingPrompt: string;\n readonly maxAttempts?: number;\n readonly imageAspectRatio?: string;\n readonly imageSize?: LlmImageSize;\n readonly signal?: AbortSignal;\n};\n\nexport type LlmExecutableTool<Schema extends z.ZodType, Output> = {\n readonly description?: string;\n readonly inputSchema: Schema;\n readonly execute: (input: z.output<Schema>) => Promise<Output> | Output;\n};\n\nexport type LlmToolSet = Record<string, LlmExecutableTool<z.ZodType, unknown>>;\n\nexport function tool<Schema extends z.ZodType, Output>(options: {\n readonly description?: string;\n readonly inputSchema: Schema;\n readonly execute: (input: z.output<Schema>) => Promise<Output> | Output;\n}): LlmExecutableTool<Schema, Output> {\n return options;\n}\n\nexport type LlmToolCallResult = {\n readonly toolName: string;\n readonly input: unknown;\n readonly output: unknown;\n readonly error?: string;\n readonly callId?: string;\n};\n\nexport type LlmToolLoopStep = {\n readonly step: number;\n readonly modelVersion: string;\n readonly text?: string;\n readonly thoughts?: string;\n readonly toolCalls: readonly LlmToolCallResult[];\n readonly usage?: LlmUsageTokens;\n readonly costUsd: number;\n};\n\nexport type LlmToolLoopResult = {\n readonly text: string;\n readonly thoughts: string;\n readonly steps: readonly LlmToolLoopStep[];\n readonly totalCostUsd: number;\n};\n\nexport type LlmToolLoopRequest = LlmInput & {\n readonly model: string;\n readonly tools: LlmToolSet;\n readonly modelTools?: readonly LlmToolConfig[];\n readonly maxSteps?: number;\n readonly openAiReasoningEffort?: OpenAiReasoningEffort;\n readonly onEvent?: (event: LlmStreamEvent) => void;\n readonly signal?: AbortSignal;\n};\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction applyNullableJsonSchema(schema: Record<string, unknown>): void {\n const anyOf = schema.anyOf;\n if (Array.isArray(anyOf)) {\n if (!anyOf.some((entry) => isPlainRecord(entry) && entry.type === \"null\")) {\n anyOf.push({ type: \"null\" });\n }\n return;\n }\n const type = schema.type;\n if (typeof type === \"string\") {\n schema.type = type === \"null\" ? \"null\" : [type, \"null\"];\n return;\n }\n if (Array.isArray(type)) {\n const normalized = type.filter((entry): entry is string => typeof entry === \"string\");\n if (!normalized.includes(\"null\")) {\n schema.type = [...normalized, \"null\"];\n } else {\n schema.type = normalized;\n }\n return;\n }\n schema.type = [\"null\"];\n}\n\nfunction orderedJsonSchemaKeys(\n properties: Record<string, unknown>,\n ordering: readonly string[] | undefined,\n): string[] {\n const keys = Object.keys(properties);\n if (!ordering || ordering.length === 0) {\n return keys;\n }\n const ordered: string[] = [];\n const seen = new Set<string>();\n for (const key of ordering) {\n if (Object.hasOwn(properties, key)) {\n ordered.push(key);\n seen.add(key);\n }\n }\n for (const key of keys) {\n if (!seen.has(key)) {\n ordered.push(key);\n }\n }\n return ordered;\n}\n\nfunction addGeminiPropertyOrdering(schema: JsonSchema): JsonSchema {\n if (!isPlainRecord(schema)) {\n return schema;\n }\n if (typeof schema.$ref === \"string\") {\n return { $ref: schema.$ref };\n }\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (key === \"properties\") {\n continue;\n }\n if (key === \"items\") {\n output.items = isPlainRecord(value) ? addGeminiPropertyOrdering(value as JsonSchema) : value;\n continue;\n }\n if (key === \"anyOf\" || key === \"oneOf\") {\n output[key] = Array.isArray(value)\n ? value.map((entry) => addGeminiPropertyOrdering(entry as JsonSchema))\n : value;\n continue;\n }\n if (key === \"$defs\" && isPlainRecord(value)) {\n const defs: Record<string, unknown> = {};\n for (const [defKey, defValue] of Object.entries(value)) {\n if (isPlainRecord(defValue)) {\n defs[defKey] = addGeminiPropertyOrdering(defValue as JsonSchema);\n }\n }\n output.$defs = defs;\n continue;\n }\n output[key] = value;\n }\n const propertiesRaw = schema.properties;\n if (isPlainRecord(propertiesRaw)) {\n const properties: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(propertiesRaw)) {\n properties[key] = isPlainRecord(value)\n ? addGeminiPropertyOrdering(value as JsonSchema)\n : value;\n }\n output.properties = properties;\n output.propertyOrdering = Object.keys(properties);\n }\n if ((schema as { nullable?: unknown }).nullable) {\n applyNullableJsonSchema(output);\n }\n return output;\n}\n\nfunction normalizeOpenAiSchema(schema: JsonSchema): JsonSchema {\n if (!isPlainRecord(schema)) {\n return schema;\n }\n if (typeof schema.$ref === \"string\") {\n return { $ref: schema.$ref };\n }\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (key === \"properties\") {\n continue;\n }\n if (key === \"required\") {\n continue;\n }\n if (key === \"additionalProperties\") {\n continue;\n }\n if (key === \"propertyOrdering\") {\n continue;\n }\n if (key === \"items\") {\n if (isPlainRecord(value)) {\n output.items = normalizeOpenAiSchema(value);\n }\n continue;\n }\n if (key === \"anyOf\" || key === \"oneOf\") {\n if (Array.isArray(value)) {\n output.anyOf = value.map((entry) => normalizeOpenAiSchema(entry as JsonSchema));\n }\n continue;\n }\n if (key === \"$defs\" && isPlainRecord(value)) {\n const defs: Record<string, unknown> = {};\n for (const [defKey, defValue] of Object.entries(value)) {\n if (isPlainRecord(defValue)) {\n defs[defKey] = normalizeOpenAiSchema(defValue);\n }\n }\n output.$defs = defs;\n continue;\n }\n output[key] = value;\n }\n\n const propertiesRaw = schema.properties;\n if (isPlainRecord(propertiesRaw)) {\n const ordering = Array.isArray((schema as { propertyOrdering?: unknown }).propertyOrdering)\n ? ((schema as { propertyOrdering?: unknown }).propertyOrdering as string[])\n : undefined;\n const orderedKeys = orderedJsonSchemaKeys(propertiesRaw, ordering);\n const properties: Record<string, unknown> = {};\n for (const key of orderedKeys) {\n const value = propertiesRaw[key];\n if (!isPlainRecord(value)) {\n properties[key] = value;\n continue;\n }\n properties[key] = normalizeOpenAiSchema(value as JsonSchema);\n }\n output.properties = properties;\n output.required = orderedKeys;\n output.additionalProperties = false;\n }\n\n const schemaType = (schema as { type?: unknown }).type;\n if (\n output.additionalProperties === undefined &&\n (schemaType === \"object\" || (Array.isArray(schemaType) && schemaType.includes(\"object\")))\n ) {\n output.additionalProperties = false;\n if (!Array.isArray(output.required)) {\n output.required = [];\n }\n }\n\n const normalizeExclusiveBound = (options: {\n exclusiveKey: \"exclusiveMinimum\" | \"exclusiveMaximum\";\n inclusiveKey: \"minimum\" | \"maximum\";\n }): void => {\n const exclusiveValue = output[options.exclusiveKey];\n if (exclusiveValue === false) {\n delete output[options.exclusiveKey];\n return;\n }\n const inclusiveValue = output[options.inclusiveKey];\n if (exclusiveValue === true) {\n if (typeof inclusiveValue === \"number\" && Number.isFinite(inclusiveValue)) {\n output[options.exclusiveKey] = inclusiveValue;\n delete output[options.inclusiveKey];\n } else {\n delete output[options.exclusiveKey];\n }\n return;\n }\n if (typeof exclusiveValue === \"number\" && Number.isFinite(exclusiveValue)) {\n delete output[options.inclusiveKey];\n }\n };\n\n normalizeExclusiveBound({\n exclusiveKey: \"exclusiveMinimum\",\n inclusiveKey: \"minimum\",\n });\n normalizeExclusiveBound({\n exclusiveKey: \"exclusiveMaximum\",\n inclusiveKey: \"maximum\",\n });\n\n return output;\n}\n\nfunction resolveOpenAiSchemaRoot(schema: JsonSchema): JsonSchema {\n if (!isPlainRecord(schema)) {\n return schema;\n }\n if (typeof schema.$ref !== \"string\") {\n return schema;\n }\n const refMatch = /^#\\/(definitions|[$]defs)\\/(.+)$/u.exec(schema.$ref);\n if (!refMatch) {\n return schema;\n }\n const section = refMatch[1];\n const key = refMatch[2];\n if (!section || !key) {\n return schema;\n }\n const defsSource =\n section === \"definitions\"\n ? (schema as { definitions?: unknown }).definitions\n : (schema as { $defs?: unknown }).$defs;\n if (!isPlainRecord(defsSource)) {\n return schema;\n }\n const resolved = defsSource[key];\n if (!isPlainRecord(resolved)) {\n return schema;\n }\n return { ...resolved };\n}\n\nexport function toGeminiJsonSchema(schema: z.ZodType, options?: { name?: string }): JsonSchema {\n const jsonSchema = zodToJsonSchema(schema, {\n name: options?.name,\n target: \"jsonSchema7\",\n }) as JsonSchema;\n return addGeminiPropertyOrdering(resolveOpenAiSchemaRoot(jsonSchema));\n}\n\nfunction isJsonSchemaObject(schema: JsonSchema | undefined): boolean {\n if (!schema || !isPlainRecord(schema)) {\n return false;\n }\n const type = (schema as { type?: unknown }).type;\n if (type === \"object\") {\n return true;\n }\n if (Array.isArray(type) && type.includes(\"object\")) {\n return true;\n }\n if (isPlainRecord((schema as { properties?: unknown }).properties)) {\n return true;\n }\n return false;\n}\n\nexport function sanitisePartForLogging(part: LlmContentPart): unknown {\n switch (part.type) {\n case \"text\":\n return {\n type: \"text\",\n thought: part.thought === true ? true : undefined,\n preview: part.text.slice(0, 200),\n };\n case \"inlineData\": {\n let omittedBytes: number;\n try {\n omittedBytes = Buffer.from(part.data, \"base64\").byteLength;\n } catch {\n omittedBytes = Buffer.byteLength(part.data, \"utf8\");\n }\n return {\n type: \"inlineData\",\n mimeType: part.mimeType,\n data: `[omitted:${omittedBytes}b]`,\n };\n }\n default:\n return \"[unknown part]\";\n }\n}\n\nexport function convertGooglePartsToLlmParts(parts: readonly GeminiPart[]): LlmContentPart[] {\n const result: LlmContentPart[] = [];\n for (const part of parts) {\n if (part.text !== undefined) {\n result.push({\n type: \"text\",\n text: part.text,\n thought: part.thought ? true : undefined,\n });\n continue;\n }\n const inline = part.inlineData;\n if (inline?.data) {\n result.push({\n type: \"inlineData\",\n data: inline.data,\n mimeType: inline.mimeType,\n });\n continue;\n }\n if (part.fileData?.fileUri) {\n throw new Error(\"fileData parts are not supported\");\n }\n }\n return result;\n}\n\nfunction assertLlmRole(value: string | undefined): LlmRole {\n switch (value) {\n case \"user\":\n case \"model\":\n case \"system\":\n case \"tool\":\n return value;\n default:\n throw new Error(`Unsupported LLM role: ${String(value)}`);\n }\n}\n\nfunction convertGeminiContentToLlmContent(content: GeminiContent): LlmContent {\n return {\n role: assertLlmRole(content.role),\n parts: convertGooglePartsToLlmParts(content.parts ?? []),\n };\n}\n\nfunction toGeminiPart(part: LlmContentPart): GeminiPart {\n switch (part.type) {\n case \"text\":\n return {\n text: part.text,\n thought: part.thought === true ? true : undefined,\n };\n case \"inlineData\":\n return {\n inlineData: {\n data: part.data,\n mimeType: part.mimeType,\n },\n };\n default:\n throw new Error(\"Unsupported LLM content part\");\n }\n}\n\nfunction convertLlmContentToGeminiContent(content: LlmContent): GeminiContent {\n return {\n role: content.role,\n parts: content.parts.map(toGeminiPart),\n };\n}\n\nfunction resolveProvider(model: string): { provider: LlmProvider; model: string } {\n if (model.startsWith(\"chatgpt-\")) {\n return { provider: \"chatgpt\", model: model.slice(\"chatgpt-\".length) };\n }\n if (model.startsWith(\"gemini-\")) {\n return { provider: \"gemini\", model };\n }\n return { provider: \"openai\", model };\n}\n\nfunction isOpenAiCodexModel(modelId: string): boolean {\n return modelId.includes(\"codex\");\n}\n\nfunction resolveOpenAiReasoningEffort(\n modelId: string,\n override?: OpenAiReasoningEffort,\n): OpenAiReasoningEffort {\n if (override) {\n return override;\n }\n if (isOpenAiCodexModel(modelId)) {\n return \"medium\";\n }\n return DEFAULT_OPENAI_REASONING_EFFORT;\n}\n\ntype OpenAiReasoningEffortParam = \"minimal\" | \"low\" | \"medium\" | \"high\";\n\nfunction toOpenAiReasoningEffort(effort: OpenAiReasoningEffort): OpenAiReasoningEffortParam {\n switch (effort) {\n case \"low\":\n return \"low\";\n case \"medium\":\n return \"medium\";\n case \"high\":\n return \"high\";\n case \"xhigh\":\n return \"high\";\n }\n}\n\nfunction resolveOpenAiVerbosity(modelId: string): \"low\" | \"medium\" | \"high\" {\n return isOpenAiCodexModel(modelId) ? \"medium\" : \"high\";\n}\n\nfunction isInlineImageMime(mimeType: string | undefined): boolean {\n if (!mimeType) {\n return false;\n }\n return mimeType.startsWith(\"image/\");\n}\n\nfunction mergeConsecutiveTextParts(parts: readonly LlmContentPart[]): LlmContentPart[] {\n if (parts.length === 0) {\n return [];\n }\n const merged: LlmContentPart[] = [];\n for (const part of parts) {\n if (part.type !== \"text\") {\n merged.push({ type: \"inlineData\", data: part.data, mimeType: part.mimeType });\n continue;\n }\n const isThought = part.thought === true;\n const last = merged[merged.length - 1];\n if (last && last.type === \"text\" && (last.thought === true) === isThought) {\n last.text += part.text;\n last.thought = isThought ? true : undefined;\n } else {\n merged.push({\n type: \"text\",\n text: part.text,\n thought: isThought ? true : undefined,\n });\n }\n }\n return merged;\n}\n\nfunction extractTextByChannel(content: LlmContent | undefined): { text: string; thoughts: string } {\n if (!content) {\n return { text: \"\", thoughts: \"\" };\n }\n let text = \"\";\n let thoughts = \"\";\n for (const part of content.parts) {\n if (part.type !== \"text\") {\n continue;\n }\n if (part.thought === true) {\n thoughts += part.text;\n } else {\n text += part.text;\n }\n }\n return { text: text.trim(), thoughts: thoughts.trim() };\n}\n\nfunction normalizeJsonText(rawText: string): string {\n let text = rawText.trim();\n\n if (text.startsWith(\"```\")) {\n text = text.replace(/^```[a-zA-Z0-9_-]*\\s*\\n?/, \"\");\n text = text.replace(/```(?:\\s*)?$/, \"\").trim();\n }\n\n const fenced = /^```(?:json)?\\s*([\\s\\S]*?)\\s*```$/i.exec(text);\n if (fenced?.[1]) {\n return fenced[1].trim();\n }\n\n if (!text.startsWith(\"{\") && !text.startsWith(\"[\")) {\n const firstBrace = text.indexOf(\"{\");\n if (firstBrace !== -1) {\n const lastBrace = text.lastIndexOf(\"}\");\n if (lastBrace !== -1 && lastBrace > firstBrace) {\n text = text.slice(firstBrace, lastBrace + 1).trim();\n }\n }\n }\n\n return text;\n}\n\nfunction escapeNewlinesInStrings(jsonText: string): string {\n let output = \"\";\n let inString = false;\n let escaped = false;\n for (let i = 0; i < jsonText.length; i += 1) {\n const char = jsonText[i] ?? \"\";\n if (inString) {\n if (escaped) {\n output += char;\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n output += char;\n escaped = true;\n continue;\n }\n if (char === '\"') {\n output += char;\n inString = false;\n continue;\n }\n if (char === \"\\n\") {\n output += \"\\\\n\";\n continue;\n }\n if (char === \"\\r\") {\n output += \"\\\\r\";\n continue;\n }\n output += char;\n continue;\n }\n if (char === '\"') {\n inString = true;\n output += char;\n continue;\n }\n output += char;\n }\n return output;\n}\n\nexport function parseJsonFromLlmText(rawText: string): unknown {\n const cleanedText = normalizeJsonText(rawText);\n const repairedText = escapeNewlinesInStrings(cleanedText);\n return JSON.parse(repairedText);\n}\n\nfunction resolveTextContents(input: LlmInput): readonly LlmContent[] {\n if (\"contents\" in input) {\n return input.contents;\n }\n const contents: LlmContent[] = [];\n if (input.systemPrompt) {\n contents.push({\n role: \"system\",\n parts: [{ type: \"text\", text: input.systemPrompt }],\n });\n }\n contents.push({\n role: \"user\",\n parts: [{ type: \"text\", text: input.prompt }],\n });\n return contents;\n}\n\nfunction toOpenAiInput(contents: readonly LlmContent[]): unknown[] {\n // Keep the shape compatible with OpenAI Responses API input.\n const OPENAI_ROLE_FROM_LLM: Record<LlmRole, string> = {\n user: \"user\",\n model: \"assistant\",\n system: \"system\",\n tool: \"assistant\",\n };\n\n return contents.map((content) => {\n const parts: Array<Record<string, unknown>> = [];\n for (const part of content.parts) {\n if (part.type === \"text\") {\n parts.push({ type: \"input_text\", text: part.text });\n continue;\n }\n const mimeType = part.mimeType ?? \"application/octet-stream\";\n const dataUrl = `data:${mimeType};base64,${part.data}`;\n parts.push({ type: \"input_image\", image_url: dataUrl, detail: \"auto\" });\n }\n if (\n parts.length === 1 &&\n parts[0]?.type === \"input_text\" &&\n typeof parts[0].text === \"string\"\n ) {\n return {\n role: OPENAI_ROLE_FROM_LLM[content.role],\n content: parts[0].text,\n };\n }\n return {\n role: OPENAI_ROLE_FROM_LLM[content.role],\n content: parts,\n };\n });\n}\n\nfunction toChatGptInput(contents: readonly LlmContent[]): {\n instructions?: string;\n input: ChatGptInputItem[];\n} {\n const instructionsParts: string[] = [];\n const input: ChatGptInputItem[] = [];\n for (const content of contents) {\n if (content.role === \"system\") {\n for (const part of content.parts) {\n if (part.type === \"text\") {\n instructionsParts.push(part.text);\n }\n }\n continue;\n }\n const isAssistant = content.role === \"model\";\n const parts: Array<Record<string, unknown>> = [];\n for (const part of content.parts) {\n if (part.type === \"text\") {\n parts.push({\n type: isAssistant ? \"output_text\" : \"input_text\",\n text: part.text,\n });\n continue;\n }\n const mimeType = part.mimeType ?? \"application/octet-stream\";\n const dataUrl = `data:${mimeType};base64,${part.data}`;\n if (isAssistant) {\n parts.push({\n type: \"output_text\",\n text: `[image:${mimeType}]`,\n });\n } else {\n parts.push({\n type: \"input_image\",\n image_url: dataUrl,\n detail: \"auto\",\n });\n }\n }\n if (parts.length === 0) {\n parts.push({\n type: isAssistant ? \"output_text\" : \"input_text\",\n text: \"(empty content)\",\n });\n }\n if (isAssistant) {\n input.push({\n type: \"message\",\n role: \"assistant\",\n status: \"completed\",\n content: parts,\n } as ChatGptInputItem);\n } else {\n input.push({\n role: \"user\",\n content: parts,\n } as ChatGptInputItem);\n }\n }\n const instructions = instructionsParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join(\"\\\\n\\\\n\");\n return {\n instructions: instructions.length > 0 ? instructions : undefined,\n input,\n };\n}\n\nfunction toGeminiTools(tools: readonly LlmToolConfig[] | undefined): GeminiTool[] | undefined {\n if (!tools || tools.length === 0) {\n return undefined;\n }\n return tools.map((tool) => {\n switch (tool.type) {\n case \"web-search\":\n return { googleSearch: {} };\n case \"code-execution\":\n return { codeExecution: {} };\n default:\n throw new Error(\"Unsupported tool configuration\");\n }\n });\n}\n\nfunction toOpenAiTools(tools: readonly LlmToolConfig[] | undefined): unknown[] | undefined {\n if (!tools || tools.length === 0) {\n return undefined;\n }\n return tools.map((tool) => {\n switch (tool.type) {\n case \"web-search\": {\n const external_web_access = tool.mode !== \"cached\";\n return { type: \"web_search\", external_web_access };\n }\n case \"code-execution\": {\n return { type: \"code_interpreter\", container: { type: \"auto\" } };\n }\n default:\n throw new Error(\"Unsupported tool configuration\");\n }\n });\n}\n\nfunction mergeTokenUpdates(\n current: LlmUsageTokens | undefined,\n next: LlmUsageTokens | undefined,\n): LlmUsageTokens | undefined {\n if (!next) {\n return current;\n }\n if (!current) {\n return next;\n }\n return {\n promptTokens: next.promptTokens ?? current.promptTokens,\n cachedTokens: next.cachedTokens ?? current.cachedTokens,\n responseTokens: next.responseTokens ?? current.responseTokens,\n responseImageTokens: next.responseImageTokens ?? current.responseImageTokens,\n thinkingTokens: next.thinkingTokens ?? current.thinkingTokens,\n totalTokens: next.totalTokens ?? current.totalTokens,\n toolUsePromptTokens: next.toolUsePromptTokens ?? current.toolUsePromptTokens,\n };\n}\n\nfunction toMaybeNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction sumModalityTokenCounts(details: unknown, modality: string): number {\n if (!Array.isArray(details)) {\n return 0;\n }\n let total = 0;\n for (const entry of details) {\n const entryModality = (entry as { modality?: unknown }).modality;\n if (typeof entryModality !== \"string\") {\n continue;\n }\n if (entryModality.toUpperCase() !== modality.toUpperCase()) {\n continue;\n }\n const tokenCount = toMaybeNumber((entry as { tokenCount?: unknown }).tokenCount);\n if (tokenCount !== undefined && tokenCount > 0) {\n total += tokenCount;\n }\n }\n return total;\n}\n\nfunction extractGeminiUsageTokens(usage: unknown): LlmUsageTokens | undefined {\n if (!usage || typeof usage !== \"object\") {\n return undefined;\n }\n const promptTokens = toMaybeNumber((usage as { promptTokenCount?: unknown }).promptTokenCount);\n const cachedTokens = toMaybeNumber(\n (usage as { cachedContentTokenCount?: unknown }).cachedContentTokenCount,\n );\n const responseTokens = toMaybeNumber(\n (usage as { candidatesTokenCount?: unknown }).candidatesTokenCount ??\n (usage as { responseTokenCount?: unknown }).responseTokenCount,\n );\n const thinkingTokens = toMaybeNumber(\n (usage as { thoughtsTokenCount?: unknown }).thoughtsTokenCount,\n );\n const totalTokens = toMaybeNumber((usage as { totalTokenCount?: unknown }).totalTokenCount);\n const toolUsePromptTokens = toMaybeNumber(\n (usage as { toolUsePromptTokenCount?: unknown }).toolUsePromptTokenCount,\n );\n const responseDetails =\n (usage as { candidatesTokensDetails?: unknown }).candidatesTokensDetails ??\n (usage as { responseTokensDetails?: unknown }).responseTokensDetails;\n const responseImageTokens = sumModalityTokenCounts(responseDetails, \"IMAGE\");\n if (\n promptTokens === undefined &&\n cachedTokens === undefined &&\n responseTokens === undefined &&\n responseImageTokens === 0 &&\n thinkingTokens === undefined &&\n totalTokens === undefined &&\n toolUsePromptTokens === undefined\n ) {\n return undefined;\n }\n return {\n promptTokens,\n cachedTokens,\n responseTokens,\n responseImageTokens: responseImageTokens > 0 ? responseImageTokens : undefined,\n thinkingTokens,\n totalTokens,\n toolUsePromptTokens,\n };\n}\n\nfunction extractOpenAiUsageTokens(usage: unknown): LlmUsageTokens | undefined {\n if (!usage || typeof usage !== \"object\") {\n return undefined;\n }\n const promptTokens = toMaybeNumber((usage as { input_tokens?: unknown }).input_tokens);\n const cachedTokens = toMaybeNumber(\n (usage as { input_tokens_details?: { cached_tokens?: unknown } }).input_tokens_details\n ?.cached_tokens,\n );\n const outputTokensRaw = toMaybeNumber((usage as { output_tokens?: unknown }).output_tokens);\n const reasoningTokens = toMaybeNumber(\n (usage as { output_tokens_details?: { reasoning_tokens?: unknown } }).output_tokens_details\n ?.reasoning_tokens,\n );\n const totalTokens = toMaybeNumber((usage as { total_tokens?: unknown }).total_tokens);\n let responseTokens: number | undefined;\n if (outputTokensRaw !== undefined) {\n const adjusted = outputTokensRaw - (reasoningTokens ?? 0);\n responseTokens = adjusted >= 0 ? adjusted : 0;\n }\n if (\n promptTokens === undefined &&\n cachedTokens === undefined &&\n responseTokens === undefined &&\n reasoningTokens === undefined &&\n totalTokens === undefined\n ) {\n return undefined;\n }\n return {\n promptTokens,\n cachedTokens,\n responseTokens,\n thinkingTokens: reasoningTokens,\n totalTokens,\n };\n}\n\nfunction extractChatGptUsageTokens(usage: unknown): LlmUsageTokens | undefined {\n if (!usage || typeof usage !== \"object\") {\n return undefined;\n }\n const promptTokens = toMaybeNumber((usage as { input_tokens?: unknown }).input_tokens);\n const cachedTokens = toMaybeNumber(\n (usage as { input_tokens_details?: { cached_tokens?: unknown } }).input_tokens_details\n ?.cached_tokens,\n );\n const outputTokensRaw = toMaybeNumber((usage as { output_tokens?: unknown }).output_tokens);\n const reasoningTokens = toMaybeNumber(\n (usage as { output_tokens_details?: { reasoning_tokens?: unknown } }).output_tokens_details\n ?.reasoning_tokens,\n );\n const totalTokens = toMaybeNumber((usage as { total_tokens?: unknown }).total_tokens);\n let responseTokens: number | undefined;\n if (outputTokensRaw !== undefined) {\n const adjusted = outputTokensRaw - (reasoningTokens ?? 0);\n responseTokens = adjusted >= 0 ? adjusted : 0;\n }\n if (\n promptTokens === undefined &&\n cachedTokens === undefined &&\n responseTokens === undefined &&\n reasoningTokens === undefined &&\n totalTokens === undefined\n ) {\n return undefined;\n }\n return {\n promptTokens,\n cachedTokens,\n responseTokens,\n thinkingTokens: reasoningTokens,\n totalTokens,\n };\n}\n\nconst MODERATION_FINISH_REASONS = new Set<FinishReason>([\n FinishReason.SAFETY,\n FinishReason.BLOCKLIST,\n FinishReason.PROHIBITED_CONTENT,\n FinishReason.SPII,\n]);\n\nfunction isModerationFinish(reason: FinishReason | undefined): boolean {\n if (!reason) {\n return false;\n }\n return MODERATION_FINISH_REASONS.has(reason);\n}\n\nfunction mergeToolOutput(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: \"Failed to serialize tool output\", detail: message });\n }\n}\n\nfunction parseOpenAiToolArguments(raw: string): { value: unknown; error?: string } {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n return { value: {} };\n }\n try {\n return { value: JSON.parse(trimmed) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { value: raw, error: message };\n }\n}\n\nfunction formatZodIssues(issues: readonly z.core.$ZodIssue[]): string {\n const messages: string[] = [];\n for (const issue of issues) {\n const path = issue.path.length > 0 ? issue.path.map(String).join(\".\") : \"input\";\n messages.push(`${path}: ${issue.message}`);\n }\n return messages.join(\"; \");\n}\n\nfunction buildToolErrorOutput(\n message: string,\n issues?: readonly z.core.$ZodIssue[],\n): Record<string, unknown> {\n const output: Record<string, unknown> = { error: message };\n if (issues && issues.length > 0) {\n output.issues = issues.map((issue) => ({\n path: issue.path.map(String),\n message: issue.message,\n code: issue.code,\n }));\n }\n return output;\n}\n\nasync function executeToolCall(params: {\n toolName: string;\n tool: LlmExecutableTool<z.ZodType, unknown> | undefined;\n rawInput: unknown;\n parseError?: string;\n}): Promise<{ result: LlmToolCallResult; outputPayload: unknown }> {\n const { toolName, tool, rawInput, parseError } = params;\n if (!tool) {\n const message = `Unknown tool: ${toolName}`;\n return {\n result: { toolName, input: rawInput, output: { error: message }, error: message },\n outputPayload: buildToolErrorOutput(message),\n };\n }\n if (parseError) {\n const message = `Invalid JSON for tool ${toolName}: ${parseError}`;\n return {\n result: { toolName, input: rawInput, output: { error: message }, error: message },\n outputPayload: buildToolErrorOutput(message),\n };\n }\n const parsed = tool.inputSchema.safeParse(rawInput);\n if (!parsed.success) {\n const message = `Invalid tool arguments for ${toolName}: ${formatZodIssues(parsed.error.issues)}`;\n const outputPayload = buildToolErrorOutput(message, parsed.error.issues);\n return {\n result: { toolName, input: rawInput, output: outputPayload, error: message },\n outputPayload,\n };\n }\n try {\n const output = await tool.execute(parsed.data);\n return {\n result: { toolName, input: parsed.data, output },\n outputPayload: output,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const outputPayload = buildToolErrorOutput(`Tool ${toolName} failed: ${message}`);\n return {\n result: { toolName, input: parsed.data, output: outputPayload, error: message },\n outputPayload,\n };\n }\n}\n\nfunction buildToolLogId(turn: number, toolIndex: number): string {\n return `turn${turn.toString()}/tool${toolIndex.toString()}`;\n}\n\nfunction sanitizeChatGptToolId(value: string): string {\n const cleaned = value.replace(/[^A-Za-z0-9_-]/gu, \"\");\n if (cleaned.length === 0) {\n return randomBytes(8).toString(\"hex\");\n }\n return cleaned.slice(0, 64);\n}\n\nfunction normalizeChatGptToolIds(params: { callId?: string; itemId?: string }): {\n callId: string;\n itemId: string;\n} {\n let rawCallId = params.callId ?? \"\";\n let rawItemId = params.itemId ?? \"\";\n if (rawCallId.includes(\"|\")) {\n const [nextCallId, nextItemId] = rawCallId.split(\"|\");\n rawCallId = nextCallId ?? rawCallId;\n if (nextItemId) {\n rawItemId = nextItemId;\n }\n } else if (rawItemId.includes(\"|\")) {\n const [nextCallId, nextItemId] = rawItemId.split(\"|\");\n rawCallId = nextCallId ?? rawCallId;\n rawItemId = nextItemId ?? rawItemId;\n }\n const callValue = sanitizeChatGptToolId(rawCallId || rawItemId || randomBytes(8).toString(\"hex\"));\n let itemValue = sanitizeChatGptToolId(rawItemId || `fc-${callValue}`);\n if (!itemValue.startsWith(\"fc\")) {\n itemValue = `fc-${itemValue}`;\n }\n return { callId: callValue, itemId: itemValue };\n}\n\nfunction extractOpenAiResponseParts(response: { output?: unknown; output_text?: unknown }): {\n parts: LlmContentPart[];\n blocked: boolean;\n} {\n const parts: LlmContentPart[] = [];\n let blocked = false;\n const output = response.output;\n if (Array.isArray(output)) {\n for (const item of output) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n const itemType = (item as { type?: unknown }).type;\n if (itemType === \"message\") {\n const content = (item as { content?: unknown }).content;\n if (Array.isArray(content)) {\n for (const entry of content) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const entryType = (entry as { type?: unknown }).type;\n if (entryType === \"output_text\") {\n const text = (entry as { text?: unknown }).text;\n if (typeof text === \"string\" && text.length > 0) {\n parts.push({ type: \"text\", text });\n }\n } else if (entryType === \"refusal\") {\n blocked = true;\n }\n }\n }\n } else if (itemType === \"reasoning\") {\n const content = (item as { content?: unknown }).content;\n if (Array.isArray(content)) {\n for (const entry of content) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const entryType = (entry as { type?: unknown }).type;\n if (entryType === \"reasoning_summary_text\" || entryType === \"reasoning_summary\") {\n const entryText =\n typeof (entry as { text?: unknown }).text === \"string\"\n ? (entry as { text?: unknown }).text\n : typeof (entry as { summary?: unknown }).summary === \"string\"\n ? (entry as { summary?: unknown }).summary\n : undefined;\n if (typeof entryText === \"string\" && entryText.length > 0) {\n parts.push({ type: \"text\", text: entryText, thought: true });\n }\n }\n }\n }\n } else if (\n itemType === \"function_call\" ||\n itemType === \"tool_call\" ||\n itemType === \"custom_tool_call\"\n ) {\n const serialized = JSON.stringify(item, null, 2);\n if (serialized.length > 0) {\n parts.push({ type: \"text\", text: `[tool-call]\\\\n${serialized}\\\\n` });\n }\n }\n }\n }\n if (parts.length === 0) {\n const outputText = response.output_text;\n if (typeof outputText === \"string\" && outputText.length > 0) {\n parts.push({ type: \"text\", text: outputText });\n }\n }\n return { parts, blocked };\n}\n\nfunction extractOpenAiFunctionCalls(\n output: unknown,\n): Array<{ name: string; arguments: string; call_id: string; id?: string }> {\n const calls: Array<{ name: string; arguments: string; call_id: string; id?: string }> = [];\n if (!Array.isArray(output)) {\n return calls;\n }\n for (const item of output) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n if ((item as { type?: unknown }).type === \"function_call\") {\n const name =\n typeof (item as { name?: unknown }).name === \"string\"\n ? ((item as { name?: unknown }).name as string)\n : \"\";\n const args =\n typeof (item as { arguments?: unknown }).arguments === \"string\"\n ? ((item as { arguments?: unknown }).arguments as string)\n : \"\";\n const call_id =\n typeof (item as { call_id?: unknown }).call_id === \"string\"\n ? ((item as { call_id?: unknown }).call_id as string)\n : \"\";\n const id =\n typeof (item as { id?: unknown }).id === \"string\"\n ? ((item as { id?: unknown }).id as string)\n : undefined;\n if (name && call_id) {\n calls.push({ name, arguments: args, call_id, id });\n }\n }\n }\n return calls;\n}\n\nfunction resolveGeminiThinkingConfig(modelId: string): GenerateContentConfig[\"thinkingConfig\"] {\n switch (modelId) {\n case \"gemini-3-pro-preview\":\n return { includeThoughts: true } as const;\n case \"gemini-2.5-pro\":\n return { includeThoughts: true, thinkingBudget: 32_768 } as const;\n case \"gemini-flash-latest\":\n case \"gemini-flash-lite-latest\":\n return { includeThoughts: true, thinkingBudget: 24_576 } as const;\n default:\n return { includeThoughts: true } as const;\n }\n}\n\nfunction decodeInlineDataBuffer(base64: string): Buffer {\n try {\n return Buffer.from(base64, \"base64\");\n } catch {\n return Buffer.from(base64, \"base64url\");\n }\n}\n\nfunction extractImages(content: LlmContent | undefined): LlmImageData[] {\n if (!content) {\n return [];\n }\n const images: LlmImageData[] = [];\n for (const part of content.parts) {\n if (part.type !== \"inlineData\") {\n continue;\n }\n const buffer = decodeInlineDataBuffer(part.data);\n images.push({ mimeType: part.mimeType, data: buffer });\n }\n return images;\n}\n\nasync function runTextCall(params: {\n request: LlmTextRequest;\n queue: AsyncQueue<LlmStreamEvent>;\n abortController: AbortController;\n}): Promise<LlmTextResult> {\n const { request, queue, abortController } = params;\n const providerInfo = resolveProvider(request.model);\n const provider = providerInfo.provider;\n const modelForProvider = providerInfo.model;\n const contents = resolveTextContents(request);\n if (contents.length === 0) {\n throw new Error(\"LLM call received an empty prompt.\");\n }\n\n let modelVersion = request.model;\n let blocked = false;\n let grounding: GroundingMetadata | undefined;\n const responseParts: LlmContentPart[] = [];\n let responseRole: LlmRole | undefined;\n let latestUsage: LlmUsageTokens | undefined;\n let responseImages = 0;\n\n const pushDelta = (channel: \"response\" | \"thought\", text: string): void => {\n if (!text) {\n return;\n }\n responseParts.push({ type: \"text\", text, ...(channel === \"thought\" ? { thought: true } : {}) });\n queue.push({ type: \"delta\", channel, text });\n };\n\n const pushInline = (data: string, mimeType: string | undefined): void => {\n if (!data) {\n return;\n }\n responseParts.push({ type: \"inlineData\", data, mimeType });\n if (isInlineImageMime(mimeType)) {\n responseImages += 1;\n }\n };\n\n const resolveAbortSignal = (): AbortSignal => {\n if (!request.signal) {\n return abortController.signal;\n }\n // Fan-in cancellation: abort if either signal aborts.\n if (request.signal.aborted) {\n abortController.abort(request.signal.reason);\n } else {\n request.signal.addEventListener(\n \"abort\",\n () => abortController.abort(request.signal?.reason),\n { once: true },\n );\n }\n return abortController.signal;\n };\n\n const signal = resolveAbortSignal();\n\n if (provider === \"openai\") {\n const openAiInput = toOpenAiInput(contents);\n const openAiTools = toOpenAiTools(request.tools);\n const reasoningEffort = resolveOpenAiReasoningEffort(\n modelForProvider,\n request.openAiReasoningEffort,\n );\n const openAiTextConfig = {\n format: request.openAiTextFormat ?? { type: \"text\" },\n verbosity: resolveOpenAiVerbosity(modelForProvider),\n };\n const reasoning = {\n effort: toOpenAiReasoningEffort(reasoningEffort),\n summary: \"detailed\" as const,\n };\n\n await runOpenAiCall(async (client) => {\n const stream = client.responses.stream(\n {\n model: modelForProvider,\n input: openAiInput as any,\n reasoning,\n text: openAiTextConfig as any,\n ...(openAiTools ? { tools: openAiTools as any } : {}),\n include: [\"code_interpreter_call.outputs\", \"reasoning.encrypted_content\"] as any,\n },\n { signal } as any,\n );\n\n for await (const event of stream as any) {\n switch (event.type) {\n case \"response.output_text.delta\": {\n const delta = event.delta ?? \"\";\n pushDelta(\"response\", typeof delta === \"string\" ? delta : \"\");\n break;\n }\n case \"response.reasoning_summary_text.delta\": {\n const delta = event.delta ?? \"\";\n pushDelta(\"thought\", typeof delta === \"string\" ? delta : \"\");\n break;\n }\n case \"response.refusal.delta\": {\n blocked = true;\n queue.push({ type: \"blocked\" });\n break;\n }\n default:\n break;\n }\n }\n\n const finalResponse = await (stream as any).finalResponse();\n modelVersion = typeof finalResponse.model === \"string\" ? finalResponse.model : request.model;\n queue.push({ type: \"model\", modelVersion });\n if (finalResponse.error) {\n const message =\n typeof finalResponse.error.message === \"string\"\n ? finalResponse.error.message\n : \"OpenAI response failed\";\n throw new Error(message);\n }\n if (\n finalResponse.status &&\n finalResponse.status !== \"completed\" &&\n finalResponse.status !== \"in_progress\"\n ) {\n const detail = finalResponse.incomplete_details?.reason;\n throw new Error(\n `OpenAI response status ${finalResponse.status}${detail ? ` (${detail})` : \"\"}`,\n );\n }\n latestUsage = extractOpenAiUsageTokens(finalResponse.usage);\n\n // Fallback: if the stream did not deliver deltas (rare), extract from final output.\n if (responseParts.length === 0) {\n const fallback = extractOpenAiResponseParts(finalResponse);\n blocked = blocked || fallback.blocked;\n for (const part of fallback.parts) {\n if (part.type === \"text\") {\n pushDelta(part.thought === true ? \"thought\" : \"response\", part.text);\n } else {\n pushInline(part.data, part.mimeType);\n }\n }\n }\n });\n } else if (provider === \"chatgpt\") {\n const chatGptInput = toChatGptInput(contents);\n const reasoningEffort = resolveOpenAiReasoningEffort(\n request.model,\n request.openAiReasoningEffort,\n );\n const openAiTools = toOpenAiTools(request.tools);\n const requestPayload = {\n model: modelForProvider,\n store: false,\n stream: true,\n instructions: chatGptInput.instructions ?? \"You are a helpful assistant.\",\n input: chatGptInput.input,\n include: [\"reasoning.encrypted_content\"],\n reasoning: { effort: toOpenAiReasoningEffort(reasoningEffort), summary: \"detailed\" as const },\n text: {\n format: request.openAiTextFormat ?? { type: \"text\" },\n verbosity: resolveOpenAiVerbosity(request.model),\n },\n ...(openAiTools ? { tools: openAiTools as any } : {}),\n };\n\n let sawResponseDelta = false;\n let sawThoughtDelta = false;\n const result = await collectChatGptCodexResponse({\n request: requestPayload as any,\n signal,\n onDelta: (delta) => {\n if (delta.thoughtDelta) {\n sawThoughtDelta = true;\n pushDelta(\"thought\", delta.thoughtDelta);\n }\n if (delta.textDelta) {\n sawResponseDelta = true;\n pushDelta(\"response\", delta.textDelta);\n }\n },\n });\n\n blocked = blocked || result.blocked;\n if (blocked) {\n queue.push({ type: \"blocked\" });\n }\n if (result.model) {\n modelVersion = `chatgpt-${result.model}`;\n queue.push({ type: \"model\", modelVersion });\n }\n latestUsage = extractChatGptUsageTokens(result.usage);\n\n // Fallback for rare cases where the SSE stream does not emit deltas.\n const fallbackText = typeof result.text === \"string\" ? result.text : \"\";\n const fallbackThoughts =\n typeof result.reasoningSummaryText === \"string\" && result.reasoningSummaryText.length > 0\n ? result.reasoningSummaryText\n : typeof result.reasoningText === \"string\"\n ? result.reasoningText\n : \"\";\n if (!sawThoughtDelta && fallbackThoughts.length > 0) {\n pushDelta(\"thought\", fallbackThoughts);\n }\n if (!sawResponseDelta && fallbackText.length > 0) {\n pushDelta(\"response\", fallbackText);\n }\n } else {\n const geminiContents = contents.map(convertLlmContentToGeminiContent);\n const config: GenerateContentConfig = {\n maxOutputTokens: 32_000,\n thinkingConfig: resolveGeminiThinkingConfig(modelForProvider),\n ...(request.responseMimeType ? { responseMimeType: request.responseMimeType } : {}),\n ...(request.responseJsonSchema ? { responseJsonSchema: request.responseJsonSchema } : {}),\n ...(request.responseModalities\n ? { responseModalities: Array.from(request.responseModalities) }\n : {}),\n ...(request.imageAspectRatio || request.imageSize\n ? {\n imageConfig: {\n ...(request.imageAspectRatio ? { aspectRatio: request.imageAspectRatio } : {}),\n ...(request.imageSize ? { imageSize: request.imageSize } : {}),\n },\n }\n : {}),\n };\n const geminiTools = toGeminiTools(request.tools);\n if (geminiTools) {\n config.tools = geminiTools;\n }\n\n await runGeminiCall(async (client) => {\n const stream = await client.models.generateContentStream({\n model: modelForProvider,\n contents: geminiContents,\n config,\n });\n let latestGrounding: GroundingMetadata | undefined;\n for await (const chunk of stream) {\n if (chunk.modelVersion) {\n modelVersion = chunk.modelVersion;\n queue.push({ type: \"model\", modelVersion });\n }\n if (chunk.promptFeedback?.blockReason) {\n blocked = true;\n queue.push({ type: \"blocked\" });\n }\n latestUsage = mergeTokenUpdates(latestUsage, extractGeminiUsageTokens(chunk.usageMetadata));\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) {\n continue;\n }\n const primary = candidates[0];\n if (primary && isModerationFinish(primary.finishReason)) {\n blocked = true;\n queue.push({ type: \"blocked\" });\n }\n for (const candidate of candidates) {\n const candidateContent = candidate.content;\n if (!candidateContent) {\n continue;\n }\n if (candidate.groundingMetadata) {\n latestGrounding = candidate.groundingMetadata;\n }\n const content = convertGeminiContentToLlmContent(candidateContent);\n if (!responseRole) {\n responseRole = content.role;\n }\n for (const part of content.parts) {\n if (part.type === \"text\") {\n pushDelta(part.thought === true ? \"thought\" : \"response\", part.text);\n } else {\n pushInline(part.data, part.mimeType);\n }\n }\n }\n }\n grounding = latestGrounding;\n });\n }\n\n const mergedParts = mergeConsecutiveTextParts(responseParts);\n const content =\n mergedParts.length > 0 ? { role: responseRole ?? \"model\", parts: mergedParts } : undefined;\n const { text, thoughts } = extractTextByChannel(content);\n\n const costUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: latestUsage,\n responseImages,\n imageSize: request.imageSize,\n });\n\n if (latestUsage) {\n queue.push({ type: \"usage\", usage: latestUsage, costUsd, modelVersion });\n }\n\n return {\n provider,\n model: request.model,\n modelVersion,\n content,\n text,\n thoughts,\n blocked,\n usage: latestUsage,\n costUsd,\n grounding,\n };\n}\n\nexport function streamText(request: LlmTextRequest): LlmTextStream {\n const queue = createAsyncQueue<LlmStreamEvent>();\n const abortController = new AbortController();\n\n const result = (async () => {\n try {\n const output = await runTextCall({ request, queue, abortController });\n queue.close();\n return output;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n queue.fail(err);\n throw err;\n }\n })();\n\n return {\n events: queue.iterable,\n result,\n abort: () => abortController.abort(),\n };\n}\n\nexport async function generateText(request: LlmTextRequest): Promise<LlmTextResult> {\n const call = streamText(request);\n // Drain events so the call runs even if the caller doesn't.\n for await (const _event of call.events) {\n // no-op\n }\n return await call.result;\n}\n\nexport async function generateJson<T>(request: LlmJsonRequest<T>): Promise<{\n readonly value: T;\n readonly rawText: string;\n readonly result: LlmTextResult;\n}> {\n const maxAttempts = Math.max(1, Math.floor(request.maxAttempts ?? 2));\n const schemaName = (request.openAiSchemaName ?? \"llm-response\").trim() || \"llm-response\";\n const providerInfo = resolveProvider(request.model);\n const isOpenAiVariant = providerInfo.provider === \"openai\" || providerInfo.provider === \"chatgpt\";\n const baseJsonSchema = zodToJsonSchema(request.schema, {\n name: schemaName,\n target: isOpenAiVariant ? \"openAi\" : \"jsonSchema7\",\n }) as JsonSchema;\n\n const responseJsonSchema = isOpenAiVariant\n ? resolveOpenAiSchemaRoot(baseJsonSchema)\n : addGeminiPropertyOrdering(baseJsonSchema);\n\n if (isOpenAiVariant && !isJsonSchemaObject(responseJsonSchema)) {\n throw new Error(\"OpenAI structured outputs require a JSON object schema at the root.\");\n }\n\n const openAiTextFormat =\n providerInfo.provider === \"openai\"\n ? {\n type: \"json_schema\" as const,\n name: schemaName,\n strict: true,\n schema: normalizeOpenAiSchema(responseJsonSchema),\n }\n : undefined;\n\n const failures: Array<{ attempt: number; rawText: string; error: unknown }> = [];\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n let rawText = \"\";\n try {\n const contents = resolveTextContents(request);\n const call = streamText({\n model: request.model,\n contents,\n tools: request.tools,\n responseMimeType: request.responseMimeType ?? \"application/json\",\n responseJsonSchema,\n openAiReasoningEffort: request.openAiReasoningEffort,\n ...(openAiTextFormat ? { openAiTextFormat } : {}),\n signal: request.signal,\n });\n\n // Collect the raw text output (response channel only).\n for await (const event of call.events) {\n if (event.type === \"delta\" && event.channel === \"response\") {\n rawText += event.text;\n }\n }\n const result = await call.result;\n rawText = rawText || result.text;\n\n const cleanedText = normalizeJsonText(rawText);\n const repairedText = escapeNewlinesInStrings(cleanedText);\n const payload: unknown = JSON.parse(repairedText);\n const normalized =\n typeof request.normalizeJson === \"function\" ? request.normalizeJson(payload) : payload;\n const parsed = request.schema.parse(normalized);\n return { value: parsed, rawText, result };\n } catch (error) {\n const handled = error instanceof Error ? error : new Error(String(error));\n failures.push({ attempt, rawText, error: handled });\n if (attempt >= maxAttempts) {\n throw new LlmJsonCallError(`LLM JSON call failed after ${attempt} attempt(s)`, failures);\n }\n }\n }\n\n throw new LlmJsonCallError(\"LLM JSON call failed\", failures);\n}\n\n// --- Tool Loop ---\n\nconst DEFAULT_TOOL_LOOP_MAX_STEPS = 8;\n\nfunction resolveToolLoopContents(input: LlmInput): readonly LlmContent[] {\n return resolveTextContents(input);\n}\n\nfunction buildOpenAiFunctionTools(tools: LlmToolSet): unknown[] {\n const toolEntries = Object.entries(tools);\n return toolEntries.map(([name, toolDef]) => ({\n type: \"function\",\n name,\n description: toolDef.description ?? undefined,\n parameters: buildOpenAiToolSchema(toolDef.inputSchema, name),\n strict: true,\n }));\n}\n\nfunction buildOpenAiToolSchema(schema: z.ZodType, name: string): JsonSchema {\n const rawSchema = zodToJsonSchema(schema, { name, target: \"openAi\" }) as JsonSchema;\n const normalized = normalizeOpenAiSchema(resolveOpenAiSchemaRoot(rawSchema));\n if (!isJsonSchemaObject(normalized)) {\n throw new Error(`OpenAI tool schema for ${name} must be a JSON object at the root.`);\n }\n return normalized;\n}\n\nfunction buildGeminiFunctionDeclarations(tools: LlmToolSet): GeminiTool[] {\n const toolEntries = Object.entries(tools);\n const functionDeclarations = toolEntries.map(([name, toolDef]) => ({\n name,\n description: toolDef.description ?? \"\",\n parametersJsonSchema: buildGeminiToolSchema(toolDef.inputSchema, name),\n }));\n return [{ functionDeclarations }];\n}\n\nfunction buildGeminiToolSchema(schema: z.ZodType, name: string): JsonSchema {\n const jsonSchema = toGeminiJsonSchema(schema, { name });\n if (!isJsonSchemaObject(jsonSchema)) {\n throw new Error(`Gemini tool schema for ${name} must be a JSON object at the root.`);\n }\n return jsonSchema;\n}\n\nfunction extractOpenAiReasoningSummary(response: unknown): string {\n if (!response || typeof response !== \"object\") {\n return \"\";\n }\n const output = (response as { output?: unknown }).output;\n if (!Array.isArray(output)) {\n return \"\";\n }\n let summary = \"\";\n for (const item of output) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n if ((item as { type?: unknown }).type !== \"reasoning\") {\n continue;\n }\n const content = (item as { content?: unknown }).content;\n if (!Array.isArray(content)) {\n continue;\n }\n for (const entry of content) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const entryType = (entry as { type?: unknown }).type;\n if (entryType === \"reasoning_summary_text\") {\n const text = (entry as { text?: unknown }).text;\n if (typeof text === \"string\") {\n summary += text;\n }\n }\n }\n }\n return summary;\n}\n\nexport async function runToolLoop(request: LlmToolLoopRequest): Promise<LlmToolLoopResult> {\n const toolEntries = Object.entries(request.tools);\n if (toolEntries.length === 0) {\n throw new Error(\"Tool loop requires at least one tool definition.\");\n }\n\n const contents = resolveToolLoopContents(request);\n if (contents.length === 0) {\n throw new Error(\"Tool loop prompt must not be empty.\");\n }\n\n const maxSteps = Math.max(1, Math.floor(request.maxSteps ?? DEFAULT_TOOL_LOOP_MAX_STEPS));\n const providerInfo = resolveProvider(request.model);\n\n const steps: LlmToolLoopStep[] = [];\n let totalCostUsd = 0;\n let finalText = \"\";\n let finalThoughts = \"\";\n\n if (providerInfo.provider === \"openai\") {\n const openAiFunctionTools = buildOpenAiFunctionTools(request.tools);\n const openAiNativeTools = toOpenAiTools(request.modelTools);\n const openAiTools = openAiNativeTools\n ? [...openAiNativeTools, ...openAiFunctionTools]\n : [...openAiFunctionTools];\n const reasoningEffort = resolveOpenAiReasoningEffort(\n providerInfo.model,\n request.openAiReasoningEffort,\n );\n const textConfig = {\n format: { type: \"text\" },\n verbosity: resolveOpenAiVerbosity(providerInfo.model),\n };\n const reasoning = {\n effort: toOpenAiReasoningEffort(reasoningEffort),\n summary: \"detailed\" as const,\n };\n\n let previousResponseId: string | undefined;\n let input: any = toOpenAiInput(contents);\n\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n const turn = stepIndex + 1;\n const abortController = new AbortController();\n if (request.signal) {\n if (request.signal.aborted) {\n abortController.abort(request.signal.reason);\n } else {\n request.signal.addEventListener(\n \"abort\",\n () => abortController.abort(request.signal?.reason),\n { once: true },\n );\n }\n }\n\n const onEvent = request.onEvent;\n let modelVersion = request.model;\n let usageTokens: LlmUsageTokens | undefined;\n\n const emitEvent = (ev: LlmStreamEvent) => {\n onEvent?.(ev);\n };\n\n const finalResponse = await runOpenAiCall(async (client) => {\n const stream = client.responses.stream(\n {\n model: providerInfo.model,\n input,\n ...(previousResponseId ? { previous_response_id: previousResponseId } : {}),\n ...(openAiTools.length > 0 ? { tools: openAiTools as any } : {}),\n ...(openAiTools.length > 0 ? { parallel_tool_calls: true } : {}),\n reasoning,\n text: textConfig as any,\n include: [\"reasoning.encrypted_content\"] as any,\n },\n { signal: abortController.signal } as any,\n );\n\n for await (const event of stream as any) {\n switch (event.type) {\n case \"response.output_text.delta\":\n emitEvent({\n type: \"delta\",\n channel: \"response\",\n text: typeof event.delta === \"string\" ? event.delta : \"\",\n });\n break;\n case \"response.reasoning_summary_text.delta\":\n emitEvent({\n type: \"delta\",\n channel: \"thought\",\n text: typeof event.delta === \"string\" ? event.delta : \"\",\n });\n break;\n case \"response.refusal.delta\":\n emitEvent({ type: \"blocked\" });\n break;\n default:\n break;\n }\n }\n return await (stream as any).finalResponse();\n });\n\n modelVersion =\n typeof (finalResponse as any).model === \"string\"\n ? (finalResponse as any).model\n : request.model;\n emitEvent({ type: \"model\", modelVersion });\n if ((finalResponse as any).error) {\n const message =\n typeof (finalResponse as any).error.message === \"string\"\n ? (finalResponse as any).error.message\n : \"OpenAI response failed\";\n throw new Error(message);\n }\n usageTokens = extractOpenAiUsageTokens((finalResponse as any).usage);\n\n const responseText = extractOpenAiResponseParts(finalResponse)\n .parts.filter((p) => p.type === \"text\" && p.thought !== true)\n .map((p) => (p as any).text as string)\n .join(\"\")\n .trim();\n const reasoningSummary = extractOpenAiReasoningSummary(finalResponse).trim();\n\n const stepCostUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: usageTokens,\n responseImages: 0,\n });\n totalCostUsd += stepCostUsd;\n\n if (usageTokens) {\n emitEvent({ type: \"usage\", usage: usageTokens, costUsd: stepCostUsd, modelVersion });\n }\n\n const functionCalls = extractOpenAiFunctionCalls((finalResponse as any).output);\n\n const stepToolCalls: LlmToolCallResult[] = [];\n if (functionCalls.length === 0) {\n finalText = responseText;\n finalThoughts = reasoningSummary;\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummary || undefined,\n toolCalls: [],\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n return { text: finalText, thoughts: finalThoughts, steps, totalCostUsd };\n }\n\n const callInputs = functionCalls.map((call, index) => {\n const toolIndex = index + 1;\n const toolId = buildToolLogId(turn, toolIndex);\n const toolName = call.name;\n const { value, error: parseError } = parseOpenAiToolArguments(call.arguments);\n return { call, toolName, value, parseError, toolId, turn, toolIndex };\n });\n\n const callResults = await Promise.all(\n callInputs.map(async (entry) => {\n return await toolCallContextStorage.run(\n {\n toolName: entry.toolName,\n toolId: entry.toolId,\n turn: entry.turn,\n toolIndex: entry.toolIndex,\n },\n async () => {\n const { result, outputPayload } = await executeToolCall({\n toolName: entry.toolName,\n tool: request.tools[entry.toolName],\n rawInput: entry.value,\n parseError: entry.parseError,\n });\n return { entry, result, outputPayload };\n },\n );\n }),\n );\n\n const toolOutputs: any[] = [];\n for (const { entry, result, outputPayload } of callResults) {\n stepToolCalls.push({ ...result, callId: entry.call.call_id });\n toolOutputs.push({\n type: \"function_call_output\",\n call_id: entry.call.call_id,\n output: mergeToolOutput(outputPayload),\n });\n }\n\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummary || undefined,\n toolCalls: stepToolCalls,\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n\n previousResponseId = (finalResponse as any).id;\n input = toolOutputs;\n }\n\n throw new Error(`Tool loop exceeded max steps (${maxSteps}) without final response.`);\n }\n\n if (providerInfo.provider === \"chatgpt\") {\n const openAiFunctionTools = buildOpenAiFunctionTools(request.tools);\n const openAiNativeTools = toOpenAiTools(request.modelTools);\n const openAiTools = openAiNativeTools\n ? [...openAiNativeTools, ...openAiFunctionTools]\n : [...openAiFunctionTools];\n\n const reasoningEffort = resolveOpenAiReasoningEffort(\n request.model,\n request.openAiReasoningEffort,\n );\n const toolLoopInput = toChatGptInput(contents);\n let input: ChatGptInputItem[] = [...toolLoopInput.input];\n\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n const turn = stepIndex + 1;\n const response = await collectChatGptCodexResponse({\n request: {\n model: providerInfo.model,\n store: false,\n stream: true,\n instructions: toolLoopInput.instructions ?? \"You are a helpful assistant.\",\n input,\n include: [\"reasoning.encrypted_content\"],\n tools: openAiTools,\n tool_choice: \"auto\" as const,\n parallel_tool_calls: true,\n reasoning: {\n effort: toOpenAiReasoningEffort(reasoningEffort),\n summary: \"detailed\" as const,\n },\n text: { verbosity: resolveOpenAiVerbosity(request.model) },\n } as any,\n signal: request.signal,\n onDelta: (delta) => {\n if (delta.thoughtDelta) {\n request.onEvent?.({ type: \"delta\", channel: \"thought\", text: delta.thoughtDelta });\n }\n if (delta.textDelta) {\n request.onEvent?.({ type: \"delta\", channel: \"response\", text: delta.textDelta });\n }\n },\n });\n\n const modelVersion = response.model ? `chatgpt-${response.model}` : request.model;\n const usageTokens = extractChatGptUsageTokens(response.usage);\n const stepCostUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: usageTokens,\n responseImages: 0,\n });\n totalCostUsd += stepCostUsd;\n\n const responseText = (response.text ?? \"\").trim();\n const reasoningSummaryText = (response.reasoningSummaryText ?? \"\").trim();\n\n const functionCalls = response.toolCalls ?? [];\n if (functionCalls.length === 0) {\n finalText = responseText;\n finalThoughts = reasoningSummaryText;\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummaryText || undefined,\n toolCalls: [],\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n return { text: finalText, thoughts: finalThoughts, steps, totalCostUsd };\n }\n\n const toolCalls: LlmToolCallResult[] = [];\n const toolOutputs: ChatGptInputItem[] = [];\n const callInputs = functionCalls.map((call, index) => {\n const toolIndex = index + 1;\n const toolId = buildToolLogId(turn, toolIndex);\n const toolName = call.name;\n const { value, error: parseError } = parseOpenAiToolArguments(call.arguments);\n const ids = normalizeChatGptToolIds({ callId: call.callId, itemId: call.id });\n return { call, toolName, value, parseError, ids, toolId, turn, toolIndex };\n });\n\n const callResults = await Promise.all(\n callInputs.map(async (entry) => {\n return await toolCallContextStorage.run(\n {\n toolName: entry.toolName,\n toolId: entry.toolId,\n turn: entry.turn,\n toolIndex: entry.toolIndex,\n },\n async () => {\n const { result, outputPayload } = await executeToolCall({\n toolName: entry.toolName,\n tool: request.tools[entry.toolName],\n rawInput: entry.value,\n parseError: entry.parseError,\n });\n return { entry, result, outputPayload };\n },\n );\n }),\n );\n\n for (const { entry, result, outputPayload } of callResults) {\n toolCalls.push({ ...result, callId: entry.ids.callId });\n toolOutputs.push({\n type: \"function_call\",\n id: entry.ids.itemId,\n call_id: entry.ids.callId,\n name: entry.toolName,\n arguments: entry.call.arguments,\n status: \"completed\",\n } as ChatGptInputItem);\n toolOutputs.push({\n type: \"function_call_output\",\n call_id: entry.ids.callId,\n output: mergeToolOutput(outputPayload),\n } as ChatGptInputItem);\n }\n\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummaryText || undefined,\n toolCalls,\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n\n input = input.concat(toolOutputs);\n }\n\n throw new Error(`Tool loop exceeded max steps (${maxSteps}) without final response.`);\n }\n\n // Gemini provider\n const geminiFunctionTools = buildGeminiFunctionDeclarations(request.tools);\n const geminiNativeTools = toGeminiTools(request.modelTools);\n const geminiTools = geminiNativeTools\n ? geminiNativeTools.concat(geminiFunctionTools)\n : geminiFunctionTools;\n const geminiContents = contents.map(convertLlmContentToGeminiContent);\n\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n const config: GenerateContentConfig = {\n maxOutputTokens: 32_000,\n tools: geminiTools,\n toolConfig: {\n functionCallingConfig: {\n mode: FunctionCallingConfigMode.VALIDATED,\n },\n },\n thinkingConfig: resolveGeminiThinkingConfig(request.model),\n };\n\n const onEvent = request.onEvent;\n\n type GeminiToolLoopResponse = {\n readonly responseText: string;\n readonly thoughtsText: string;\n readonly functionCalls: Array<NonNullable<GeminiPart[\"functionCall\"]>>;\n readonly modelParts: GeminiPart[];\n readonly usageMetadata?: unknown;\n readonly modelVersion?: string;\n };\n\n const response: GeminiToolLoopResponse = await runGeminiCall(async (client) => {\n const stream = await client.models.generateContentStream({\n model: request.model,\n contents: geminiContents,\n config,\n });\n let responseText = \"\";\n let thoughtsText = \"\";\n const modelParts: GeminiPart[] = [];\n const functionCalls: Array<NonNullable<GeminiPart[\"functionCall\"]>> = [];\n const seenFunctionCallIds = new Set<string>();\n const seenFunctionCallKeys = new Set<string>();\n let latestUsageMetadata: unknown;\n let resolvedModelVersion: string | undefined;\n\n for await (const chunk of stream) {\n if (chunk.modelVersion) {\n resolvedModelVersion = chunk.modelVersion;\n onEvent?.({ type: \"model\", modelVersion: chunk.modelVersion });\n }\n if (chunk.usageMetadata) {\n latestUsageMetadata = chunk.usageMetadata;\n }\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) {\n continue;\n }\n const primary = candidates[0];\n const parts = primary?.content?.parts;\n if (!parts || parts.length === 0) {\n continue;\n }\n\n for (const part of parts) {\n modelParts.push(part);\n const call = part.functionCall;\n if (call) {\n const id = typeof call.id === \"string\" ? call.id : \"\";\n const shouldAdd = (() => {\n if (id.length > 0) {\n if (seenFunctionCallIds.has(id)) {\n return false;\n }\n seenFunctionCallIds.add(id);\n return true;\n }\n const key = JSON.stringify({ name: call.name ?? \"\", args: call.args ?? null });\n if (seenFunctionCallKeys.has(key)) {\n return false;\n }\n seenFunctionCallKeys.add(key);\n return true;\n })();\n if (shouldAdd) {\n functionCalls.push(call);\n }\n }\n if (typeof part.text === \"string\" && part.text.length > 0) {\n if (part.thought) {\n thoughtsText += part.text;\n onEvent?.({ type: \"delta\", channel: \"thought\", text: part.text });\n } else {\n responseText += part.text;\n onEvent?.({ type: \"delta\", channel: \"response\", text: part.text });\n }\n }\n }\n }\n\n return {\n responseText,\n thoughtsText,\n functionCalls,\n modelParts,\n usageMetadata: latestUsageMetadata,\n modelVersion: resolvedModelVersion ?? request.model,\n };\n });\n\n const usageTokens = extractGeminiUsageTokens(response.usageMetadata);\n const modelVersion = response.modelVersion ?? request.model;\n const stepCostUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: usageTokens,\n responseImages: 0,\n });\n totalCostUsd += stepCostUsd;\n\n if (response.functionCalls.length === 0) {\n finalText = response.responseText.trim();\n finalThoughts = response.thoughtsText.trim();\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: finalText || undefined,\n thoughts: finalThoughts || undefined,\n toolCalls: [],\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n return { text: finalText, thoughts: finalThoughts, steps, totalCostUsd };\n }\n\n const toolCalls: LlmToolCallResult[] = [];\n\n const modelPartsForHistory = response.modelParts.filter(\n (part) => !(typeof part.text === \"string\" && part.thought === true),\n );\n if (modelPartsForHistory.length > 0) {\n geminiContents.push({ role: \"model\", parts: modelPartsForHistory });\n } else {\n const parts: GeminiPart[] = [];\n if (response.responseText) {\n parts.push({ text: response.responseText });\n }\n for (const call of response.functionCalls) {\n parts.push({ functionCall: call });\n }\n geminiContents.push({ role: \"model\", parts });\n }\n\n const responseParts: GeminiPart[] = [];\n const callInputs = response.functionCalls.map((call, index) => {\n const turn = stepIndex + 1;\n const toolIndex = index + 1;\n const toolId = buildToolLogId(turn, toolIndex);\n const toolName = call.name ?? \"unknown\";\n const rawInput = call.args ?? {};\n return { call, toolName, rawInput, toolId, turn, toolIndex };\n });\n\n const callResults = await Promise.all(\n callInputs.map(async (entry) => {\n return await toolCallContextStorage.run(\n {\n toolName: entry.toolName,\n toolId: entry.toolId,\n turn: entry.turn,\n toolIndex: entry.toolIndex,\n },\n async () => {\n const { result, outputPayload } = await executeToolCall({\n toolName: entry.toolName,\n tool: request.tools[entry.toolName],\n rawInput: entry.rawInput,\n });\n return { entry, result, outputPayload };\n },\n );\n }),\n );\n\n for (const { entry, result, outputPayload } of callResults) {\n toolCalls.push({ ...result, callId: entry.call.id });\n const responsePayload = isPlainRecord(outputPayload)\n ? outputPayload\n : { output: outputPayload };\n responseParts.push({\n functionResponse: {\n name: entry.toolName,\n response: responsePayload,\n ...(entry.call.id ? { id: entry.call.id } : {}),\n },\n });\n }\n\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: response.responseText.trim() || undefined,\n thoughts: response.thoughtsText.trim() || undefined,\n toolCalls,\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n\n geminiContents.push({ role: \"user\", parts: responseParts });\n }\n\n throw new Error(`Tool loop exceeded max steps (${maxSteps}) without final response.`);\n}\n\n// --- Images (Gemini image-preview) ---\n\nconst IMAGE_GRADE_SCHEMA = z.enum([\"pass\", \"fail\"]);\n\nasync function gradeGeneratedImage(params: {\n gradingPrompt: string;\n imagePrompt: string;\n image: LlmImageData;\n model: string;\n}): Promise<z.infer<typeof IMAGE_GRADE_SCHEMA>> {\n const parts: LlmContentPart[] = [\n {\n type: \"text\",\n text: [\n params.gradingPrompt,\n \"\",\n \"Image prompt to grade:\",\n params.imagePrompt,\n \"\",\n 'Respond with the JSON string \"pass\" or \"fail\".',\n ].join(\"\\\\n\"),\n },\n {\n type: \"inlineData\",\n data: params.image.data.toString(\"base64\"),\n mimeType: params.image.mimeType ?? \"image/png\",\n },\n ];\n const { value } = await generateJson({\n model: params.model,\n contents: [{ role: \"user\", parts }],\n schema: IMAGE_GRADE_SCHEMA,\n });\n return value;\n}\n\nexport async function generateImages(request: LlmGenerateImagesRequest): Promise<LlmImageData[]> {\n const maxAttempts = Math.max(1, Math.floor(request.maxAttempts ?? 4));\n const promptList = Array.from(request.imagePrompts);\n if (promptList.length === 0) {\n return [];\n }\n const numImages = promptList.length;\n\n type PromptEntry = { index: number; prompt: string };\n const promptEntries: PromptEntry[] = promptList.map((rawPrompt, arrayIndex) => {\n const trimmedPrompt = rawPrompt.trim();\n if (!trimmedPrompt) {\n throw new Error(`imagePrompts[${arrayIndex}] must be a non-empty string`);\n }\n return { index: arrayIndex + 1, prompt: trimmedPrompt };\n });\n\n const gradingPrompt = request.imageGradingPrompt.trim();\n if (!gradingPrompt) {\n throw new Error(\"imageGradingPrompt must be a non-empty string\");\n }\n\n const addText = (parts: LlmContentPart[], text: string) => {\n const lastPart = parts[parts.length - 1];\n if (lastPart !== undefined && lastPart.type === \"text\") {\n (lastPart as any).text = `${(lastPart as any).text}\\\\n${text}`;\n } else {\n parts.push({ type: \"text\", text });\n }\n };\n\n const buildInitialPromptParts = (): LlmContentPart[] => {\n const parts: LlmContentPart[] = [];\n addText(\n parts,\n [\n `Please make all ${numImages} requested images:`,\n \"\",\n \"Follow the style:\",\n request.stylePrompt,\n ].join(\"\\\\n\"),\n );\n if (request.styleImages && request.styleImages.length > 0) {\n addText(\n parts,\n \"\\\\nFollow the visual style, composition and the characters from these images:\",\n );\n for (const styleImage of request.styleImages) {\n parts.push({\n type: \"inlineData\",\n data: styleImage.data.toString(\"base64\"),\n mimeType: styleImage.mimeType,\n });\n }\n }\n const lines: string[] = [\"\", \"Image descriptions:\"];\n for (const entry of promptEntries) {\n lines.push(`\\\\nImage ${entry.index}: ${entry.prompt}`);\n }\n lines.push(\"\");\n lines.push(`Please make all ${numImages} images.`);\n addText(parts, lines.join(\"\\\\n\"));\n return parts;\n };\n\n const buildContinuationPromptParts = (pending: PromptEntry[]): LlmContentPart[] => {\n const pendingIds = pending.map((entry) => entry.index).join(\", \");\n const lines: string[] = [\n `Please continue generating the remaining images: ${pendingIds}.`,\n \"\",\n \"Image descriptions:\",\n ];\n for (const entry of pending) {\n lines.push(`\\\\nImage ${entry.index}: ${entry.prompt}`);\n }\n lines.push(`\\\\nPlease make all ${pending.length} remaining images.`);\n return [{ type: \"text\", text: lines.join(\"\\\\n\") }];\n };\n\n const contents: LlmContent[] = [{ role: \"user\", parts: buildInitialPromptParts() }];\n\n const orderedEntries = [...promptEntries];\n const resolvedImages = new Map<number, LlmImageData>();\n\n const removeResolvedEntries = (resolved: ReadonlySet<number>) => {\n if (resolved.size === 0) {\n return;\n }\n for (let i = promptEntries.length - 1; i >= 0; i -= 1) {\n const entry = promptEntries[i];\n if (!entry) {\n continue;\n }\n if (resolved.has(entry.index)) {\n promptEntries.splice(i, 1);\n }\n }\n };\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n const result = await generateText({\n model: request.model,\n contents,\n responseModalities: [\"IMAGE\", \"TEXT\"],\n imageAspectRatio: request.imageAspectRatio,\n imageSize: request.imageSize ?? \"2K\",\n });\n if (result.blocked || !result.content) {\n continue;\n }\n const images = extractImages(result.content);\n if (images.length > 0 && promptEntries.length > 0) {\n const assignedCount = Math.min(images.length, promptEntries.length);\n const pendingAssignments = promptEntries.slice(0, assignedCount);\n const assignedImages = images.slice(0, assignedCount);\n const gradeResults = await Promise.all(\n pendingAssignments.map((entry, index) =>\n gradeGeneratedImage({\n gradingPrompt,\n imagePrompt: entry.prompt,\n image: (() => {\n const image = assignedImages[index];\n if (!image) {\n throw new Error(\"Image generation returned fewer images than expected.\");\n }\n return image as LlmImageData;\n })(),\n model: \"gpt-5.2\",\n }),\n ),\n );\n const passedEntries = new Set<number>();\n for (let i = 0; i < gradeResults.length; i += 1) {\n const grade = gradeResults[i];\n const entry = pendingAssignments[i];\n const image = assignedImages[i];\n if (!grade || !entry || !image) {\n continue;\n }\n if (grade === \"pass\") {\n resolvedImages.set(entry.index, image as LlmImageData);\n passedEntries.add(entry.index);\n }\n }\n removeResolvedEntries(passedEntries);\n }\n if (promptEntries.length === 0) {\n break;\n }\n contents.push(result.content);\n contents.push({ role: \"user\", parts: buildContinuationPromptParts(promptEntries) });\n }\n\n const orderedImages: LlmImageData[] = [];\n for (const entry of orderedEntries) {\n const image = resolvedImages.get(entry.index);\n if (image) {\n orderedImages.push(image);\n }\n }\n\n return orderedImages.slice(0, numImages);\n}\n\nexport async function generateImageInBatches(\n request: LlmGenerateImagesRequest & { batchSize: number; overlapSize: number },\n): Promise<LlmImageData[]> {\n const {\n batchSize,\n overlapSize,\n imagePrompts,\n styleImages: baseStyleImagesInput,\n ...rest\n } = request;\n if (batchSize <= 0) {\n throw new Error(\"batchSize must be greater than 0\");\n }\n if (imagePrompts.length === 0) {\n return [];\n }\n\n const baseStyleImages = baseStyleImagesInput ? [...baseStyleImagesInput] : [];\n const generatedImages: LlmImageData[] = [];\n const totalPrompts = imagePrompts.length;\n\n for (let startIndex = 0; startIndex < totalPrompts; startIndex += batchSize) {\n const endIndex = Math.min(startIndex + batchSize, totalPrompts);\n const batchPrompts = imagePrompts.slice(startIndex, endIndex);\n\n let styleImagesForBatch: readonly LlmImageData[] = baseStyleImages;\n if (overlapSize > 0 && generatedImages.length > 0) {\n const overlapImages = generatedImages.slice(\n Math.max(0, generatedImages.length - overlapSize),\n );\n if (overlapImages.length > 0) {\n styleImagesForBatch = [...baseStyleImages, ...overlapImages];\n }\n }\n\n const batchImages = await generateImages({\n ...rest,\n imagePrompts: batchPrompts,\n styleImages: styleImagesForBatch,\n });\n\n generatedImages.push(...batchImages);\n }\n\n return generatedImages;\n}\n\nexport function stripCodexCitationMarkers(value: string): {\n text: string;\n stripped: boolean;\n} {\n // Codex-style citation markers are private-use unicode characters:\n // cite... (U+E200/U+E202/U+E201)\n const citationBlockPattern = /\\uE200cite\\uE202[^\\uE201]*\\uE201/gu;\n const leftoverMarkersPattern = /[\\uE200\\uE201\\uE202]/gu;\n\n const withoutBlocks = value.replace(citationBlockPattern, \"\");\n const withoutMarkers = withoutBlocks.replace(leftoverMarkersPattern, \"\");\n const stripped = withoutMarkers !== value;\n return { text: withoutMarkers, stripped };\n}\n\nfunction hasMarkdownSourcesSection(value: string): boolean {\n return /^##\\s+Sources\\s*$/gmu.test(value);\n}\n\nexport function appendMarkdownSourcesSection(value: string, sources: readonly string[]): string {\n const trimmed = value.trimEnd();\n if (sources.length === 0) {\n return trimmed;\n }\n if (hasMarkdownSourcesSection(trimmed)) {\n return trimmed;\n }\n const lines = sources.map((url) => `- <${url}>`).join(\"\\n\");\n return `${trimmed}\\n\\n## Sources\\n${lines}`;\n}\n","export type AsyncQueue<T> = {\n push: (value: T) => void;\n close: () => void;\n fail: (error: Error) => void;\n iterable: AsyncIterable<T>;\n};\n\nexport function createAsyncQueue<T>(): AsyncQueue<T> {\n let closed = false;\n let error: Error | null = null;\n const values: T[] = [];\n let pending: {\n resolve: (value: IteratorResult<T>) => void;\n reject: (err: Error) => void;\n } | null = null;\n\n const push = (value: T) => {\n if (closed || error) {\n return;\n }\n if (pending) {\n const { resolve } = pending;\n pending = null;\n resolve({ value, done: false });\n return;\n }\n values.push(value);\n };\n\n const close = () => {\n if (closed || error) {\n return;\n }\n closed = true;\n if (pending) {\n const { resolve } = pending;\n pending = null;\n resolve({ value: undefined as never, done: true });\n }\n };\n\n const fail = (err: Error) => {\n if (closed || error) {\n return;\n }\n error = err;\n if (pending) {\n const { reject } = pending;\n pending = null;\n reject(err);\n }\n };\n\n async function* iterator(): AsyncIterable<T> {\n while (true) {\n if (error) {\n throw error;\n }\n if (values.length > 0) {\n yield values.shift() as T;\n continue;\n }\n if (closed) {\n return;\n }\n const next = await new Promise<IteratorResult<T>>((resolve, reject) => {\n pending = { resolve, reject };\n });\n if (next.done) {\n return;\n }\n yield next.value;\n }\n }\n\n return { push, close, fail, iterable: iterator() };\n}\n","export type GeminiProPricing = {\n readonly threshold: number;\n readonly inputRateLow: number;\n readonly inputRateHigh: number;\n readonly cachedRateLow: number;\n readonly cachedRateHigh: number;\n readonly outputRateLow: number;\n readonly outputRateHigh: number;\n};\n\nexport type GeminiImagePricing = {\n readonly inputRate: number;\n readonly cachedRate: number;\n readonly outputTextRate: number;\n readonly outputImageRate: number;\n readonly imagePrices: Record<string, number>;\n};\n\n// Gemini pricing from Spark comments (USD per token).\nconst GEMINI_3_PRO_PREVIEW_PRICING: GeminiProPricing = {\n threshold: 200_000,\n inputRateLow: 2 / 1_000_000,\n inputRateHigh: 4 / 1_000_000,\n cachedRateLow: 0.2 / 1_000_000,\n cachedRateHigh: 0.4 / 1_000_000,\n outputRateLow: 12 / 1_000_000,\n outputRateHigh: 18 / 1_000_000,\n};\n\n// Pricing from Gemini 2.5 Pro public rates (per 1M tokens, USD):\n// - Input: $1.25 (<=200k prompt tokens), $2.50 (>200k)\n// - Output (including thinking): $10.00 (<=200k), $15.00 (>200k)\n// - Context caching: $0.125 (<=200k), $0.25 (>200k)\nconst GEMINI_2_5_PRO_PRICING: GeminiProPricing = {\n threshold: 200_000,\n inputRateLow: 1.25 / 1_000_000,\n inputRateHigh: 2.5 / 1_000_000,\n cachedRateLow: 0.125 / 1_000_000,\n cachedRateHigh: 0.25 / 1_000_000,\n outputRateLow: 10 / 1_000_000,\n outputRateHigh: 15 / 1_000_000,\n};\n\nconst GEMINI_IMAGE_PREVIEW_PRICING: GeminiImagePricing = {\n inputRate: 2 / 1_000_000,\n cachedRate: 0.2 / 1_000_000,\n outputTextRate: 12 / 1_000_000,\n outputImageRate: 120 / 1_000_000,\n imagePrices: {\n \"1K\": 0.134,\n \"2K\": 0.134,\n \"4K\": 0.24,\n },\n};\n\nexport function getGeminiProPricing(modelId: string): GeminiProPricing | undefined {\n if (modelId.includes(\"gemini-2.5-pro\")) {\n return GEMINI_2_5_PRO_PRICING;\n }\n if (modelId.includes(\"gemini-3-pro\")) {\n return GEMINI_3_PRO_PREVIEW_PRICING;\n }\n return undefined;\n}\n\nexport function getGeminiImagePricing(modelId: string): GeminiImagePricing | undefined {\n if (modelId.includes(\"image-preview\")) {\n return GEMINI_IMAGE_PREVIEW_PRICING;\n }\n return undefined;\n}\n","export type OpenAiPricing = {\n readonly inputRate: number;\n readonly cachedRate: number;\n readonly outputRate: number;\n};\n\n// Pricing from the Spark repo (best-effort snapshot).\n// Keep this conservative: unknown models -> cost 0.\nconst OPENAI_GPT_52_PRICING: OpenAiPricing = {\n inputRate: 1.75 / 1_000_000,\n cachedRate: 0.175 / 1_000_000,\n outputRate: 14 / 1_000_000,\n};\n\nconst OPENAI_GPT_51_CODEX_MINI_PRICING: OpenAiPricing = {\n inputRate: 0.25 / 1_000_000,\n cachedRate: 0.025 / 1_000_000,\n outputRate: 2.0 / 1_000_000,\n};\n\nexport function getOpenAiPricing(modelId: string): OpenAiPricing | undefined {\n if (modelId.includes(\"gpt-5.2\")) {\n return OPENAI_GPT_52_PRICING;\n }\n if (modelId.includes(\"gpt-5.1-codex-mini\")) {\n return OPENAI_GPT_51_CODEX_MINI_PRICING;\n }\n return undefined;\n}\n","import { getGeminiImagePricing, getGeminiProPricing } from \"../google/pricing.js\";\nimport { getOpenAiPricing } from \"../openai/pricing.js\";\n\nexport type LlmUsageTokens = {\n readonly promptTokens?: number;\n readonly cachedTokens?: number;\n readonly responseTokens?: number;\n readonly responseImageTokens?: number;\n readonly thinkingTokens?: number;\n readonly totalTokens?: number;\n readonly toolUsePromptTokens?: number;\n};\n\nfunction resolveUsageNumber(value: number | undefined): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.max(0, value);\n }\n return 0;\n}\n\nexport function estimateCallCostUsd({\n modelId,\n tokens,\n responseImages,\n imageSize,\n}: {\n modelId: string;\n tokens: LlmUsageTokens | undefined;\n responseImages: number;\n imageSize?: string;\n}): number {\n if (!tokens) {\n return 0;\n }\n const promptTokens = resolveUsageNumber(tokens.promptTokens);\n const cachedTokens = resolveUsageNumber(tokens.cachedTokens);\n const responseTokens = resolveUsageNumber(tokens.responseTokens);\n const responseImageTokens = resolveUsageNumber(tokens.responseImageTokens);\n const thinkingTokens = resolveUsageNumber(tokens.thinkingTokens);\n const toolUsePromptTokens = resolveUsageNumber(tokens.toolUsePromptTokens);\n const promptTokenTotal = promptTokens + toolUsePromptTokens;\n const nonCachedPrompt = Math.max(0, promptTokenTotal - cachedTokens);\n\n const imagePreviewPricing = getGeminiImagePricing(modelId);\n if (imagePreviewPricing) {\n const resolvedImageSize =\n imageSize && imagePreviewPricing.imagePrices[imageSize] ? imageSize : \"2K\";\n const imageRate = imagePreviewPricing.imagePrices[resolvedImageSize] ?? 0;\n const tokensPerImage =\n imagePreviewPricing.outputImageRate > 0 ? imageRate / imagePreviewPricing.outputImageRate : 0;\n let responseTextForPricing = Math.max(0, responseTokens - responseImageTokens);\n let imageTokensForPricing = responseImageTokens;\n if (imageTokensForPricing <= 0 && responseImages > 0 && tokensPerImage > 0) {\n const estimatedImageTokens = responseImages * tokensPerImage;\n imageTokensForPricing = estimatedImageTokens;\n if (responseTextForPricing >= estimatedImageTokens) {\n responseTextForPricing -= estimatedImageTokens;\n }\n }\n const textOutputCost =\n (responseTextForPricing + thinkingTokens) * imagePreviewPricing.outputTextRate;\n const inputCost = nonCachedPrompt * imagePreviewPricing.inputRate;\n const cachedCost = cachedTokens * imagePreviewPricing.cachedRate;\n const imageOutputCost = imageTokensForPricing * imagePreviewPricing.outputImageRate;\n return inputCost + cachedCost + textOutputCost + imageOutputCost;\n }\n\n const geminiPricing = getGeminiProPricing(modelId);\n if (geminiPricing) {\n const useHighTier = promptTokenTotal > geminiPricing.threshold;\n const inputRate = useHighTier ? geminiPricing.inputRateHigh : geminiPricing.inputRateLow;\n const cachedRate = useHighTier ? geminiPricing.cachedRateHigh : geminiPricing.cachedRateLow;\n const outputRate = useHighTier ? geminiPricing.outputRateHigh : geminiPricing.outputRateLow;\n const inputCost = nonCachedPrompt * inputRate;\n const cachedCost = cachedTokens * cachedRate;\n const outputTokens = responseTokens + thinkingTokens;\n const outputCost = outputTokens * outputRate;\n return inputCost + cachedCost + outputCost;\n }\n\n const openAiPricing = getOpenAiPricing(modelId);\n if (openAiPricing) {\n const inputCost = nonCachedPrompt * openAiPricing.inputRate;\n const cachedCost = cachedTokens * openAiPricing.cachedRate;\n const outputTokens = responseTokens + thinkingTokens;\n const outputCost = outputTokens * openAiPricing.outputRate;\n return inputCost + cachedCost + outputCost;\n }\n\n return 0;\n}\n","import os from \"node:os\";\nimport { TextDecoder } from \"node:util\";\n\nimport { getChatGptAuthProfile } from \"./chatgpt-auth.js\";\n\nconst CHATGPT_CODEX_ENDPOINT = \"https://chatgpt.com/backend-api/codex/responses\";\n\nexport type ChatGptInputTextPart = {\n type: \"input_text\";\n text: string;\n};\n\nexport type ChatGptOutputTextPart = {\n type: \"output_text\";\n text: string;\n};\n\nexport type ChatGptInputImagePart = {\n type: \"input_image\";\n image_url: string | { url: string };\n detail?: \"auto\";\n};\n\nexport type ChatGptInputMessagePart =\n | ChatGptInputTextPart\n | ChatGptOutputTextPart\n | ChatGptInputImagePart;\n\nexport type ChatGptInputMessage = {\n role: \"user\" | \"assistant\";\n content: string | ChatGptInputMessagePart[];\n type?: \"message\";\n status?: \"completed\";\n};\n\nexport type ChatGptFunctionCall = {\n type: \"function_call\";\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n status?: \"completed\";\n};\n\nexport type ChatGptFunctionCallOutput = {\n type: \"function_call_output\";\n call_id: string;\n output: string;\n};\n\nexport type ChatGptInputItem =\n | ChatGptInputMessage\n | ChatGptFunctionCall\n | ChatGptFunctionCallOutput;\n\nexport type ChatGptCodexRequest = {\n model: string;\n store: boolean;\n stream: boolean;\n instructions?: string;\n input: ChatGptInputItem[];\n text?: { verbosity?: string; format?: unknown };\n include?: string[];\n prompt_cache_key?: string;\n tool_choice?: \"auto\" | \"required\" | \"none\";\n parallel_tool_calls?: boolean;\n temperature?: number;\n tools?: unknown[];\n reasoning?: { effort: string; summary: string };\n};\n\nexport type ChatGptCodexStreamEvent = {\n type?: string;\n [key: string]: unknown;\n};\n\nexport type ChatGptCodexUsage = {\n input_tokens?: number;\n input_tokens_details?: { cached_tokens?: number };\n output_tokens?: number;\n output_tokens_details?: { reasoning_tokens?: number };\n total_tokens?: number;\n};\n\nexport type ChatGptCodexToolCall = {\n id: string;\n callId: string;\n name: string;\n arguments: string;\n};\n\nexport type ChatGptCodexWebSearchAction = {\n type: string;\n query?: string;\n queries?: string[];\n url?: string;\n pattern?: string;\n sources?: Array<{ url: string }>;\n};\n\nexport type ChatGptCodexWebSearchCall = {\n id: string;\n status?: string;\n action?: ChatGptCodexWebSearchAction;\n};\n\nexport type ChatGptCodexCollectedResponse = {\n text: string;\n reasoningText: string;\n reasoningSummaryText: string;\n toolCalls: ChatGptCodexToolCall[];\n webSearchCalls: ChatGptCodexWebSearchCall[];\n usage?: ChatGptCodexUsage;\n model?: string;\n status?: string;\n blocked: boolean;\n};\n\nexport type ChatGptCodexDelta = {\n textDelta?: string;\n thoughtDelta?: string;\n};\n\nexport async function streamChatGptCodexResponse(options: {\n request: ChatGptCodexRequest;\n sessionId?: string;\n signal?: AbortSignal;\n}): Promise<AsyncIterable<ChatGptCodexStreamEvent>> {\n const { access, accountId } = await getChatGptAuthProfile();\n const headers: Record<string, string> = {\n Authorization: `Bearer ${access}`,\n \"chatgpt-account-id\": accountId,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"llm\",\n \"User-Agent\": buildUserAgent(),\n Accept: \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n };\n if (options.sessionId) {\n headers.session_id = options.sessionId;\n }\n const response = await fetch(CHATGPT_CODEX_ENDPOINT, {\n method: \"POST\",\n headers,\n body: JSON.stringify(options.request),\n signal: options.signal,\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`ChatGPT Codex request failed (${response.status}): ${body}`);\n }\n const body = response.body;\n if (!body) {\n throw new Error(\"ChatGPT Codex response body was empty.\");\n }\n return parseEventStream(body);\n}\n\nexport async function collectChatGptCodexResponse(options: {\n request: ChatGptCodexRequest;\n sessionId?: string;\n signal?: AbortSignal;\n onDelta?: (delta: ChatGptCodexDelta) => void;\n}): Promise<ChatGptCodexCollectedResponse> {\n const stream = await streamChatGptCodexResponse(options);\n const toolCalls = new Map<string, ChatGptCodexToolCall>();\n const toolCallOrder: string[] = [];\n const webSearchCalls = new Map<string, ChatGptCodexWebSearchCall>();\n const webSearchCallOrder: string[] = [];\n let text = \"\";\n const reasoningText = \"\";\n let reasoningSummaryText = \"\";\n let usage: ChatGptCodexUsage | undefined;\n let model: string | undefined;\n let status: string | undefined;\n let blocked = false;\n for await (const event of stream) {\n const type = typeof event.type === \"string\" ? event.type : undefined;\n if (type === \"response.output_text.delta\") {\n const delta = typeof event.delta === \"string\" ? event.delta : \"\";\n if (delta.length > 0) {\n text += delta;\n options.onDelta?.({ textDelta: delta });\n }\n continue;\n }\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = typeof event.delta === \"string\" ? event.delta : \"\";\n if (delta.length > 0) {\n reasoningSummaryText += delta;\n options.onDelta?.({ thoughtDelta: delta });\n }\n continue;\n }\n if (type === \"response.reasoning_text.delta\") {\n // Avoid collecting chain-of-thought; summaries are handled separately above.\n continue;\n }\n if (type === \"response.refusal.delta\") {\n blocked = true;\n continue;\n }\n if (type === \"response.output_item.added\" || type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown> | undefined;\n if (item) {\n if (item.type === \"function_call\") {\n const id = typeof item.id === \"string\" ? item.id : \"\";\n const callId = typeof item.call_id === \"string\" ? item.call_id : id;\n const name = typeof item.name === \"string\" ? item.name : \"\";\n const args = typeof item.arguments === \"string\" ? item.arguments : \"\";\n if (callId) {\n if (!toolCalls.has(callId)) {\n toolCallOrder.push(callId);\n }\n toolCalls.set(callId, { id, callId, name, arguments: args });\n }\n } else if (item.type === \"web_search_call\") {\n const id = typeof item.id === \"string\" ? item.id : \"\";\n if (id) {\n if (!webSearchCalls.has(id)) {\n webSearchCallOrder.push(id);\n }\n webSearchCalls.set(id, {\n id,\n status: typeof item.status === \"string\" ? item.status : undefined,\n action:\n item.action && typeof item.action === \"object\"\n ? (item.action as ChatGptCodexWebSearchAction)\n : undefined,\n });\n }\n }\n }\n continue;\n }\n if (type === \"response.completed\") {\n const response = event.response as Record<string, unknown> | undefined;\n if (response) {\n usage = response.usage as ChatGptCodexUsage | undefined;\n model = typeof response.model === \"string\" ? response.model : undefined;\n status = typeof response.status === \"string\" ? response.status : undefined;\n }\n continue;\n }\n if (type === \"response.failed\") {\n const response = event.response as Record<string, unknown> | undefined;\n if (response) {\n usage = response.usage as ChatGptCodexUsage | undefined;\n model = typeof response.model === \"string\" ? response.model : undefined;\n status = typeof response.status === \"string\" ? response.status : undefined;\n }\n continue;\n }\n if (type === \"response.in_progress\") {\n const response = event.response as Record<string, unknown> | undefined;\n if (response) {\n usage = response.usage as ChatGptCodexUsage | undefined;\n model = typeof response.model === \"string\" ? response.model : undefined;\n status = typeof response.status === \"string\" ? response.status : undefined;\n }\n }\n }\n\n // Fallback: if we never received the summary delta, preserve reasoningText.\n if (!reasoningSummaryText && reasoningText) {\n reasoningSummaryText = reasoningText;\n }\n\n const orderedToolCalls = toolCallOrder\n .map((id) => toolCalls.get(id))\n .filter((call): call is ChatGptCodexToolCall => call !== undefined);\n const orderedWebSearchCalls = webSearchCallOrder\n .map((id) => webSearchCalls.get(id))\n .filter((call): call is ChatGptCodexWebSearchCall => call !== undefined);\n\n return {\n text,\n reasoningText,\n reasoningSummaryText,\n toolCalls: orderedToolCalls,\n webSearchCalls: orderedWebSearchCalls,\n usage,\n model,\n status,\n blocked,\n };\n}\n\nfunction buildUserAgent(): string {\n const node = process.version;\n const platform = os.platform();\n const release = os.release();\n return `@ljoukov/llm (node ${node}; ${platform} ${release})`;\n}\n\nasync function* parseEventStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncIterable<ChatGptCodexStreamEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n let sepIndex = buffer.indexOf(\"\\n\\n\");\n while (sepIndex !== -1) {\n const raw = buffer.slice(0, sepIndex);\n buffer = buffer.slice(sepIndex + 2);\n const event = parseEventBlock(raw);\n if (event) {\n yield event;\n }\n sepIndex = buffer.indexOf(\"\\n\\n\");\n }\n }\n if (buffer.trim().length > 0) {\n const event = parseEventBlock(buffer);\n if (event) {\n yield event;\n }\n }\n}\n\nfunction parseEventBlock(raw: string): ChatGptCodexStreamEvent | null {\n const lines = raw\n .split(/\\r?\\n/u)\n .map((line) => line.trimEnd())\n .filter(Boolean);\n const dataLines = lines\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(\"data:\".length).trimStart());\n if (dataLines.length === 0) {\n return null;\n }\n const payload = dataLines.join(\"\\n\");\n if (payload === \"[DONE]\") {\n return null;\n }\n try {\n return JSON.parse(payload) as ChatGptCodexStreamEvent;\n } catch {\n return null;\n }\n}\n","import { Buffer } from \"node:buffer\";\n\nimport { z } from \"zod\";\n\nimport { loadLocalEnv } from \"../utils/env.js\";\n\nconst CHATGPT_AUTH_JSON_ENV = \"CHATGPT_AUTH_JSON\";\nconst CHATGPT_AUTH_JSON_B64_ENV = \"CHATGPT_AUTH_JSON_B64\";\n\nconst CHATGPT_ACCESS_ENV = \"CHATGPT_ACCESS\";\nconst CHATGPT_REFRESH_ENV = \"CHATGPT_REFRESH\";\nconst CHATGPT_EXPIRES_ENV = \"CHATGPT_EXPIRES\";\n\nconst CHATGPT_ACCOUNT_ID_ENV = \"CHATGPT_ACCOUNT_ID\";\nconst CHATGPT_ID_TOKEN_ENV = \"CHATGPT_ID_TOKEN\";\nconst CHATGPT_ACCESS_TOKEN_ENV = \"CHATGPT_ACCESS_TOKEN\";\nconst CHATGPT_REFRESH_TOKEN_ENV = \"CHATGPT_REFRESH_TOKEN\";\nconst CHATGPT_EXPIRES_AT_ENV = \"CHATGPT_EXPIRES_AT\";\n\nconst CHATGPT_OAUTH_CLIENT_ID = \"app_EMoamEEZ73f0CkXaXp7hrann\";\nconst CHATGPT_OAUTH_TOKEN_URL = \"https://auth.openai.com/oauth/token\";\nconst CHATGPT_OAUTH_REDIRECT_URI = \"http://localhost:1455/auth/callback\";\n\nconst TOKEN_EXPIRY_BUFFER_MS = 30_000;\n\nexport type ChatGptAuthProfile = {\n readonly access: string;\n readonly refresh: string;\n readonly expires: number;\n readonly accountId: string;\n readonly idToken?: string;\n};\n\nconst AuthInputSchema = z\n .object({\n access: z.string().min(1).optional(),\n access_token: z.string().min(1).optional(),\n accessToken: z.string().min(1).optional(),\n refresh: z.string().min(1).optional(),\n refresh_token: z.string().min(1).optional(),\n refreshToken: z.string().min(1).optional(),\n expires: z.union([z.number(), z.string()]).optional(),\n expires_at: z.union([z.number(), z.string()]).optional(),\n expiresAt: z.union([z.number(), z.string()]).optional(),\n accountId: z.string().min(1).optional(),\n account_id: z.string().min(1).optional(),\n id_token: z.string().optional(),\n idToken: z.string().optional(),\n })\n .loose();\n\nconst RefreshResponseSchema = z.object({\n access_token: z.string().min(1),\n refresh_token: z.string().min(1),\n expires_in: z.union([z.number(), z.string()]),\n});\n\nconst ExchangeResponseSchema = z.object({\n access_token: z.string().min(1),\n refresh_token: z.string().min(1),\n expires_in: z.union([z.number(), z.string()]),\n id_token: z.string().optional(),\n});\n\nlet cachedProfile: ChatGptAuthProfile | null = null;\nlet refreshPromise: Promise<ChatGptAuthProfile> | null = null;\n\nexport function encodeChatGptAuthJson(profile: ChatGptAuthProfile): string {\n const payload = {\n access: profile.access,\n refresh: profile.refresh,\n expires: profile.expires,\n accountId: profile.accountId,\n ...(profile.idToken ? { id_token: profile.idToken } : {}),\n };\n return JSON.stringify(payload);\n}\n\nexport function encodeChatGptAuthJsonB64(profile: ChatGptAuthProfile): string {\n return Buffer.from(encodeChatGptAuthJson(profile)).toString(\"base64url\");\n}\n\nexport async function exchangeChatGptOauthCode({\n code,\n verifier,\n redirectUri = CHATGPT_OAUTH_REDIRECT_URI,\n}: {\n code: string;\n verifier: string;\n redirectUri?: string;\n}): Promise<ChatGptAuthProfile> {\n const params = new URLSearchParams();\n params.set(\"grant_type\", \"authorization_code\");\n params.set(\"client_id\", CHATGPT_OAUTH_CLIENT_ID);\n params.set(\"code\", code);\n params.set(\"code_verifier\", verifier);\n params.set(\"redirect_uri\", redirectUri);\n const response = await fetch(CHATGPT_OAUTH_TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: params.toString(),\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`ChatGPT OAuth token exchange failed (${response.status}): ${body}`);\n }\n const payload = ExchangeResponseSchema.parse(await response.json());\n return profileFromTokenResponse(payload);\n}\n\nexport async function refreshChatGptOauthToken(refreshToken: string): Promise<ChatGptAuthProfile> {\n const params = new URLSearchParams();\n params.set(\"grant_type\", \"refresh_token\");\n params.set(\"client_id\", CHATGPT_OAUTH_CLIENT_ID);\n params.set(\"refresh_token\", refreshToken);\n const response = await fetch(CHATGPT_OAUTH_TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: params.toString(),\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`ChatGPT OAuth refresh failed (${response.status}): ${body}`);\n }\n const payload = RefreshResponseSchema.parse(await response.json());\n return profileFromTokenResponse(payload);\n}\n\nexport async function getChatGptAuthProfile(): Promise<ChatGptAuthProfile> {\n if (cachedProfile && !isExpired(cachedProfile)) {\n return cachedProfile;\n }\n if (refreshPromise) {\n return refreshPromise;\n }\n refreshPromise = (async () => {\n try {\n const baseProfile = cachedProfile ?? loadAuthProfileFromEnv();\n const profile = isExpired(baseProfile)\n ? await refreshChatGptOauthToken(baseProfile.refresh)\n : baseProfile;\n cachedProfile = profile;\n return profile;\n } finally {\n refreshPromise = null;\n }\n })();\n return refreshPromise;\n}\n\nfunction profileFromTokenResponse(payload: {\n access_token: string;\n refresh_token: string;\n expires_in: number | string;\n id_token?: string;\n}): ChatGptAuthProfile {\n const expires = Date.now() + normalizeNumber(payload.expires_in) * 1000;\n const accountId =\n extractChatGptAccountId(payload.id_token ?? \"\") ??\n extractChatGptAccountId(payload.access_token);\n if (!accountId) {\n throw new Error(\"Failed to extract chatgpt_account_id from access token.\");\n }\n return {\n access: payload.access_token,\n refresh: payload.refresh_token,\n expires,\n accountId,\n idToken: payload.id_token,\n };\n}\n\nfunction normalizeAuthProfile(data: z.infer<typeof AuthInputSchema>): ChatGptAuthProfile {\n const access = data.access ?? data.access_token ?? data.accessToken ?? undefined;\n const refresh = data.refresh ?? data.refresh_token ?? data.refreshToken ?? undefined;\n if (!access || !refresh) {\n throw new Error(\"ChatGPT credentials must include access and refresh.\");\n }\n const expiresRaw = data.expires ?? data.expires_at ?? data.expiresAt;\n const idToken = data.idToken ?? data.id_token ?? undefined;\n const expires =\n normalizeEpochMillis(expiresRaw) ??\n extractJwtExpiry(idToken ?? access) ??\n Date.now() + 5 * 60_000;\n const accountId =\n data.accountId ??\n data.account_id ??\n extractChatGptAccountId(idToken ?? \"\") ??\n extractChatGptAccountId(access);\n if (!accountId) {\n throw new Error(\"ChatGPT credentials missing chatgpt_account_id.\");\n }\n return {\n access,\n refresh,\n expires,\n accountId,\n idToken: idToken ?? undefined,\n };\n}\n\nfunction normalizeEpochMillis(value: unknown): number | undefined {\n const numeric = normalizeNumber(value);\n if (!Number.isFinite(numeric)) {\n return undefined;\n }\n return numeric < 1_000_000_000_000 ? numeric * 1000 : numeric;\n}\n\nfunction normalizeNumber(value: unknown): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return Number.NaN;\n}\n\nfunction isExpired(profile: ChatGptAuthProfile): boolean {\n const expires = profile.expires;\n if (!Number.isFinite(expires)) {\n return true;\n }\n return Date.now() + TOKEN_EXPIRY_BUFFER_MS >= expires;\n}\n\nfunction loadAuthProfileFromEnv(): ChatGptAuthProfile {\n loadLocalEnv();\n\n const rawJson = process.env[CHATGPT_AUTH_JSON_ENV];\n if (rawJson && rawJson.trim().length > 0) {\n return normalizeAuthProfile(AuthInputSchema.parse(JSON.parse(rawJson)));\n }\n\n const rawB64 = process.env[CHATGPT_AUTH_JSON_B64_ENV];\n if (rawB64 && rawB64.trim().length > 0) {\n const decoded = Buffer.from(rawB64.trim(), \"base64url\").toString(\"utf8\");\n return normalizeAuthProfile(AuthInputSchema.parse(JSON.parse(decoded)));\n }\n\n const access =\n process.env[CHATGPT_ACCESS_ENV] ?? process.env[CHATGPT_ACCESS_TOKEN_ENV] ?? undefined;\n const refresh =\n process.env[CHATGPT_REFRESH_ENV] ?? process.env[CHATGPT_REFRESH_TOKEN_ENV] ?? undefined;\n const expires =\n process.env[CHATGPT_EXPIRES_ENV] ?? process.env[CHATGPT_EXPIRES_AT_ENV] ?? undefined;\n const accountId = process.env[CHATGPT_ACCOUNT_ID_ENV] ?? undefined;\n const idToken = process.env[CHATGPT_ID_TOKEN_ENV] ?? undefined;\n\n const parsed = AuthInputSchema.parse({\n access,\n refresh,\n expires,\n accountId,\n idToken,\n });\n\n return normalizeAuthProfile(parsed);\n}\n\nfunction decodeJwtPayload(token: string): unknown {\n const segments = token.split(\".\");\n if (segments.length < 2) {\n return null;\n }\n const payloadB64 = segments[1] ?? \"\";\n try {\n const decoded = Buffer.from(payloadB64, \"base64url\").toString(\"utf8\");\n return JSON.parse(decoded);\n } catch {\n return null;\n }\n}\n\nfunction extractJwtExpiry(token: string): number | undefined {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const exp = (payload as { exp?: unknown }).exp;\n const parsed = normalizeNumber(exp);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return undefined;\n }\n return parsed < 1_000_000_000_000 ? parsed * 1000 : parsed;\n}\n\nfunction extractChatGptAccountId(token: string): string | undefined {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const accountId = (payload as { chatgpt_account_id?: unknown }).chatgpt_account_id;\n return typeof accountId === \"string\" && accountId.length > 0 ? accountId : undefined;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nlet envLoaded = false;\n\n/**\n * Loads `.env.local` from `process.cwd()` once.\n *\n * - Does not override already-set `process.env` values.\n * - Missing file is silently ignored.\n */\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n const envPath = path.join(process.cwd(), \".env.local\");\n loadEnvFromFile(envPath, { override: false });\n envLoaded = true;\n}\n\nexport function loadEnvFromFile(\n filePath: string,\n { override = false }: { override?: boolean } = {},\n): void {\n let content: string;\n try {\n content = fs.readFileSync(filePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n\n for (const line of content.split(/\\r?\\n/u)) {\n const entry = parseEnvLine(line);\n if (!entry) {\n continue;\n }\n const [key, value] = entry;\n if (override || process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n}\n\nfunction parseEnvLine(line: string): [string, string] | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n return null;\n }\n\n const match = trimmed.match(/^(?:export\\s+)?([A-Za-z_][A-Za-z0-9_\\-.]*)\\s*=\\s*(.*)$/u);\n if (!match) {\n return null;\n }\n\n const key = match[1];\n if (!key) {\n return null;\n }\n let value = match[2] ?? \"\";\n\n if (value.startsWith('\"') && value.endsWith('\"') && value.length >= 2) {\n value = value.slice(1, -1);\n } else if (value.startsWith(\"'\") && value.endsWith(\"'\") && value.length >= 2) {\n value = value.slice(1, -1);\n } else {\n const commentIndex = value.indexOf(\" #\");\n if (commentIndex >= 0) {\n value = value.slice(0, commentIndex);\n }\n value = value.trim();\n }\n\n return [key, value];\n}\n","export type CallSchedulerRetryPolicy = {\n readonly maxAttempts: number;\n /**\n * Return `null` to stop retrying and surface the original error.\n * `attempt` is 1-based and indicates the attempt that just failed.\n */\n readonly getDelayMs: (attempt: number, error: unknown) => number | null;\n};\n\nexport type CallSchedulerOptions = {\n readonly maxParallelRequests?: number;\n readonly minIntervalBetweenStartMs?: number;\n readonly startJitterMs?: number;\n readonly retry?: CallSchedulerRetryPolicy;\n};\n\nexport type CallScheduler = {\n run: <T>(fn: () => Promise<T>) => Promise<T>;\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction toError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n if (typeof value === \"string\") {\n return new Error(value);\n }\n return new Error(\"Unknown error\");\n}\n\nexport function createCallScheduler(options: CallSchedulerOptions = {}): CallScheduler {\n const maxParallelRequests = Math.max(1, Math.floor(options.maxParallelRequests ?? 3));\n const minIntervalBetweenStartMs = Math.max(0, Math.floor(options.minIntervalBetweenStartMs ?? 0));\n const startJitterMs = Math.max(0, Math.floor(options.startJitterMs ?? 0));\n const retryPolicy = options.retry;\n\n let activeCount = 0;\n let lastStartTime = 0;\n\n // Serializes start-spacing to avoid concurrent jobs racing on lastStartTime.\n let startSpacingChain: Promise<void> = Promise.resolve();\n\n type QueueJob = () => Promise<void>;\n const queue: QueueJob[] = [];\n\n async function applyStartSpacing(): Promise<void> {\n const previous = startSpacingChain;\n let release: (() => void) | undefined;\n startSpacingChain = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous;\n try {\n if (lastStartTime > 0 && minIntervalBetweenStartMs > 0) {\n const earliestNext = lastStartTime + minIntervalBetweenStartMs;\n const wait = Math.max(0, earliestNext - Date.now());\n if (wait > 0) {\n await sleep(wait);\n }\n }\n if (startJitterMs > 0) {\n await sleep(Math.floor(Math.random() * (startJitterMs + 1)));\n }\n lastStartTime = Date.now();\n } finally {\n release?.();\n }\n }\n\n async function attemptWithRetries<T>(fn: () => Promise<T>, attempt: number): Promise<T> {\n try {\n await applyStartSpacing();\n return await fn();\n } catch (error: unknown) {\n const err = toError(error);\n if (!retryPolicy || attempt >= retryPolicy.maxAttempts) {\n throw err;\n }\n let delay = retryPolicy.getDelayMs(attempt, error);\n if (delay === null) {\n throw err;\n }\n if (!Number.isFinite(delay)) {\n delay = 0;\n }\n const normalizedDelay = Math.max(0, delay);\n if (normalizedDelay > 0) {\n await sleep(normalizedDelay);\n }\n return attemptWithRetries(fn, attempt + 1);\n }\n }\n\n function drainQueue(): void {\n while (activeCount < maxParallelRequests && queue.length > 0) {\n const task = queue.shift();\n if (!task) {\n continue;\n }\n activeCount += 1;\n void task();\n }\n }\n\n function run<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const job: QueueJob = async () => {\n try {\n const result = await attemptWithRetries(fn, 1);\n resolve(result);\n } catch (error: unknown) {\n reject(toError(error));\n } finally {\n activeCount -= 1;\n queueMicrotask(drainQueue);\n }\n };\n queue.push(job);\n drainQueue();\n });\n }\n\n return { run };\n}\n","import { GoogleGenAI, type GoogleGenAIOptions } from \"@google/genai\";\n\nimport { getGoogleAuthOptions, getGoogleServiceAccount } from \"./auth.js\";\n\nexport const GEMINI_MODEL_IDS = [\n \"gemini-3-pro-preview\",\n \"gemini-2.5-pro\",\n \"gemini-flash-latest\",\n \"gemini-flash-lite-latest\",\n] as const;\n\nexport type GeminiModelId = (typeof GEMINI_MODEL_IDS)[number];\n\nexport function isGeminiModelId(value: string): value is GeminiModelId {\n return (GEMINI_MODEL_IDS as readonly string[]).includes(value);\n}\n\nconst CLOUD_PLATFORM_SCOPE = \"https://www.googleapis.com/auth/cloud-platform\";\nconst DEFAULT_VERTEX_LOCATION = \"global\";\n\nexport type GeminiConfiguration = {\n readonly projectId?: string;\n readonly location?: string;\n};\n\nlet geminiConfiguration: GeminiConfiguration = {};\nlet clientPromise: Promise<GoogleGenAI> | undefined;\n\nfunction normaliseConfigValue(value?: string | null): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function configureGemini(options: GeminiConfiguration = {}): void {\n const nextProjectId = normaliseConfigValue(options.projectId);\n const nextLocation = normaliseConfigValue(options.location);\n geminiConfiguration = {\n projectId: nextProjectId !== undefined ? nextProjectId : geminiConfiguration.projectId,\n location: nextLocation !== undefined ? nextLocation : geminiConfiguration.location,\n };\n clientPromise = undefined;\n}\n\nfunction resolveProjectId(): string {\n const override = geminiConfiguration.projectId;\n if (override) {\n return override;\n }\n const serviceAccount = getGoogleServiceAccount();\n return serviceAccount.projectId;\n}\n\nfunction resolveLocation(): string {\n const override = geminiConfiguration.location;\n if (override) {\n return override;\n }\n return DEFAULT_VERTEX_LOCATION;\n}\n\nexport async function getGeminiClient(): Promise<GoogleGenAI> {\n if (!clientPromise) {\n clientPromise = Promise.resolve().then(() => {\n const projectId = resolveProjectId();\n const location = resolveLocation();\n const googleAuthOptions = getGoogleAuthOptions(CLOUD_PLATFORM_SCOPE);\n return new GoogleGenAI({\n vertexai: true,\n project: projectId,\n location,\n googleAuthOptions: googleAuthOptions as GoogleGenAIOptions[\"googleAuthOptions\"],\n });\n });\n }\n return clientPromise;\n}\n","import { GoogleAuth, type AnyAuthClient, type GoogleAuthOptions } from \"google-auth-library\";\nimport { z } from \"zod\";\n\nimport { loadLocalEnv } from \"../utils/env.js\";\n\nexport type GoogleServiceAccount = {\n projectId: string;\n clientEmail: string;\n privateKey: string;\n tokenUri?: string;\n};\n\nconst ServiceAccountSchema = z\n .object({\n project_id: z.string().min(1),\n client_email: z.email(),\n private_key: z.string().min(1),\n token_uri: z.string().optional(),\n })\n .transform(({ project_id, client_email, private_key, token_uri }) => ({\n projectId: project_id,\n clientEmail: client_email,\n privateKey: private_key.replace(/\\\\n/g, \"\\n\"),\n tokenUri: token_uri,\n }));\n\nlet cachedServiceAccount: GoogleServiceAccount | null = null;\nconst authClientCache = new Map<string, GoogleAuth<AnyAuthClient>>();\n\nexport function parseGoogleServiceAccount(input: string): GoogleServiceAccount {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n throw new Error(`Invalid Google service account JSON: ${(error as Error).message}`);\n }\n return ServiceAccountSchema.parse(parsed);\n}\n\nexport function getGoogleServiceAccount(): GoogleServiceAccount {\n if (cachedServiceAccount) {\n return cachedServiceAccount;\n }\n\n loadLocalEnv();\n\n const raw = process.env.GOOGLE_SERVICE_ACCOUNT_JSON;\n if (!raw || raw.trim().length === 0) {\n throw new Error(\"GOOGLE_SERVICE_ACCOUNT_JSON must be provided for Google APIs access.\");\n }\n\n cachedServiceAccount = parseGoogleServiceAccount(raw);\n return cachedServiceAccount;\n}\n\nfunction normaliseScopes(scopes?: string | readonly string[]): string[] | undefined {\n if (!scopes) {\n return undefined;\n }\n if (typeof scopes === \"string\") {\n return [scopes];\n }\n if (scopes.length === 0) {\n return undefined;\n }\n return Array.from(new Set(scopes)).sort();\n}\n\nexport function getGoogleAuthOptions(\n scopes?: string | readonly string[],\n): GoogleAuthOptions<AnyAuthClient> {\n const serviceAccount = getGoogleServiceAccount();\n const normalisedScopes = normaliseScopes(scopes);\n const options: GoogleAuthOptions<AnyAuthClient> = {\n credentials: {\n client_email: serviceAccount.clientEmail,\n private_key: serviceAccount.privateKey,\n },\n projectId: serviceAccount.projectId,\n scopes: normalisedScopes,\n };\n return options;\n}\n\nexport function getGoogleAuth(scopes?: string | readonly string[]): GoogleAuth<AnyAuthClient> {\n const normalised = normaliseScopes(scopes);\n const key = (normalised ?? []).join(\" \");\n const cached = authClientCache.get(key);\n if (cached) {\n return cached;\n }\n const auth = new GoogleAuth(getGoogleAuthOptions(normalised));\n authClientCache.set(key, auth);\n return auth;\n}\n\nexport async function getGoogleAccessToken(scopes?: string | readonly string[]): Promise<string> {\n const auth = getGoogleAuth(scopes);\n const token = await auth.getAccessToken();\n if (!token) {\n throw new Error(\"GoogleAuth returned an empty access token.\");\n }\n return token;\n}\n","import type { GoogleGenAI } from \"@google/genai\";\n\nimport { createCallScheduler } from \"../utils/scheduler.js\";\n\nimport { getGeminiClient } from \"./client.js\";\n\nconst RETRYABLE_STATUSES = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst RETRYABLE_ERROR_CODES = new Set([\"ECONNRESET\", \"ETIMEDOUT\", \"EAI_AGAIN\"]);\nconst RATE_LIMIT_REASONS = new Set([\"RATE_LIMIT_EXCEEDED\", \"RESOURCE_EXHAUSTED\", \"QUOTA_EXCEEDED\"]);\n\nfunction getStatus(error: unknown): number | undefined {\n const maybe = error as {\n status?: unknown;\n statusCode?: unknown;\n code?: unknown;\n response?: { status?: unknown };\n };\n const candidates = [maybe?.status, maybe?.statusCode, maybe?.response?.status];\n for (const value of candidates) {\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n }\n if (typeof maybe?.code === \"number\") {\n return maybe.code;\n }\n return undefined;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const maybe = error as { code?: unknown; cause?: unknown };\n if (typeof maybe.code === \"string\") {\n return maybe.code;\n }\n if (maybe.cause && typeof maybe.cause === \"object\") {\n const causeCode = (maybe.cause as { code?: unknown }).code;\n if (typeof causeCode === \"string\") {\n return causeCode;\n }\n }\n return undefined;\n}\n\nfunction getErrorReason(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const details = (error as { errorDetails?: unknown }).errorDetails;\n if (Array.isArray(details) && details.length > 0) {\n const reason = (details[0] as { reason?: unknown }).reason;\n if (typeof reason === \"string\") {\n return reason;\n }\n }\n const cause = (error as { cause?: unknown }).cause;\n if (cause && typeof cause === \"object\") {\n const nestedDetails = (cause as { errorDetails?: unknown }).errorDetails;\n if (Array.isArray(nestedDetails) && nestedDetails.length > 0) {\n const reason = (nestedDetails[0] as { reason?: unknown }).reason;\n if (typeof reason === \"string\") {\n return reason;\n }\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return \"\";\n}\n\nfunction parseRetryInfo(details: unknown): number | undefined {\n if (Array.isArray(details)) {\n for (const entry of details) {\n const ms = parseRetryInfo(entry);\n if (ms !== undefined) {\n return ms;\n }\n }\n return undefined;\n }\n if (!details || typeof details !== \"object\") {\n return undefined;\n }\n const retryDelay = (details as { retryDelay?: unknown }).retryDelay as\n | { seconds?: unknown; nanos?: unknown }\n | undefined;\n if (retryDelay) {\n const secondsRaw = retryDelay.seconds;\n const nanosRaw = retryDelay.nanos;\n const seconds =\n typeof secondsRaw === \"number\"\n ? secondsRaw\n : typeof secondsRaw === \"string\"\n ? Number.parseFloat(secondsRaw)\n : 0;\n const nanos =\n typeof nanosRaw === \"number\"\n ? nanosRaw\n : typeof nanosRaw === \"string\"\n ? Number.parseInt(nanosRaw, 10)\n : 0;\n if (Number.isFinite(seconds) || Number.isFinite(nanos)) {\n const totalMs = seconds * 1000 + nanos / 1_000_000;\n if (totalMs > 0) {\n return totalMs;\n }\n }\n }\n const nestedDetails = (details as { details?: unknown }).details;\n if (nestedDetails) {\n const nested = parseRetryInfo(nestedDetails);\n if (nested !== undefined) {\n return nested;\n }\n }\n return undefined;\n}\n\nfunction parseRetryAfterFromMessage(message: string): number | undefined {\n const trimmed = message.trim();\n if (!trimmed) {\n return undefined;\n }\n const regex = /retry in\\\\s+([0-9]+(?:\\\\.[0-9]+)?)\\\\s*(s|sec|secs|seconds?)/iu;\n const match = regex.exec(trimmed);\n if (match?.[1]) {\n const value = Number.parseFloat(match[1]);\n if (Number.isFinite(value) && value > 0) {\n return value * 1000;\n }\n }\n return undefined;\n}\n\nfunction getRetryAfterMs(error: unknown): number | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n\n const infoFromDetails = parseRetryInfo((error as { errorDetails?: unknown }).errorDetails);\n if (infoFromDetails !== undefined) {\n return infoFromDetails;\n }\n\n const cause = (error as { cause?: unknown }).cause;\n if (cause && typeof cause === \"object\") {\n const nested = getRetryAfterMs(cause);\n if (nested !== undefined) {\n return nested;\n }\n }\n\n const message = getErrorMessage(error);\n if (message) {\n const fromMessage = parseRetryAfterFromMessage(message.toLowerCase());\n if (fromMessage !== undefined) {\n return fromMessage;\n }\n }\n\n return undefined;\n}\n\nfunction shouldRetry(error: unknown): boolean {\n const status = getStatus(error);\n if (status && RETRYABLE_STATUSES.has(status)) {\n return true;\n }\n\n const reason = getErrorReason(error);\n if (reason && RATE_LIMIT_REASONS.has(reason)) {\n return true;\n }\n\n const code = getErrorCode(error);\n if (code && RETRYABLE_ERROR_CODES.has(code)) {\n return true;\n }\n\n const message = getErrorMessage(error).toLowerCase();\n if (message.includes(\"rate limit\") || message.includes(\"temporarily unavailable\")) {\n return true;\n }\n if (message.includes(\"fetch failed\") || message.includes(\"socket hang up\")) {\n return true;\n }\n if (message.includes(\"quota\") || message.includes(\"insufficient\")) {\n return false;\n }\n if (message.includes(\"timeout\") || message.includes(\"network\")) {\n return true;\n }\n return false;\n}\n\nfunction retryDelayMs(attempt: number): number {\n const baseRetryDelayMs = 500;\n const maxRetryDelayMs = 4000;\n const base = Math.min(maxRetryDelayMs, baseRetryDelayMs * 2 ** (attempt - 1));\n const jitter = Math.floor(Math.random() * 200);\n return base + jitter;\n}\n\nconst scheduler = createCallScheduler({\n maxParallelRequests: 3,\n minIntervalBetweenStartMs: 200,\n startJitterMs: 200,\n retry: {\n maxAttempts: 3,\n getDelayMs: (attempt, error) => {\n if (!shouldRetry(error)) {\n return null;\n }\n const hintedDelay = getRetryAfterMs(error);\n return hintedDelay ?? retryDelayMs(attempt);\n },\n },\n});\n\nexport async function runGeminiCall<T>(fn: (client: GoogleGenAI) => Promise<T>): Promise<T> {\n return scheduler.run(async () => fn(await getGeminiClient()));\n}\n","import OpenAI from \"openai\";\nimport { Agent, fetch as undiciFetch } from \"undici\";\n\nimport { loadLocalEnv } from \"../utils/env.js\";\n\nlet cachedApiKey: string | null = null;\nlet cachedClient: OpenAI | null = null;\nlet cachedFetch: typeof fetch | null = null;\nlet cachedTimeoutMs: number | null = null;\n\nconst DEFAULT_OPENAI_TIMEOUT_MS = 15 * 60_000;\n\nfunction resolveOpenAiTimeoutMs(): number {\n if (cachedTimeoutMs !== null) {\n return cachedTimeoutMs;\n }\n\n const raw = process.env.OPENAI_STREAM_TIMEOUT_MS ?? process.env.OPENAI_TIMEOUT_MS;\n const parsed = raw ? Number(raw) : Number.NaN;\n cachedTimeoutMs = Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_OPENAI_TIMEOUT_MS;\n return cachedTimeoutMs;\n}\n\nfunction getOpenAiFetch(): typeof fetch {\n if (cachedFetch) {\n return cachedFetch;\n }\n\n const timeoutMs = resolveOpenAiTimeoutMs();\n const dispatcher = new Agent({\n bodyTimeout: timeoutMs,\n headersTimeout: timeoutMs,\n });\n cachedFetch = ((input: any, init?: any) => {\n return undiciFetch(input, {\n ...(init ?? {}),\n dispatcher,\n });\n }) as typeof fetch;\n\n return cachedFetch;\n}\n\nfunction getOpenAiApiKey(): string {\n if (cachedApiKey !== null) {\n return cachedApiKey;\n }\n\n loadLocalEnv();\n\n const raw = process.env.OPENAI_API_KEY;\n const value = raw?.trim();\n if (!value) {\n throw new Error(\"OPENAI_API_KEY must be provided to access OpenAI APIs.\");\n }\n\n cachedApiKey = value;\n return cachedApiKey;\n}\n\nexport function getOpenAiClient(): OpenAI {\n if (cachedClient) {\n return cachedClient;\n }\n\n const apiKey = getOpenAiApiKey();\n const timeoutMs = resolveOpenAiTimeoutMs();\n cachedClient = new OpenAI({\n apiKey,\n fetch: getOpenAiFetch(),\n timeout: timeoutMs,\n });\n return cachedClient;\n}\n","import type OpenAI from \"openai\";\n\nimport { createCallScheduler } from \"../utils/scheduler.js\";\n\nimport { getOpenAiClient } from \"./client.js\";\n\nexport type OpenAiReasoningEffort = \"low\" | \"medium\" | \"high\" | \"xhigh\";\nexport const DEFAULT_OPENAI_REASONING_EFFORT: OpenAiReasoningEffort = \"medium\";\n\nconst scheduler = createCallScheduler({\n maxParallelRequests: 3,\n minIntervalBetweenStartMs: 200,\n startJitterMs: 200,\n});\n\nexport async function runOpenAiCall<T>(fn: (client: OpenAI) => Promise<T>): Promise<T> {\n return scheduler.run(async () => fn(getOpenAiClient()));\n}\n"],"mappings":"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","names":["import_node_buffer","import_genai","import_zod","path","fs","body","os","import_zod","undiciFetch","OpenAI","scheduler","tool","path","text","content"]}
|