{"version":3,"file":"google-generative-ai-DYSbNJT7.mjs","names":[],"sources":["../node_modules/.pnpm/@earendil-works+pi-ai@0.84.1_ws@8.21.3_zod@4.4.3/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js"],"sourcesContent":["import { GoogleGenAI, } from \"@google/genai\";\nimport { calculateCost, clampThinkingLevel } from \"../models.js\";\nimport { formatProviderError, normalizeProviderError } from \"../utils/error-body.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\nimport { providerHeadersToRecord } from \"../utils/headers.js\";\nimport { sanitizeSurrogates } from \"../utils/sanitize-unicode.js\";\nimport { convertMessages, convertTools, isThinkingPart, mapStopReason, resolveGoogleFunctionCallingMode, retainThoughtSignature, retryGoogleRequest, supportsGoogleStrictToolSampling, } from \"./google-shared.js\";\nimport { buildBaseOptions } from \"./simple-options.js\";\n// Counter for generating unique tool call IDs\nlet toolCallCounter = 0;\nexport const stream = (model, context, options) => {\n    const stream = new AssistantMessageEventStream();\n    (async () => {\n        const output = {\n            role: \"assistant\",\n            content: [],\n            api: \"google-generative-ai\",\n            provider: model.provider,\n            model: model.id,\n            usage: {\n                input: 0,\n                output: 0,\n                cacheRead: 0,\n                cacheWrite: 0,\n                totalTokens: 0,\n                cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n            },\n            stopReason: \"pending\",\n            timestamp: Date.now(),\n        };\n        try {\n            if (options?.fetch && options.fetch !== globalThis.fetch) {\n                throw new Error(\"Custom fetch is not supported by the Google Generative AI adapter\");\n            }\n            const apiKey = options?.apiKey;\n            if (!apiKey) {\n                throw new Error(`No API key for provider: ${model.provider}`);\n            }\n            const client = createClient(model, apiKey, options?.headers);\n            let params = buildParams(model, context, options);\n            const nextParams = await options?.onPayload?.(params, model);\n            if (nextParams !== undefined) {\n                params = nextParams;\n            }\n            const googleStream = await retryGoogleRequest(() => client.models.generateContentStream(params), options);\n            stream.push({ type: \"start\", partial: output });\n            let currentBlock = null;\n            const blocks = output.content;\n            const blockIndex = () => blocks.length - 1;\n            for await (const chunk of googleStream) {\n                // @google/genai documents GenerateContentResponse.responseId as an output-only field\n                // used to identify each response. Keep the first non-empty one from the stream.\n                output.responseId ||= chunk.responseId;\n                const candidate = chunk.candidates?.[0];\n                if (candidate?.content?.parts) {\n                    for (const part of candidate.content.parts) {\n                        if (part.text !== undefined) {\n                            const isThinking = isThinkingPart(part);\n                            if (!currentBlock ||\n                                (isThinking && currentBlock.type !== \"thinking\") ||\n                                (!isThinking && currentBlock.type !== \"text\")) {\n                                if (currentBlock) {\n                                    if (currentBlock.type === \"text\") {\n                                        stream.push({\n                                            type: \"text_end\",\n                                            contentIndex: blocks.length - 1,\n                                            content: currentBlock.text,\n                                            partial: output,\n                                        });\n                                    }\n                                    else {\n                                        stream.push({\n                                            type: \"thinking_end\",\n                                            contentIndex: blockIndex(),\n                                            content: currentBlock.thinking,\n                                            partial: output,\n                                        });\n                                    }\n                                }\n                                if (isThinking) {\n                                    currentBlock = { type: \"thinking\", thinking: \"\", thinkingSignature: undefined };\n                                    output.content.push(currentBlock);\n                                    stream.push({ type: \"thinking_start\", contentIndex: blockIndex(), partial: output });\n                                }\n                                else {\n                                    currentBlock = { type: \"text\", text: \"\" };\n                                    output.content.push(currentBlock);\n                                    stream.push({ type: \"text_start\", contentIndex: blockIndex(), partial: output });\n                                }\n                            }\n                            if (currentBlock.type === \"thinking\") {\n                                currentBlock.thinking += part.text;\n                                currentBlock.thinkingSignature = retainThoughtSignature(currentBlock.thinkingSignature, part.thoughtSignature);\n                                stream.push({\n                                    type: \"thinking_delta\",\n                                    contentIndex: blockIndex(),\n                                    delta: part.text,\n                                    partial: output,\n                                });\n                            }\n                            else {\n                                currentBlock.text += part.text;\n                                currentBlock.textSignature = retainThoughtSignature(currentBlock.textSignature, part.thoughtSignature);\n                                stream.push({\n                                    type: \"text_delta\",\n                                    contentIndex: blockIndex(),\n                                    delta: part.text,\n                                    partial: output,\n                                });\n                            }\n                        }\n                        if (part.functionCall) {\n                            if (currentBlock) {\n                                if (currentBlock.type === \"text\") {\n                                    stream.push({\n                                        type: \"text_end\",\n                                        contentIndex: blockIndex(),\n                                        content: currentBlock.text,\n                                        partial: output,\n                                    });\n                                }\n                                else {\n                                    stream.push({\n                                        type: \"thinking_end\",\n                                        contentIndex: blockIndex(),\n                                        content: currentBlock.thinking,\n                                        partial: output,\n                                    });\n                                }\n                                currentBlock = null;\n                            }\n                            // Generate unique ID if not provided or if it's a duplicate\n                            const providedId = part.functionCall.id;\n                            const needsNewId = !providedId || output.content.some((b) => b.type === \"toolCall\" && b.id === providedId);\n                            const toolCallId = needsNewId\n                                ? `${part.functionCall.name}_${Date.now()}_${++toolCallCounter}`\n                                : providedId;\n                            const toolCall = {\n                                type: \"toolCall\",\n                                id: toolCallId,\n                                name: part.functionCall.name || \"\",\n                                arguments: part.functionCall.args ?? {},\n                                ...(part.thoughtSignature && { thoughtSignature: part.thoughtSignature }),\n                            };\n                            output.content.push(toolCall);\n                            stream.push({ type: \"toolcall_start\", contentIndex: blockIndex(), partial: output });\n                            stream.push({\n                                type: \"toolcall_delta\",\n                                contentIndex: blockIndex(),\n                                delta: JSON.stringify(toolCall.arguments),\n                                partial: output,\n                            });\n                            stream.push({ type: \"toolcall_end\", contentIndex: blockIndex(), toolCall, partial: output });\n                        }\n                    }\n                }\n                if (candidate?.finishReason) {\n                    output.rawStopReason = candidate.finishReason;\n                    output.stopReason = mapStopReason(candidate.finishReason);\n                    if (output.content.some((b) => b.type === \"toolCall\")) {\n                        output.stopReason = \"toolUse\";\n                    }\n                }\n                if (chunk.usageMetadata) {\n                    output.usage = {\n                        input: (chunk.usageMetadata.promptTokenCount || 0) - (chunk.usageMetadata.cachedContentTokenCount || 0),\n                        output: (chunk.usageMetadata.candidatesTokenCount || 0) + (chunk.usageMetadata.thoughtsTokenCount || 0),\n                        cacheRead: chunk.usageMetadata.cachedContentTokenCount || 0,\n                        cacheWrite: 0,\n                        reasoning: chunk.usageMetadata.thoughtsTokenCount || 0,\n                        totalTokens: chunk.usageMetadata.totalTokenCount || 0,\n                        cost: {\n                            input: 0,\n                            output: 0,\n                            cacheRead: 0,\n                            cacheWrite: 0,\n                            total: 0,\n                        },\n                    };\n                    calculateCost(model, output.usage);\n                }\n            }\n            if (currentBlock) {\n                if (currentBlock.type === \"text\") {\n                    stream.push({\n                        type: \"text_end\",\n                        contentIndex: blockIndex(),\n                        content: currentBlock.text,\n                        partial: output,\n                    });\n                }\n                else {\n                    stream.push({\n                        type: \"thinking_end\",\n                        contentIndex: blockIndex(),\n                        content: currentBlock.thinking,\n                        partial: output,\n                    });\n                }\n            }\n            if (options?.signal?.aborted) {\n                throw new Error(\"Request was aborted\");\n            }\n            if (output.stopReason === \"pending\") {\n                throw new Error(\"Google stream ended without a finish reason\");\n            }\n            if (output.stopReason === \"aborted\" || output.stopReason === \"error\") {\n                const errorMessage = output.rawStopReason\n                    ? `Provider stopped with: ${output.rawStopReason}`\n                    : \"An unknown error occurred\";\n                throw new Error(errorMessage);\n            }\n            stream.push({ type: \"done\", reason: output.stopReason, message: output });\n            stream.end();\n        }\n        catch (error) {\n            // Remove internal index property used during streaming\n            for (const block of output.content) {\n                if (\"index\" in block) {\n                    delete block.index;\n                }\n            }\n            output.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n            output.errorMessage = formatProviderError(normalizeProviderError(error));\n            stream.push({ type: \"error\", reason: output.stopReason, error: output });\n            stream.end();\n        }\n    })();\n    return stream;\n};\nexport const streamSimple = (model, context, options) => {\n    const apiKey = options?.apiKey;\n    if (!apiKey) {\n        throw new Error(`No API key for provider: ${model.provider}`);\n    }\n    const base = buildBaseOptions(model, context, options, apiKey);\n    if (!options?.reasoning) {\n        return stream(model, context, { ...base, thinking: { enabled: false } });\n    }\n    const clampedReasoning = clampThinkingLevel(model, options.reasoning);\n    const effort = (clampedReasoning === \"off\" ? \"high\" : clampedReasoning);\n    const googleModel = model;\n    if (isGemini3ProModel(googleModel) || isGemini3FlashModel(googleModel) || isGemma4Model(googleModel)) {\n        return stream(model, context, {\n            ...base,\n            thinking: {\n                enabled: true,\n                level: getThinkingLevel(effort, googleModel),\n            },\n        });\n    }\n    return stream(model, context, {\n        ...base,\n        thinking: {\n            enabled: true,\n            budgetTokens: getGoogleBudget(googleModel, effort, options.thinkingBudgets),\n        },\n    });\n};\nfunction createClient(model, apiKey, optionsHeaders) {\n    const httpOptions = {};\n    if (model.baseUrl) {\n        httpOptions.baseUrl = model.baseUrl;\n        httpOptions.apiVersion = \"\"; // baseUrl already includes version path, don't append\n    }\n    const headers = providerHeadersToRecord({ ...model.headers, ...optionsHeaders });\n    if (headers) {\n        httpOptions.headers = headers;\n    }\n    return new GoogleGenAI({\n        apiKey,\n        httpOptions: Object.keys(httpOptions).length > 0 ? httpOptions : undefined,\n    });\n}\nfunction buildParams(model, context, options = {}) {\n    const contents = convertMessages(model, context);\n    const generationConfig = {};\n    if (options.temperature !== undefined) {\n        generationConfig.temperature = options.temperature;\n    }\n    if (options.maxTokens !== undefined) {\n        generationConfig.maxOutputTokens = options.maxTokens;\n    }\n    const functionCallingMode = context.tools?.length\n        ? resolveGoogleFunctionCallingMode(context.tools, options.toolChoice, supportsGoogleStrictToolSampling(model.id))\n        : undefined;\n    const config = {\n        ...(Object.keys(generationConfig).length > 0 && generationConfig),\n        ...(context.systemPrompt && { systemInstruction: sanitizeSurrogates(context.systemPrompt) }),\n        ...(context.tools && context.tools.length > 0 && { tools: convertTools(context.tools) }),\n        ...(functionCallingMode !== undefined && {\n            toolConfig: { functionCallingConfig: { mode: functionCallingMode } },\n        }),\n    };\n    if (options.thinking?.enabled && model.reasoning) {\n        const thinkingConfig = { includeThoughts: true };\n        if (options.thinking.level !== undefined) {\n            // Cast to any since our GoogleThinkingLevel mirrors Google's ThinkingLevel enum values\n            thinkingConfig.thinkingLevel = options.thinking.level;\n        }\n        else if (options.thinking.budgetTokens !== undefined) {\n            thinkingConfig.thinkingBudget = options.thinking.budgetTokens;\n        }\n        config.thinkingConfig = thinkingConfig;\n    }\n    else if (model.reasoning && options.thinking && !options.thinking.enabled) {\n        config.thinkingConfig = getDisabledThinkingConfig(model);\n    }\n    if (options.signal) {\n        if (options.signal.aborted) {\n            throw new Error(\"Request aborted\");\n        }\n        config.abortSignal = options.signal;\n    }\n    const params = {\n        model: model.id,\n        contents,\n        config,\n    };\n    return params;\n}\nfunction isGemma4Model(model) {\n    return /gemma-?4/.test(model.id.toLowerCase());\n}\nfunction isGemini3ProModel(model) {\n    return /gemini-3(?:\\.\\d+)?-pro/.test(model.id.toLowerCase());\n}\nfunction isGemini3FlashModel(model) {\n    const id = model.id.toLowerCase();\n    return /gemini-3(?:\\.\\d+)?-flash/.test(id) || id === \"gemini-flash-latest\" || id === \"gemini-flash-lite-latest\";\n}\nfunction getDisabledThinkingConfig(model) {\n    // Google docs: Gemini 3.1 Pro cannot disable thinking, and Gemini 3 Flash / Flash-Lite\n    // do not support full thinking-off either. For Gemini 3 models, use the lowest supported\n    // thinkingLevel without includeThoughts so hidden thinking remains invisible to pi.\n    if (isGemini3ProModel(model)) {\n        return { thinkingLevel: \"LOW\" };\n    }\n    if (isGemini3FlashModel(model)) {\n        return { thinkingLevel: \"MINIMAL\" };\n    }\n    if (isGemma4Model(model)) {\n        return { thinkingLevel: \"MINIMAL\" };\n    }\n    // Gemini 2.x supports disabling via thinkingBudget = 0.\n    return { thinkingBudget: 0 };\n}\nfunction getThinkingLevel(effort, model) {\n    if (isGemini3ProModel(model)) {\n        switch (effort) {\n            case \"minimal\":\n            case \"low\":\n                return \"LOW\";\n            case \"medium\":\n            case \"high\":\n                return \"HIGH\";\n        }\n    }\n    if (isGemma4Model(model)) {\n        switch (effort) {\n            case \"minimal\":\n            case \"low\":\n                return \"MINIMAL\";\n            case \"medium\":\n            case \"high\":\n                return \"HIGH\";\n        }\n    }\n    switch (effort) {\n        case \"minimal\":\n            return \"MINIMAL\";\n        case \"low\":\n            return \"LOW\";\n        case \"medium\":\n            return \"MEDIUM\";\n        case \"high\":\n            return \"HIGH\";\n    }\n}\nfunction getGoogleBudget(model, effort, customBudgets) {\n    if (customBudgets?.[effort] !== undefined) {\n        return customBudgets[effort];\n    }\n    if (model.id.includes(\"2.5-pro\")) {\n        const budgets = {\n            minimal: 128,\n            low: 2048,\n            medium: 8192,\n            high: 32768,\n        };\n        return budgets[effort];\n    }\n    if (model.id.includes(\"2.5-flash-lite\")) {\n        const budgets = {\n            minimal: 512,\n            low: 2048,\n            medium: 8192,\n            high: 24576,\n        };\n        return budgets[effort];\n    }\n    if (model.id.includes(\"2.5-flash\")) {\n        const budgets = {\n            minimal: 128,\n            low: 2048,\n            medium: 8192,\n            high: 24576,\n        };\n        return budgets[effort];\n    }\n    return -1;\n}\n//# sourceMappingURL=google-generative-ai.js.map"],"x_google_ignoreList":[0],"mappings":"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"}