@gullabs/google 0.8.3 → 0.9.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/README.md +13 -0
- package/dist/index.cjs +76 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -6
- package/dist/index.d.ts +30 -6
- package/dist/index.js +76 -8
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/reasoning-budget.ts","../src/flex-fallback.ts","../src/errors.ts","../src/adapter.ts","../src/pricing.ts","../src/cost.ts","../src/model-config/gemini-2.5-pro.ts","../src/model-config/gemini-2.5-flash.ts","../src/model-config/gemini-2.5-flash-lite.ts","../src/model-config/gemini-3.5-flash.ts","../src/model-config/gemini-3.1-flash-lite.ts","../src/model-config/gemini-3.1-pro-preview.ts","../src/model-config/gemini-3-flash-preview.ts","../src/model-config/gemma-4-31b-it.ts","../src/model-config/gemma-4-26b-a4b-it.ts","../src/models.ts","../src/provider.ts","../src/file-store.ts","../src/cache-store.ts","../src/grounding.ts","../src/content-to-messages.ts"],"names":["LlmError","z","classifyError","redactSecrets"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Structural GeminiClientLike interface + buildGoogleClient factory.\n *\n * This module defines the structural interface the adapter depends on.\n * The real @google/genai SDK is imported ONLY in buildGoogleClient so tests\n * can inject a fake without pulling in the real SDK.\n *\n * @module\n */\n\nimport { LlmError } from '@gullabs/core'\nimport type { AuthMaterial } from '@gullabs/core'\n\n// ---------------------------------------------------------------------------\n// Auth narrowing — Google only accepts ApiKeyAuth\n// ---------------------------------------------------------------------------\n\n/**\n * Narrows {@link AuthMaterial} to its `apiKey` string, rejecting the\n * dev-only `CliSessionAuth` variant.\n *\n * Google is a production API provider and only ever accepts API-key\n * credentials; `{ cliSession: true }` is reserved for the dev-only CLI\n * provider packages (`@gullabs/claude-cli`, `@gullabs/codex-cli`).\n */\nexport function requireApiKey(auth: AuthMaterial): string {\n if (\n !('apiKey' in auth) ||\n typeof auth.apiKey !== 'string' ||\n auth.apiKey.trim() === ''\n ) {\n throw new LlmError('@gullabs/google requires auth.apiKey', {\n kind: 'invalid_auth',\n retryable: false,\n provider: 'google',\n })\n }\n return auth.apiKey\n}\n\n// ---------------------------------------------------------------------------\n// Transport timeout defaults\n// ---------------------------------------------------------------------------\n\n/**\n * Default HTTP transport timeout for Gemini Flex service-tier calls (ms).\n *\n * The default per-attempt transport (httpOptions) timeout applied ONLY when a\n * flex call provides no explicit `timeoutMs`. Set to 25 minutes (1_500_000 ms)\n * to cover the ~20-minute flex workload ceiling with margin. The @google/genai\n * SDK defaults to 1 minute, which would terminate a long flex call prematurely.\n * Callers SHOULD still set `timeoutMs` for a precise per-attempt ceiling; this\n * value is only the backstop for callers that do not.\n */\nexport const FLEX_DEFAULT_TIMEOUT_MS = 1_500_000\n\n/**\n * Default HTTP transport timeout for Gemini standard-tier calls (ms).\n *\n * Used when a standard-tier request has no explicit `timeoutMs`. The adapter\n * also backs this with an AbortController so the limit is a real client-side\n * ceiling, not only an SDK transport hint.\n */\nexport const STANDARD_DEFAULT_TIMEOUT_MS = 300_000\n\n/**\n * Buffer added above `timeoutMs` when setting the SDK transport timeout.\n *\n * When `timeoutMs` is set, the engine arms an AbortSignal at exactly\n * `timeoutMs`. If the SDK transport timer fired at the same instant it\n * could preempt the signal and produce a raw SDK error instead of the\n * engine's clean `kind:'timeout'`. By setting the transport timeout to\n * `timeoutMs + TRANSPORT_TIMEOUT_BUFFER_MS` we ensure the engine's\n * AbortSignal always fires first.\n */\nexport const TRANSPORT_TIMEOUT_BUFFER_MS = 5_000\n\n// ---------------------------------------------------------------------------\n// Response shape — mirrors the @google/genai surface we actually consume\n// ---------------------------------------------------------------------------\n\n/** A single text/thought part in a Gemini candidate content. */\nexport interface GeminiPartShape {\n text?: string\n /**\n * Present and `true` on thought-summary parts.\n * Real field name in @google/genai Candidate.content.parts: `thought`.\n */\n thought?: boolean\n}\n\n/** A candidate returned by Gemini generateContent. */\nexport interface GeminiCandidateShape {\n content?: {\n parts?: GeminiPartShape[]\n }\n /**\n * Why the model stopped.\n * Real SDK enum (FinishReason): \"STOP\", \"MAX_TOKENS\", \"SAFETY\",\n * \"RECITATION\", \"BLOCKLIST\", \"PROHIBITED_CONTENT\", etc.\n */\n finishReason?: string\n /**\n * Grounding metadata returned when Google Search grounding is active.\n * Real SDK type: GroundingMetadata. Kept as `unknown` to avoid a hard\n * coupling to @google/genai types; cast to JsonValue at the adapter boundary.\n */\n groundingMetadata?: unknown\n}\n\n/**\n * Token usage metadata returned alongside a Gemini response.\n *\n * Real type: GenerateContentResponseUsageMetadata.\n * NOTE: thoughtsTokenCount is SEPARATE from candidatesTokenCount.\n * The adapter must add them to get GROSS outputTokens.\n */\nexport interface GeminiUsageMetadataShape {\n promptTokenCount?: number\n candidatesTokenCount?: number\n cachedContentTokenCount?: number\n thoughtsTokenCount?: number\n totalTokenCount?: number\n}\n\n/**\n * Structural equivalent of @google/genai's GenerateContentResponse.\n * Only the fields the adapter reads are represented here.\n */\nexport interface GeminiResponseShape {\n candidates?: GeminiCandidateShape[]\n usageMetadata?: GeminiUsageMetadataShape\n /** Real field: GenerateContentResponse.modelVersion */\n modelVersion?: string\n /** Real field: GenerateContentResponse.responseId */\n responseId?: string\n /**\n * Safety-block metadata.\n * Real type: GenerateContentResponsePromptFeedback.\n * Present when the prompt (not output) was blocked by safety filters.\n */\n promptFeedback?: {\n /** Real type: BlockedReason (string enum). e.g. \"SAFETY\", \"OTHER\". */\n blockReason?: string\n blockReasonMessage?: string\n safetyRatings?: unknown[]\n }\n}\n\n// ---------------------------------------------------------------------------\n// Request / config shape — what the adapter sends to generateContent\n// ---------------------------------------------------------------------------\n\n/**\n * Per-part media-resolution hint emitted on inline/file parts.\n * Real type: @google/genai `PartMediaResolution`; `level` values come from\n * the `PartMediaResolutionLevel` string enum (we only emit the LOW/MEDIUM/HIGH\n * subset our normalized `mediaResolution` maps to).\n */\nexport interface GeminiPartMediaResolution {\n level?: 'MEDIA_RESOLUTION_LOW' | 'MEDIA_RESOLUTION_MEDIUM' | 'MEDIA_RESOLUTION_HIGH'\n}\n\n/** A text part in a content object we construct. */\nexport interface GeminiTextContentPart {\n text: string\n}\n\n/**\n * An inline binary media part in a content object we construct.\n * `data` must be raw base64 — no `data:…;base64,` prefix.\n */\nexport interface GeminiInlineDataContentPart {\n inlineData: {\n /** IANA media type, e.g. `\"image/png\"`. */\n mimeType: string\n /** Raw base64-encoded bytes (no data-URL prefix). */\n data: string\n }\n /** Optional per-part media-resolution hint (real field: `Part.mediaResolution`). */\n mediaResolution?: GeminiPartMediaResolution\n}\n\n/**\n * A provider-hosted file reference part in a content object we construct.\n * The Gemini service dereferences `fileUri` server-side.\n */\nexport interface GeminiFileDataContentPart {\n fileData: {\n /** IANA media type of the referenced file. */\n mimeType: string\n /** Provider-assigned file URI, e.g. from the Gemini File API. */\n fileUri: string\n }\n /** Optional per-part media-resolution hint (real field: `Part.mediaResolution`). */\n mediaResolution?: GeminiPartMediaResolution\n}\n\n/**\n * Union of all part shapes the adapter may produce for `GeminiContent.parts`.\n * Each member (including the optional per-part `mediaResolution`) is a\n * structural subset of the real `@google/genai` `Part` type for the fields we use.\n */\nexport type GeminiContentPart =\n GeminiTextContentPart | GeminiInlineDataContentPart | GeminiFileDataContentPart\n\n/** A content object (message) we construct. */\nexport interface GeminiContent {\n role: string\n parts: GeminiContentPart[]\n}\n\n/**\n * Schema shape we pass as responseSchema.\n * Structurally compatible with @google/genai Schema.\n */\nexport interface GeminiSchema {\n type?: string\n description?: string\n properties?: Record<string, GeminiSchema>\n required?: string[]\n items?: GeminiSchema\n enum?: string[]\n nullable?: boolean\n format?: string\n}\n\n/**\n * Thinking configuration.\n * Real type: ThinkingConfig in @google/genai.\n * - thinkingBudget: 0 = DISABLED, -1 = AUTOMATIC\n * - thinkingLevel: ThinkingLevel enum (\"LOW\", \"MEDIUM\", \"HIGH\", \"MINIMAL\")\n */\nexport interface GeminiThinkingConfig {\n includeThoughts?: boolean\n thinkingBudget?: number\n /**\n * Real type: ThinkingLevel enum.\n * Values: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"MINIMAL\" | \"THINKING_LEVEL_UNSPECIFIED\"\n */\n thinkingLevel?: string\n}\n\n/**\n * Config object passed in GenerateContentParameters.config.\n * Real type: GenerateContentConfig.\n * abortSignal is inside config, NOT in the top-level params.\n */\nexport interface GeminiGenerateConfig {\n systemInstruction?: { parts: GeminiContentPart[] }\n temperature?: number\n topP?: number\n topK?: number\n maxOutputTokens?: number\n stopSequences?: string[]\n responseMimeType?: string\n responseSchema?: GeminiSchema\n thinkingConfig?: GeminiThinkingConfig\n /** Real type: ServiceTier enum. Values: \"flex\" | \"standard\". */\n serviceTier?: string\n /** Real field: GenerateContentConfig.abortSignal (NOT in top-level params). */\n abortSignal?: AbortSignal\n /**\n * Per-request HTTP options forwarded to the @google/genai transport.\n * We use this to set a transport-level timeout that is >= the AbortSignal\n * deadline so the SDK fetch does not preempt the abort.\n *\n * Real field: GenerateContentConfig.httpOptions.timeout (milliseconds).\n * Real field: GenerateContentConfig.httpOptions.headers (Record<string,string>).\n * (No current use of custom headers here: Vertex AI auth — and the\n * Vertex flex-routing header injection this field once supported — was\n * removed from this library; see ADR-019 in DECISIONS.md. Only\n * API-key auth is supported below.)\n */\n httpOptions?: { timeout?: number; headers?: Record<string, string> }\n}\n\n/**\n * Parameters for models.generateContent.\n * Real type: GenerateContentParameters.\n */\nexport interface GeminiGenerateParams {\n model: string\n contents: GeminiContent[]\n config?: GeminiGenerateConfig\n}\n\n/**\n * Parameters for models.countTokens.\n * Real type: CountTokensParameters.\n */\nexport interface GeminiCountTokensParams {\n model: string\n contents: GeminiContent[]\n config?: {\n systemInstruction?: { parts: GeminiContentPart[] }\n /**\n * Real field: CountTokensConfig.abortSignal. countTokens has no\n * tier-timeout dance (no flex/standard default ceilings) — `ctx.signal`\n * is forwarded here directly, unlike `run()`'s combined timer signal.\n */\n abortSignal?: AbortSignal\n }\n}\n\n/**\n * Response shape for models.countTokens.\n * Real type: CountTokensResponse.\n */\nexport interface GeminiCountTokensResponseShape {\n totalTokens?: number\n cachedContentTokenCount?: number\n}\n\n// ---------------------------------------------------------------------------\n// GeminiClientLike — structural interface (no @google/genai dependency)\n// ---------------------------------------------------------------------------\n\n/**\n * Structural interface for the @google/genai client surface the adapter uses.\n *\n * Satisfied by:\n * - The real GoogleGenAI client (via buildGoogleClient wrapper).\n * - FakeGeminiClient from @gullabs/testing (its generateContent/countTokens\n * accept unknown).\n */\nexport interface GeminiClientLike {\n models: {\n generateContent(params: GeminiGenerateParams): Promise<GeminiResponseShape>\n countTokens(params: GeminiCountTokensParams): Promise<GeminiCountTokensResponseShape>\n }\n}\n\n// ---------------------------------------------------------------------------\n// buildGoogleClient — imports the real @google/genai SDK\n// ---------------------------------------------------------------------------\n\n/**\n * Build a real @google/genai client from AuthMaterial.\n *\n * Returns a GeminiClientLike wrapper around the real GoogleGenAI client.\n * Only API-key authentication is supported; Vertex AI is not.\n *\n * @param auth - API key credentials ({ apiKey }).\n */\nexport async function buildGoogleClient(auth: AuthMaterial): Promise<GeminiClientLike> {\n // Import the real SDK — only called at runtime when no client is injected.\n // The cast is safe: GeminiGenerateParams is a structural subset of\n // GenerateContentParameters; GeminiResponseShape is a subset of\n // GenerateContentResponse.\n const { GoogleGenAI } = await import('@google/genai')\n\n const ai = new GoogleGenAI({ apiKey: requireApiKey(auth) })\n\n return {\n models: {\n async generateContent(params: GeminiGenerateParams): Promise<GeminiResponseShape> {\n // Cast needed: our structural types are subsets of the real SDK types.\n const result = await (\n ai.models.generateContent as (params: unknown) => Promise<GeminiResponseShape>\n )(params)\n return result\n },\n async countTokens(\n params: GeminiCountTokensParams,\n ): Promise<GeminiCountTokensResponseShape> {\n // Cast needed: our structural types are subsets of the real SDK types.\n const result = await (\n ai.models.countTokens as (\n params: unknown,\n ) => Promise<GeminiCountTokensResponseShape>\n )(params)\n return result\n },\n },\n }\n}\n","import type { ReasoningEffort } from '@gullabs/core'\n\nexport const GOOGLE_REASONING_EFFORT_BUDGET: Record<ReasoningEffort, number> = {\n none: 0,\n low: 1024,\n medium: 8192,\n high: 24576,\n}\n","import type { LlmError } from '@gullabs/core'\n\nconst CAPACITY_PATTERNS = [\n /capacity/i,\n /overload/i,\n /overloaded/i,\n /unavailable/i,\n /no\\s+capacity/i,\n /temporar(?:y|ily)/i,\n /try\\s+again/i,\n]\n\nconst QUOTA_PATTERNS = [\n /quota/i,\n /billing/i,\n /billable/i,\n /payment/i,\n /rate\\s+limit/i,\n /exceeded/i,\n /insufficient/i,\n]\n\nexport function isGeminiCapacityError(err: LlmError): boolean {\n if (err.kind === 'server') return err.httpStatus === 503\n if (err.kind !== 'rate_limited') return false\n\n const message = err.message\n if (QUOTA_PATTERNS.some((pattern) => pattern.test(message))) {\n return false\n }\n return CAPACITY_PATTERNS.some((pattern) => pattern.test(message))\n}\n","/**\n * classifyGoogleError — reclassify a raw thrown value into a typed\n * {@link LlmError} for @gullabs/google.\n *\n * Thin wrapper around `@gullabs/core`'s `classifyError`: applies the shared\n * HTTP-status/timeout/abort classification, tags `provider: 'google'`, and\n * widens the retryable bucket to cover connection-level transport failures\n * that never produced an HTTP response for `classifyError` to route by\n * status.\n *\n * `@google/genai`'s underlying `fetch` (undici, in Node) throws a plain\n * `TypeError: fetch failed` for DNS failures, connection refusals, and\n * severed sockets — wrapping the underlying errno error as `.cause`.\n * `classifyError` has no HTTP status to classify these by, so they\n * previously fell through to `kind: 'unknown', retryable: false`, which\n * Temporal treats as non-retryable and uses to kill the audit run outright\n * instead of retrying a transient network blip (live-observed 2026-07-10,\n * redline e2e runs f6eca8f9 / 51f64c2f).\n *\n * These are reclassified `kind: 'server', retryable: true` — the same\n * \"provider fault, not caller fault, safe to retry\" bucket already used\n * elsewhere in this adapter for provider-side failures with no HTTP status\n * (see the malformed-`countTokens`-response case in `adapter.ts`).\n *\n * @module\n */\n\nimport { LlmError, classifyError } from '@gullabs/core'\n\n/**\n * Message/errno signatures of a transport-level failure: the request never\n * reached Google's servers (or the connection was severed mid-flight), so\n * there is no HTTP response for `classifyHttpStatus` to route by status.\n * Covers undici's own default message (`\"fetch failed\"`) plus the\n * Node/undici errno codes that surface when the underlying socket fails\n * before a response arrives.\n */\nconst GOOGLE_TRANSPORT_ERROR_PATTERN =\n /fetch failed|connection error|econnreset|econnrefused|etimedout|eai_again|epipe|socket hang up/i\n\n/** True iff `err.message` or `err.code` matches a known transport-failure signature. */\nfunction matchesGoogleTransportSignature(err: unknown): boolean {\n if (!(err instanceof Error)) return false\n if (GOOGLE_TRANSPORT_ERROR_PATTERN.test(err.message)) return true\n const code = (err as { code?: unknown }).code\n return typeof code === 'string' && GOOGLE_TRANSPORT_ERROR_PATTERN.test(code)\n}\n\n/**\n * True iff `rawErr` is (or wraps) a transport-level connection failure.\n *\n * Detection order:\n * 1. `rawErr.message` / `rawErr.code` matches a known transport-failure\n * signature.\n * 2. A wrapped `rawErr.cause` matches the same — undici's `fetch failed`\n * `TypeError` attaches the underlying socket/DNS errno error as\n * `.cause`.\n */\nfunction isGoogleTransportError(rawErr: unknown): boolean {\n if (matchesGoogleTransportSignature(rawErr)) return true\n if (rawErr instanceof Error) {\n const cause = (rawErr as { cause?: unknown }).cause\n if (matchesGoogleTransportSignature(cause)) return true\n }\n return false\n}\n\n/** Optional extra fields threaded onto the returned {@link LlmError}. */\nexport interface ClassifyGoogleErrorExtra {\n /** Service tier actually attempted by the provider when known. */\n servedServiceTier?: string\n}\n\n/**\n * Classify a raw error thrown from a `@google/genai` client call into a\n * typed {@link LlmError} always tagged `provider: 'google'`.\n *\n * Delegates to `@gullabs/core`'s `classifyError` for HTTP-status/timeout/\n * abort classification (an already-classified `LlmError` passes through\n * `classifyError` unchanged, per its own contract), then rebuilds the\n * result with `provider: 'google'` forced on — every error surfaced by this\n * adapter is tagged, even one injected pre-classified (e.g. by a test\n * double) without a provider of its own. It also reclassifies the\n * `kind: 'unknown'` fallback as `kind: 'server', retryable: true` when the\n * raw error matches a known transport-failure signature (see\n * {@link isGoogleTransportError}). A connection that never reached Google is\n * not the caller's fault and is safe to retry; it must never be surfaced as\n * the non-retryable `unknown` kind.\n */\nexport function classifyGoogleError(\n rawErr: unknown,\n extra?: ClassifyGoogleErrorExtra,\n): LlmError {\n const base = classifyError(rawErr)\n const reclassifyAsTransport = base.kind === 'unknown' && isGoogleTransportError(rawErr)\n\n return new LlmError(base.message, {\n kind: reclassifyAsTransport ? 'server' : base.kind,\n retryable: reclassifyAsTransport ? true : base.retryable,\n ...(base.httpStatus !== undefined ? { httpStatus: base.httpStatus } : {}),\n ...(base.retryAfterMs !== undefined ? { retryAfterMs: base.retryAfterMs } : {}),\n provider: 'google',\n cause: base.cause ?? rawErr,\n ...(extra?.servedServiceTier !== undefined\n ? { servedServiceTier: extra.servedServiceTier }\n : {}),\n })\n}\n","/**\n * geminiAdapter — @gullabs/google Gemini provider adapter.\n *\n * Pure request⇄response mapping over @google/genai (via GeminiClientLike).\n * Never persists, never computes cost, never loops.\n *\n * @module\n */\n\nimport { LlmError, assertNever } from '@gullabs/core'\nimport type {\n ProviderAdapter,\n ResolvedRequest,\n AdapterCtx,\n AdapterResult,\n Usage,\n Warning,\n FinishReason,\n JsonValue,\n AuthMaterial,\n Part,\n Message,\n TokenCountRequest,\n TokenCount,\n} from '@gullabs/core'\nimport {\n buildGoogleClient,\n FLEX_DEFAULT_TIMEOUT_MS,\n STANDARD_DEFAULT_TIMEOUT_MS,\n TRANSPORT_TIMEOUT_BUFFER_MS,\n} from './client.js'\nimport { GOOGLE_REASONING_EFFORT_BUDGET } from './reasoning-budget.js'\nimport type {\n GeminiClientLike,\n GeminiGenerateConfig,\n GeminiContent,\n GeminiContentPart,\n GeminiResponseShape,\n GeminiUsageMetadataShape,\n GeminiCountTokensParams,\n} from './client.js'\nimport { isGeminiCapacityError } from './flex-fallback.js'\nimport { classifyGoogleError } from './errors.js'\n\ntype GeminiGoogleSearchTool = { googleSearch: Record<string, never> }\n\ntype GeminiAllowedTool = GeminiGoogleSearchTool\n\ntype GeminiSafetySetting = {\n category: string\n threshold: string\n}\n\ntype GeminiDispatchConfig = GeminiGenerateConfig & {\n cachedContent?: string\n httpOptions?: { timeout?: number }\n safetySettings?: GeminiSafetySetting[]\n tools?: GeminiAllowedTool[]\n}\n\nconst ALLOWED_GOOGLE_PROVIDER_OPTION_KEYS = new Set([\n 'cachedContent',\n 'flexFallback',\n 'httpOptions',\n 'safetySettings',\n 'tools',\n])\n\nconst ALLOWED_GOOGLE_HTTP_OPTION_KEYS = new Set(['timeout'])\n\nconst RESERVED_GOOGLE_PROVIDER_OPTION_KEYS = new Set([\n 'abortSignal',\n 'imageConfig',\n 'maxOutputTokens',\n 'mediaResolution',\n 'responseFormat',\n 'responseMimeType',\n 'responseModalities',\n 'responseSchema',\n 'responseJsonSchema',\n 'serviceTier',\n 'speechConfig',\n 'stopSequences',\n 'temperature',\n 'thinkingConfig',\n 'topK',\n 'topP',\n '_responseJsonSchema',\n])\n\nconst GOOGLE_SEARCH_SUPPORTED_MODELS = new Set([\n 'gemini-2.5-flash',\n 'gemini-2.5-flash-lite',\n 'gemini-2.5-pro',\n 'gemini-3-flash-preview',\n 'gemini-3.1-flash-lite',\n 'gemini-3.1-pro-preview',\n 'gemini-3.5-flash',\n])\n\nconst STRUCTURED_OUTPUT_GOOGLE_SEARCH_ALLOWLIST = new Set([\n 'gemini-3.1-pro-preview',\n 'gemini-3.5-flash',\n])\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isEmptyPlainObject(value: unknown): value is Record<string, never> {\n return isPlainRecord(value) && Object.keys(value).length === 0\n}\n\nfunction badGoogleProviderOptions(message: string): LlmError {\n return new LlmError(message, { kind: 'bad_request', retryable: false })\n}\n\nfunction parseGoogleTool(tool: unknown, model: string): GeminiAllowedTool {\n if (!isPlainRecord(tool)) {\n throw badGoogleProviderOptions(\n `providerOptions.google.tools entries must be objects for model \"${model}\".`,\n )\n }\n\n const keys = Object.keys(tool)\n if (keys.length !== 1) {\n throw badGoogleProviderOptions(\n `providerOptions.google.tools entries must have exactly one supported tool key for model \"${model}\".`,\n )\n }\n\n const key = keys[0]\n switch (key) {\n case 'googleSearch': {\n if (!isEmptyPlainObject(tool['googleSearch'])) {\n throw badGoogleProviderOptions(\n `providerOptions.google.tools[].googleSearch must be an empty object for model \"${model}\".`,\n )\n }\n return { googleSearch: {} }\n }\n\n default:\n throw badGoogleProviderOptions(\n `providerOptions.google.tools[].${key} is not supported for model \"${model}\".`,\n )\n }\n}\n\nfunction parseGoogleSafetySetting(\n setting: unknown,\n index: number,\n model: string,\n): GeminiSafetySetting {\n if (!isPlainRecord(setting)) {\n throw badGoogleProviderOptions(\n `providerOptions.google.safetySettings[${index}] must be an object for model \"${model}\".`,\n )\n }\n\n const keys = Object.keys(setting)\n const unknownKeys = keys.filter((key) => key !== 'category' && key !== 'threshold')\n if (unknownKeys.length > 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google.safetySettings[${index}] contains unsupported keys [${unknownKeys.join(\n ', ',\n )}] for model \"${model}\". Allowed keys: category, threshold.`,\n )\n }\n\n if (typeof setting['category'] !== 'string' || setting['category'].length === 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google.safetySettings[${index}].category must be a non-empty string for model \"${model}\".`,\n )\n }\n\n if (typeof setting['threshold'] !== 'string' || setting['threshold'].length === 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google.safetySettings[${index}].threshold must be a non-empty string for model \"${model}\".`,\n )\n }\n\n return {\n category: setting['category'],\n threshold: setting['threshold'],\n }\n}\n\nfunction mapGoogleProviderOptions(\n googleOpts: unknown,\n model: string,\n structuredOutputRequested: boolean,\n descriptorGrounding: boolean | undefined,\n): Partial<GeminiDispatchConfig> & { flexFallback?: boolean } {\n if (googleOpts === undefined) {\n return {}\n }\n\n if (!isPlainRecord(googleOpts)) {\n throw badGoogleProviderOptions(\n `providerOptions.google must be an object for model \"${model}\".`,\n )\n }\n\n const reservedKeys = Object.keys(googleOpts).filter((key) =>\n RESERVED_GOOGLE_PROVIDER_OPTION_KEYS.has(key),\n )\n if (reservedKeys.length > 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google reserves keys [${reservedKeys.join(\n ', ',\n )}] for typed model config on \"${model}\".`,\n )\n }\n\n const unknownKeys = Object.keys(googleOpts).filter(\n (key) =>\n !ALLOWED_GOOGLE_PROVIDER_OPTION_KEYS.has(key) &&\n !RESERVED_GOOGLE_PROVIDER_OPTION_KEYS.has(key),\n )\n if (unknownKeys.length > 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google contains unsupported keys [${unknownKeys.join(\n ', ',\n )}] for model \"${model}\". Allowed keys: cachedContent, flexFallback, httpOptions, safetySettings, tools.`,\n )\n }\n\n const mapped: Partial<GeminiDispatchConfig> & { flexFallback?: boolean } = {}\n\n if (googleOpts['cachedContent'] !== undefined) {\n if (\n typeof googleOpts['cachedContent'] !== 'string' ||\n googleOpts['cachedContent'].length === 0\n ) {\n throw badGoogleProviderOptions(\n `providerOptions.google.cachedContent must be a non-empty string for model \"${model}\".`,\n )\n }\n mapped.cachedContent = googleOpts['cachedContent']\n }\n\n if (googleOpts['flexFallback'] !== undefined) {\n if (typeof googleOpts['flexFallback'] !== 'boolean') {\n throw badGoogleProviderOptions(\n `providerOptions.google.flexFallback must be a boolean for model \"${model}\".`,\n )\n }\n mapped.flexFallback = googleOpts['flexFallback']\n }\n\n if (googleOpts['httpOptions'] !== undefined) {\n if (!isPlainRecord(googleOpts['httpOptions'])) {\n throw badGoogleProviderOptions(\n `providerOptions.google.httpOptions must be an object for model \"${model}\".`,\n )\n }\n\n const unknownHttpOptionKeys = Object.keys(googleOpts['httpOptions']).filter(\n (key) => !ALLOWED_GOOGLE_HTTP_OPTION_KEYS.has(key),\n )\n if (unknownHttpOptionKeys.length > 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google.httpOptions contains unsupported keys [${unknownHttpOptionKeys.join(\n ', ',\n )}] for model \"${model}\". Allowed keys: timeout.`,\n )\n }\n\n const timeout = googleOpts['httpOptions']['timeout']\n if (timeout !== undefined) {\n if (typeof timeout !== 'number' || !Number.isInteger(timeout) || timeout <= 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google.httpOptions.timeout must be a positive integer for model \"${model}\".`,\n )\n }\n mapped.httpOptions = { timeout }\n } else {\n mapped.httpOptions = {}\n }\n }\n\n if (googleOpts['safetySettings'] !== undefined) {\n if (!Array.isArray(googleOpts['safetySettings'])) {\n throw badGoogleProviderOptions(\n `providerOptions.google.safetySettings must be an array for model \"${model}\".`,\n )\n }\n\n mapped.safetySettings = googleOpts['safetySettings'].map((setting, index) =>\n parseGoogleSafetySetting(setting, index, model),\n )\n }\n\n if (googleOpts['tools'] !== undefined) {\n if (!Array.isArray(googleOpts['tools'])) {\n throw badGoogleProviderOptions(\n `providerOptions.google.tools must be an array for model \"${model}\".`,\n )\n }\n\n const tools = googleOpts['tools'].map((tool) => parseGoogleTool(tool, model))\n const groundingSupported =\n descriptorGrounding === true ||\n (descriptorGrounding === undefined && GOOGLE_SEARCH_SUPPORTED_MODELS.has(model))\n\n if (!groundingSupported) {\n throw badGoogleProviderOptions(\n `providerOptions.google.tools is not supported for model \"${model}\".`,\n )\n }\n\n if (\n structuredOutputRequested &&\n !STRUCTURED_OUTPUT_GOOGLE_SEARCH_ALLOWLIST.has(model)\n ) {\n throw badGoogleProviderOptions(\n `Structured output with googleSearch is supported only for models \"gemini-3.1-pro-preview\" and \"gemini-3.5-flash\"; got \"${model}\".`,\n )\n }\n\n mapped.tools = tools\n }\n\n return mapped\n}\n\nfunction assertSamplingAllowed(\n config: GeminiDispatchConfig,\n model: string,\n sampling: string | undefined,\n): void {\n if (sampling !== 'fixed') {\n return\n }\n\n const offendingSampling: string[] = []\n if ('temperature' in config) {\n offendingSampling.push('temperature')\n }\n if ('topP' in config) {\n offendingSampling.push('topP')\n }\n if ('topK' in config) {\n offendingSampling.push('topK')\n }\n\n if (offendingSampling.length > 0) {\n throw new LlmError(\n `Sampling parameters [${offendingSampling.join(', ')}] are not supported for model \"${model}\" (fixed sampling).`,\n { kind: 'bad_request', retryable: false },\n )\n }\n}\n\n// ---------------------------------------------------------------------------\n// Exported types for consumers that inject a custom client\n// ---------------------------------------------------------------------------\nexport type { GeminiClientLike }\n\n// ---------------------------------------------------------------------------\n// FinishReason mapping (Gemini SDK enum → our FinishReason)\n// ---------------------------------------------------------------------------\n\nfunction mapFinishReason(raw: string | undefined): FinishReason | undefined {\n if (raw === undefined) return undefined\n switch (raw) {\n case 'STOP':\n return 'stop'\n case 'MAX_TOKENS':\n return 'length'\n case 'SAFETY':\n case 'RECITATION':\n case 'BLOCKLIST':\n case 'PROHIBITED_CONTENT':\n case 'IMAGE_SAFETY':\n return 'content_filter'\n default:\n return 'other'\n }\n}\n\n// ---------------------------------------------------------------------------\n// mediaResolution mapping (normalized hint → Gemini PartMediaResolutionLevel)\n// ---------------------------------------------------------------------------\n\n/**\n * Map our normalized cross-provider `mediaResolution` hint to the Gemini\n * `PartMediaResolutionLevel` string-enum value emitted on `Part.mediaResolution`.\n */\nfunction mapMediaResolution(\n res: 'low' | 'medium' | 'high',\n): 'MEDIA_RESOLUTION_LOW' | 'MEDIA_RESOLUTION_MEDIUM' | 'MEDIA_RESOLUTION_HIGH' {\n switch (res) {\n case 'low':\n return 'MEDIA_RESOLUTION_LOW'\n case 'medium':\n return 'MEDIA_RESOLUTION_MEDIUM'\n case 'high':\n return 'MEDIA_RESOLUTION_HIGH'\n default:\n return assertNever(res)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Usage mapping — #1 correctness rule\n// ---------------------------------------------------------------------------\n\n/**\n * Map Gemini usageMetadata to our Usage type.\n *\n * **GROSS convention enforced here:**\n * - outputTokens = candidatesTokenCount + (thoughtsTokenCount ?? 0)\n * → thinkingTokens ⊆ outputTokens so cost math doesn't double-count.\n * - inputTokens = promptTokenCount (cachedContentTokenCount is already a\n * subset of promptTokenCount → cachedInputTokens = cachedContentTokenCount).\n */\nfunction mapUsage(meta: GeminiUsageMetadataShape | undefined): Usage {\n const promptTokenCount = meta?.promptTokenCount ?? 0\n const candidatesTokenCount = meta?.candidatesTokenCount ?? 0\n const cachedContentTokenCount = meta?.cachedContentTokenCount\n const thoughtsTokenCount = meta?.thoughtsTokenCount\n\n // #1 RULE: outputTokens = candidates + thoughts (GROSS; thinking ⊆ output)\n const outputTokens = candidatesTokenCount + (thoughtsTokenCount ?? 0)\n const inputTokens = promptTokenCount\n const totalTokens = meta?.totalTokenCount\n\n // Canonical details keys: input, cached, output.\n const details: Record<string, number> = {\n input: inputTokens,\n output: outputTokens,\n ...(cachedContentTokenCount !== undefined ? { cached: cachedContentTokenCount } : {}),\n ...(thoughtsTokenCount !== undefined ? { thinking: thoughtsTokenCount } : {}),\n }\n\n // Raw: the full usageMetadata object verbatim (as JsonValue).\n const raw: JsonValue =\n meta !== undefined ? (meta as unknown as { [k: string]: JsonValue }) : null\n\n const usage: Usage = {\n inputTokens,\n outputTokens,\n details,\n raw,\n ...(cachedContentTokenCount !== undefined\n ? { cachedInputTokens: cachedContentTokenCount }\n : {}),\n ...(thoughtsTokenCount !== undefined ? { thinkingTokens: thoughtsTokenCount } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {}),\n }\n\n return usage\n}\n\n// ---------------------------------------------------------------------------\n// Message → Gemini contents mapping (shared by run() and countTokens())\n// ---------------------------------------------------------------------------\n\n/**\n * Map a single {@link Part} to its Gemini SDK equivalent.\n *\n * - `text` → `{ text }`\n * - `inline-media` → `{ inlineData: { mimeType, data } }` + optional `mediaResolution`\n * - `file-uri` → `{ fileData: { mimeType, fileUri } }` + optional `mediaResolution`\n *\n * `mediaResolution` IS supported as a per-part field by the Gemini SDK\n * (`Part.mediaResolution`). The normalised value is mapped to the\n * `PartMediaResolutionLevel` string enum before emission.\n */\nfunction mapPart(p: Part): GeminiContentPart {\n switch (p.kind) {\n case 'text':\n return { text: p.text }\n\n case 'inline-media': {\n return {\n inlineData: {\n mimeType: p.mimeType,\n data: p.data,\n },\n ...(p.mediaResolution !== undefined\n ? { mediaResolution: { level: mapMediaResolution(p.mediaResolution) } }\n : {}),\n }\n }\n\n case 'file-uri': {\n return {\n fileData: {\n mimeType: p.mimeType,\n fileUri: p.uri,\n },\n ...(p.mediaResolution !== undefined\n ? { mediaResolution: { level: mapMediaResolution(p.mediaResolution) } }\n : {}),\n }\n }\n\n default:\n return assertNever(p)\n }\n}\n\n/**\n * Map engine {@link Message}s to Gemini SDK `contents`.\n *\n * Shared by `run()` (generation) and `countTokens()` (token counting) so both\n * code paths map messages identically — a divergence here would make token\n * counts unrepresentative of the actual generation call.\n */\nexport function mapMessagesToGeminiContents(messages: Message[]): GeminiContent[] {\n return messages.map((msg) => ({\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: msg.parts.map(mapPart),\n }))\n}\n\n// ---------------------------------------------------------------------------\n// Adapter options\n// ---------------------------------------------------------------------------\n\nexport interface GeminiAdapterOptions {\n /**\n * Inject a pre-built client (real or fake).\n * When omitted, `buildGoogleClient` is called with `ctx.auth` at call time,\n * inside the classified try/catch so any construction failure is wrapped\n * as a typed `LlmError`.\n */\n client?: GeminiClientLike\n /**\n * @internal Testing-only.\n *\n * Override the default `buildGoogleClient` factory. Allows unit tests to\n * simulate construction failures (e.g. bad credentials) without importing\n * the real `@google/genai` SDK. Never set this in production code.\n */\n _clientFactory?: (auth: AuthMaterial) => GeminiClientLike | Promise<GeminiClientLike>\n}\n\n// ---------------------------------------------------------------------------\n// geminiAdapter factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Gemini provider adapter.\n *\n * @param opts.client - Optional pre-built client (e.g. for testing).\n */\nexport function geminiAdapter(opts?: GeminiAdapterOptions): ProviderAdapter {\n return {\n id: 'google',\n\n async run(req: ResolvedRequest, ctx: AdapterCtx): Promise<AdapterResult> {\n if (req.provider !== 'google') {\n throw new LlmError(\n `geminiAdapter received a request for provider \"${req.provider}\", expected \"google\".`,\n { kind: 'bad_request', retryable: false },\n )\n }\n\n const warnings: Warning[] = []\n const model = req.model\n\n // ------------------------------------------------------------------\n // 1. Map messages → contents\n // ------------------------------------------------------------------\n\n const contents: GeminiContent[] = mapMessagesToGeminiContents(req.messages)\n\n // ------------------------------------------------------------------\n // 2. Build GenerateContentConfig\n // ------------------------------------------------------------------\n const genConfig = req.config\n const config: GeminiDispatchConfig = {}\n\n // System instruction\n if (req.system !== undefined) {\n config.systemInstruction = { parts: [{ text: req.system }] }\n }\n\n // Basic generation parameters (only include when defined)\n if (genConfig.temperature !== undefined) {\n config.temperature = genConfig.temperature\n }\n if (genConfig.topP !== undefined) {\n config.topP = genConfig.topP\n }\n if (genConfig.topK !== undefined) {\n config.topK = genConfig.topK\n }\n if (genConfig.maxOutputTokens !== undefined) {\n config.maxOutputTokens = genConfig.maxOutputTokens\n }\n if (genConfig.stopSequences !== undefined) {\n config.stopSequences = genConfig.stopSequences\n }\n\n // Service tier (FLEX or STANDARD)\n // Real SDK: GenerateContentConfig.serviceTier = ServiceTier enum (\"flex\"|\"standard\")\n const explicit = (genConfig as { serviceTier?: 'flex' | 'standard' }).serviceTier\n const supported = req.modelDescriptor?.capabilities?.serviceTiers\n if (explicit !== undefined) {\n // caller explicitly chose a tier — reject if the model can't honour it\n if (\n req.modelDescriptor !== undefined &&\n (supported === undefined || !supported.includes(explicit))\n ) {\n throw new LlmError(\n `serviceTier \"${explicit}\" is not supported for model \"${model}\".`,\n { kind: 'bad_request', retryable: false },\n )\n }\n config.serviceTier = explicit\n }\n\n // ------------------------------------------------------------------\n // 3. Reasoning → thinkingConfig\n // ------------------------------------------------------------------\n const reasoning = genConfig.reasoning\n if (reasoning !== undefined) {\n const reasoningApi = req.modelDescriptor?.capabilities?.reasoningApi\n\n if (reasoning.effort !== undefined && reasoning.budgetTokens !== undefined) {\n throw new LlmError(\n `Provide either reasoning.effort or reasoning.budgetTokens, not both, for model \"${model}\".`,\n { kind: 'bad_request', retryable: false },\n )\n }\n\n if (reasoningApi === 'budget') {\n // gemini-2.5* → thinkingBudget\n const budget =\n reasoning.budgetTokens !== undefined\n ? reasoning.budgetTokens\n : reasoning.effort !== undefined\n ? GOOGLE_REASONING_EFFORT_BUDGET[reasoning.effort]\n : undefined\n\n config.thinkingConfig = {\n ...(budget !== undefined ? { thinkingBudget: budget } : {}),\n ...(reasoning.includeThoughts === true ? { includeThoughts: true } : {}),\n }\n } else if (reasoningApi === 'level') {\n // gemini-3.* → thinkingLevel\n if (reasoning.budgetTokens !== undefined) {\n throw new LlmError(\n `reasoning.budgetTokens is not supported for model \"${model}\" (it uses thinkingLevel, not thinkingBudget); use reasoning.effort instead.`,\n { kind: 'bad_request', retryable: false },\n )\n }\n\n // Real SDK ThinkingLevel enum: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"MINIMAL\"\n let thinkingLevel: string | undefined\n if (reasoning.effort !== undefined) {\n switch (reasoning.effort) {\n case 'none':\n thinkingLevel = 'MINIMAL'\n break\n case 'low':\n thinkingLevel = 'LOW'\n break\n case 'medium':\n thinkingLevel = 'MEDIUM'\n break\n case 'high':\n thinkingLevel = 'HIGH'\n break\n default:\n assertNever(reasoning.effort)\n }\n }\n\n config.thinkingConfig = {\n ...(thinkingLevel !== undefined ? { thinkingLevel } : {}),\n ...(reasoning.includeThoughts === true ? { includeThoughts: true } : {}),\n }\n } else {\n throw new LlmError(\n `Model \"${model}\" does not support reasoning/thinkingConfig.`,\n { kind: 'bad_request', retryable: false },\n )\n }\n }\n\n // ------------------------------------------------------------------\n // 4. Structured output → responseMimeType + responseSchema\n // ------------------------------------------------------------------\n const structuredOutputRequested = req.outputJsonSchema !== undefined\n if (structuredOutputRequested) {\n const nativeStructuredOutput =\n req.modelDescriptor?.capabilities?.nativeStructuredOutput !== false\n\n if (nativeStructuredOutput) {\n config.responseMimeType = 'application/json'\n config.responseSchema = req.outputJsonSchema as NonNullable<\n GeminiGenerateConfig['responseSchema']\n >\n }\n }\n\n // ------------------------------------------------------------------\n // 5. providerOptions.google → explicit allowlisted mapping\n // ------------------------------------------------------------------\n const googleProviderConfig = mapGoogleProviderOptions(\n genConfig.providerOptions?.['google'],\n model,\n structuredOutputRequested,\n req.modelDescriptor?.capabilities?.grounding,\n )\n if (googleProviderConfig.cachedContent !== undefined) {\n config.cachedContent = googleProviderConfig.cachedContent\n }\n if (googleProviderConfig.httpOptions !== undefined) {\n config.httpOptions = googleProviderConfig.httpOptions\n }\n if (googleProviderConfig.safetySettings !== undefined) {\n config.safetySettings = googleProviderConfig.safetySettings\n }\n if (googleProviderConfig.tools !== undefined) {\n config.tools = googleProviderConfig.tools\n }\n\n // ------------------------------------------------------------------\n // 5a. Fixed-sampling models reject sampling params even when a custom\n // descriptor or direct adapter test bypasses core parsing.\n // ------------------------------------------------------------------\n assertSamplingAllowed(config, model, req.modelDescriptor?.capabilities?.sampling)\n\n // ------------------------------------------------------------------\n // 6. AbortSignal passthrough + FIX A-2: client-side flex ceiling\n //\n // FIX A-2 belt-and-suspenders: @google/genai issue #1277 — on SDK\n // versions before 2.0.0, httpOptions.timeout is a no-op for\n // generateContent. Upstream landed a related Undici dispatcher fix in\n // 2.0.0 (commit 850f680), but we keep this mitigation as\n // belt-and-suspenders since it is now merely double-covered, not made\n // incorrect. On explicit flex calls without timeoutMs, the engine arms\n // NO AbortSignal; relying solely on\n // httpOptions.timeout risks a silent hang. We arm our own\n // AbortController here and combine it with any incoming signal so WE\n // enforce the ceiling regardless of the SDK bug.\n //\n // Flex and standard default paths need this extra timer when timeoutMs is\n // absent. When timeoutMs IS set the engine already arms a hard AbortSignal\n // at exactly timeoutMs.\n //\n // Abort reason uses DOMException with name 'TimeoutError' so classifyError\n // maps the resulting LlmError to kind:'timeout' (retryable:true), matching\n // how the rest of the codebase surfaces timeout errors.\n //\n // AbortSignal.any requires Node ≥ 20.3; our engine floor is Node ≥ 20,\n // so this is always available in supported environments.\n //\n // Real SDK: GenerateContentConfig.abortSignal (in config, NOT in params)\n // ------------------------------------------------------------------\n let tierTimeoutHandle: ReturnType<typeof setTimeout> | undefined\n\n const clearTierTimeout = (): void => {\n if (tierTimeoutHandle !== undefined) {\n clearTimeout(tierTimeoutHandle)\n tierTimeoutHandle = undefined\n }\n }\n\n const applyTierTimeout = (tier: string | undefined): void => {\n clearTierTimeout()\n delete config.abortSignal\n\n const defaultTimeoutMs =\n genConfig.timeoutMs === undefined\n ? tier === 'flex'\n ? FLEX_DEFAULT_TIMEOUT_MS\n : tier === 'standard'\n ? STANDARD_DEFAULT_TIMEOUT_MS\n : undefined\n : undefined\n\n if (defaultTimeoutMs !== undefined) {\n const tierController = new AbortController()\n const tierLabel = tier === 'standard' ? 'Standard' : 'Flex'\n const timeoutReason = new DOMException(\n `${tierLabel} timeout: call exceeded ${defaultTimeoutMs}ms client-side ceiling` +\n ' (@google/genai #1277 belt-and-suspenders)',\n 'TimeoutError',\n )\n tierTimeoutHandle = setTimeout(() => {\n tierController.abort(timeoutReason)\n }, defaultTimeoutMs)\n config.abortSignal =\n ctx.signal !== undefined\n ? AbortSignal.any([tierController.signal, ctx.signal])\n : tierController.signal\n } else if (ctx.signal !== undefined) {\n config.abortSignal = ctx.signal\n }\n }\n\n applyTierTimeout(config.serviceTier)\n\n // ------------------------------------------------------------------\n // 7. Transport timeout — set httpOptions.timeout so the @google/genai\n // HTTP transport does NOT preempt the AbortSignal hard ceiling.\n //\n // Policy (precedence, highest first):\n // 1. Caller-supplied providerOptions.google.httpOptions.timeout wins.\n // 2. timeoutMs is set → computed transport timeout = timeoutMs +\n // TRANSPORT_TIMEOUT_BUFFER_MS so the engine's AbortSignal (hard\n // ceiling at timeoutMs) always fires before the SDK transport timer.\n // 3. serviceTier 'flex', no timeoutMs → FLEX_DEFAULT_TIMEOUT_MS (no\n // buffer; there is no engine AbortSignal deadline in this case).\n // 4. serviceTier 'standard', no timeoutMs → STANDARD_DEFAULT_TIMEOUT_MS.\n //\n // Only assign config.httpOptions when the merged object is non-empty\n // (exactOptionalPropertyTypes-safe).\n // ------------------------------------------------------------------\n\n // Capture caller-supplied httpOptions BEFORE we overwrite.\n // These arrived via the allowlisted provider-options mapper above.\n const callerHttpOptions = config.httpOptions\n\n const computedTimeoutMs: number | undefined =\n genConfig.timeoutMs !== undefined\n ? genConfig.timeoutMs + TRANSPORT_TIMEOUT_BUFFER_MS\n : config.serviceTier === 'flex'\n ? FLEX_DEFAULT_TIMEOUT_MS\n : config.serviceTier === 'standard'\n ? STANDARD_DEFAULT_TIMEOUT_MS\n : undefined\n\n const mergedHttpOptions: { timeout?: number } = {\n ...(computedTimeoutMs !== undefined ? { timeout: computedTimeoutMs } : {}),\n ...callerHttpOptions,\n }\n\n if (Object.keys(mergedHttpOptions).length > 0) {\n config.httpOptions = mergedHttpOptions\n }\n\n // ------------------------------------------------------------------\n // 8b. Client construction + SDK call — both inside the classifier\n // so that ANY failure in run() (including a bad auth constructor)\n // is rethrown as a typed LlmError(provider:'google').\n // ------------------------------------------------------------------\n let response: GeminiResponseShape\n let servedServiceTier = config.serviceTier\n const dispatch = async (): Promise<GeminiResponseShape> => {\n const dispatchConfig: GeminiGenerateConfig = {\n ...config,\n ...(config.httpOptions !== undefined\n ? { httpOptions: { ...config.httpOptions } }\n : {}),\n }\n const params = {\n model,\n contents,\n config: dispatchConfig,\n }\n const buildClient = opts?._clientFactory ?? buildGoogleClient\n const client: GeminiClientLike =\n opts?.client !== undefined ? opts.client : await buildClient(ctx.auth)\n ctx.logger.debug(\n {\n model,\n configKeys: Object.keys(dispatchConfig),\n serviceTier: dispatchConfig.serviceTier,\n },\n 'llm.adapter.dispatch',\n )\n return client.models.generateContent(params)\n }\n try {\n response = await dispatch()\n } catch (rawErr) {\n // Classify SDK errors → LlmError\n const typed = classifyGoogleError(\n rawErr,\n servedServiceTier !== undefined ? { servedServiceTier } : undefined,\n )\n\n if (\n config.serviceTier === 'flex' &&\n googleProviderConfig.flexFallback !== false &&\n isGeminiCapacityError(typed)\n ) {\n config.serviceTier = 'standard'\n servedServiceTier = 'standard'\n const fallbackTimeout =\n genConfig.timeoutMs !== undefined\n ? genConfig.timeoutMs + TRANSPORT_TIMEOUT_BUFFER_MS\n : STANDARD_DEFAULT_TIMEOUT_MS\n config.httpOptions = {\n timeout: fallbackTimeout,\n ...callerHttpOptions,\n }\n applyTierTimeout('standard')\n try {\n response = await dispatch()\n } catch (fallbackRawErr) {\n throw classifyGoogleError(fallbackRawErr, { servedServiceTier: 'standard' })\n }\n } else {\n throw typed\n }\n } finally {\n // FIX A-2: always clear the tier timeout timer so it never leaks,\n // regardless of whether the call succeeded, threw, or was aborted.\n clearTierTimeout()\n }\n\n // ------------------------------------------------------------------\n // 8. Blocked response check\n // promptFeedback.blockReason set OR no candidates → content_filter\n // ------------------------------------------------------------------\n const hasBlockReason = response.promptFeedback?.blockReason !== undefined\n const hasCandidates =\n response.candidates !== undefined && response.candidates.length > 0\n\n if (hasBlockReason || !hasCandidates) {\n const reason = response.promptFeedback?.blockReason ?? 'NO_CANDIDATES'\n throw new LlmError(`Gemini response blocked: ${reason}`, {\n kind: 'content_filter',\n retryable: false,\n provider: 'google',\n })\n }\n\n // ------------------------------------------------------------------\n // 9. Map response\n // ------------------------------------------------------------------\n const candidates = response.candidates\n if (candidates === undefined || candidates.length === 0) {\n throw new LlmError('Gemini response blocked: NO_CANDIDATES', {\n kind: 'content_filter',\n retryable: false,\n provider: 'google',\n })\n }\n const candidate = candidates[0]\n if (candidate === undefined) {\n throw new LlmError('Gemini response blocked: NO_CANDIDATES', {\n kind: 'content_filter',\n retryable: false,\n provider: 'google',\n })\n }\n const parts = candidate.content?.parts ?? []\n\n // Separate thought parts from text parts.\n const textParts: string[] = []\n const thoughtParts: string[] = []\n\n for (const part of parts) {\n if (part.text !== undefined) {\n if (part.thought === true) {\n thoughtParts.push(part.text)\n } else {\n textParts.push(part.text)\n }\n }\n }\n\n const text = textParts.join('')\n const reasoningText = thoughtParts.length > 0 ? thoughtParts.join('') : undefined\n\n // Parse structured output (JSON text → rawStructured).\n let rawStructured: unknown\n if (structuredOutputRequested && text.length > 0) {\n try {\n rawStructured = JSON.parse(text)\n } catch {\n // Core reports outputParsed:false; callers own validation/retry policy.\n }\n }\n\n // ------------------------------------------------------------------\n // 10. Build AdapterResult\n // ------------------------------------------------------------------\n const usage = mapUsage(response.usageMetadata)\n const finishReason = mapFinishReason(candidate.finishReason)\n\n const result: AdapterResult = {\n model,\n usage,\n warnings,\n ...(servedServiceTier !== undefined ? { servedServiceTier } : {}),\n ...(text.length > 0 ? { text } : {}),\n ...(reasoningText !== undefined ? { reasoningText } : {}),\n ...(rawStructured !== undefined ? { rawStructured } : {}),\n ...(finishReason !== undefined ? { finishReason } : {}),\n ...(response.modelVersion !== undefined\n ? { modelVersion: response.modelVersion }\n : {}),\n ...(response.responseId !== undefined ? { responseId: response.responseId } : {}),\n // Build providerMetadata — merge promptFeedback + groundingMetadata when present.\n ...((): { providerMetadata: JsonValue } | Record<string, never> => {\n const pf = response.promptFeedback\n const gm = candidate.groundingMetadata\n if (pf === undefined && gm === undefined) return {}\n const meta: { [k: string]: JsonValue } = {}\n if (pf !== undefined) {\n meta['promptFeedback'] = pf as unknown as JsonValue\n }\n if (gm !== undefined) {\n meta['groundingMetadata'] = gm as unknown as JsonValue\n }\n return { providerMetadata: meta as JsonValue }\n })(),\n }\n\n return result\n },\n\n async countTokens(req: TokenCountRequest, ctx: AdapterCtx): Promise<TokenCount> {\n if (req.provider !== 'google') {\n throw new LlmError(\n `geminiAdapter received a request for provider \"${req.provider}\", expected \"google\".`,\n { kind: 'bad_request', retryable: false },\n )\n }\n\n const contents = mapMessagesToGeminiContents(req.messages)\n const params: GeminiCountTokensParams = {\n model: req.model,\n contents,\n ...(req.system !== undefined || ctx.signal !== undefined\n ? {\n config: {\n ...(req.system !== undefined\n ? { systemInstruction: { parts: [{ text: req.system }] } }\n : {}),\n ...(ctx.signal !== undefined ? { abortSignal: ctx.signal } : {}),\n },\n }\n : {}),\n }\n\n try {\n const buildClient = opts?._clientFactory ?? buildGoogleClient\n const client: GeminiClientLike =\n opts?.client !== undefined ? opts.client : await buildClient(ctx.auth)\n const response = await client.models.countTokens(params)\n\n if (response.totalTokens === undefined) {\n // Provider fault, not caller fault: the SDK call succeeded but the\n // payload is malformed — classify as a (retryable) server error.\n throw new LlmError(\n 'Gemini countTokens response is malformed: missing required field: totalTokens',\n { kind: 'server', retryable: true, provider: 'google' },\n )\n }\n\n const details: Record<string, number> | undefined =\n response.cachedContentTokenCount !== undefined\n ? { cached: response.cachedContentTokenCount }\n : undefined\n\n return {\n totalTokens: response.totalTokens,\n ...(details !== undefined ? { details } : {}),\n raw: response as unknown as JsonValue,\n }\n } catch (rawErr) {\n throw classifyGoogleError(rawErr)\n }\n },\n }\n}\n","/**\n * Gemini pricing snapshot for @gullabs/google.\n *\n * All rates are in **micro-USD per million tokens** (µUSD/M).\n * To get the cost for N tokens: `cost_µUSD = N * ratePerM / 1_000_000`.\n *\n * **Service tiers.** Rates below are STANDARD-tier. Google's **Batch** tier is a\n * flat 50% discount on standard, and **Flex** matches Batch pricing. The cost\n * engine applies the {@link TIER_FACTOR} multiplier — this snapshot stores\n * standard rates only.\n *\n * **Long-context tier.** Gemini Pro models charge a premium when the GROSS input\n * token count exceeds 200,000. Selected by `inputTokens` (incl. cached), not by\n * billable input.\n *\n * **Thinking tokens.** Already inside `outputTokens` (GROSS convention) and\n * billed at the standard output rate — no separate thinking lane.\n *\n * **Modality caveat (v1 = text).** Gemini 2.5 Flash / Flash-Lite charge a higher\n * INPUT rate for audio tokens than for text/image/video. v1 is text-only and uses\n * the text/img/vid input rate. Per-modality input pricing is a deferred seam\n * (see DESIGN.md) — revisit when audio input is supported.\n *\n * Verified against https://ai.google.dev/gemini-api/docs/pricing on 2026-06-28.\n *\n * @module\n */\n\nimport type { ModelRates } from '@gullabs/core'\n\n/**\n * Identifies this pricing snapshot — bump the date when rates change.\n *\n * This is a snapshot date tied to Gemini's own pricing page, not a generic\n * core concept — it lives here (not `@gullabs/core`) alongside the rates it\n * dates.\n */\nexport const pricingVersion = 'gemini-2026-06-28' as const\n\n/**\n * Service-tier price multipliers. Batch and Flex are a flat 50% of standard\n * (per Google's pricing page: \"Batch API — 50% cost reduction\"; Flex matches Batch).\n *\n * `serviceTier` is an opaque, provider-defined string end-to-end — this map is\n * the *only* place a tier name is resolved to a multiplier. A tier key not\n * present here is never coerced to `standard`: `computeCost` (`@gullabs/core`)\n * treats that as an unpriced call (reject-don't-map), not a mapping to this\n * table's default. `undefined` (no tier requested) is the one case that\n * legitimately defaults to `standard` — that is documented default behavior,\n * not a guess.\n */\nexport const TIER_FACTOR: Readonly<Record<string, number>> = Object.freeze({\n standard: 1,\n flex: 0.5,\n batch: 0.5,\n})\n\n/**\n * Frozen Gemini pricing snapshot (STANDARD tier; per-1M in µUSD).\n *\n * Keys are model-string prefixes / exact identifiers used in routing. The cost\n * engine matches exact first, then longest-prefix (see `lookupRates` in\n * `cost.ts`).\n *\n * Source: https://ai.google.dev/gemini-api/docs/pricing (2026-06-28).\n */\nexport const GEMINI_PRICING: Readonly<Record<string, ModelRates>> = Object.freeze({\n // ── Gemini 2.5 Pro ── $1.25/$10 (≤200k), $2.50/$15 (>200k); cached $0.125/$0.25\n 'gemini-2.5-pro': {\n inputPerM: 1_250_000,\n cachedPerM: 125_000,\n outputPerM: 10_000_000,\n gt200k: {\n inputPerM: 2_500_000,\n cachedPerM: 250_000,\n outputPerM: 15_000_000,\n },\n },\n\n // ── Gemini 2.5 Flash ── input $0.30 (text), output $2.50, cached $0.03\n 'gemini-2.5-flash': {\n inputPerM: 300_000,\n cachedPerM: 30_000,\n outputPerM: 2_500_000,\n },\n\n // ── Gemini 2.5 Flash-Lite ── input $0.10 (text), output $0.40, cached $0.01\n 'gemini-2.5-flash-lite': {\n inputPerM: 100_000,\n cachedPerM: 10_000,\n outputPerM: 400_000,\n },\n\n // ── Gemini 3.5 Flash ── input $1.50, output $9.00, cached $0.15\n 'gemini-3.5-flash': {\n inputPerM: 1_500_000,\n cachedPerM: 150_000,\n outputPerM: 9_000_000,\n },\n\n // ── Gemini 3.1 Flash-Lite ── input $0.25 (text), output $1.50, cached $0.025\n 'gemini-3.1-flash-lite': {\n inputPerM: 250_000,\n cachedPerM: 25_000,\n outputPerM: 1_500_000,\n },\n\n // ── Gemini 3.1 Pro (preview) ── $2.00/$12 (≤200k), $4.00/$18 (>200k); cached $0.20/$0.40\n 'gemini-3.1-pro-preview': {\n inputPerM: 2_000_000,\n cachedPerM: 200_000,\n outputPerM: 12_000_000,\n gt200k: {\n inputPerM: 4_000_000,\n cachedPerM: 400_000,\n outputPerM: 18_000_000,\n },\n },\n\n // ── Gemini 3 Flash (preview) ── input $0.50, output $3.00, cached $0.05 (90% discount)\n 'gemini-3-flash-preview': {\n inputPerM: 500_000,\n cachedPerM: 50_000,\n outputPerM: 3_000_000,\n },\n})\n","/**\n * Gemini pricing source for @gullabs/google.\n *\n * Provides `geminiPricingSource` — a factory returning a `PricingSource` port\n * implementation backed by the frozen Gemini pricing snapshot ({@link\n * GEMINI_PRICING}). Walks the rates table (exact-then-longest-prefix match)\n * and delegates the actual arithmetic to `@gullabs/core`'s `computeCost`,\n * supplying this package's rates table + tier-factor map as explicit\n * parameters — core itself carries zero Gemini pricing knowledge.\n *\n * @module\n */\n\nimport { computeCost } from '@gullabs/core'\nimport type { Cost, ModelRates, PricingSource, Usage } from '@gullabs/core'\n\nimport { GEMINI_PRICING, TIER_FACTOR, pricingVersion } from './pricing.js'\n\n/**\n * Look up rates for a model.\n *\n * Performs an exact-key match first, then falls back to longest-prefix match\n * (e.g. `\"gemini-2.5-pro-001\"` matches `\"gemini-2.5-pro\"`).\n *\n * @returns The matched {@link ModelRates}, or `undefined` if no entry found.\n */\nfunction lookupRates(model: string): ModelRates | undefined {\n // 1. Exact match — fast path.\n const exact = GEMINI_PRICING[model]\n if (exact !== undefined) return exact\n\n // 2. Longest-prefix match.\n let bestKey = ''\n let bestRates: ModelRates | undefined\n for (const key of Object.keys(GEMINI_PRICING)) {\n if (model.startsWith(key) && key.length > bestKey.length) {\n bestKey = key\n bestRates = GEMINI_PRICING[key]\n }\n }\n return bestRates\n}\n\n/**\n * Factory that returns the **google-scoped** {@link PricingSource} port\n * implementation backed by the built-in Gemini pricing snapshot.\n *\n * `PricingSource` is provider-scoped by contract — this source only knows\n * bare Gemini/Gemma model keys. Compose it into `ClientConfig.pricingSources`\n * under the `'google'` key (or bundle it via {@link googleProvider}); do not\n * use it for other providers.\n *\n * The returned object is stateless and can be shared across calls.\n *\n * @example\n * ```ts\n * import { geminiPricingSource } from '@gullabs/google'\n *\n * const pricing = geminiPricingSource()\n * const cost = pricing.price('gemini-2.5-pro', usage, 'flex')\n * ```\n */\nexport function geminiPricingSource(): PricingSource {\n return {\n version: pricingVersion,\n price(model: string, usage: Usage, tier?: string): Cost {\n return computeCost(model, usage, tier, lookupRates, TIER_FACTOR, pricingVersion)\n },\n hasModel(model: string): boolean {\n return lookupRates(model) !== undefined\n },\n listModels(): readonly string[] {\n return Object.keys(GEMINI_PRICING)\n },\n }\n}\n","import { z } from 'zod'\n\nexport const Gemini25ProConfigSchema = z\n .union([\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-pro.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-pro.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-pro.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-pro.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-pro.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-2.5-pro.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-2.5-pro. Thinking off is not supported.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z.number().int().min(128).max(32768).meta({\n title: 'Reasoning Budget Tokens',\n description: 'thinkingBudget token range for gemini-2.5-pro.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Pro thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-pro.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-2.5-pro.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-pro.',\n }),\n }),\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-pro.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-pro.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-pro.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-pro.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-pro.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-2.5-pro.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-2.5-pro. Thinking off is not supported.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z.number().int().min(128).max(32768).meta({\n title: 'Reasoning Budget Tokens',\n description: 'thinkingBudget token range for gemini-2.5-pro.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Pro thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-pro.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-2.5-pro.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-pro.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini25ProConfig',\n description:\n 'Strict generateContent config for model gemini-2.5-pro. Budget reasoning, tunable sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', temperature: 0.7, reasoning: { effort: 'high' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini25FlashConfigSchema = z\n .union([\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-flash.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-flash.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-flash.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-flash.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-flash.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-2.5-flash.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemini-2.5-flash.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z.number().int().min(0).max(24576).meta({\n title: 'Reasoning Budget Tokens',\n description: 'thinkingBudget token range for gemini-2.5-flash.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Flash thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-flash.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-2.5-flash.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-flash.',\n }),\n }),\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-flash.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-flash.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-flash.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-flash.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-flash.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-2.5-flash.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemini-2.5-flash.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z.number().int().min(0).max(24576).meta({\n title: 'Reasoning Budget Tokens',\n description: 'thinkingBudget token range for gemini-2.5-flash.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Flash thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-flash.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-2.5-flash.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-flash.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini25FlashConfig',\n description:\n 'Strict generateContent config for model gemini-2.5-flash. Budget reasoning, tunable sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', temperature: 0.7, reasoning: { effort: 'none' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini25FlashLiteConfigSchema = z\n .union([\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-flash-lite.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-flash-lite.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-flash-lite.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-flash-lite.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-flash-lite.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-2.5-flash-lite.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemini-2.5-flash-lite.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z\n .union([z.literal(0), z.number().int().min(512).max(24576)])\n .meta({\n title: 'Reasoning Budget Tokens',\n description:\n 'thinkingBudget token range for gemini-2.5-flash-lite. Zero disables thinking; non-zero values must be 512..24576.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Flash-Lite thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-flash-lite.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-2.5-flash-lite.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-flash-lite.',\n }),\n }),\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-flash-lite.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-flash-lite.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-flash-lite.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-flash-lite.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-flash-lite.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-2.5-flash-lite.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemini-2.5-flash-lite.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z\n .union([z.literal(0), z.number().int().min(512).max(24576)])\n .meta({\n title: 'Reasoning Budget Tokens',\n description:\n 'thinkingBudget token range for gemini-2.5-flash-lite. Zero disables thinking; non-zero values must be 512..24576.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Flash-Lite thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-flash-lite.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-2.5-flash-lite.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-flash-lite.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini25FlashLiteConfig',\n description:\n 'Strict generateContent config for model gemini-2.5-flash-lite. Budget reasoning, tunable sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', temperature: 0.7, reasoning: { budgetTokens: 0 } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini35FlashConfigSchema = z\n .union([\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.5-flash.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.5-flash.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-3.5-flash.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.5-flash; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.5 Flash thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.5-flash.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-3.5-flash.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.5-flash.',\n }),\n }),\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.5-flash.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.5-flash.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-3.5-flash.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.5-flash; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.5 Flash thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.5-flash.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-3.5-flash.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.5-flash.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini35FlashConfig',\n description:\n 'Strict generateContent config for model gemini-3.5-flash. Level reasoning, fixed sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', reasoning: { effort: 'high' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini31FlashLiteConfigSchema = z\n .union([\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.1-flash-lite.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.1-flash-lite.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-3.1-flash-lite.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.1-flash-lite; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.1 Flash-Lite thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.1-flash-lite.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3.1-flash-lite.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.1-flash-lite.',\n }),\n }),\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.1-flash-lite.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.1-flash-lite.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-3.1-flash-lite.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.1-flash-lite; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.1 Flash-Lite thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.1-flash-lite.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3.1-flash-lite.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.1-flash-lite.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini31FlashLiteConfig',\n description:\n 'Strict generateContent config for model gemini-3.1-flash-lite. Level reasoning, fixed sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', reasoning: { effort: 'medium' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini31ProPreviewConfigSchema = z\n .union([\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.1-pro-preview.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.1-pro-preview.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-3.1-pro-preview.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.1-pro-preview. Thinking off is not supported.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.1 Pro Preview thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.1-pro-preview.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3.1-pro-preview.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.1-pro-preview.',\n }),\n }),\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.1-pro-preview.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.1-pro-preview.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-3.1-pro-preview.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.1-pro-preview. Thinking off is not supported.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.1 Pro Preview thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.1-pro-preview.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3.1-pro-preview.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.1-pro-preview.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini31ProPreviewConfig',\n description:\n 'Strict generateContent config for model gemini-3.1-pro-preview. Level reasoning, fixed sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', reasoning: { effort: 'high' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini3FlashPreviewConfigSchema = z\n .union([\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3-flash-preview.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3-flash-preview.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-3-flash-preview.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3-flash-preview; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3 Flash Preview thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3-flash-preview.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3-flash-preview.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3-flash-preview.',\n }),\n }),\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3-flash-preview.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3-flash-preview.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-3-flash-preview.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3-flash-preview; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3 Flash Preview thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3-flash-preview.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3-flash-preview.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3-flash-preview.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini3FlashPreviewConfig',\n description:\n 'Strict generateContent config for model gemini-3-flash-preview. Level reasoning, fixed sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', reasoning: { effort: 'medium' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemma431bItConfigSchema = z\n .strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemma-4-31b-it.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemma-4-31b-it.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemma-4-31b-it.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemma-4-31b-it.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemma-4-31b-it.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemma-4-31b-it.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemma 4 31B IT thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemma-4-31b-it.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemma-4-31b-it.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemma-4-31b-it.',\n }),\n })\n .meta({\n title: 'Gemma431bItConfig',\n description:\n 'Strict generateContent config for model gemma-4-31b-it. Level reasoning, tunable sampling, no service tier, structured output, grounding, intentionally unpriced.',\n examples: [{ temperature: 0.7, reasoning: { effort: 'high' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemma426bA4bItConfigSchema = z\n .strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemma-4-26b-a4b-it.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemma-4-26b-a4b-it.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemma-4-26b-a4b-it.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemma-4-26b-a4b-it.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemma-4-26b-a4b-it.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemma-4-26b-a4b-it.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemma 4 26B A4B IT thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemma-4-26b-a4b-it.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemma-4-26b-a4b-it.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemma-4-26b-a4b-it.',\n }),\n })\n .meta({\n title: 'Gemma426bA4bItConfig',\n description:\n 'Strict generateContent config for model gemma-4-26b-a4b-it. Level reasoning, tunable sampling, no service tier, structured output, grounding, intentionally unpriced.',\n examples: [{ temperature: 0.7, reasoning: { effort: 'none' } }],\n })\n","/**\n * Model descriptor registry for @gullabs/google.\n *\n * Centralises Gemini/Gemma model knowledge: reasoning-effort vocabularies,\n * capability flags, and the built-in descriptor arrays. `@gullabs/core` owns\n * only the generic registry machinery (`ModelDescriptor`, `ModelRegistry`,\n * `createModelRegistry`) — this module supplies the Gemini-specific data.\n *\n * @module\n */\n\nimport type { ModelDescriptor, ModelRegistry, ReasoningEffort } from '@gullabs/core'\nimport { createModelRegistry } from '@gullabs/core'\n\nimport {\n Gemma426bA4bItConfigSchema,\n Gemma431bItConfigSchema,\n Gemini25FlashConfigSchema,\n Gemini25FlashLiteConfigSchema,\n Gemini25ProConfigSchema,\n Gemini31FlashLiteConfigSchema,\n Gemini31ProPreviewConfigSchema,\n Gemini35FlashConfigSchema,\n Gemini3FlashPreviewConfigSchema,\n} from './model-config/index.js'\nimport { toConfigJsonSchema, zodToStandardSchema } from '@gullabs/core'\n\nconst GEMINI_25_PRO_REASONING_EFFORTS = [\n 'low',\n 'medium',\n 'high',\n] as const satisfies ReadonlyArray<ReasoningEffort>\nconst GEMINI_LEVEL_REASONING_EFFORTS = [\n 'none',\n 'low',\n 'medium',\n 'high',\n] as const satisfies ReadonlyArray<ReasoningEffort>\nconst GEMINI_LEVEL_PRO_PREVIEW_REASONING_EFFORTS = [\n 'low',\n 'medium',\n 'high',\n] as const satisfies ReadonlyArray<ReasoningEffort>\nconst GEMINI_25_FLASH_REASONING_EFFORTS = [\n 'none',\n 'low',\n 'medium',\n 'high',\n] as const satisfies ReadonlyArray<ReasoningEffort>\nconst GEMMA_REASONING_EFFORTS = [\n 'none',\n 'high',\n] as const satisfies ReadonlyArray<ReasoningEffort>\n\nexport const geminiModelDescriptors: ModelDescriptor[] = [\n {\n model: 'gemini-2.5-pro',\n provider: 'google',\n pricingFamily: 'gemini-2.5-pro',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'budget',\n admittedReasoningEfforts: GEMINI_25_PRO_REASONING_EFFORTS,\n sampling: 'tunable',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini25ProConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini25ProConfigSchema),\n validateConfig: zodToStandardSchema(Gemini25ProConfigSchema),\n },\n {\n model: 'gemini-2.5-flash',\n provider: 'google',\n pricingFamily: 'gemini-2.5-flash',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'budget',\n admittedReasoningEfforts: GEMINI_25_FLASH_REASONING_EFFORTS,\n sampling: 'tunable',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini25FlashConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini25FlashConfigSchema),\n validateConfig: zodToStandardSchema(Gemini25FlashConfigSchema),\n },\n {\n model: 'gemini-2.5-flash-lite',\n provider: 'google',\n pricingFamily: 'gemini-2.5-flash-lite',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'budget',\n admittedReasoningEfforts: GEMINI_25_FLASH_REASONING_EFFORTS,\n sampling: 'tunable',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini25FlashLiteConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini25FlashLiteConfigSchema),\n validateConfig: zodToStandardSchema(Gemini25FlashLiteConfigSchema),\n },\n {\n model: 'gemini-3.5-flash',\n provider: 'google',\n pricingFamily: 'gemini-3.5-flash',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMINI_LEVEL_REASONING_EFFORTS,\n sampling: 'fixed',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini35FlashConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini35FlashConfigSchema),\n validateConfig: zodToStandardSchema(Gemini35FlashConfigSchema),\n },\n {\n model: 'gemini-3.1-flash-lite',\n provider: 'google',\n pricingFamily: 'gemini-3.1-flash-lite',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMINI_LEVEL_REASONING_EFFORTS,\n sampling: 'fixed',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini31FlashLiteConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini31FlashLiteConfigSchema),\n validateConfig: zodToStandardSchema(Gemini31FlashLiteConfigSchema),\n },\n {\n model: 'gemini-3.1-pro-preview',\n provider: 'google',\n pricingFamily: 'gemini-3.1-pro-preview',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMINI_LEVEL_PRO_PREVIEW_REASONING_EFFORTS,\n sampling: 'fixed',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini31ProPreviewConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini31ProPreviewConfigSchema),\n validateConfig: zodToStandardSchema(Gemini31ProPreviewConfigSchema),\n },\n {\n model: 'gemini-3-flash-preview',\n provider: 'google',\n pricingFamily: 'gemini-3-flash-preview',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMINI_LEVEL_REASONING_EFFORTS,\n sampling: 'fixed',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini3FlashPreviewConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini3FlashPreviewConfigSchema),\n validateConfig: zodToStandardSchema(Gemini3FlashPreviewConfigSchema),\n },\n]\n\nexport const gemmaModelDescriptors: ModelDescriptor[] = [\n {\n model: 'gemma-4-31b-it',\n provider: 'google',\n capabilities: {\n reasoning: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMMA_REASONING_EFFORTS,\n structuredOutput: true,\n nativeStructuredOutput: true,\n grounding: true,\n vision: true,\n sampling: 'tunable',\n },\n configSchema: Gemma431bItConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemma431bItConfigSchema),\n validateConfig: zodToStandardSchema(Gemma431bItConfigSchema),\n },\n {\n model: 'gemma-4-26b-a4b-it',\n provider: 'google',\n capabilities: {\n reasoning: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMMA_REASONING_EFFORTS,\n structuredOutput: true,\n nativeStructuredOutput: true,\n grounding: true,\n vision: true,\n sampling: 'tunable',\n },\n configSchema: Gemma426bA4bItConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemma426bA4bItConfigSchema),\n validateConfig: zodToStandardSchema(Gemma426bA4bItConfigSchema),\n },\n]\n\n/**\n * Pre-built registry of all built-in Gemini + Gemma descriptors.\n *\n * Most callers should prefer {@link googleProvider} (which bundles this same\n * descriptor set via `composeProviders`); this export remains for callers\n * that need a bare `ModelRegistry` without going through the plugin seam.\n */\nexport const defaultGeminiRegistry: ModelRegistry = createModelRegistry([\n ...geminiModelDescriptors,\n ...gemmaModelDescriptors,\n])\n","/**\n * `googleProvider` — {@link ProviderPlugin} factory for @gullabs/google.\n *\n * Bundles the Gemini adapter, the built-in Gemini + Gemma model descriptors,\n * and the Gemini pricing source into a single plugin for\n * {@link composeProviders}.\n *\n * @module\n */\n\nimport type { ProviderPlugin } from '@gullabs/core'\n\nimport { geminiAdapter } from './adapter.js'\nimport type { GeminiAdapterOptions } from './adapter.js'\nimport { geminiPricingSource } from './cost.js'\nimport { geminiModelDescriptors, gemmaModelDescriptors } from './models.js'\n\n/**\n * Create a {@link ProviderPlugin} for the Gemini provider.\n *\n * @param opts - Forwarded to {@link geminiAdapter}.\n * @returns A plugin bundling the Gemini adapter, Gemini + Gemma model\n * descriptors, and the built-in Gemini pricing source.\n *\n * @example\n * ```ts\n * import { createClient, composeProviders } from '@gullabs/core'\n * import { googleProvider } from '@gullabs/google'\n *\n * const client = createClient({\n * ...composeProviders([googleProvider()]),\n * })\n * ```\n */\nexport function googleProvider(opts?: GeminiAdapterOptions): ProviderPlugin {\n return {\n adapter: geminiAdapter(opts),\n modelDescriptors: [...geminiModelDescriptors, ...gemmaModelDescriptors],\n pricingSource: geminiPricingSource(),\n }\n}\n","/**\n * GoogleFileStore — thin wrapper over the Gemini File API.\n *\n * Handles upload + polling until ACTIVE, and tracked deletion.\n * Injectable sleep and client for tests (no network required).\n *\n * @module\n */\n\nimport type { AuthMaterial, Logger } from '@gullabs/core'\nimport { LlmError, classifyError, redactSecrets } from '@gullabs/core'\n\nimport { requireApiKey } from './client.js'\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/** A handle to a file stored in the Gemini File API. */\nexport interface GoogleFileHandle {\n /** Resource name, e.g. \"files/abc123\". */\n name: string\n /** URI to pass as FileUriPart.uri in an LlmRequest. */\n uri: string\n mimeType: string\n /** Provider auto-deletes ~48 h after upload. Absent when not returned. */\n expiresAt?: Date\n}\n\n/**\n * Minimal structural interface for the Gemini Files client surface we use.\n * Satisfied by the real ai.files object or a test fake.\n */\nexport interface GeminiFilesClientLike {\n upload(params: {\n file: Uint8Array | Blob\n config?: { mimeType?: string; displayName?: string }\n }): Promise<{\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }>\n get(params: { name: string }): Promise<{\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }>\n delete(params: { name: string }): Promise<void>\n}\n\nexport interface GoogleFileStoreOptions {\n auth: AuthMaterial\n /** Injectable client for tests; skips SDK import when provided. */\n client?: GeminiFilesClientLike\n /** Called on delete failures instead of rethrowing. Default: console.error. */\n onDeleteError?: (name: string, err: unknown) => void\n /** Optional structured logger. When provided, routes delete failures to logger.error. */\n logger?: Logger\n poll?: {\n /** Delay between state polls. Default: 3000 ms. */\n intervalMs?: number\n /** Max time to wait for ACTIVE. Default: 300 000 ms (5 min). */\n timeoutMs?: number\n }\n /** Injectable sleep for tests. Default: real setTimeout. */\n sleep?: (ms: number) => Promise<void>\n /** Injectable clock for deterministic tests. Default: `Date.now`. */\n now?: () => number\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_INTERVAL_MS = 3_000\nconst DEFAULT_TIMEOUT_MS = 300_000\n\nconst realSleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms))\n\nasync function buildFilesClient(auth: AuthMaterial): Promise<GeminiFilesClientLike> {\n const { GoogleGenAI } = await import('@google/genai')\n\n const ai = new GoogleGenAI({ apiKey: requireApiKey(auth) })\n\n return {\n async upload(params) {\n // Real SDK accepts string | Blob; convert Uint8Array → Blob.\n // Uint8Array.from() copies into a fresh, plain ArrayBuffer-backed\n // array — BlobPart requires Uint8Array<ArrayBuffer>, which excludes\n // the SharedArrayBuffer-backed views that Uint8Array<ArrayBufferLike>\n // (the type of params.file) may structurally include.\n const fileArg: Blob =\n params.file instanceof Uint8Array\n ? new Blob(\n [Uint8Array.from(params.file)],\n params.config?.mimeType !== undefined && params.config.mimeType.length > 0\n ? { type: params.config.mimeType }\n : {},\n )\n : params.file\n\n const result = await (\n ai.files.upload as (p: unknown) => Promise<{\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }>\n )({\n file: fileArg,\n ...(params.config !== undefined ? { config: params.config } : {}),\n })\n return result\n },\n\n async get(params) {\n const result = await (\n ai.files.get as (p: unknown) => Promise<{\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }>\n )(params)\n return result\n },\n\n async delete(params) {\n await (ai.files.delete as (p: unknown) => Promise<unknown>)(params)\n },\n }\n}\n\ntype FileResp = {\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n}\n\nfunction makeHandle(\n resp: FileResp,\n fallback: { name: string; uri: string; mimeType: string },\n): GoogleFileHandle {\n const et = resp.expirationTime\n return {\n name: resp.name ?? fallback.name,\n uri: resp.uri ?? fallback.uri,\n mimeType: resp.mimeType ?? fallback.mimeType,\n ...(et !== undefined && et.length > 0 ? { expiresAt: new Date(et) } : {}),\n }\n}\n\n// ---------------------------------------------------------------------------\n// GoogleFileStore\n// ---------------------------------------------------------------------------\n\n/**\n * **Auth snapshot note:** this store captures the `AuthMaterial` at construction\n * time and memoizes a single SDK client from it (`clientPromise`). This is\n * correct and sufficient for static API keys. If refreshable credentials\n * (short-lived OAuth/STS tokens) are added in the future, this memoization is\n * the seam that will need rework: the cached client would hold stale credentials\n * for the lifetime of a long-lived store instance. At that point, the store\n * will need to either rebuild the client on each operation or accept a\n * credential-resolver callback rather than a plain `AuthMaterial` value.\n * See ADR-020 in DECISIONS.md.\n */\nexport class GoogleFileStore {\n private readonly auth: AuthMaterial\n private readonly clientOverride: GeminiFilesClientLike | undefined\n private readonly onDeleteError: (name: string, err: unknown) => void\n private readonly logger: Logger | undefined\n private readonly intervalMs: number\n private readonly timeoutMs: number\n private readonly sleep: (ms: number) => Promise<void>\n private readonly now: () => number\n /** Memoised client promise — built at most once per store instance. */\n private clientPromise: Promise<GeminiFilesClientLike> | undefined\n\n constructor(opts: GoogleFileStoreOptions) {\n this.auth = opts.auth\n this.clientOverride = opts.client\n this.logger = opts.logger\n this.onDeleteError =\n opts.onDeleteError ??\n ((name, err) => {\n if (this.logger !== undefined) {\n this.logger.error(\n { name, error: redactSecrets(classifyError(err).message) },\n 'gemini.file.delete.failed',\n )\n } else {\n console.error(\n `[GoogleFileStore] delete failed for \"${name}\":`,\n redactSecrets(classifyError(err).message),\n )\n }\n })\n this.intervalMs = opts.poll?.intervalMs ?? DEFAULT_INTERVAL_MS\n this.timeoutMs = opts.poll?.timeoutMs ?? DEFAULT_TIMEOUT_MS\n this.sleep = opts.sleep ?? realSleep\n this.now = opts.now ?? (() => Date.now())\n }\n\n private getClient(): Promise<GeminiFilesClientLike> {\n if (this.clientOverride !== undefined) return Promise.resolve(this.clientOverride)\n if (this.clientPromise === undefined) {\n this.clientPromise = buildFilesClient(this.auth)\n }\n return this.clientPromise\n }\n\n /**\n * Upload bytes to the Gemini File API and wait until the file is ACTIVE.\n *\n * @param source - Raw bytes or Blob.\n * @param mimeType - IANA media type, e.g. `\"image/png\"`.\n * @param opts - Optional display name.\n */\n async upload(\n source: Uint8Array | Blob,\n mimeType: string,\n opts?: { displayName?: string; signal?: AbortSignal },\n ): Promise<GoogleFileHandle> {\n const signal = opts?.signal\n const client = await this.getClient()\n\n let uploadResp: {\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }\n try {\n uploadResp = await client.upload({\n file: source,\n config: {\n mimeType,\n ...(opts?.displayName !== undefined ? { displayName: opts.displayName } : {}),\n },\n })\n } catch (e) {\n throw classifyError(e)\n }\n\n const { name, uri } = uploadResp\n\n if (\n name === undefined ||\n name.length === 0 ||\n uri === undefined ||\n uri.length === 0\n ) {\n // Provider fault, not caller fault: the SDK call succeeded but the\n // payload is malformed — classify as a server error. NOT retryable:\n // upload() is side-effecting and not idempotent — the provider may have\n // already stored the file even though the payload carries no name/uri,\n // so there is no handle to clean up and an automatic retry could\n // orphan/duplicate provider-side resources.\n throw new LlmError('File upload response missing required fields (name or uri)', {\n kind: 'server',\n retryable: false,\n provider: 'google',\n })\n }\n\n const fallback = { name, uri, mimeType }\n\n if (uploadResp.state === 'ACTIVE') {\n return makeHandle(uploadResp, fallback)\n }\n\n if (uploadResp.state === 'FAILED') {\n throw new LlmError('File processing failed immediately after upload', {\n kind: 'bad_request',\n retryable: false,\n })\n }\n\n // PROCESSING (or unknown) — poll until ACTIVE or timeout.\n const deadline = this.now() + this.timeoutMs\n\n // Pre-flight: if the signal is already aborted, throw before creating any\n // promise so we never produce an unhandled rejection.\n if (signal?.aborted === true) {\n throw new LlmError('File upload polling aborted', {\n kind: 'aborted',\n retryable: false,\n })\n }\n\n // Build an abort-race promise so future aborts wake up the sleep race\n // immediately rather than waiting the full interval. Created only when\n // the signal is NOT already aborted (guard above handles that case).\n const abortRacePromise: Promise<never> | undefined =\n signal !== undefined\n ? new Promise<never>((_, reject) => {\n signal.addEventListener(\n 'abort',\n () => {\n reject(\n new LlmError('File upload polling aborted', {\n kind: 'aborted',\n retryable: false,\n }),\n )\n },\n { once: true },\n )\n })\n : undefined\n\n for (;;) {\n if (this.now() >= deadline) {\n throw new LlmError('Timed out waiting for uploaded file to become ACTIVE', {\n kind: 'timeout',\n retryable: true,\n })\n }\n\n // Sleep — race against the abort promise so we wake up immediately\n // when the signal fires rather than waiting the full interval.\n const sleepCall = this.sleep(this.intervalMs)\n await (abortRacePromise !== undefined\n ? Promise.race([sleepCall, abortRacePromise])\n : sleepCall)\n\n let pollResp: {\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }\n try {\n pollResp = await client.get({ name })\n } catch (e) {\n throw classifyError(e)\n }\n\n // Also guard here: the signal may have fired during client.get()\n // before we looped back to the sleep race.\n // Cast needed: TS 5.6 persists readonly-property narrowing across awaits,\n // making it think `aborted` is still `false | undefined` after the preflight.\n if ((signal?.aborted as boolean | undefined) === true) {\n throw new LlmError('File upload polling aborted', {\n kind: 'aborted',\n retryable: false,\n })\n }\n\n if (pollResp.state === 'ACTIVE') {\n return makeHandle(pollResp, fallback)\n }\n\n if (pollResp.state === 'FAILED') {\n throw new LlmError('File processing failed during polling', {\n kind: 'bad_request',\n retryable: false,\n })\n }\n // PROCESSING — continue loop\n }\n }\n\n /**\n * Delete a single uploaded file.\n * Errors are forwarded to `onDeleteError` and NOT rethrown.\n */\n async delete(handle: GoogleFileHandle): Promise<void> {\n try {\n const client = await this.getClient()\n await client.delete({ name: handle.name })\n } catch (err) {\n this.onDeleteError(handle.name, err)\n }\n }\n\n /**\n * Delete multiple files.\n * Each failure is individually forwarded to `onDeleteError`; none are thrown.\n */\n async deleteAll(handles: GoogleFileHandle[]): Promise<void> {\n await Promise.allSettled(handles.map((h) => this.delete(h)))\n }\n}\n","/**\n * GoogleCacheStore — thin wrapper over the Gemini Context Cache API.\n *\n * Manages create / get-or-create / refresh / delete lifecycle for cached\n * contents. In-memory cache entries are PROCESS-SCOPED; they are not shared\n * across processes, workers, or restarts.\n *\n * Injectable client and `now` function keep tests free of network and clock.\n *\n * @module\n */\n\nimport type { AuthMaterial, Logger } from '@gullabs/core'\nimport type { Content } from '@google/genai'\n\nimport { requireApiKey } from './client.js'\nimport { LlmError, classifyError, redactSecrets } from '@gullabs/core'\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * A handle to a cached content resource in the Gemini Context Cache API.\n *\n * Pass `cacheName` as `providerOptions.google.cachedContent` in LlmRequest.\n */\nexport interface GoogleCacheHandle {\n /** Resource name, e.g. \"cachedContents/xyz\". */\n cacheName: string\n /**\n * Local view of when the cache expires (server-authoritative; computed from\n * ttl or parsed from the server response `expireTime`).\n */\n expiresAt: Date\n /** Caches are model-bound; never use a handle with a different model. */\n model: string\n}\n\n/** Key used to look up or create an entry in the in-process cache map. */\nexport interface CacheKey {\n model: string\n /** Caller-chosen stable identifier, e.g. a hash of the cached content. */\n stableKey: string\n}\n\n/**\n * Minimal structural interface for the Gemini Caches client surface we use.\n * Satisfied by the real `ai.caches` object or a test fake.\n */\nexport interface GeminiCachesClientLike {\n create(params: {\n model: string\n config: {\n contents?: Content[]\n systemInstruction?: Content | string\n ttl?: string\n displayName?: string\n }\n }): Promise<{ name?: string; model?: string; expireTime?: string }>\n\n update(params: {\n name: string\n config: { ttl?: string; expireTime?: string }\n }): Promise<{ name?: string; expireTime?: string }>\n\n delete(params: { name: string }): Promise<unknown>\n}\n\nexport interface GoogleCacheStoreOptions {\n auth: AuthMaterial\n /** Injectable client for tests; skips SDK import when provided. */\n client?: GeminiCachesClientLike\n /**\n * When true, concurrent `getOrCreate` calls for the same key share one\n * in-flight create. Default false.\n */\n coalesce?: boolean\n /**\n * Subtracted from the local expiry so we stop using a cache slightly before\n * the server evicts it. Default 30 s.\n */\n expirySkewSeconds?: number\n /** Called on delete failures instead of rethrowing. */\n onDeleteError?: (cacheName: string, err: unknown) => void\n /** Optional structured logger. When provided, routes delete failures to logger.error. */\n logger?: Logger\n /** Injectable clock for deterministic tests. Default: `Date.now`. */\n now?: () => number\n /**\n * Opt-in pre-flight token-count gate applied before every cache create\n * (both `create()` directly and the `getOrCreate()` path it delegates to,\n * including the coalesced path — enforced once, inside `create()`, so\n * there is no separate \"in-flight\" gap to close).\n */\n preflight?: {\n /** Minimum token count required before a cache create is allowed to proceed. */\n minTokens: number\n /**\n * Counts tokens for the exact token-bearing payload of the impending\n * create — `model` + `contents` + `systemInstruction` only. `ttl` and\n * `displayName` are excluded: they carry no tokens and are irrelevant to\n * the pre-flight check.\n *\n * This callback receives genai-native `Content[]`/`Content|string` — it\n * does NOT receive the library's `Message[]` shape and there is no\n * automatic conversion between the two (explicit seam, by design). Hosts\n * using genai-native content directly can wire this to a raw\n * `client.models.countTokens` call; hosts building from the library's\n * `Message[]` should call `@gullabs/core`'s `client.countTokens` rather\n * than expecting this callback to convert for them.\n */\n countTokens: (payload: {\n model: string\n contents?: Content[]\n systemInstruction?: Content | string\n }) => Promise<number>\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_SKEW_SECONDS = 30\nconst DEFAULT_EXTENSION_SECONDS = 3600\n\nasync function buildCachesClient(auth: AuthMaterial): Promise<GeminiCachesClientLike> {\n const { GoogleGenAI } = await import('@google/genai')\n\n const ai = new GoogleGenAI({ apiKey: requireApiKey(auth) })\n\n return {\n async create(params) {\n const result = await (\n ai.caches.create as (p: unknown) => Promise<{\n name?: string\n model?: string\n expireTime?: string\n }>\n )(params)\n return result\n },\n\n async update(params) {\n const result = await (\n ai.caches.update as (p: unknown) => Promise<{\n name?: string\n expireTime?: string\n }>\n )(params)\n return result\n },\n\n async delete(params) {\n await (ai.caches.delete as (p: unknown) => Promise<unknown>)(params)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// GoogleCacheStore\n// ---------------------------------------------------------------------------\n\ninterface EntryRecord {\n handle: GoogleCacheHandle\n /** Original ttlSeconds used to create this entry; used as extension default. */\n ttlSeconds: number\n}\n\n/**\n * Process-scoped helper for the Gemini Context Cache API.\n *\n * NOTE: `getOrCreate` reuse is PROCESS-SCOPED only. Entries survive only for\n * the lifetime of this `GoogleCacheStore` instance. Across restarts, new\n * caches will be created (and old ones will be server-evicted after their TTL).\n *\n * **Auth snapshot note:** this store captures the `AuthMaterial` at construction\n * time and memoizes a single SDK client from it (`clientPromise`). This is\n * correct and sufficient for static API keys. If refreshable credentials\n * (short-lived OAuth/STS tokens) are added in the future, this memoization is\n * the seam that will need rework: the cached client would hold stale credentials\n * for the lifetime of a long-lived store instance. At that point, the store\n * will need to either rebuild the client on each operation or accept a\n * credential-resolver callback rather than a plain `AuthMaterial` value.\n * See ADR-020 in DECISIONS.md.\n */\nexport class GoogleCacheStore {\n private readonly auth: AuthMaterial\n private readonly clientOverride: GeminiCachesClientLike | undefined\n private readonly coalesce: boolean\n private readonly skewMs: number\n private readonly onDeleteError: (cacheName: string, err: unknown) => void\n private readonly logger: Logger | undefined\n private readonly now: () => number\n private readonly preflight: GoogleCacheStoreOptions['preflight']\n\n /** Memoised client promise — built at most once per store instance. */\n private clientPromise: Promise<GeminiCachesClientLike> | undefined\n\n /** In-process cache of live handles, keyed by `${model}:${stableKey}`. */\n private readonly entries: Map<string, EntryRecord> = new Map()\n\n /** In-flight create promises when coalescing is enabled. */\n private readonly inflight: Map<string, Promise<GoogleCacheHandle>> = new Map()\n\n constructor(opts: GoogleCacheStoreOptions) {\n this.auth = opts.auth\n this.clientOverride = opts.client\n this.coalesce = opts.coalesce ?? false\n this.skewMs = (opts.expirySkewSeconds ?? DEFAULT_SKEW_SECONDS) * 1000\n this.logger = opts.logger\n this.onDeleteError =\n opts.onDeleteError ??\n ((cacheName, err) => {\n if (this.logger !== undefined) {\n this.logger.error(\n { name: cacheName, error: redactSecrets(classifyError(err).message) },\n 'gemini.cache.delete.failed',\n )\n } else {\n console.error(\n `[GoogleCacheStore] delete failed for \"${cacheName}\":`,\n redactSecrets(classifyError(err).message),\n )\n }\n })\n this.now = opts.now ?? (() => Date.now())\n this.preflight = opts.preflight\n }\n\n private getClient(): Promise<GeminiCachesClientLike> {\n if (this.clientOverride !== undefined) return Promise.resolve(this.clientOverride)\n if (this.clientPromise === undefined) {\n this.clientPromise = buildCachesClient(this.auth)\n }\n return this.clientPromise\n }\n\n private isLive(handle: GoogleCacheHandle): boolean {\n return handle.expiresAt.getTime() - this.skewMs > this.now()\n }\n\n /**\n * Create a new cached content resource.\n *\n * The `expiresAt` on the returned handle is computed from the server's\n * `expireTime` when available, with a local-clock fallback of\n * `now + ttlSeconds * 1000`.\n */\n async create(input: {\n model: string\n ttlSeconds: number\n contents?: Content[]\n systemInstruction?: Content | string\n displayName?: string\n }): Promise<GoogleCacheHandle> {\n if (this.preflight !== undefined) {\n const counted = await this.preflight.countTokens({\n model: input.model,\n ...(input.contents !== undefined ? { contents: input.contents } : {}),\n ...(input.systemInstruction !== undefined\n ? { systemInstruction: input.systemInstruction }\n : {}),\n })\n if (counted < this.preflight.minTokens) {\n throw new LlmError(\n `GoogleCacheStore preflight: counted ${counted} token(s), below the configured ` +\n `minimum of ${this.preflight.minTokens} for model \"${input.model}\".`,\n { kind: 'bad_request', retryable: false },\n )\n }\n }\n\n const client = await this.getClient()\n\n const config: {\n ttl: string\n contents?: Content[]\n systemInstruction?: Content | string\n displayName?: string\n } = { ttl: `${input.ttlSeconds}s` }\n\n if (input.contents !== undefined) config.contents = input.contents\n if (input.systemInstruction !== undefined)\n config.systemInstruction = input.systemInstruction\n if (input.displayName !== undefined) config.displayName = input.displayName\n\n let resp: { name?: string; model?: string; expireTime?: string }\n try {\n resp = await client.create({ model: input.model, config })\n } catch (e) {\n throw classifyError(e)\n }\n\n if (resp.name === undefined || resp.name.length === 0) {\n // Provider fault, not caller fault: the SDK call succeeded but the\n // payload is malformed — classify as a server error. NOT retryable:\n // create() is side-effecting and not idempotent — the provider may have\n // already created the cached content even though the payload carries no\n // name, so there is no handle to clean up and an automatic retry could\n // orphan/duplicate provider-side resources.\n throw new LlmError('Cache create response missing required field: name', {\n kind: 'server',\n retryable: false,\n provider: 'google',\n })\n }\n\n const fallbackExpiry = new Date(this.now() + input.ttlSeconds * 1000)\n const expiresAt =\n resp.expireTime !== undefined && resp.expireTime.length > 0\n ? new Date(resp.expireTime)\n : fallbackExpiry\n\n return {\n cacheName: resp.name,\n model: resp.model ?? input.model,\n expiresAt,\n }\n }\n\n /**\n * Return a live cached-content handle, creating one if none exists or the\n * cached entry has expired (accounting for skew).\n *\n * Reuse is PROCESS-SCOPED only — this store instance's in-memory map.\n *\n * When `coalesce` is enabled, concurrent calls for the same key share one\n * in-flight create.\n */\n async getOrCreate(\n key: CacheKey,\n factory: () => Promise<{\n ttlSeconds: number\n contents?: Content[]\n systemInstruction?: Content | string\n }>,\n ): Promise<GoogleCacheHandle> {\n const mapKey = `${key.model}:${key.stableKey}`\n\n // Return existing live entry if available.\n const existing = this.entries.get(mapKey)\n if (existing !== undefined && this.isLive(existing.handle)) {\n return existing.handle\n }\n\n // If coalescing, piggyback on an in-flight create for this key.\n if (this.coalesce) {\n const inFlight = this.inflight.get(mapKey)\n if (inFlight !== undefined) {\n return inFlight\n }\n }\n\n const doCreate = async (): Promise<GoogleCacheHandle> => {\n const factoryResult = await factory()\n const handle = await this.create({\n model: key.model,\n ttlSeconds: factoryResult.ttlSeconds,\n ...(factoryResult.contents !== undefined\n ? { contents: factoryResult.contents }\n : {}),\n ...(factoryResult.systemInstruction !== undefined\n ? { systemInstruction: factoryResult.systemInstruction }\n : {}),\n })\n this.entries.set(mapKey, { handle, ttlSeconds: factoryResult.ttlSeconds })\n return handle\n }\n\n if (this.coalesce) {\n const promise = doCreate().finally(() => {\n this.inflight.delete(mapKey)\n })\n this.inflight.set(mapKey, promise)\n return promise\n }\n\n return doCreate()\n }\n\n /**\n * Extend the cache TTL if it will expire within `thresholdSeconds`.\n *\n * Fail-open: if the update call throws, the original handle is returned\n * unchanged. This method NEVER throws.\n *\n * @param handle - Handle to potentially refresh.\n * @param opts.thresholdSeconds - Extend if expiry is within this many seconds.\n * Default 300.\n * @param opts.extensionSeconds - New TTL to set. Default: original TTL from\n * entries map, or 3600 s when the handle was not created via `getOrCreate`.\n */\n async refreshIfExpiringSoon(\n handle: GoogleCacheHandle,\n opts?: { thresholdSeconds?: number; extensionSeconds?: number },\n ): Promise<GoogleCacheHandle> {\n const thresholdMs = (opts?.thresholdSeconds ?? 300) * 1000\n\n if (handle.expiresAt.getTime() - this.now() > thresholdMs) {\n // Not near expiry — return unchanged.\n return handle\n }\n\n // Find the original ttl from the entries map for this handle.\n let extensionSeconds = opts?.extensionSeconds\n if (extensionSeconds === undefined) {\n for (const entry of this.entries.values()) {\n if (entry.handle.cacheName === handle.cacheName) {\n extensionSeconds = entry.ttlSeconds\n break\n }\n }\n extensionSeconds = extensionSeconds ?? DEFAULT_EXTENSION_SECONDS\n }\n\n try {\n const client = await this.getClient()\n const resp = await client.update({\n name: handle.cacheName,\n config: { ttl: `${extensionSeconds}s` },\n })\n\n const fallbackExpiry = new Date(this.now() + extensionSeconds * 1000)\n const newExpiresAt =\n resp.expireTime !== undefined && resp.expireTime.length > 0\n ? new Date(resp.expireTime)\n : fallbackExpiry\n\n const newHandle: GoogleCacheHandle = {\n cacheName: handle.cacheName,\n model: handle.model,\n expiresAt: newExpiresAt,\n }\n\n // Update the entries map entry if this handle is tracked.\n for (const [k, entry] of this.entries.entries()) {\n if (entry.handle.cacheName === handle.cacheName) {\n this.entries.set(k, { handle: newHandle, ttlSeconds: extensionSeconds })\n break\n }\n }\n\n return newHandle\n } catch {\n // Fail-open: return original handle unchanged.\n return handle\n }\n }\n\n /**\n * Delete a cached content resource.\n *\n * Errors are forwarded to `onDeleteError` and NOT rethrown.\n * The handle is removed from the in-process entries map regardless.\n */\n async delete(handle: GoogleCacheHandle): Promise<void> {\n // Always remove from local map, even if delete fails.\n for (const [k, entry] of this.entries.entries()) {\n if (entry.handle.cacheName === handle.cacheName) {\n this.entries.delete(k)\n break\n }\n }\n\n try {\n const client = await this.getClient()\n await client.delete({ name: handle.cacheName })\n } catch (err) {\n this.onDeleteError(handle.cacheName, err)\n }\n }\n}\n","/**\n * normalizeGroundingCitations — shape Gemini's raw groundingMetadata.groundingChunks\n * into a clean, deduplicated citation list.\n *\n * This is a caller-owned, optional post-processing convenience helper — NOT\n * request validation. It NEVER throws: any missing/malformed input yields `[]`.\n *\n * @module\n */\n\nexport interface Citation {\n url: string\n sourceName: string\n}\n\n/**\n * Derive a human-readable source name for a hostname, stripping a leading\n * `www.` label (e.g. `www.example.com` → `example.com`).\n */\nfunction hostnameFrom(url: URL): string {\n return url.hostname.startsWith('www.') ? url.hostname.slice(4) : url.hostname\n}\n\n/**\n * Shape a single grounding chunk into a `Citation`, or `undefined` if the\n * chunk is malformed (missing/invalid `web.uri`, or a `web.uri` that isn't\n * a well-formed http(s) URL with a hostname).\n *\n * Real SDK shape (`@google/genai` `GroundingChunk.web`): `{ uri, title, domain }`,\n * which in practice is always an http(s) URL. This helper only ever produces\n * http(s) citations — any other scheme (`javascript:`, `mailto:`, `data:`,\n * `file:`, etc.) is treated as a malformed chunk and skipped, since callers\n * may render `Citation.url` as a clickable link.\n *\n * `title`, when present, is the human-readable page title and is preferred\n * over the hostname as `sourceName`; the hostname (parsed from `uri`) is the\n * robust fallback when `title` is absent.\n */\nfunction toCitation(chunk: unknown): Citation | undefined {\n if (chunk === null || typeof chunk !== 'object') return undefined\n\n const web = (chunk as Record<string, unknown>)['web']\n if (web === null || typeof web !== 'object') return undefined\n\n const uri = (web as Record<string, unknown>)['uri']\n if (typeof uri !== 'string' || uri.length === 0) return undefined\n\n let parsed: URL\n try {\n parsed = new URL(uri)\n } catch {\n return undefined\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return undefined\n if (parsed.hostname === '') return undefined\n\n const title = (web as Record<string, unknown>)['title']\n const sourceName =\n typeof title === 'string' && title.length > 0 ? title : hostnameFrom(parsed)\n\n return { url: uri, sourceName }\n}\n\n/**\n * Shape Gemini's raw `groundingMetadata.groundingChunks` into a clean,\n * deduplicated citation list (deduplicated by URL, first-seen order).\n *\n * Accepts `unknown` since `groundingMetadata` arrives as raw JSON on\n * `providerMetadata` (see `docs/grounded-structured.md`). Never throws —\n * any missing/malformed top-level shape returns `[]`; a malformed individual\n * chunk is skipped rather than failing the whole array.\n */\nexport function normalizeGroundingCitations(groundingMetadata: unknown): Citation[] {\n if (groundingMetadata === null || typeof groundingMetadata !== 'object') return []\n\n const chunks = (groundingMetadata as Record<string, unknown>)['groundingChunks']\n if (!Array.isArray(chunks)) return []\n\n const seen = new Set<string>()\n const citations: Citation[] = []\n\n for (const chunk of chunks) {\n const citation = toCitation(chunk)\n if (citation === undefined) continue\n if (seen.has(citation.url)) continue\n seen.add(citation.url)\n citations.push(citation)\n }\n\n return citations\n}\n","/**\n * geminiContentToMessages — migration utility: `@google/genai` `Content[]` →\n * any-llm's normalized `Message[]`.\n *\n * For consumers moving hand-authored `@google/genai` prompts onto this\n * library. Uses `@google/genai` TYPES ONLY (no runtime SDK dependency — the\n * package is a peer dep, imported here with `import type`).\n *\n * Reject-don't-map: every genai `Content`/`Part` shape this utility cannot\n * losslessly represent in any-llm's normalized types throws a typed\n * `LlmError('bad_request')` naming the offending field or kind. Nothing is\n * ever silently dropped — that silent-loss failure mode is exactly what this\n * utility exists to eliminate for migrating callers.\n *\n * Validation is an exhaustive own-key scan: the set of defined keys on each\n * `Part` must be EXACTLY one of the recognized combinations (`['text']`,\n * `['inlineData']`, `['inlineData', 'mediaResolution']`, `['fileData']`,\n * `['fileData', 'mediaResolution']`). Any other key — including unknown\n * future SDK fields — or any combination outside that set throws. Keys whose\n * value is `undefined` are treated as absent (genai types are all-optional;\n * only defined values count).\n *\n * @module\n */\n\nimport { LlmError } from '@gullabs/core'\nimport type { Message, Part } from '@gullabs/core'\nimport type { Content, Part as GenaiPart } from '@google/genai'\n\n/**\n * Input accepted by {@link geminiContentToMessages}.\n */\nexport interface GeminiContentToMessagesInput {\n /** Raw `@google/genai` conversation history to convert. */\n contents: Content[]\n /**\n * Raw `@google/genai` system instruction — either the SDK's shorthand\n * plain string, or a full `Content` (only text parts supported; any\n * non-text part throws).\n */\n systemInstruction?: Content | string\n}\n\n/**\n * Output produced by {@link geminiContentToMessages}.\n */\nexport interface GeminiContentToMessagesResult {\n /** Concatenated system text, present only when `systemInstruction` was given. */\n system?: string\n /** Normalized any-llm messages, one per input `Content`. */\n messages: Message[]\n}\n\nfunction badRequest(message: string): LlmError {\n return new LlmError(message, { kind: 'bad_request', retryable: false })\n}\n\n/**\n * Own keys of `obj` whose value is defined. genai types are all-optional;\n * a key explicitly set to `undefined` is treated as absent.\n */\nfunction definedKeys(obj: object): string[] {\n return Object.keys(obj).filter(\n (key) => (obj as Record<string, unknown>)[key] !== undefined,\n )\n}\n\n// ---------------------------------------------------------------------------\n// mediaResolution mapping (Gemini PartMediaResolutionLevel → our normalized hint)\n// ---------------------------------------------------------------------------\n\nfunction mapMediaResolutionLevel(\n level: string,\n location: string,\n): 'low' | 'medium' | 'high' {\n switch (level) {\n case 'MEDIA_RESOLUTION_LOW':\n return 'low'\n case 'MEDIA_RESOLUTION_MEDIUM':\n return 'medium'\n case 'MEDIA_RESOLUTION_HIGH':\n return 'high'\n default:\n throw badRequest(\n `${location}: unsupported Part.mediaResolution.level \"${level}\" — any-llm only ` +\n 'supports MEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH.',\n )\n }\n}\n\n/**\n * Convert a defined `Part.mediaResolution` object to the normalized hint.\n *\n * Exhaustive own-key scan: the only representable key is `level`, and it must\n * carry a usable value. An explicit-but-empty `mediaResolution` (empty object,\n * or `level: undefined`) is ambiguous — the caller wrote something any-llm\n * cannot interpret — so it throws rather than being silently ignored.\n */\nfunction convertMediaResolution(\n mediaResolution: NonNullable<GenaiPart['mediaResolution']>,\n location: string,\n): 'low' | 'medium' | 'high' {\n const extraKeys = definedKeys(mediaResolution).filter((key) => key !== 'level')\n if (extraKeys.length > 0) {\n throw badRequest(\n `${location}: Part.mediaResolution keys [${extraKeys.join(', ')}] are not ` +\n 'representable in any-llm — only mediaResolution.level is supported.',\n )\n }\n\n if (mediaResolution.level === undefined) {\n throw badRequest(\n `${location}: Part.mediaResolution is present but carries no level — an ` +\n 'explicit-but-empty mediaResolution is ambiguous; set level or omit the field.',\n )\n }\n\n return mapMediaResolutionLevel(mediaResolution.level, location)\n}\n\n// ---------------------------------------------------------------------------\n// Part mapping (exhaustive own-key scan, reject-don't-map)\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a single `@google/genai` `Part` to its any-llm equivalent.\n *\n * The defined-key set of the part must be exactly one of: `['text']`,\n * `['inlineData']`, `['inlineData', 'mediaResolution']`, `['fileData']`,\n * `['fileData', 'mediaResolution']`. Anything else — function calling,\n * executable code, tool results, thought-flagged parts, `thoughtSignature`,\n * `videoMetadata`, `partMetadata`, unknown future SDK fields, `text`\n * combined with any other key, or a part with zero recognized fields —\n * throws `LlmError('bad_request')` naming the offending key(s).\n */\nfunction convertPart(part: GenaiPart, location: string): Part {\n const keys = definedKeys(part)\n const baseKeys = keys.filter(\n (key) => key === 'text' || key === 'inlineData' || key === 'fileData',\n )\n\n if (baseKeys.length === 0) {\n if (keys.length === 0) {\n throw badRequest(\n `${location}: Part has no recognized fields set (expected exactly one of ` +\n 'text, inlineData, fileData).',\n )\n }\n throw badRequest(\n `${location}: Part keys [${keys.join(', ')}] are not supported by ` +\n 'geminiContentToMessages — only text, inlineData, and fileData parts can be ' +\n 'represented in any-llm.',\n )\n }\n\n if (baseKeys.length > 1) {\n throw badRequest(\n `${location}: Part has more than one of text/inlineData/fileData set ` +\n `([${baseKeys.join(', ')}]) — geminiContentToMessages requires exactly one.`,\n )\n }\n\n const base = baseKeys[0] as 'text' | 'inlineData' | 'fileData'\n const extraKeys = keys.filter(\n (key) => key !== base && !(base !== 'text' && key === 'mediaResolution'),\n )\n if (extraKeys.length > 0) {\n throw badRequest(\n `${location}: Part keys [${extraKeys.join(', ')}] cannot be represented in ` +\n `any-llm alongside ${base} — nothing is silently dropped.`,\n )\n }\n\n if (part.text !== undefined) {\n return { kind: 'text', text: part.text }\n }\n\n if (part.inlineData !== undefined) {\n const inlineData = part.inlineData\n const inlineExtraKeys = definedKeys(inlineData).filter(\n (key) => key !== 'mimeType' && key !== 'data',\n )\n if (inlineExtraKeys.length > 0) {\n throw badRequest(\n `${location}: Part.inlineData keys [${inlineExtraKeys.join(', ')}] are not ` +\n 'representable in any-llm.',\n )\n }\n if (inlineData.mimeType === undefined) {\n throw badRequest(`${location}: Part.inlineData.mimeType is required.`)\n }\n if (inlineData.data === undefined) {\n throw badRequest(`${location}: Part.inlineData.data is required.`)\n }\n return {\n kind: 'inline-media',\n mimeType: inlineData.mimeType,\n data: inlineData.data,\n ...(part.mediaResolution !== undefined\n ? { mediaResolution: convertMediaResolution(part.mediaResolution, location) }\n : {}),\n }\n }\n\n if (part.fileData !== undefined) {\n const fileData = part.fileData\n const fileExtraKeys = definedKeys(fileData).filter(\n (key) => key !== 'fileUri' && key !== 'mimeType',\n )\n if (fileExtraKeys.length > 0) {\n throw badRequest(\n `${location}: Part.fileData keys [${fileExtraKeys.join(', ')}] are not ` +\n 'representable in any-llm.',\n )\n }\n if (fileData.fileUri === undefined) {\n throw badRequest(`${location}: Part.fileData.fileUri is required.`)\n }\n if (fileData.mimeType === undefined) {\n throw badRequest(`${location}: Part.fileData.mimeType is required.`)\n }\n return {\n kind: 'file-uri',\n uri: fileData.fileUri,\n mimeType: fileData.mimeType,\n ...(part.mediaResolution !== undefined\n ? { mediaResolution: convertMediaResolution(part.mediaResolution, location) }\n : {}),\n }\n }\n\n // Unreachable: baseKeys.length === 1 guarantees one of the branches above.\n throw badRequest(`${location}: Part has no recognized fields set.`)\n}\n\n// ---------------------------------------------------------------------------\n// Role mapping (no inference)\n// ---------------------------------------------------------------------------\n\nfunction convertRole(role: string | undefined, location: string): 'user' | 'assistant' {\n if (role === 'user') return 'user'\n if (role === 'model') return 'assistant'\n throw badRequest(\n `${location}: Content.role \"${String(role)}\" is not supported — only \"user\" and ` +\n '\"model\" are recognized. any-llm never infers a missing role.',\n )\n}\n\n// ---------------------------------------------------------------------------\n// systemInstruction mapping (NEVER inferred from contents)\n// ---------------------------------------------------------------------------\n\n/**\n * Concatenate the text parts of a `systemInstruction`.\n *\n * A string is used as-is. For a `Content`, the envelope's defined-key set\n * must be exactly `['parts']` (or empty) — `role`, or any unknown future\n * Content field, throws naming the key(s). Every part's defined-key set must\n * be exactly `['text']` — any other key (media, tool shapes, thought flags,\n * `mediaResolution`, unknown future fields) throws naming the offending\n * key(s). A `Content` with zero parts yields `''` (the caller explicitly\n * supplied a system instruction; the derivation is just empty).\n */\nfunction convertSystemInstruction(systemInstruction: Content | string): string {\n if (typeof systemInstruction === 'string') {\n return systemInstruction\n }\n\n const envelopeExtraKeys = definedKeys(systemInstruction).filter(\n (key) => key !== 'parts',\n )\n if (envelopeExtraKeys.length > 0) {\n throw badRequest(\n `systemInstruction: Content keys [${envelopeExtraKeys.join(', ')}] are not ` +\n 'supported on a system instruction — only parts is allowed.',\n )\n }\n\n const parts = systemInstruction.parts ?? []\n const textFragments: string[] = []\n\n parts.forEach((part, index) => {\n const keys = definedKeys(part)\n if (keys.length !== 1 || keys[0] !== 'text' || part.text === undefined) {\n const offending = keys.filter((key) => key !== 'text')\n const named = offending.length > 0 ? offending : keys\n throw badRequest(\n `systemInstruction.parts[${index}]: only text parts are allowed in a system ` +\n `instruction — part keys [${named.length > 0 ? named.join(', ') : 'none'}] ` +\n 'are not supported.',\n )\n }\n textFragments.push(part.text)\n })\n\n return textFragments.join('')\n}\n\n// ---------------------------------------------------------------------------\n// geminiContentToMessages\n// ---------------------------------------------------------------------------\n\n/**\n * Convert `@google/genai` `Content[]` / `Part[]` into any-llm's normalized\n * `{ system?, messages }` shape.\n *\n * A migration utility for callers moving hand-authored `@google/genai`\n * prompts onto any-llm. Exhaustive and reject-don't-map: any genai shape\n * that cannot be losslessly represented in any-llm's normalized types\n * throws `LlmError('bad_request')` naming the offending kind/field instead\n * of silently dropping it.\n *\n * `system` is derived ONLY from the explicit `systemInstruction` input —\n * never inferred from `contents`.\n *\n * @example\n * ```ts\n * // Before: hand-rolled @google/genai prompt\n * const contents: Content[] = [\n * { role: 'user', parts: [{ text: 'Describe this image.' }, { inlineData: { mimeType: 'image/png', data } }] },\n * { role: 'model', parts: [{ text: 'A red bicycle leaning against a brick wall.' }] },\n * ]\n *\n * // After: migrate onto any-llm's normalized shape in one call\n * import { geminiContentToMessages } from '@gullabs/google'\n *\n * const { system, messages } = geminiContentToMessages({\n * contents,\n * systemInstruction: 'You are a concise visual describer.',\n * })\n *\n * const result = await client.generate({ provider: 'google', model: 'gemini-2.5-pro', system, messages }, { auth })\n * ```\n */\nexport function geminiContentToMessages(\n input: GeminiContentToMessagesInput,\n): GeminiContentToMessagesResult {\n const system =\n input.systemInstruction !== undefined\n ? convertSystemInstruction(input.systemInstruction)\n : undefined\n\n const messages: Message[] = input.contents.map((content, contentIndex) => {\n const location = `contents[${contentIndex}]`\n const envelopeExtraKeys = definedKeys(content).filter(\n (key) => key !== 'role' && key !== 'parts',\n )\n if (envelopeExtraKeys.length > 0) {\n throw badRequest(\n `${location}: Content keys [${envelopeExtraKeys.join(', ')}] are not ` +\n 'supported — only role and parts are allowed.',\n )\n }\n const role = convertRole(content.role, location)\n const parts = (content.parts ?? []).map((part, partIndex) =>\n convertPart(part, `${location}.parts[${partIndex}]`),\n )\n return { role, parts }\n })\n\n return { ...(system !== undefined ? { system } : {}), messages }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/reasoning-budget.ts","../src/flex-fallback.ts","../src/errors.ts","../src/adapter.ts","../src/pricing.ts","../src/cost.ts","../src/model-config/gemini-2.5-pro.ts","../src/model-config/gemini-2.5-flash.ts","../src/model-config/gemini-2.5-flash-lite.ts","../src/model-config/gemini-3.5-flash.ts","../src/model-config/gemini-3.1-flash-lite.ts","../src/model-config/gemini-3.1-pro-preview.ts","../src/model-config/gemini-3-flash-preview.ts","../src/model-config/gemma-4-31b-it.ts","../src/model-config/gemma-4-26b-a4b-it.ts","../src/models.ts","../src/provider.ts","../src/file-store.ts","../src/cache-store.ts","../src/grounding.ts","../src/content-to-messages.ts"],"names":["LlmError","z","classifyError","redactSecrets"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Structural GeminiClientLike interface + buildGoogleClient factory.\n *\n * This module defines the structural interface the adapter depends on.\n * The real @google/genai SDK is imported ONLY in buildGoogleClient so tests\n * can inject a fake without pulling in the real SDK.\n *\n * @module\n */\n\nimport { LlmError } from '@gullabs/core'\nimport type { AuthMaterial } from '@gullabs/core'\n\n// ---------------------------------------------------------------------------\n// Auth narrowing — Google only accepts ApiKeyAuth\n// ---------------------------------------------------------------------------\n\n/**\n * Narrows {@link AuthMaterial} to its `apiKey` string, rejecting the\n * dev-only `CliSessionAuth` variant.\n *\n * Google is a production API provider and only ever accepts API-key\n * credentials; `{ cliSession: true }` is reserved for the dev-only CLI\n * provider packages (`@gullabs/claude-cli`, `@gullabs/codex-cli`).\n */\nexport function requireApiKey(auth: AuthMaterial): string {\n if (\n !('apiKey' in auth) ||\n typeof auth.apiKey !== 'string' ||\n auth.apiKey.trim() === ''\n ) {\n throw new LlmError('@gullabs/google requires auth.apiKey', {\n kind: 'invalid_auth',\n retryable: false,\n provider: 'google',\n })\n }\n return auth.apiKey\n}\n\n// ---------------------------------------------------------------------------\n// Transport timeout defaults\n// ---------------------------------------------------------------------------\n\n/**\n * Default HTTP transport timeout for Gemini Flex service-tier calls (ms).\n *\n * The default per-attempt transport (httpOptions) timeout applied ONLY when a\n * flex call provides no explicit `timeoutMs`. Set to 25 minutes (1_500_000 ms)\n * to cover the ~20-minute flex workload ceiling with margin. The @google/genai\n * SDK defaults to 1 minute, which would terminate a long flex call prematurely.\n * Callers SHOULD still set `timeoutMs` for a precise per-attempt ceiling; this\n * value is only the backstop for callers that do not.\n */\nexport const FLEX_DEFAULT_TIMEOUT_MS = 1_500_000\n\n/**\n * Default HTTP transport timeout for Gemini standard-tier calls (ms).\n *\n * Used when a standard-tier request has no explicit `timeoutMs`. The adapter\n * also backs this with an AbortController so the limit is a real client-side\n * ceiling, not only an SDK transport hint.\n */\nexport const STANDARD_DEFAULT_TIMEOUT_MS = 300_000\n\n/**\n * Buffer added above `timeoutMs` when setting the SDK transport timeout.\n *\n * When `timeoutMs` is set, the engine arms an AbortSignal at exactly\n * `timeoutMs`. If the SDK transport timer fired at the same instant it\n * could preempt the signal and produce a raw SDK error instead of the\n * engine's clean `kind:'timeout'`. By setting the transport timeout to\n * `timeoutMs + TRANSPORT_TIMEOUT_BUFFER_MS` we ensure the engine's\n * AbortSignal always fires first.\n */\nexport const TRANSPORT_TIMEOUT_BUFFER_MS = 5_000\n\n// ---------------------------------------------------------------------------\n// Response shape — mirrors the @google/genai surface we actually consume\n// ---------------------------------------------------------------------------\n\n/** A single text/thought part in a Gemini candidate content. */\nexport interface GeminiPartShape {\n text?: string\n /**\n * Present and `true` on thought-summary parts.\n * Real field name in @google/genai Candidate.content.parts: `thought`.\n */\n thought?: boolean\n}\n\n/** A candidate returned by Gemini generateContent. */\nexport interface GeminiCandidateShape {\n content?: {\n parts?: GeminiPartShape[]\n }\n /**\n * Why the model stopped.\n * Real SDK enum (FinishReason): \"STOP\", \"MAX_TOKENS\", \"SAFETY\",\n * \"RECITATION\", \"BLOCKLIST\", \"PROHIBITED_CONTENT\", etc.\n */\n finishReason?: string\n /**\n * Grounding metadata returned when Google Search grounding is active.\n * Real SDK type: GroundingMetadata. Kept as `unknown` to avoid a hard\n * coupling to @google/genai types; cast to JsonValue at the adapter boundary.\n */\n groundingMetadata?: unknown\n}\n\n/**\n * Token usage metadata returned alongside a Gemini response.\n *\n * Real type: GenerateContentResponseUsageMetadata.\n * NOTE: thoughtsTokenCount is SEPARATE from candidatesTokenCount.\n * The adapter must add them to get GROSS outputTokens.\n */\nexport interface GeminiUsageMetadataShape {\n promptTokenCount?: number\n candidatesTokenCount?: number\n cachedContentTokenCount?: number\n thoughtsTokenCount?: number\n totalTokenCount?: number\n}\n\n/**\n * Structural equivalent of @google/genai's GenerateContentResponse.\n * Only the fields the adapter reads are represented here.\n */\nexport interface GeminiResponseShape {\n candidates?: GeminiCandidateShape[]\n usageMetadata?: GeminiUsageMetadataShape\n /** Real field: GenerateContentResponse.modelVersion */\n modelVersion?: string\n /** Real field: GenerateContentResponse.responseId */\n responseId?: string\n /**\n * Safety-block metadata.\n * Real type: GenerateContentResponsePromptFeedback.\n * Present when the prompt (not output) was blocked by safety filters.\n */\n promptFeedback?: {\n /** Real type: BlockedReason (string enum). e.g. \"SAFETY\", \"OTHER\". */\n blockReason?: string\n blockReasonMessage?: string\n safetyRatings?: unknown[]\n }\n}\n\n// ---------------------------------------------------------------------------\n// Request / config shape — what the adapter sends to generateContent\n// ---------------------------------------------------------------------------\n\n/**\n * Per-part media-resolution hint emitted on inline/file parts.\n * Real type: @google/genai `PartMediaResolution`; `level` values come from\n * the `PartMediaResolutionLevel` string enum (we only emit the LOW/MEDIUM/HIGH\n * subset our normalized `mediaResolution` maps to).\n */\nexport interface GeminiPartMediaResolution {\n level?: 'MEDIA_RESOLUTION_LOW' | 'MEDIA_RESOLUTION_MEDIUM' | 'MEDIA_RESOLUTION_HIGH'\n}\n\n/** A text part in a content object we construct. */\nexport interface GeminiTextContentPart {\n text: string\n}\n\n/**\n * An inline binary media part in a content object we construct.\n * `data` must be raw base64 — no `data:…;base64,` prefix.\n */\nexport interface GeminiInlineDataContentPart {\n inlineData: {\n /** IANA media type, e.g. `\"image/png\"`. */\n mimeType: string\n /** Raw base64-encoded bytes (no data-URL prefix). */\n data: string\n }\n /** Optional per-part media-resolution hint (real field: `Part.mediaResolution`). */\n mediaResolution?: GeminiPartMediaResolution\n}\n\n/**\n * A provider-hosted file reference part in a content object we construct.\n * The Gemini service dereferences `fileUri` server-side.\n */\nexport interface GeminiFileDataContentPart {\n fileData: {\n /** IANA media type of the referenced file. */\n mimeType: string\n /** Provider-assigned file URI, e.g. from the Gemini File API. */\n fileUri: string\n }\n /** Optional per-part media-resolution hint (real field: `Part.mediaResolution`). */\n mediaResolution?: GeminiPartMediaResolution\n}\n\n/**\n * Union of all part shapes the adapter may produce for `GeminiContent.parts`.\n * Each member (including the optional per-part `mediaResolution`) is a\n * structural subset of the real `@google/genai` `Part` type for the fields we use.\n */\nexport type GeminiContentPart =\n GeminiTextContentPart | GeminiInlineDataContentPart | GeminiFileDataContentPart\n\n/** A content object (message) we construct. */\nexport interface GeminiContent {\n role: string\n parts: GeminiContentPart[]\n}\n\n/**\n * Schema shape we pass as responseSchema.\n * Structurally compatible with @google/genai Schema.\n */\nexport interface GeminiSchema {\n type?: string\n description?: string\n properties?: Record<string, GeminiSchema>\n required?: string[]\n items?: GeminiSchema\n enum?: string[]\n nullable?: boolean\n format?: string\n}\n\n/**\n * Thinking configuration.\n * Real type: ThinkingConfig in @google/genai.\n * - thinkingBudget: 0 = DISABLED, -1 = AUTOMATIC\n * - thinkingLevel: ThinkingLevel enum (\"LOW\", \"MEDIUM\", \"HIGH\", \"MINIMAL\")\n */\nexport interface GeminiThinkingConfig {\n includeThoughts?: boolean\n thinkingBudget?: number\n /**\n * Real type: ThinkingLevel enum.\n * Values: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"MINIMAL\" | \"THINKING_LEVEL_UNSPECIFIED\"\n */\n thinkingLevel?: string\n}\n\n/**\n * Config object passed in GenerateContentParameters.config.\n * Real type: GenerateContentConfig.\n * abortSignal is inside config, NOT in the top-level params.\n */\nexport interface GeminiGenerateConfig {\n systemInstruction?: { parts: GeminiContentPart[] }\n temperature?: number\n topP?: number\n topK?: number\n maxOutputTokens?: number\n stopSequences?: string[]\n responseMimeType?: string\n responseSchema?: GeminiSchema\n thinkingConfig?: GeminiThinkingConfig\n /** Real type: ServiceTier enum. Values: \"flex\" | \"standard\". */\n serviceTier?: string\n /** Real field: GenerateContentConfig.abortSignal (NOT in top-level params). */\n abortSignal?: AbortSignal\n /**\n * Per-request HTTP options forwarded to the @google/genai transport.\n * We use this to set a transport-level timeout that is >= the AbortSignal\n * deadline so the SDK fetch does not preempt the abort.\n *\n * Real field: GenerateContentConfig.httpOptions.timeout (milliseconds).\n * Real field: GenerateContentConfig.httpOptions.headers (Record<string,string>).\n * (No current use of custom headers here: Vertex AI auth — and the\n * Vertex flex-routing header injection this field once supported — was\n * removed from this library; see ADR-019 in DECISIONS.md. Only\n * API-key auth is supported below.)\n */\n httpOptions?: { timeout?: number; headers?: Record<string, string> }\n}\n\n/**\n * Parameters for models.generateContent.\n * Real type: GenerateContentParameters.\n */\nexport interface GeminiGenerateParams {\n model: string\n contents: GeminiContent[]\n config?: GeminiGenerateConfig\n}\n\n/**\n * Parameters for models.countTokens.\n * Real type: CountTokensParameters.\n */\nexport interface GeminiCountTokensParams {\n model: string\n contents: GeminiContent[]\n config?: {\n systemInstruction?: { parts: GeminiContentPart[] }\n /**\n * Real field: CountTokensConfig.abortSignal. countTokens has no\n * tier-timeout dance (no flex/standard default ceilings) — `ctx.signal`\n * is forwarded here directly, unlike `run()`'s combined timer signal.\n */\n abortSignal?: AbortSignal\n }\n}\n\n/**\n * Response shape for models.countTokens.\n * Real type: CountTokensResponse.\n */\nexport interface GeminiCountTokensResponseShape {\n totalTokens?: number\n cachedContentTokenCount?: number\n}\n\n// ---------------------------------------------------------------------------\n// GeminiClientLike — structural interface (no @google/genai dependency)\n// ---------------------------------------------------------------------------\n\n/**\n * Structural interface for the @google/genai client surface the adapter uses.\n *\n * Satisfied by:\n * - The real GoogleGenAI client (via buildGoogleClient wrapper).\n * - FakeGeminiClient from @gullabs/testing (its generateContent/countTokens\n * accept unknown).\n */\nexport interface GeminiClientLike {\n models: {\n generateContent(params: GeminiGenerateParams): Promise<GeminiResponseShape>\n countTokens(params: GeminiCountTokensParams): Promise<GeminiCountTokensResponseShape>\n }\n}\n\n// ---------------------------------------------------------------------------\n// buildGoogleClient — imports the real @google/genai SDK\n// ---------------------------------------------------------------------------\n\n/**\n * Build a real @google/genai client from AuthMaterial.\n *\n * Returns a GeminiClientLike wrapper around the real GoogleGenAI client.\n * Only API-key authentication is supported; Vertex AI is not.\n *\n * @param auth - API key credentials ({ apiKey }).\n */\nexport async function buildGoogleClient(auth: AuthMaterial): Promise<GeminiClientLike> {\n // Import the real SDK — only called at runtime when no client is injected.\n // The cast is safe: GeminiGenerateParams is a structural subset of\n // GenerateContentParameters; GeminiResponseShape is a subset of\n // GenerateContentResponse.\n const { GoogleGenAI } = await import('@google/genai')\n\n const ai = new GoogleGenAI({ apiKey: requireApiKey(auth) })\n\n return {\n models: {\n async generateContent(params: GeminiGenerateParams): Promise<GeminiResponseShape> {\n // Cast needed: our structural types are subsets of the real SDK types.\n const result = await (\n ai.models.generateContent as (params: unknown) => Promise<GeminiResponseShape>\n )(params)\n return result\n },\n async countTokens(\n params: GeminiCountTokensParams,\n ): Promise<GeminiCountTokensResponseShape> {\n // Cast needed: our structural types are subsets of the real SDK types.\n const result = await (\n ai.models.countTokens as (\n params: unknown,\n ) => Promise<GeminiCountTokensResponseShape>\n )(params)\n return result\n },\n },\n }\n}\n","import type { ReasoningEffort } from '@gullabs/core'\n\nexport const GOOGLE_REASONING_EFFORT_BUDGET: Record<ReasoningEffort, number> = {\n none: 0,\n low: 1024,\n medium: 8192,\n high: 24576,\n}\n","import type { LlmError } from '@gullabs/core'\n\nconst CAPACITY_PATTERNS = [\n /capacity/i,\n /overload/i,\n /overloaded/i,\n /unavailable/i,\n /no\\s+capacity/i,\n /temporar(?:y|ily)/i,\n /try\\s+again/i,\n]\n\nconst QUOTA_PATTERNS = [\n /quota/i,\n /billing/i,\n /billable/i,\n /payment/i,\n /rate\\s+limit/i,\n /exceeded/i,\n /insufficient/i,\n]\n\nexport function isGeminiCapacityError(err: LlmError): boolean {\n if (err.kind === 'server') return err.httpStatus === 503\n if (err.kind !== 'rate_limited') return false\n\n const message = err.message\n if (QUOTA_PATTERNS.some((pattern) => pattern.test(message))) {\n return false\n }\n return CAPACITY_PATTERNS.some((pattern) => pattern.test(message))\n}\n","/**\n * classifyGoogleError — reclassify a raw thrown value into a typed\n * {@link LlmError} for @gullabs/google.\n *\n * Thin wrapper around `@gullabs/core`'s `classifyError`: applies the shared\n * HTTP-status/timeout/abort classification, tags `provider: 'google'`, and\n * widens the retryable bucket to cover connection-level transport failures\n * that never produced an HTTP response for `classifyError` to route by\n * status.\n *\n * `@google/genai`'s underlying `fetch` (undici, in Node) throws a plain\n * `TypeError: fetch failed` for DNS failures, connection refusals, and\n * severed sockets — wrapping the underlying errno error as `.cause`.\n * `classifyError` has no HTTP status to classify these by, so they\n * previously fell through to `kind: 'unknown', retryable: false`, which\n * Temporal treats as non-retryable and uses to kill the audit run outright\n * instead of retrying a transient network blip (live-observed 2026-07-10,\n * redline e2e runs f6eca8f9 / 51f64c2f).\n *\n * These are reclassified `kind: 'server', retryable: true` — the same\n * \"provider fault, not caller fault, safe to retry\" bucket already used\n * elsewhere in this adapter for provider-side failures with no HTTP status\n * (see the malformed-`countTokens`-response case in `adapter.ts`).\n *\n * @module\n */\n\nimport { LlmError, classifyError } from '@gullabs/core'\n\n/**\n * Message/errno signatures of a transport-level failure: the request never\n * reached Google's servers (or the connection was severed mid-flight), so\n * there is no HTTP response for `classifyHttpStatus` to route by status.\n * Covers undici's own default message (`\"fetch failed\"`) plus the\n * Node/undici errno codes that surface when the underlying socket fails\n * before a response arrives.\n */\nconst GOOGLE_TRANSPORT_ERROR_PATTERN =\n /fetch failed|connection error|econnreset|econnrefused|etimedout|eai_again|epipe|socket hang up/i\n\n/** True iff `err.message` or `err.code` matches a known transport-failure signature. */\nfunction matchesGoogleTransportSignature(err: unknown): boolean {\n if (!(err instanceof Error)) return false\n if (GOOGLE_TRANSPORT_ERROR_PATTERN.test(err.message)) return true\n const code = (err as { code?: unknown }).code\n return typeof code === 'string' && GOOGLE_TRANSPORT_ERROR_PATTERN.test(code)\n}\n\n/**\n * True iff `rawErr` is (or wraps) a transport-level connection failure.\n *\n * Detection order:\n * 1. `rawErr.message` / `rawErr.code` matches a known transport-failure\n * signature.\n * 2. A wrapped `rawErr.cause` matches the same — undici's `fetch failed`\n * `TypeError` attaches the underlying socket/DNS errno error as\n * `.cause`.\n */\nfunction isGoogleTransportError(rawErr: unknown): boolean {\n if (matchesGoogleTransportSignature(rawErr)) return true\n if (rawErr instanceof Error) {\n const cause = (rawErr as { cause?: unknown }).cause\n if (matchesGoogleTransportSignature(cause)) return true\n }\n return false\n}\n\n/** Optional extra fields threaded onto the returned {@link LlmError}. */\nexport interface ClassifyGoogleErrorExtra {\n /** Service tier actually attempted by the provider when known. */\n servedServiceTier?: string\n}\n\n/**\n * Classify a raw error thrown from a `@google/genai` client call into a\n * typed {@link LlmError} always tagged `provider: 'google'`.\n *\n * Delegates to `@gullabs/core`'s `classifyError` for HTTP-status/timeout/\n * abort classification (an already-classified `LlmError` passes through\n * `classifyError` unchanged, per its own contract), then rebuilds the\n * result with `provider: 'google'` forced on — every error surfaced by this\n * adapter is tagged, even one injected pre-classified (e.g. by a test\n * double) without a provider of its own. It also reclassifies the\n * `kind: 'unknown'` fallback as `kind: 'server', retryable: true` when the\n * raw error matches a known transport-failure signature (see\n * {@link isGoogleTransportError}). A connection that never reached Google is\n * not the caller's fault and is safe to retry; it must never be surfaced as\n * the non-retryable `unknown` kind.\n */\nexport function classifyGoogleError(\n rawErr: unknown,\n extra?: ClassifyGoogleErrorExtra,\n): LlmError {\n const base = classifyError(rawErr)\n const reclassifyAsTransport = base.kind === 'unknown' && isGoogleTransportError(rawErr)\n\n return new LlmError(base.message, {\n kind: reclassifyAsTransport ? 'server' : base.kind,\n retryable: reclassifyAsTransport ? true : base.retryable,\n ...(base.httpStatus !== undefined ? { httpStatus: base.httpStatus } : {}),\n ...(base.retryAfterMs !== undefined ? { retryAfterMs: base.retryAfterMs } : {}),\n provider: 'google',\n cause: base.cause ?? rawErr,\n ...(extra?.servedServiceTier !== undefined\n ? { servedServiceTier: extra.servedServiceTier }\n : {}),\n })\n}\n","/**\n * geminiAdapter — @gullabs/google Gemini provider adapter.\n *\n * Pure request⇄response mapping over @google/genai (via GeminiClientLike).\n * Never persists, never computes cost, never loops.\n *\n * @module\n */\n\nimport { LlmError, assertNever } from '@gullabs/core'\nimport type {\n ProviderAdapter,\n ResolvedRequest,\n AdapterCtx,\n AdapterResult,\n Usage,\n Warning,\n FinishReason,\n JsonValue,\n AuthMaterial,\n Part,\n Message,\n TokenCountRequest,\n TokenCount,\n} from '@gullabs/core'\nimport {\n buildGoogleClient,\n FLEX_DEFAULT_TIMEOUT_MS,\n STANDARD_DEFAULT_TIMEOUT_MS,\n TRANSPORT_TIMEOUT_BUFFER_MS,\n} from './client.js'\nimport { GOOGLE_REASONING_EFFORT_BUDGET } from './reasoning-budget.js'\nimport type {\n GeminiClientLike,\n GeminiGenerateConfig,\n GeminiContent,\n GeminiContentPart,\n GeminiResponseShape,\n GeminiUsageMetadataShape,\n GeminiCountTokensParams,\n} from './client.js'\nimport { isGeminiCapacityError } from './flex-fallback.js'\nimport { classifyGoogleError } from './errors.js'\n\ntype GeminiGoogleSearchTool = { googleSearch: Record<string, never> }\n\ntype GeminiAllowedTool = GeminiGoogleSearchTool\n\ntype GeminiSafetySetting = {\n category: string\n threshold: string\n}\n\ntype GeminiDispatchConfig = GeminiGenerateConfig & {\n cachedContent?: string\n httpOptions?: { timeout?: number }\n safetySettings?: GeminiSafetySetting[]\n tools?: GeminiAllowedTool[]\n}\n\nconst ALLOWED_GOOGLE_PROVIDER_OPTION_KEYS = new Set([\n 'cachedContent',\n 'flexFallback',\n 'httpOptions',\n 'safetySettings',\n 'tools',\n])\n\nconst ALLOWED_GOOGLE_HTTP_OPTION_KEYS = new Set(['timeout'])\n\nconst RESERVED_GOOGLE_PROVIDER_OPTION_KEYS = new Set([\n 'abortSignal',\n 'imageConfig',\n 'maxOutputTokens',\n 'mediaResolution',\n 'responseFormat',\n 'responseMimeType',\n 'responseModalities',\n 'responseSchema',\n 'responseJsonSchema',\n 'serviceTier',\n 'speechConfig',\n 'stopSequences',\n 'temperature',\n 'thinkingConfig',\n 'topK',\n 'topP',\n '_responseJsonSchema',\n])\n\nconst GOOGLE_SEARCH_SUPPORTED_MODELS = new Set([\n 'gemini-2.5-flash',\n 'gemini-2.5-flash-lite',\n 'gemini-2.5-pro',\n 'gemini-3-flash-preview',\n 'gemini-3.1-flash-lite',\n 'gemini-3.1-pro-preview',\n 'gemini-3.5-flash',\n])\n\nconst STRUCTURED_OUTPUT_GOOGLE_SEARCH_ALLOWLIST = new Set([\n 'gemini-3.1-pro-preview',\n 'gemini-3.5-flash',\n])\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isEmptyPlainObject(value: unknown): value is Record<string, never> {\n return isPlainRecord(value) && Object.keys(value).length === 0\n}\n\nfunction badGoogleProviderOptions(message: string): LlmError {\n return new LlmError(message, { kind: 'bad_request', retryable: false })\n}\n\nfunction parseGoogleTool(tool: unknown, model: string): GeminiAllowedTool {\n if (!isPlainRecord(tool)) {\n throw badGoogleProviderOptions(\n `providerOptions.google.tools entries must be objects for model \"${model}\".`,\n )\n }\n\n const keys = Object.keys(tool)\n if (keys.length !== 1) {\n throw badGoogleProviderOptions(\n `providerOptions.google.tools entries must have exactly one supported tool key for model \"${model}\".`,\n )\n }\n\n const key = keys[0]\n switch (key) {\n case 'googleSearch': {\n if (!isEmptyPlainObject(tool['googleSearch'])) {\n throw badGoogleProviderOptions(\n `providerOptions.google.tools[].googleSearch must be an empty object for model \"${model}\".`,\n )\n }\n return { googleSearch: {} }\n }\n\n default:\n throw badGoogleProviderOptions(\n `providerOptions.google.tools[].${key} is not supported for model \"${model}\".`,\n )\n }\n}\n\nfunction parseGoogleSafetySetting(\n setting: unknown,\n index: number,\n model: string,\n): GeminiSafetySetting {\n if (!isPlainRecord(setting)) {\n throw badGoogleProviderOptions(\n `providerOptions.google.safetySettings[${index}] must be an object for model \"${model}\".`,\n )\n }\n\n const keys = Object.keys(setting)\n const unknownKeys = keys.filter((key) => key !== 'category' && key !== 'threshold')\n if (unknownKeys.length > 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google.safetySettings[${index}] contains unsupported keys [${unknownKeys.join(\n ', ',\n )}] for model \"${model}\". Allowed keys: category, threshold.`,\n )\n }\n\n if (typeof setting['category'] !== 'string' || setting['category'].length === 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google.safetySettings[${index}].category must be a non-empty string for model \"${model}\".`,\n )\n }\n\n if (typeof setting['threshold'] !== 'string' || setting['threshold'].length === 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google.safetySettings[${index}].threshold must be a non-empty string for model \"${model}\".`,\n )\n }\n\n return {\n category: setting['category'],\n threshold: setting['threshold'],\n }\n}\n\nfunction mapGoogleProviderOptions(\n googleOpts: unknown,\n model: string,\n structuredOutputRequested: boolean,\n descriptorGrounding: boolean | undefined,\n): Partial<GeminiDispatchConfig> & { flexFallback?: boolean } {\n if (googleOpts === undefined) {\n return {}\n }\n\n if (!isPlainRecord(googleOpts)) {\n throw badGoogleProviderOptions(\n `providerOptions.google must be an object for model \"${model}\".`,\n )\n }\n\n const reservedKeys = Object.keys(googleOpts).filter((key) =>\n RESERVED_GOOGLE_PROVIDER_OPTION_KEYS.has(key),\n )\n if (reservedKeys.length > 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google reserves keys [${reservedKeys.join(\n ', ',\n )}] for typed model config on \"${model}\".`,\n )\n }\n\n const unknownKeys = Object.keys(googleOpts).filter(\n (key) =>\n !ALLOWED_GOOGLE_PROVIDER_OPTION_KEYS.has(key) &&\n !RESERVED_GOOGLE_PROVIDER_OPTION_KEYS.has(key),\n )\n if (unknownKeys.length > 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google contains unsupported keys [${unknownKeys.join(\n ', ',\n )}] for model \"${model}\". Allowed keys: cachedContent, flexFallback, httpOptions, safetySettings, tools.`,\n )\n }\n\n const mapped: Partial<GeminiDispatchConfig> & { flexFallback?: boolean } = {}\n\n if (googleOpts['cachedContent'] !== undefined) {\n if (\n typeof googleOpts['cachedContent'] !== 'string' ||\n googleOpts['cachedContent'].length === 0\n ) {\n throw badGoogleProviderOptions(\n `providerOptions.google.cachedContent must be a non-empty string for model \"${model}\".`,\n )\n }\n mapped.cachedContent = googleOpts['cachedContent']\n }\n\n if (googleOpts['flexFallback'] !== undefined) {\n if (typeof googleOpts['flexFallback'] !== 'boolean') {\n throw badGoogleProviderOptions(\n `providerOptions.google.flexFallback must be a boolean for model \"${model}\".`,\n )\n }\n mapped.flexFallback = googleOpts['flexFallback']\n }\n\n if (googleOpts['httpOptions'] !== undefined) {\n if (!isPlainRecord(googleOpts['httpOptions'])) {\n throw badGoogleProviderOptions(\n `providerOptions.google.httpOptions must be an object for model \"${model}\".`,\n )\n }\n\n const unknownHttpOptionKeys = Object.keys(googleOpts['httpOptions']).filter(\n (key) => !ALLOWED_GOOGLE_HTTP_OPTION_KEYS.has(key),\n )\n if (unknownHttpOptionKeys.length > 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google.httpOptions contains unsupported keys [${unknownHttpOptionKeys.join(\n ', ',\n )}] for model \"${model}\". Allowed keys: timeout.`,\n )\n }\n\n const timeout = googleOpts['httpOptions']['timeout']\n if (timeout !== undefined) {\n if (typeof timeout !== 'number' || !Number.isInteger(timeout) || timeout <= 0) {\n throw badGoogleProviderOptions(\n `providerOptions.google.httpOptions.timeout must be a positive integer for model \"${model}\".`,\n )\n }\n mapped.httpOptions = { timeout }\n } else {\n mapped.httpOptions = {}\n }\n }\n\n if (googleOpts['safetySettings'] !== undefined) {\n if (!Array.isArray(googleOpts['safetySettings'])) {\n throw badGoogleProviderOptions(\n `providerOptions.google.safetySettings must be an array for model \"${model}\".`,\n )\n }\n\n mapped.safetySettings = googleOpts['safetySettings'].map((setting, index) =>\n parseGoogleSafetySetting(setting, index, model),\n )\n }\n\n if (googleOpts['tools'] !== undefined) {\n if (!Array.isArray(googleOpts['tools'])) {\n throw badGoogleProviderOptions(\n `providerOptions.google.tools must be an array for model \"${model}\".`,\n )\n }\n\n const tools = googleOpts['tools'].map((tool) => parseGoogleTool(tool, model))\n const groundingSupported =\n descriptorGrounding === true ||\n (descriptorGrounding === undefined && GOOGLE_SEARCH_SUPPORTED_MODELS.has(model))\n\n if (!groundingSupported) {\n throw badGoogleProviderOptions(\n `providerOptions.google.tools is not supported for model \"${model}\".`,\n )\n }\n\n if (\n structuredOutputRequested &&\n !STRUCTURED_OUTPUT_GOOGLE_SEARCH_ALLOWLIST.has(model)\n ) {\n throw badGoogleProviderOptions(\n `Structured output with googleSearch is supported only for models \"gemini-3.1-pro-preview\" and \"gemini-3.5-flash\"; got \"${model}\".`,\n )\n }\n\n mapped.tools = tools\n }\n\n return mapped\n}\n\nfunction assertSamplingAllowed(\n config: GeminiDispatchConfig,\n model: string,\n sampling: string | undefined,\n): void {\n if (sampling !== 'fixed') {\n return\n }\n\n const offendingSampling: string[] = []\n if ('temperature' in config) {\n offendingSampling.push('temperature')\n }\n if ('topP' in config) {\n offendingSampling.push('topP')\n }\n if ('topK' in config) {\n offendingSampling.push('topK')\n }\n\n if (offendingSampling.length > 0) {\n throw new LlmError(\n `Sampling parameters [${offendingSampling.join(', ')}] are not supported for model \"${model}\" (fixed sampling).`,\n { kind: 'bad_request', retryable: false },\n )\n }\n}\n\n// ---------------------------------------------------------------------------\n// Exported types for consumers that inject a custom client\n// ---------------------------------------------------------------------------\nexport type { GeminiClientLike }\n\n// ---------------------------------------------------------------------------\n// FinishReason mapping (Gemini SDK enum → our FinishReason)\n// ---------------------------------------------------------------------------\n\nfunction mapFinishReason(raw: string | undefined): FinishReason | undefined {\n if (raw === undefined) return undefined\n switch (raw) {\n case 'STOP':\n return 'stop'\n case 'MAX_TOKENS':\n return 'length'\n case 'SAFETY':\n case 'RECITATION':\n case 'BLOCKLIST':\n case 'PROHIBITED_CONTENT':\n case 'IMAGE_SAFETY':\n return 'content_filter'\n default:\n return 'other'\n }\n}\n\n// ---------------------------------------------------------------------------\n// mediaResolution mapping (normalized hint → Gemini PartMediaResolutionLevel)\n// ---------------------------------------------------------------------------\n\n/**\n * Map our normalized cross-provider `mediaResolution` hint to the Gemini\n * `PartMediaResolutionLevel` string-enum value emitted on `Part.mediaResolution`.\n */\nfunction mapMediaResolution(\n res: 'low' | 'medium' | 'high',\n): 'MEDIA_RESOLUTION_LOW' | 'MEDIA_RESOLUTION_MEDIUM' | 'MEDIA_RESOLUTION_HIGH' {\n switch (res) {\n case 'low':\n return 'MEDIA_RESOLUTION_LOW'\n case 'medium':\n return 'MEDIA_RESOLUTION_MEDIUM'\n case 'high':\n return 'MEDIA_RESOLUTION_HIGH'\n default:\n return assertNever(res)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Usage mapping — #1 correctness rule\n// ---------------------------------------------------------------------------\n\n/**\n * Map Gemini usageMetadata to our Usage type.\n *\n * **GROSS convention enforced here:**\n * - outputTokens = candidatesTokenCount + (thoughtsTokenCount ?? 0)\n * → thinkingTokens ⊆ outputTokens so cost math doesn't double-count.\n * - inputTokens = promptTokenCount (cachedContentTokenCount is already a\n * subset of promptTokenCount → cachedInputTokens = cachedContentTokenCount).\n */\nfunction mapUsage(meta: GeminiUsageMetadataShape | undefined): Usage {\n const promptTokenCount = meta?.promptTokenCount ?? 0\n const candidatesTokenCount = meta?.candidatesTokenCount ?? 0\n const cachedContentTokenCount = meta?.cachedContentTokenCount\n const thoughtsTokenCount = meta?.thoughtsTokenCount\n\n // #1 RULE: outputTokens = candidates + thoughts (GROSS; thinking ⊆ output)\n const outputTokens = candidatesTokenCount + (thoughtsTokenCount ?? 0)\n const inputTokens = promptTokenCount\n const totalTokens = meta?.totalTokenCount\n\n // Canonical details keys: input, cached, output.\n const details: Record<string, number> = {\n input: inputTokens,\n output: outputTokens,\n ...(cachedContentTokenCount !== undefined ? { cached: cachedContentTokenCount } : {}),\n ...(thoughtsTokenCount !== undefined ? { thinking: thoughtsTokenCount } : {}),\n }\n\n // Raw: the full usageMetadata object verbatim (as JsonValue).\n const raw: JsonValue =\n meta !== undefined ? (meta as unknown as { [k: string]: JsonValue }) : null\n\n const usage: Usage = {\n inputTokens,\n outputTokens,\n details,\n raw,\n ...(cachedContentTokenCount !== undefined\n ? { cachedInputTokens: cachedContentTokenCount }\n : {}),\n ...(thoughtsTokenCount !== undefined ? { thinkingTokens: thoughtsTokenCount } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {}),\n }\n\n return usage\n}\n\n// ---------------------------------------------------------------------------\n// Message → Gemini contents mapping (shared by run() and countTokens())\n// ---------------------------------------------------------------------------\n\n/**\n * Map a single {@link Part} to its Gemini SDK equivalent.\n *\n * - `text` → `{ text }`\n * - `inline-media` → `{ inlineData: { mimeType, data } }` + optional `mediaResolution`\n * - `file-uri` → `{ fileData: { mimeType, fileUri } }` + optional `mediaResolution`\n * - `file-ref` → rejected (`bad_request`) — Gemini Files uses URIs, not bare ids\n *\n * `mediaResolution` IS supported as a per-part field by the Gemini SDK\n * (`Part.mediaResolution`). The normalised value is mapped to the\n * `PartMediaResolutionLevel` string enum before emission.\n */\nfunction mapPart(p: Part): GeminiContentPart {\n switch (p.kind) {\n case 'text':\n return { text: p.text }\n\n case 'inline-media': {\n return {\n inlineData: {\n mimeType: p.mimeType,\n data: p.data,\n },\n ...(p.mediaResolution !== undefined\n ? { mediaResolution: { level: mapMediaResolution(p.mediaResolution) } }\n : {}),\n }\n }\n\n case 'file-uri': {\n return {\n fileData: {\n mimeType: p.mimeType,\n fileUri: p.uri,\n },\n ...(p.mediaResolution !== undefined\n ? { mediaResolution: { level: mapMediaResolution(p.mediaResolution) } }\n : {}),\n }\n }\n\n case 'file-ref':\n throw new LlmError(\n 'Google Gemini expects FileUriPart with a Files API uri; got file-ref (provider file id). Upload via GoogleFileStore and pass the returned uri.',\n { kind: 'bad_request', retryable: false, provider: 'google' },\n )\n\n default:\n return assertNever(p)\n }\n}\n\n/**\n * Map engine {@link Message}s to Gemini SDK `contents`.\n *\n * Shared by `run()` (generation) and `countTokens()` (token counting) so both\n * code paths map messages identically — a divergence here would make token\n * counts unrepresentative of the actual generation call.\n */\nexport function mapMessagesToGeminiContents(messages: Message[]): GeminiContent[] {\n return messages.map((msg) => ({\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: msg.parts.map(mapPart),\n }))\n}\n\n// ---------------------------------------------------------------------------\n// Adapter options\n// ---------------------------------------------------------------------------\n\nexport interface GeminiAdapterOptions {\n /**\n * Inject a pre-built client (real or fake).\n * When omitted, `buildGoogleClient` is called with `ctx.auth` at call time,\n * inside the classified try/catch so any construction failure is wrapped\n * as a typed `LlmError`.\n */\n client?: GeminiClientLike\n /**\n * @internal Testing-only.\n *\n * Override the default `buildGoogleClient` factory. Allows unit tests to\n * simulate construction failures (e.g. bad credentials) without importing\n * the real `@google/genai` SDK. Never set this in production code.\n */\n _clientFactory?: (auth: AuthMaterial) => GeminiClientLike | Promise<GeminiClientLike>\n}\n\n// ---------------------------------------------------------------------------\n// geminiAdapter factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Gemini provider adapter.\n *\n * @param opts.client - Optional pre-built client (e.g. for testing).\n */\nexport function geminiAdapter(opts?: GeminiAdapterOptions): ProviderAdapter {\n return {\n id: 'google',\n\n async run(req: ResolvedRequest, ctx: AdapterCtx): Promise<AdapterResult> {\n if (req.provider !== 'google') {\n throw new LlmError(\n `geminiAdapter received a request for provider \"${req.provider}\", expected \"google\".`,\n { kind: 'bad_request', retryable: false },\n )\n }\n\n const warnings: Warning[] = []\n const model = req.model\n\n // ------------------------------------------------------------------\n // 1. Map messages → contents\n // ------------------------------------------------------------------\n\n const contents: GeminiContent[] = mapMessagesToGeminiContents(req.messages)\n\n // ------------------------------------------------------------------\n // 2. Build GenerateContentConfig\n // ------------------------------------------------------------------\n const genConfig = req.config\n const config: GeminiDispatchConfig = {}\n\n // System instruction\n if (req.system !== undefined) {\n config.systemInstruction = { parts: [{ text: req.system }] }\n }\n\n // Basic generation parameters (only include when defined)\n if (genConfig.temperature !== undefined) {\n config.temperature = genConfig.temperature\n }\n if (genConfig.topP !== undefined) {\n config.topP = genConfig.topP\n }\n if (genConfig.topK !== undefined) {\n config.topK = genConfig.topK\n }\n if (genConfig.maxOutputTokens !== undefined) {\n config.maxOutputTokens = genConfig.maxOutputTokens\n }\n if (genConfig.stopSequences !== undefined) {\n config.stopSequences = genConfig.stopSequences\n }\n\n // Service tier (FLEX or STANDARD)\n // Real SDK: GenerateContentConfig.serviceTier = ServiceTier enum (\"flex\"|\"standard\")\n const explicit = (genConfig as { serviceTier?: 'flex' | 'standard' }).serviceTier\n const supported = req.modelDescriptor?.capabilities?.serviceTiers\n if (explicit !== undefined) {\n // caller explicitly chose a tier — reject if the model can't honour it\n if (\n req.modelDescriptor !== undefined &&\n (supported === undefined || !supported.includes(explicit))\n ) {\n throw new LlmError(\n `serviceTier \"${explicit}\" is not supported for model \"${model}\".`,\n { kind: 'bad_request', retryable: false },\n )\n }\n config.serviceTier = explicit\n }\n\n // ------------------------------------------------------------------\n // 3. Reasoning → thinkingConfig\n // ------------------------------------------------------------------\n const reasoning = genConfig.reasoning\n if (reasoning !== undefined) {\n const reasoningApi = req.modelDescriptor?.capabilities?.reasoningApi\n\n if (reasoning.effort !== undefined && reasoning.budgetTokens !== undefined) {\n throw new LlmError(\n `Provide either reasoning.effort or reasoning.budgetTokens, not both, for model \"${model}\".`,\n { kind: 'bad_request', retryable: false },\n )\n }\n\n if (reasoningApi === 'budget') {\n // gemini-2.5* → thinkingBudget\n const budget =\n reasoning.budgetTokens !== undefined\n ? reasoning.budgetTokens\n : reasoning.effort !== undefined\n ? GOOGLE_REASONING_EFFORT_BUDGET[reasoning.effort]\n : undefined\n\n config.thinkingConfig = {\n ...(budget !== undefined ? { thinkingBudget: budget } : {}),\n ...(reasoning.includeThoughts === true ? { includeThoughts: true } : {}),\n }\n } else if (reasoningApi === 'level') {\n // gemini-3.* → thinkingLevel\n if (reasoning.budgetTokens !== undefined) {\n throw new LlmError(\n `reasoning.budgetTokens is not supported for model \"${model}\" (it uses thinkingLevel, not thinkingBudget); use reasoning.effort instead.`,\n { kind: 'bad_request', retryable: false },\n )\n }\n\n // Real SDK ThinkingLevel enum: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"MINIMAL\"\n let thinkingLevel: string | undefined\n if (reasoning.effort !== undefined) {\n switch (reasoning.effort) {\n case 'none':\n thinkingLevel = 'MINIMAL'\n break\n case 'low':\n thinkingLevel = 'LOW'\n break\n case 'medium':\n thinkingLevel = 'MEDIUM'\n break\n case 'high':\n thinkingLevel = 'HIGH'\n break\n default:\n assertNever(reasoning.effort)\n }\n }\n\n config.thinkingConfig = {\n ...(thinkingLevel !== undefined ? { thinkingLevel } : {}),\n ...(reasoning.includeThoughts === true ? { includeThoughts: true } : {}),\n }\n } else {\n throw new LlmError(\n `Model \"${model}\" does not support reasoning/thinkingConfig.`,\n { kind: 'bad_request', retryable: false },\n )\n }\n }\n\n // ------------------------------------------------------------------\n // 4. Structured output → responseMimeType + responseSchema\n // ------------------------------------------------------------------\n const structuredOutputRequested = req.outputJsonSchema !== undefined\n if (structuredOutputRequested) {\n const nativeStructuredOutput =\n req.modelDescriptor?.capabilities?.nativeStructuredOutput !== false\n\n if (nativeStructuredOutput) {\n config.responseMimeType = 'application/json'\n config.responseSchema = req.outputJsonSchema as NonNullable<\n GeminiGenerateConfig['responseSchema']\n >\n }\n }\n\n // ------------------------------------------------------------------\n // 5. providerOptions.google → explicit allowlisted mapping\n // ------------------------------------------------------------------\n const googleProviderConfig = mapGoogleProviderOptions(\n genConfig.providerOptions?.['google'],\n model,\n structuredOutputRequested,\n req.modelDescriptor?.capabilities?.grounding,\n )\n if (googleProviderConfig.cachedContent !== undefined) {\n config.cachedContent = googleProviderConfig.cachedContent\n }\n if (googleProviderConfig.httpOptions !== undefined) {\n config.httpOptions = googleProviderConfig.httpOptions\n }\n if (googleProviderConfig.safetySettings !== undefined) {\n config.safetySettings = googleProviderConfig.safetySettings\n }\n if (googleProviderConfig.tools !== undefined) {\n config.tools = googleProviderConfig.tools\n }\n\n // ------------------------------------------------------------------\n // 5a. Fixed-sampling models reject sampling params even when a custom\n // descriptor or direct adapter test bypasses core parsing.\n // ------------------------------------------------------------------\n assertSamplingAllowed(config, model, req.modelDescriptor?.capabilities?.sampling)\n\n // ------------------------------------------------------------------\n // 6. AbortSignal passthrough + FIX A-2: client-side flex ceiling\n //\n // FIX A-2 belt-and-suspenders: @google/genai issue #1277 — on SDK\n // versions before 2.0.0, httpOptions.timeout is a no-op for\n // generateContent. Upstream landed a related Undici dispatcher fix in\n // 2.0.0 (commit 850f680), but we keep this mitigation as\n // belt-and-suspenders since it is now merely double-covered, not made\n // incorrect. On explicit flex calls without timeoutMs, the engine arms\n // NO AbortSignal; relying solely on\n // httpOptions.timeout risks a silent hang. We arm our own\n // AbortController here and combine it with any incoming signal so WE\n // enforce the ceiling regardless of the SDK bug.\n //\n // Flex and standard default paths need this extra timer when timeoutMs is\n // absent. When timeoutMs IS set the engine already arms a hard AbortSignal\n // at exactly timeoutMs.\n //\n // Abort reason uses DOMException with name 'TimeoutError' so classifyError\n // maps the resulting LlmError to kind:'timeout' (retryable:true), matching\n // how the rest of the codebase surfaces timeout errors.\n //\n // AbortSignal.any requires Node ≥ 20.3; our engine floor is Node ≥ 20,\n // so this is always available in supported environments.\n //\n // Real SDK: GenerateContentConfig.abortSignal (in config, NOT in params)\n // ------------------------------------------------------------------\n let tierTimeoutHandle: ReturnType<typeof setTimeout> | undefined\n\n const clearTierTimeout = (): void => {\n if (tierTimeoutHandle !== undefined) {\n clearTimeout(tierTimeoutHandle)\n tierTimeoutHandle = undefined\n }\n }\n\n const applyTierTimeout = (tier: string | undefined): void => {\n clearTierTimeout()\n delete config.abortSignal\n\n const defaultTimeoutMs =\n genConfig.timeoutMs === undefined\n ? tier === 'flex'\n ? FLEX_DEFAULT_TIMEOUT_MS\n : tier === 'standard'\n ? STANDARD_DEFAULT_TIMEOUT_MS\n : undefined\n : undefined\n\n if (defaultTimeoutMs !== undefined) {\n const tierController = new AbortController()\n const tierLabel = tier === 'standard' ? 'Standard' : 'Flex'\n const timeoutReason = new DOMException(\n `${tierLabel} timeout: call exceeded ${defaultTimeoutMs}ms client-side ceiling` +\n ' (@google/genai #1277 belt-and-suspenders)',\n 'TimeoutError',\n )\n tierTimeoutHandle = setTimeout(() => {\n tierController.abort(timeoutReason)\n }, defaultTimeoutMs)\n config.abortSignal =\n ctx.signal !== undefined\n ? AbortSignal.any([tierController.signal, ctx.signal])\n : tierController.signal\n } else if (ctx.signal !== undefined) {\n config.abortSignal = ctx.signal\n }\n }\n\n applyTierTimeout(config.serviceTier)\n\n // ------------------------------------------------------------------\n // 7. Transport timeout — set httpOptions.timeout so the @google/genai\n // HTTP transport does NOT preempt the AbortSignal hard ceiling.\n //\n // Policy (precedence, highest first):\n // 1. Caller-supplied providerOptions.google.httpOptions.timeout wins.\n // 2. timeoutMs is set → computed transport timeout = timeoutMs +\n // TRANSPORT_TIMEOUT_BUFFER_MS so the engine's AbortSignal (hard\n // ceiling at timeoutMs) always fires before the SDK transport timer.\n // 3. serviceTier 'flex', no timeoutMs → FLEX_DEFAULT_TIMEOUT_MS (no\n // buffer; there is no engine AbortSignal deadline in this case).\n // 4. serviceTier 'standard', no timeoutMs → STANDARD_DEFAULT_TIMEOUT_MS.\n //\n // Only assign config.httpOptions when the merged object is non-empty\n // (exactOptionalPropertyTypes-safe).\n // ------------------------------------------------------------------\n\n // Capture caller-supplied httpOptions BEFORE we overwrite.\n // These arrived via the allowlisted provider-options mapper above.\n const callerHttpOptions = config.httpOptions\n\n const computedTimeoutMs: number | undefined =\n genConfig.timeoutMs !== undefined\n ? genConfig.timeoutMs + TRANSPORT_TIMEOUT_BUFFER_MS\n : config.serviceTier === 'flex'\n ? FLEX_DEFAULT_TIMEOUT_MS\n : config.serviceTier === 'standard'\n ? STANDARD_DEFAULT_TIMEOUT_MS\n : undefined\n\n const mergedHttpOptions: { timeout?: number } = {\n ...(computedTimeoutMs !== undefined ? { timeout: computedTimeoutMs } : {}),\n ...callerHttpOptions,\n }\n\n if (Object.keys(mergedHttpOptions).length > 0) {\n config.httpOptions = mergedHttpOptions\n }\n\n // ------------------------------------------------------------------\n // 8b. Client construction + SDK call — both inside the classifier\n // so that ANY failure in run() (including a bad auth constructor)\n // is rethrown as a typed LlmError(provider:'google').\n // ------------------------------------------------------------------\n let response: GeminiResponseShape\n let servedServiceTier = config.serviceTier\n const dispatch = async (): Promise<GeminiResponseShape> => {\n const dispatchConfig: GeminiGenerateConfig = {\n ...config,\n ...(config.httpOptions !== undefined\n ? { httpOptions: { ...config.httpOptions } }\n : {}),\n }\n const params = {\n model,\n contents,\n config: dispatchConfig,\n }\n const buildClient = opts?._clientFactory ?? buildGoogleClient\n const client: GeminiClientLike =\n opts?.client !== undefined ? opts.client : await buildClient(ctx.auth)\n ctx.logger.debug(\n {\n model,\n configKeys: Object.keys(dispatchConfig),\n serviceTier: dispatchConfig.serviceTier,\n },\n 'llm.adapter.dispatch',\n )\n return client.models.generateContent(params)\n }\n try {\n response = await dispatch()\n } catch (rawErr) {\n // Classify SDK errors → LlmError\n const typed = classifyGoogleError(\n rawErr,\n servedServiceTier !== undefined ? { servedServiceTier } : undefined,\n )\n\n if (\n config.serviceTier === 'flex' &&\n googleProviderConfig.flexFallback !== false &&\n isGeminiCapacityError(typed)\n ) {\n config.serviceTier = 'standard'\n servedServiceTier = 'standard'\n const fallbackTimeout =\n genConfig.timeoutMs !== undefined\n ? genConfig.timeoutMs + TRANSPORT_TIMEOUT_BUFFER_MS\n : STANDARD_DEFAULT_TIMEOUT_MS\n config.httpOptions = {\n timeout: fallbackTimeout,\n ...callerHttpOptions,\n }\n applyTierTimeout('standard')\n try {\n response = await dispatch()\n } catch (fallbackRawErr) {\n throw classifyGoogleError(fallbackRawErr, { servedServiceTier: 'standard' })\n }\n } else {\n throw typed\n }\n } finally {\n // FIX A-2: always clear the tier timeout timer so it never leaks,\n // regardless of whether the call succeeded, threw, or was aborted.\n clearTierTimeout()\n }\n\n // ------------------------------------------------------------------\n // 8. Blocked response check\n // promptFeedback.blockReason set OR no candidates → content_filter\n // ------------------------------------------------------------------\n const hasBlockReason = response.promptFeedback?.blockReason !== undefined\n const hasCandidates =\n response.candidates !== undefined && response.candidates.length > 0\n\n if (hasBlockReason || !hasCandidates) {\n const reason = response.promptFeedback?.blockReason ?? 'NO_CANDIDATES'\n throw new LlmError(`Gemini response blocked: ${reason}`, {\n kind: 'content_filter',\n retryable: false,\n provider: 'google',\n })\n }\n\n // ------------------------------------------------------------------\n // 9. Map response\n // ------------------------------------------------------------------\n const candidates = response.candidates\n if (candidates === undefined || candidates.length === 0) {\n throw new LlmError('Gemini response blocked: NO_CANDIDATES', {\n kind: 'content_filter',\n retryable: false,\n provider: 'google',\n })\n }\n const candidate = candidates[0]\n if (candidate === undefined) {\n throw new LlmError('Gemini response blocked: NO_CANDIDATES', {\n kind: 'content_filter',\n retryable: false,\n provider: 'google',\n })\n }\n const parts = candidate.content?.parts ?? []\n\n // Separate thought parts from text parts.\n const textParts: string[] = []\n const thoughtParts: string[] = []\n\n for (const part of parts) {\n if (part.text !== undefined) {\n if (part.thought === true) {\n thoughtParts.push(part.text)\n } else {\n textParts.push(part.text)\n }\n }\n }\n\n const text = textParts.join('')\n const reasoningText = thoughtParts.length > 0 ? thoughtParts.join('') : undefined\n\n // Parse structured output (JSON text → rawStructured).\n let rawStructured: unknown\n if (structuredOutputRequested && text.length > 0) {\n try {\n rawStructured = JSON.parse(text)\n } catch {\n // Core reports outputParsed:false; callers own validation/retry policy.\n }\n }\n\n // ------------------------------------------------------------------\n // 10. Build AdapterResult\n // ------------------------------------------------------------------\n const usage = mapUsage(response.usageMetadata)\n const finishReason = mapFinishReason(candidate.finishReason)\n\n const result: AdapterResult = {\n model,\n usage,\n warnings,\n ...(servedServiceTier !== undefined ? { servedServiceTier } : {}),\n ...(text.length > 0 ? { text } : {}),\n ...(reasoningText !== undefined ? { reasoningText } : {}),\n ...(rawStructured !== undefined ? { rawStructured } : {}),\n ...(finishReason !== undefined ? { finishReason } : {}),\n ...(response.modelVersion !== undefined\n ? { modelVersion: response.modelVersion }\n : {}),\n ...(response.responseId !== undefined ? { responseId: response.responseId } : {}),\n // Build providerMetadata — merge promptFeedback + groundingMetadata when present.\n ...((): { providerMetadata: JsonValue } | Record<string, never> => {\n const pf = response.promptFeedback\n const gm = candidate.groundingMetadata\n if (pf === undefined && gm === undefined) return {}\n const meta: { [k: string]: JsonValue } = {}\n if (pf !== undefined) {\n meta['promptFeedback'] = pf as unknown as JsonValue\n }\n if (gm !== undefined) {\n meta['groundingMetadata'] = gm as unknown as JsonValue\n }\n return { providerMetadata: meta as JsonValue }\n })(),\n }\n\n return result\n },\n\n async countTokens(req: TokenCountRequest, ctx: AdapterCtx): Promise<TokenCount> {\n if (req.provider !== 'google') {\n throw new LlmError(\n `geminiAdapter received a request for provider \"${req.provider}\", expected \"google\".`,\n { kind: 'bad_request', retryable: false },\n )\n }\n\n const contents = mapMessagesToGeminiContents(req.messages)\n const params: GeminiCountTokensParams = {\n model: req.model,\n contents,\n ...(req.system !== undefined || ctx.signal !== undefined\n ? {\n config: {\n ...(req.system !== undefined\n ? { systemInstruction: { parts: [{ text: req.system }] } }\n : {}),\n ...(ctx.signal !== undefined ? { abortSignal: ctx.signal } : {}),\n },\n }\n : {}),\n }\n\n try {\n const buildClient = opts?._clientFactory ?? buildGoogleClient\n const client: GeminiClientLike =\n opts?.client !== undefined ? opts.client : await buildClient(ctx.auth)\n const response = await client.models.countTokens(params)\n\n if (response.totalTokens === undefined) {\n // Provider fault, not caller fault: the SDK call succeeded but the\n // payload is malformed — classify as a (retryable) server error.\n throw new LlmError(\n 'Gemini countTokens response is malformed: missing required field: totalTokens',\n { kind: 'server', retryable: true, provider: 'google' },\n )\n }\n\n const details: Record<string, number> | undefined =\n response.cachedContentTokenCount !== undefined\n ? { cached: response.cachedContentTokenCount }\n : undefined\n\n return {\n totalTokens: response.totalTokens,\n ...(details !== undefined ? { details } : {}),\n raw: response as unknown as JsonValue,\n }\n } catch (rawErr) {\n throw classifyGoogleError(rawErr)\n }\n },\n }\n}\n","/**\n * Gemini pricing snapshot for @gullabs/google.\n *\n * All rates are in **micro-USD per million tokens** (µUSD/M).\n * To get the cost for N tokens: `cost_µUSD = N * ratePerM / 1_000_000`.\n *\n * **Service tiers.** Rates below are STANDARD-tier. Google's **Batch** tier is a\n * flat 50% discount on standard, and **Flex** matches Batch pricing. The cost\n * engine applies the {@link TIER_FACTOR} multiplier — this snapshot stores\n * standard rates only.\n *\n * **Long-context tier.** Gemini Pro models charge a premium when the GROSS input\n * token count exceeds 200,000. Selected by `inputTokens` (incl. cached), not by\n * billable input.\n *\n * **Thinking tokens.** Already inside `outputTokens` (GROSS convention) and\n * billed at the standard output rate — no separate thinking lane.\n *\n * **Modality caveat (v1 = text).** Gemini 2.5 Flash / Flash-Lite charge a higher\n * INPUT rate for audio tokens than for text/image/video. v1 is text-only and uses\n * the text/img/vid input rate. Per-modality input pricing is a deferred seam\n * (see DESIGN.md) — revisit when audio input is supported.\n *\n * Verified against https://ai.google.dev/gemini-api/docs/pricing on 2026-06-28.\n *\n * @module\n */\n\nimport type { ModelRates } from '@gullabs/core'\n\n/**\n * Identifies this pricing snapshot — bump the date when rates change.\n *\n * This is a snapshot date tied to Gemini's own pricing page, not a generic\n * core concept — it lives here (not `@gullabs/core`) alongside the rates it\n * dates.\n */\nexport const pricingVersion = 'gemini-2026-06-28' as const\n\n/**\n * Service-tier price multipliers. Batch and Flex are a flat 50% of standard\n * (per Google's pricing page: \"Batch API — 50% cost reduction\"; Flex matches Batch).\n *\n * `serviceTier` is an opaque, provider-defined string end-to-end — this map is\n * the *only* place a tier name is resolved to a multiplier. A tier key not\n * present here is never coerced to `standard`: `computeCost` (`@gullabs/core`)\n * treats that as an unpriced call (reject-don't-map), not a mapping to this\n * table's default. `undefined` (no tier requested) is the one case that\n * legitimately defaults to `standard` — that is documented default behavior,\n * not a guess.\n */\nexport const TIER_FACTOR: Readonly<Record<string, number>> = Object.freeze({\n standard: 1,\n flex: 0.5,\n batch: 0.5,\n})\n\n/**\n * Frozen Gemini pricing snapshot (STANDARD tier; per-1M in µUSD).\n *\n * Keys are model-string prefixes / exact identifiers used in routing. The cost\n * engine matches exact first, then longest-prefix (see `lookupRates` in\n * `cost.ts`).\n *\n * Source: https://ai.google.dev/gemini-api/docs/pricing (2026-06-28).\n */\nexport const GEMINI_PRICING: Readonly<Record<string, ModelRates>> = Object.freeze({\n // ── Gemini 2.5 Pro ── $1.25/$10 (≤200k), $2.50/$15 (>200k); cached $0.125/$0.25\n 'gemini-2.5-pro': {\n inputPerM: 1_250_000,\n cachedPerM: 125_000,\n outputPerM: 10_000_000,\n gt200k: {\n inputPerM: 2_500_000,\n cachedPerM: 250_000,\n outputPerM: 15_000_000,\n },\n },\n\n // ── Gemini 2.5 Flash ── input $0.30 (text), output $2.50, cached $0.03\n 'gemini-2.5-flash': {\n inputPerM: 300_000,\n cachedPerM: 30_000,\n outputPerM: 2_500_000,\n },\n\n // ── Gemini 2.5 Flash-Lite ── input $0.10 (text), output $0.40, cached $0.01\n 'gemini-2.5-flash-lite': {\n inputPerM: 100_000,\n cachedPerM: 10_000,\n outputPerM: 400_000,\n },\n\n // ── Gemini 3.5 Flash ── input $1.50, output $9.00, cached $0.15\n 'gemini-3.5-flash': {\n inputPerM: 1_500_000,\n cachedPerM: 150_000,\n outputPerM: 9_000_000,\n },\n\n // ── Gemini 3.1 Flash-Lite ── input $0.25 (text), output $1.50, cached $0.025\n 'gemini-3.1-flash-lite': {\n inputPerM: 250_000,\n cachedPerM: 25_000,\n outputPerM: 1_500_000,\n },\n\n // ── Gemini 3.1 Pro (preview) ── $2.00/$12 (≤200k), $4.00/$18 (>200k); cached $0.20/$0.40\n 'gemini-3.1-pro-preview': {\n inputPerM: 2_000_000,\n cachedPerM: 200_000,\n outputPerM: 12_000_000,\n gt200k: {\n inputPerM: 4_000_000,\n cachedPerM: 400_000,\n outputPerM: 18_000_000,\n },\n },\n\n // ── Gemini 3 Flash (preview) ── input $0.50, output $3.00, cached $0.05 (90% discount)\n 'gemini-3-flash-preview': {\n inputPerM: 500_000,\n cachedPerM: 50_000,\n outputPerM: 3_000_000,\n },\n})\n","/**\n * Gemini pricing source for @gullabs/google.\n *\n * Provides `geminiPricingSource` — a factory returning a `PricingSource` port\n * implementation backed by the frozen Gemini pricing snapshot ({@link\n * GEMINI_PRICING}). Walks the rates table (exact-then-longest-prefix match)\n * and delegates the actual arithmetic to `@gullabs/core`'s `computeCost`,\n * supplying this package's rates table + tier-factor map as explicit\n * parameters — core itself carries zero Gemini pricing knowledge.\n *\n * @module\n */\n\nimport { computeCost } from '@gullabs/core'\nimport type { Cost, ModelRates, PricingSource, Usage } from '@gullabs/core'\n\nimport { GEMINI_PRICING, TIER_FACTOR, pricingVersion } from './pricing.js'\n\n/**\n * Look up rates for a model.\n *\n * Performs an exact-key match first, then falls back to longest-prefix match\n * (e.g. `\"gemini-2.5-pro-001\"` matches `\"gemini-2.5-pro\"`).\n *\n * @returns The matched {@link ModelRates}, or `undefined` if no entry found.\n */\nfunction lookupRates(model: string): ModelRates | undefined {\n // 1. Exact match — fast path.\n const exact = GEMINI_PRICING[model]\n if (exact !== undefined) return exact\n\n // 2. Longest-prefix match.\n let bestKey = ''\n let bestRates: ModelRates | undefined\n for (const key of Object.keys(GEMINI_PRICING)) {\n if (model.startsWith(key) && key.length > bestKey.length) {\n bestKey = key\n bestRates = GEMINI_PRICING[key]\n }\n }\n return bestRates\n}\n\n/**\n * Factory that returns the **google-scoped** {@link PricingSource} port\n * implementation backed by the built-in Gemini pricing snapshot.\n *\n * `PricingSource` is provider-scoped by contract — this source only knows\n * bare Gemini/Gemma model keys. Compose it into `ClientConfig.pricingSources`\n * under the `'google'` key (or bundle it via {@link googleProvider}); do not\n * use it for other providers.\n *\n * The returned object is stateless and can be shared across calls.\n *\n * @example\n * ```ts\n * import { geminiPricingSource } from '@gullabs/google'\n *\n * const pricing = geminiPricingSource()\n * const cost = pricing.price('gemini-2.5-pro', usage, 'flex')\n * ```\n */\nexport function geminiPricingSource(): PricingSource {\n return {\n version: pricingVersion,\n price(model: string, usage: Usage, tier?: string): Cost {\n return computeCost(model, usage, tier, lookupRates, TIER_FACTOR, pricingVersion)\n },\n hasModel(model: string): boolean {\n return lookupRates(model) !== undefined\n },\n listModels(): readonly string[] {\n return Object.keys(GEMINI_PRICING)\n },\n }\n}\n","import { z } from 'zod'\n\nexport const Gemini25ProConfigSchema = z\n .union([\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-pro.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-pro.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-pro.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-pro.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-pro.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-2.5-pro.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-2.5-pro. Thinking off is not supported.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z.number().int().min(128).max(32768).meta({\n title: 'Reasoning Budget Tokens',\n description: 'thinkingBudget token range for gemini-2.5-pro.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Pro thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-pro.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-2.5-pro.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-pro.',\n }),\n }),\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-pro.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-pro.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-pro.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-pro.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-pro.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-2.5-pro.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-2.5-pro. Thinking off is not supported.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z.number().int().min(128).max(32768).meta({\n title: 'Reasoning Budget Tokens',\n description: 'thinkingBudget token range for gemini-2.5-pro.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Pro thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-pro.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-2.5-pro.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-pro.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini25ProConfig',\n description:\n 'Strict generateContent config for model gemini-2.5-pro. Budget reasoning, tunable sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', temperature: 0.7, reasoning: { effort: 'high' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini25FlashConfigSchema = z\n .union([\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-flash.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-flash.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-flash.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-flash.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-flash.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-2.5-flash.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemini-2.5-flash.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z.number().int().min(0).max(24576).meta({\n title: 'Reasoning Budget Tokens',\n description: 'thinkingBudget token range for gemini-2.5-flash.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Flash thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-flash.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-2.5-flash.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-flash.',\n }),\n }),\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-flash.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-flash.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-flash.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-flash.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-flash.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-2.5-flash.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemini-2.5-flash.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z.number().int().min(0).max(24576).meta({\n title: 'Reasoning Budget Tokens',\n description: 'thinkingBudget token range for gemini-2.5-flash.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Flash thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-flash.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-2.5-flash.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-flash.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini25FlashConfig',\n description:\n 'Strict generateContent config for model gemini-2.5-flash. Budget reasoning, tunable sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', temperature: 0.7, reasoning: { effort: 'none' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini25FlashLiteConfigSchema = z\n .union([\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-flash-lite.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-flash-lite.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-flash-lite.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-flash-lite.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-flash-lite.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-2.5-flash-lite.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemini-2.5-flash-lite.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z\n .union([z.literal(0), z.number().int().min(512).max(24576)])\n .meta({\n title: 'Reasoning Budget Tokens',\n description:\n 'thinkingBudget token range for gemini-2.5-flash-lite. Zero disables thinking; non-zero values must be 512..24576.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Flash-Lite thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-flash-lite.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-2.5-flash-lite.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-flash-lite.',\n }),\n }),\n z.strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemini-2.5-flash-lite.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemini-2.5-flash-lite.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemini-2.5-flash-lite.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-2.5-flash-lite.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-2.5-flash-lite.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-2.5-flash-lite.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemini-2.5-flash-lite.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n budgetTokens: z\n .union([z.literal(0), z.number().int().min(512).max(24576)])\n .meta({\n title: 'Reasoning Budget Tokens',\n description:\n 'thinkingBudget token range for gemini-2.5-flash-lite. Zero disables thinking; non-zero values must be 512..24576.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 2.5 Flash-Lite thinkingBudget configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-2.5-flash-lite.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-2.5-flash-lite.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-2.5-flash-lite.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini25FlashLiteConfig',\n description:\n 'Strict generateContent config for model gemini-2.5-flash-lite. Budget reasoning, tunable sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', temperature: 0.7, reasoning: { budgetTokens: 0 } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini35FlashConfigSchema = z\n .union([\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.5-flash.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.5-flash.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-3.5-flash.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.5-flash; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.5 Flash thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.5-flash.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-3.5-flash.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.5-flash.',\n }),\n }),\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.5-flash.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.5-flash.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-3.5-flash.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.5-flash; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.5 Flash thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.5-flash.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemini-3.5-flash.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.5-flash.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini35FlashConfig',\n description:\n 'Strict generateContent config for model gemini-3.5-flash. Level reasoning, fixed sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', reasoning: { effort: 'high' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini31FlashLiteConfigSchema = z\n .union([\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.1-flash-lite.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.1-flash-lite.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-3.1-flash-lite.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.1-flash-lite; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.1 Flash-Lite thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.1-flash-lite.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3.1-flash-lite.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.1-flash-lite.',\n }),\n }),\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.1-flash-lite.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.1-flash-lite.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-3.1-flash-lite.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.1-flash-lite; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.1 Flash-Lite thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.1-flash-lite.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3.1-flash-lite.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.1-flash-lite.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini31FlashLiteConfig',\n description:\n 'Strict generateContent config for model gemini-3.1-flash-lite. Level reasoning, fixed sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', reasoning: { effort: 'medium' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini31ProPreviewConfigSchema = z\n .union([\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.1-pro-preview.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.1-pro-preview.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-3.1-pro-preview.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.1-pro-preview. Thinking off is not supported.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.1 Pro Preview thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.1-pro-preview.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3.1-pro-preview.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.1-pro-preview.',\n }),\n }),\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3.1-pro-preview.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3.1-pro-preview.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-3.1-pro-preview.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3.1-pro-preview. Thinking off is not supported.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3.1 Pro Preview thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3.1-pro-preview.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3.1-pro-preview.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3.1-pro-preview.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini31ProPreviewConfig',\n description:\n 'Strict generateContent config for model gemini-3.1-pro-preview. Level reasoning, fixed sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', reasoning: { effort: 'high' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemini3FlashPreviewConfigSchema = z\n .union([\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3-flash-preview.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3-flash-preview.',\n }),\n serviceTier: z.literal('flex').meta({\n title: 'Service Tier',\n description: 'Explicit flex tier for gemini-3-flash-preview.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3-flash-preview; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3 Flash Preview thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3-flash-preview.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n flexFallback: z.boolean().optional().meta({\n title: 'Flex Fallback',\n description:\n 'Allow provider fallback from flex when flex was explicitly selected.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3-flash-preview.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3-flash-preview.',\n }),\n }),\n z.strictObject({\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemini-3-flash-preview.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemini-3-flash-preview.',\n }),\n serviceTier: z.literal('standard').optional().meta({\n title: 'Service Tier',\n description: 'Standard tier or omitted tier for gemini-3-flash-preview.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'low', 'medium', 'high']).meta({\n title: 'Reasoning Effort',\n description:\n 'Reasoning effort for gemini-3-flash-preview; none maps to minimal thinking.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemini 3 Flash Preview thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemini-3-flash-preview.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description:\n 'Allowlisted Google provider options for gemini-3-flash-preview.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemini-3-flash-preview.',\n }),\n }),\n ])\n .meta({\n title: 'Gemini3FlashPreviewConfig',\n description:\n 'Strict generateContent config for model gemini-3-flash-preview. Level reasoning, fixed sampling, flex/standard tiers, structured output, grounding, priced.',\n examples: [{ serviceTier: 'flex', reasoning: { effort: 'medium' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemma431bItConfigSchema = z\n .strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemma-4-31b-it.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemma-4-31b-it.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemma-4-31b-it.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemma-4-31b-it.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemma-4-31b-it.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemma-4-31b-it.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemma 4 31B IT thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemma-4-31b-it.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemma-4-31b-it.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemma-4-31b-it.',\n }),\n })\n .meta({\n title: 'Gemma431bItConfig',\n description:\n 'Strict generateContent config for model gemma-4-31b-it. Level reasoning, tunable sampling, no service tier, structured output, grounding, intentionally unpriced.',\n examples: [{ temperature: 0.7, reasoning: { effort: 'high' } }],\n })\n","import { z } from 'zod'\n\nexport const Gemma426bA4bItConfigSchema = z\n .strictObject({\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .meta({\n title: 'Temperature',\n description: 'Sampling temperature for gemma-4-26b-a4b-it.',\n examples: [0.7],\n }),\n topP: z.number().min(0).max(1).optional().meta({\n title: 'Top P',\n description: 'Nucleus sampling probability for gemma-4-26b-a4b-it.',\n }),\n topK: z.number().int().positive().optional().meta({\n title: 'Top K',\n description: 'Top-k sampling limit for gemma-4-26b-a4b-it.',\n }),\n maxOutputTokens: z.number().int().positive().optional().meta({\n title: 'Max Output Tokens',\n description: 'Maximum output token cap for gemma-4-26b-a4b-it.',\n }),\n stopSequences: z.array(z.string()).max(5).optional().meta({\n title: 'Stop Sequences',\n description: 'Up to five stop sequences for gemma-4-26b-a4b-it.',\n }),\n reasoning: z\n .union([\n z.strictObject({\n effort: z.enum(['none', 'high']).meta({\n title: 'Reasoning Effort',\n description: 'Reasoning effort for gemma-4-26b-a4b-it.',\n }),\n includeThoughts: z.boolean().optional().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n z.strictObject({\n includeThoughts: z.boolean().meta({\n title: 'Include Thoughts',\n description: 'Return provider thought summaries when supported.',\n }),\n }),\n ])\n .optional()\n .meta({\n title: 'Reasoning',\n description: 'Gemma 4 26B A4B IT thinkingLevel configuration.',\n }),\n timeoutMs: z.number().int().positive().optional().meta({\n title: 'Timeout',\n description: 'Logical request timeout in milliseconds.',\n }),\n providerOptions: z\n .strictObject({\n google: z\n .strictObject({\n cachedContent: z.string().min(1).optional().meta({\n title: 'Cached Content',\n description: 'Google cached content resource name.',\n }),\n safetySettings: z\n .array(\n z.strictObject({\n category: z.string().min(1).meta({\n title: 'Safety Category',\n description: 'Google safety category identifier.',\n }),\n threshold: z.string().min(1).meta({\n title: 'Safety Threshold',\n description: 'Google safety threshold identifier.',\n }),\n }),\n )\n .optional()\n .meta({\n title: 'Safety Settings',\n description: 'Allowlisted Google safety settings.',\n }),\n tools: z\n .array(\n z.strictObject({\n googleSearch: z.strictObject({}).meta({\n title: 'Google Search',\n description: 'Google Search grounding tool.',\n }),\n }),\n )\n .min(1)\n .optional()\n .meta({\n title: 'Tools',\n description: 'Allowlisted Google tools for gemma-4-26b-a4b-it.',\n }),\n httpOptions: z\n .strictObject({\n timeout: z.number().int().positive().optional().meta({\n title: 'HTTP Timeout',\n description: 'Per-request Google transport timeout in milliseconds.',\n }),\n })\n .optional()\n .meta({\n title: 'HTTP Options',\n description: 'Allowlisted Google transport options.',\n }),\n })\n .optional()\n .meta({\n title: 'Google Provider Options',\n description: 'Allowlisted Google provider options for gemma-4-26b-a4b-it.',\n }),\n })\n .optional()\n .meta({\n title: 'Provider Options',\n description: 'Provider-specific options accepted for gemma-4-26b-a4b-it.',\n }),\n })\n .meta({\n title: 'Gemma426bA4bItConfig',\n description:\n 'Strict generateContent config for model gemma-4-26b-a4b-it. Level reasoning, tunable sampling, no service tier, structured output, grounding, intentionally unpriced.',\n examples: [{ temperature: 0.7, reasoning: { effort: 'none' } }],\n })\n","/**\n * Model descriptor registry for @gullabs/google.\n *\n * Centralises Gemini/Gemma model knowledge: reasoning-effort vocabularies,\n * capability flags, and the built-in descriptor arrays. `@gullabs/core` owns\n * only the generic registry machinery (`ModelDescriptor`, `ModelRegistry`,\n * `createModelRegistry`) — this module supplies the Gemini-specific data.\n *\n * @module\n */\n\nimport type { ModelDescriptor, ModelRegistry, ReasoningEffort } from '@gullabs/core'\nimport { createModelRegistry } from '@gullabs/core'\n\nimport {\n Gemma426bA4bItConfigSchema,\n Gemma431bItConfigSchema,\n Gemini25FlashConfigSchema,\n Gemini25FlashLiteConfigSchema,\n Gemini25ProConfigSchema,\n Gemini31FlashLiteConfigSchema,\n Gemini31ProPreviewConfigSchema,\n Gemini35FlashConfigSchema,\n Gemini3FlashPreviewConfigSchema,\n} from './model-config/index.js'\nimport { toConfigJsonSchema, zodToStandardSchema } from '@gullabs/core'\n\nconst GEMINI_25_PRO_REASONING_EFFORTS = [\n 'low',\n 'medium',\n 'high',\n] as const satisfies ReadonlyArray<ReasoningEffort>\nconst GEMINI_LEVEL_REASONING_EFFORTS = [\n 'none',\n 'low',\n 'medium',\n 'high',\n] as const satisfies ReadonlyArray<ReasoningEffort>\nconst GEMINI_LEVEL_PRO_PREVIEW_REASONING_EFFORTS = [\n 'low',\n 'medium',\n 'high',\n] as const satisfies ReadonlyArray<ReasoningEffort>\nconst GEMINI_25_FLASH_REASONING_EFFORTS = [\n 'none',\n 'low',\n 'medium',\n 'high',\n] as const satisfies ReadonlyArray<ReasoningEffort>\nconst GEMMA_REASONING_EFFORTS = [\n 'none',\n 'high',\n] as const satisfies ReadonlyArray<ReasoningEffort>\n\nexport const geminiModelDescriptors: ModelDescriptor[] = [\n {\n model: 'gemini-2.5-pro',\n provider: 'google',\n pricingFamily: 'gemini-2.5-pro',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'budget',\n admittedReasoningEfforts: GEMINI_25_PRO_REASONING_EFFORTS,\n sampling: 'tunable',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini25ProConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini25ProConfigSchema),\n validateConfig: zodToStandardSchema(Gemini25ProConfigSchema),\n },\n {\n model: 'gemini-2.5-flash',\n provider: 'google',\n pricingFamily: 'gemini-2.5-flash',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'budget',\n admittedReasoningEfforts: GEMINI_25_FLASH_REASONING_EFFORTS,\n sampling: 'tunable',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini25FlashConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini25FlashConfigSchema),\n validateConfig: zodToStandardSchema(Gemini25FlashConfigSchema),\n },\n {\n model: 'gemini-2.5-flash-lite',\n provider: 'google',\n pricingFamily: 'gemini-2.5-flash-lite',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'budget',\n admittedReasoningEfforts: GEMINI_25_FLASH_REASONING_EFFORTS,\n sampling: 'tunable',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini25FlashLiteConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini25FlashLiteConfigSchema),\n validateConfig: zodToStandardSchema(Gemini25FlashLiteConfigSchema),\n },\n {\n model: 'gemini-3.5-flash',\n provider: 'google',\n pricingFamily: 'gemini-3.5-flash',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMINI_LEVEL_REASONING_EFFORTS,\n sampling: 'fixed',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini35FlashConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini35FlashConfigSchema),\n validateConfig: zodToStandardSchema(Gemini35FlashConfigSchema),\n },\n {\n model: 'gemini-3.1-flash-lite',\n provider: 'google',\n pricingFamily: 'gemini-3.1-flash-lite',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMINI_LEVEL_REASONING_EFFORTS,\n sampling: 'fixed',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini31FlashLiteConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini31FlashLiteConfigSchema),\n validateConfig: zodToStandardSchema(Gemini31FlashLiteConfigSchema),\n },\n {\n model: 'gemini-3.1-pro-preview',\n provider: 'google',\n pricingFamily: 'gemini-3.1-pro-preview',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMINI_LEVEL_PRO_PREVIEW_REASONING_EFFORTS,\n sampling: 'fixed',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini31ProPreviewConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini31ProPreviewConfigSchema),\n validateConfig: zodToStandardSchema(Gemini31ProPreviewConfigSchema),\n },\n {\n model: 'gemini-3-flash-preview',\n provider: 'google',\n pricingFamily: 'gemini-3-flash-preview',\n capabilities: {\n reasoning: true,\n structuredOutput: true,\n nativeStructuredOutput: true,\n vision: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMINI_LEVEL_REASONING_EFFORTS,\n sampling: 'fixed',\n caching: { explicit: true, minTokens: 2048 },\n grounding: true,\n serviceTiers: ['flex', 'standard'],\n },\n configSchema: Gemini3FlashPreviewConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemini3FlashPreviewConfigSchema),\n validateConfig: zodToStandardSchema(Gemini3FlashPreviewConfigSchema),\n },\n]\n\nexport const gemmaModelDescriptors: ModelDescriptor[] = [\n {\n model: 'gemma-4-31b-it',\n provider: 'google',\n capabilities: {\n reasoning: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMMA_REASONING_EFFORTS,\n structuredOutput: true,\n nativeStructuredOutput: true,\n grounding: true,\n vision: true,\n sampling: 'tunable',\n },\n configSchema: Gemma431bItConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemma431bItConfigSchema),\n validateConfig: zodToStandardSchema(Gemma431bItConfigSchema),\n },\n {\n model: 'gemma-4-26b-a4b-it',\n provider: 'google',\n capabilities: {\n reasoning: true,\n reasoningApi: 'level',\n admittedReasoningEfforts: GEMMA_REASONING_EFFORTS,\n structuredOutput: true,\n nativeStructuredOutput: true,\n grounding: true,\n vision: true,\n sampling: 'tunable',\n },\n configSchema: Gemma426bA4bItConfigSchema,\n configJsonSchema: toConfigJsonSchema(Gemma426bA4bItConfigSchema),\n validateConfig: zodToStandardSchema(Gemma426bA4bItConfigSchema),\n },\n]\n\n/**\n * Pre-built registry of all built-in Gemini + Gemma descriptors.\n *\n * Most callers should prefer {@link googleProvider} (which bundles this same\n * descriptor set via `composeProviders`); this export remains for callers\n * that need a bare `ModelRegistry` without going through the plugin seam.\n */\nexport const defaultGeminiRegistry: ModelRegistry = createModelRegistry([\n ...geminiModelDescriptors,\n ...gemmaModelDescriptors,\n])\n","/**\n * `googleProvider` — {@link ProviderPlugin} factory for @gullabs/google.\n *\n * Bundles the Gemini adapter, the built-in Gemini + Gemma model descriptors,\n * and the Gemini pricing source into a single plugin for\n * {@link composeProviders}.\n *\n * @module\n */\n\nimport type { ProviderPlugin } from '@gullabs/core'\n\nimport { geminiAdapter } from './adapter.js'\nimport type { GeminiAdapterOptions } from './adapter.js'\nimport { geminiPricingSource } from './cost.js'\nimport { geminiModelDescriptors, gemmaModelDescriptors } from './models.js'\n\n/**\n * Create a {@link ProviderPlugin} for the Gemini provider.\n *\n * @param opts - Forwarded to {@link geminiAdapter}.\n * @returns A plugin bundling the Gemini adapter, Gemini + Gemma model\n * descriptors, and the built-in Gemini pricing source.\n *\n * @example\n * ```ts\n * import { createClient, composeProviders } from '@gullabs/core'\n * import { googleProvider } from '@gullabs/google'\n *\n * const client = createClient({\n * ...composeProviders([googleProvider()]),\n * })\n * ```\n */\nexport function googleProvider(opts?: GeminiAdapterOptions): ProviderPlugin {\n return {\n adapter: geminiAdapter(opts),\n modelDescriptors: [...geminiModelDescriptors, ...gemmaModelDescriptors],\n pricingSource: geminiPricingSource(),\n }\n}\n","/**\n * GoogleFileStore — thin wrapper over the Gemini File API.\n *\n * Handles upload + polling until ACTIVE, and tracked deletion.\n * Injectable sleep and client for tests (no network required).\n *\n * @module\n */\n\nimport type { AuthMaterial, Logger } from '@gullabs/core'\nimport { LlmError, classifyError, redactSecrets } from '@gullabs/core'\n\nimport { requireApiKey } from './client.js'\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/** A handle to a file stored in the Gemini File API. */\nexport interface GoogleFileHandle {\n /** Resource name, e.g. \"files/abc123\". */\n name: string\n /** URI to pass as FileUriPart.uri in an LlmRequest. */\n uri: string\n mimeType: string\n /** Provider auto-deletes ~48 h after upload. Absent when not returned. */\n expiresAt?: Date\n}\n\n/**\n * Minimal structural interface for the Gemini Files client surface we use.\n * Satisfied by the real ai.files object or a test fake.\n */\nexport interface GeminiFilesClientLike {\n upload(params: {\n file: Uint8Array | Blob\n config?: { mimeType?: string; displayName?: string }\n }): Promise<{\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }>\n get(params: { name: string }): Promise<{\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }>\n delete(params: { name: string }): Promise<void>\n}\n\n/**\n * Options for {@link GoogleFileStore.delete} / {@link GoogleFileStore.deleteAll}.\n *\n * Default is fail-open (P5 side-effect style). Pass `failClosed: true` when\n * the host gates durable state on known delete success. Shape matches\n * `@gullabs/xai` `FileDeleteOptions` by convention.\n */\nexport interface FileDeleteOptions {\n signal?: AbortSignal\n /**\n * When true, non-not-found failures throw typed `LlmError`.\n * When false/omitted, failures invoke `onDeleteError` and resolve.\n * Not-found is success in both modes (idempotent).\n */\n failClosed?: boolean\n}\n\nexport interface GoogleFileStoreOptions {\n auth: AuthMaterial\n /** Injectable client for tests; skips SDK import when provided. */\n client?: GeminiFilesClientLike\n /** Called on delete failures instead of rethrowing. Default: console.error. */\n onDeleteError?: (name: string, err: unknown) => void\n /** Optional structured logger. When provided, routes delete failures to logger.error. */\n logger?: Logger\n poll?: {\n /** Delay between state polls. Default: 3000 ms. */\n intervalMs?: number\n /** Max time to wait for ACTIVE. Default: 300 000 ms (5 min). */\n timeoutMs?: number\n }\n /** Injectable sleep for tests. Default: real setTimeout. */\n sleep?: (ms: number) => Promise<void>\n /** Injectable clock for deterministic tests. Default: `Date.now`. */\n now?: () => number\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_INTERVAL_MS = 3_000\nconst DEFAULT_TIMEOUT_MS = 300_000\n\nconst realSleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms))\n\nasync function buildFilesClient(auth: AuthMaterial): Promise<GeminiFilesClientLike> {\n const { GoogleGenAI } = await import('@google/genai')\n\n const ai = new GoogleGenAI({ apiKey: requireApiKey(auth) })\n\n return {\n async upload(params) {\n // Real SDK accepts string | Blob; convert Uint8Array → Blob.\n // Uint8Array.from() copies into a fresh, plain ArrayBuffer-backed\n // array — BlobPart requires Uint8Array<ArrayBuffer>, which excludes\n // the SharedArrayBuffer-backed views that Uint8Array<ArrayBufferLike>\n // (the type of params.file) may structurally include.\n const fileArg: Blob =\n params.file instanceof Uint8Array\n ? new Blob(\n [Uint8Array.from(params.file)],\n params.config?.mimeType !== undefined && params.config.mimeType.length > 0\n ? { type: params.config.mimeType }\n : {},\n )\n : params.file\n\n const result = await (\n ai.files.upload as (p: unknown) => Promise<{\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }>\n )({\n file: fileArg,\n ...(params.config !== undefined ? { config: params.config } : {}),\n })\n return result\n },\n\n async get(params) {\n const result = await (\n ai.files.get as (p: unknown) => Promise<{\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }>\n )(params)\n return result\n },\n\n async delete(params) {\n await (ai.files.delete as (p: unknown) => Promise<unknown>)(params)\n },\n }\n}\n\ntype FileResp = {\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n}\n\nfunction makeHandle(\n resp: FileResp,\n fallback: { name: string; uri: string; mimeType: string },\n): GoogleFileHandle {\n const et = resp.expirationTime\n return {\n name: resp.name ?? fallback.name,\n uri: resp.uri ?? fallback.uri,\n mimeType: resp.mimeType ?? fallback.mimeType,\n ...(et !== undefined && et.length > 0 ? { expiresAt: new Date(et) } : {}),\n }\n}\n\n// ---------------------------------------------------------------------------\n// GoogleFileStore\n// ---------------------------------------------------------------------------\n\n/**\n * **Auth snapshot note:** this store captures the `AuthMaterial` at construction\n * time and memoizes a single SDK client from it (`clientPromise`). This is\n * correct and sufficient for static API keys. If refreshable credentials\n * (short-lived OAuth/STS tokens) are added in the future, this memoization is\n * the seam that will need rework: the cached client would hold stale credentials\n * for the lifetime of a long-lived store instance. At that point, the store\n * will need to either rebuild the client on each operation or accept a\n * credential-resolver callback rather than a plain `AuthMaterial` value.\n * See ADR-020 in DECISIONS.md.\n */\nexport class GoogleFileStore {\n private readonly auth: AuthMaterial\n private readonly clientOverride: GeminiFilesClientLike | undefined\n private readonly onDeleteError: (name: string, err: unknown) => void\n private readonly logger: Logger | undefined\n private readonly intervalMs: number\n private readonly timeoutMs: number\n private readonly sleep: (ms: number) => Promise<void>\n private readonly now: () => number\n /** Memoised client promise — built at most once per store instance. */\n private clientPromise: Promise<GeminiFilesClientLike> | undefined\n\n constructor(opts: GoogleFileStoreOptions) {\n this.auth = opts.auth\n this.clientOverride = opts.client\n this.logger = opts.logger\n this.onDeleteError =\n opts.onDeleteError ??\n ((name, err) => {\n if (this.logger !== undefined) {\n this.logger.error(\n { name, error: redactSecrets(classifyError(err).message) },\n 'gemini.file.delete.failed',\n )\n } else {\n console.error(\n `[GoogleFileStore] delete failed for \"${name}\":`,\n redactSecrets(classifyError(err).message),\n )\n }\n })\n this.intervalMs = opts.poll?.intervalMs ?? DEFAULT_INTERVAL_MS\n this.timeoutMs = opts.poll?.timeoutMs ?? DEFAULT_TIMEOUT_MS\n this.sleep = opts.sleep ?? realSleep\n this.now = opts.now ?? (() => Date.now())\n }\n\n private getClient(): Promise<GeminiFilesClientLike> {\n if (this.clientOverride !== undefined) return Promise.resolve(this.clientOverride)\n if (this.clientPromise === undefined) {\n this.clientPromise = buildFilesClient(this.auth)\n }\n return this.clientPromise\n }\n\n /**\n * Upload bytes to the Gemini File API and wait until the file is ACTIVE.\n *\n * @param source - Raw bytes or Blob.\n * @param mimeType - IANA media type, e.g. `\"image/png\"`.\n * @param opts - Optional display name.\n */\n async upload(\n source: Uint8Array | Blob,\n mimeType: string,\n opts?: { displayName?: string; signal?: AbortSignal },\n ): Promise<GoogleFileHandle> {\n const signal = opts?.signal\n const client = await this.getClient()\n\n let uploadResp: {\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }\n try {\n uploadResp = await client.upload({\n file: source,\n config: {\n mimeType,\n ...(opts?.displayName !== undefined ? { displayName: opts.displayName } : {}),\n },\n })\n } catch (e) {\n throw classifyError(e)\n }\n\n const { name, uri } = uploadResp\n\n if (\n name === undefined ||\n name.length === 0 ||\n uri === undefined ||\n uri.length === 0\n ) {\n // Provider fault, not caller fault: the SDK call succeeded but the\n // payload is malformed — classify as a server error. NOT retryable:\n // upload() is side-effecting and not idempotent — the provider may have\n // already stored the file even though the payload carries no name/uri,\n // so there is no handle to clean up and an automatic retry could\n // orphan/duplicate provider-side resources.\n throw new LlmError('File upload response missing required fields (name or uri)', {\n kind: 'server',\n retryable: false,\n provider: 'google',\n })\n }\n\n const fallback = { name, uri, mimeType }\n\n if (uploadResp.state === 'ACTIVE') {\n return makeHandle(uploadResp, fallback)\n }\n\n if (uploadResp.state === 'FAILED') {\n throw new LlmError('File processing failed immediately after upload', {\n kind: 'bad_request',\n retryable: false,\n })\n }\n\n // PROCESSING (or unknown) — poll until ACTIVE or timeout.\n const deadline = this.now() + this.timeoutMs\n\n // Pre-flight: if the signal is already aborted, throw before creating any\n // promise so we never produce an unhandled rejection.\n if (signal?.aborted === true) {\n throw new LlmError('File upload polling aborted', {\n kind: 'aborted',\n retryable: false,\n })\n }\n\n // Build an abort-race promise so future aborts wake up the sleep race\n // immediately rather than waiting the full interval. Created only when\n // the signal is NOT already aborted (guard above handles that case).\n const abortRacePromise: Promise<never> | undefined =\n signal !== undefined\n ? new Promise<never>((_, reject) => {\n signal.addEventListener(\n 'abort',\n () => {\n reject(\n new LlmError('File upload polling aborted', {\n kind: 'aborted',\n retryable: false,\n }),\n )\n },\n { once: true },\n )\n })\n : undefined\n\n for (;;) {\n if (this.now() >= deadline) {\n throw new LlmError('Timed out waiting for uploaded file to become ACTIVE', {\n kind: 'timeout',\n retryable: true,\n })\n }\n\n // Sleep — race against the abort promise so we wake up immediately\n // when the signal fires rather than waiting the full interval.\n const sleepCall = this.sleep(this.intervalMs)\n await (abortRacePromise !== undefined\n ? Promise.race([sleepCall, abortRacePromise])\n : sleepCall)\n\n let pollResp: {\n name?: string\n uri?: string\n mimeType?: string\n state?: string\n expirationTime?: string\n }\n try {\n pollResp = await client.get({ name })\n } catch (e) {\n throw classifyError(e)\n }\n\n // Also guard here: the signal may have fired during client.get()\n // before we looped back to the sleep race.\n // Cast needed: TS 5.6 persists readonly-property narrowing across awaits,\n // making it think `aborted` is still `false | undefined` after the preflight.\n if ((signal?.aborted as boolean | undefined) === true) {\n throw new LlmError('File upload polling aborted', {\n kind: 'aborted',\n retryable: false,\n })\n }\n\n if (pollResp.state === 'ACTIVE') {\n return makeHandle(pollResp, fallback)\n }\n\n if (pollResp.state === 'FAILED') {\n throw new LlmError('File processing failed during polling', {\n kind: 'bad_request',\n retryable: false,\n })\n }\n // PROCESSING — continue loop\n }\n }\n\n /**\n * Delete a single uploaded file. Idempotent: not-found → success.\n *\n * Default (`failClosed` omitted/false): errors go to `onDeleteError` and\n * resolve (P5 fail-open). With `failClosed: true`, non-not-found errors\n * throw typed `LlmError` and `onDeleteError` is not called.\n *\n * Empty/blank `handle.name` always throws `bad_request`.\n */\n async delete(handle: GoogleFileHandle, opts?: FileDeleteOptions): Promise<void> {\n const name = handle.name\n if (typeof name !== 'string' || name.trim() === '') {\n throw new LlmError('GoogleFileHandle.name must be a non-empty string.', {\n kind: 'bad_request',\n retryable: false,\n provider: 'google',\n })\n }\n\n const failClosed = opts?.failClosed === true\n\n try {\n if (opts?.signal?.aborted === true) {\n throw new LlmError('Google file delete aborted', {\n kind: 'aborted',\n retryable: false,\n provider: 'google',\n })\n }\n const client = await this.getClient()\n await client.delete({ name })\n } catch (err) {\n if (isGoogleNotFoundError(err)) {\n return\n }\n const classified = err instanceof LlmError ? err : classifyError(err)\n const withProvider =\n classified.provider === undefined\n ? new LlmError(classified.message, {\n kind: classified.kind,\n retryable: classified.retryable,\n ...(classified.httpStatus !== undefined\n ? { httpStatus: classified.httpStatus }\n : {}),\n ...(classified.retryAfterMs !== undefined\n ? { retryAfterMs: classified.retryAfterMs }\n : {}),\n provider: 'google',\n cause: classified.cause ?? err,\n })\n : classified\n\n if (failClosed) {\n throw withProvider\n }\n this.onDeleteError(name, withProvider)\n }\n }\n\n /**\n * Delete multiple files.\n *\n * Fail-open (default): `Promise.allSettled` per handle.\n * Fail-closed: `Promise.all` — first throw rejects; in-flight siblings are\n * not cancelled. Prefer per-handle delete when gating durable release state.\n */\n async deleteAll(handles: GoogleFileHandle[], opts?: FileDeleteOptions): Promise<void> {\n if (opts?.failClosed === true) {\n await Promise.all(handles.map((h) => this.delete(h, opts)))\n return\n }\n await Promise.allSettled(handles.map((h) => this.delete(h, opts)))\n }\n}\n\n/** Detect Gemini/SDK not-found shapes so delete stays idempotent. */\nfunction isGoogleNotFoundError(err: unknown): boolean {\n if (err instanceof LlmError && err.httpStatus === 404) {\n return true\n }\n if (typeof err !== 'object' || err === null) {\n return false\n }\n const obj = err as Record<string, unknown>\n if (obj['status'] === 404 || obj['httpStatus'] === 404 || obj['code'] === 404) {\n return true\n }\n if (obj['status'] === 'NOT_FOUND' || obj['code'] === 'NOT_FOUND') {\n return true\n }\n const msg = typeof obj['message'] === 'string' ? obj['message'] : ''\n if (/not\\s*found|404/i.test(msg) && /file/i.test(msg)) {\n return true\n }\n return false\n}\n","/**\n * GoogleCacheStore — thin wrapper over the Gemini Context Cache API.\n *\n * Manages create / get-or-create / refresh / delete lifecycle for cached\n * contents. In-memory cache entries are PROCESS-SCOPED; they are not shared\n * across processes, workers, or restarts.\n *\n * Injectable client and `now` function keep tests free of network and clock.\n *\n * @module\n */\n\nimport type { AuthMaterial, Logger } from '@gullabs/core'\nimport type { Content } from '@google/genai'\n\nimport { requireApiKey } from './client.js'\nimport { LlmError, classifyError, redactSecrets } from '@gullabs/core'\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * A handle to a cached content resource in the Gemini Context Cache API.\n *\n * Pass `cacheName` as `providerOptions.google.cachedContent` in LlmRequest.\n */\nexport interface GoogleCacheHandle {\n /** Resource name, e.g. \"cachedContents/xyz\". */\n cacheName: string\n /**\n * Local view of when the cache expires (server-authoritative; computed from\n * ttl or parsed from the server response `expireTime`).\n */\n expiresAt: Date\n /** Caches are model-bound; never use a handle with a different model. */\n model: string\n}\n\n/** Key used to look up or create an entry in the in-process cache map. */\nexport interface CacheKey {\n model: string\n /** Caller-chosen stable identifier, e.g. a hash of the cached content. */\n stableKey: string\n}\n\n/**\n * Minimal structural interface for the Gemini Caches client surface we use.\n * Satisfied by the real `ai.caches` object or a test fake.\n */\nexport interface GeminiCachesClientLike {\n create(params: {\n model: string\n config: {\n contents?: Content[]\n systemInstruction?: Content | string\n ttl?: string\n displayName?: string\n }\n }): Promise<{ name?: string; model?: string; expireTime?: string }>\n\n update(params: {\n name: string\n config: { ttl?: string; expireTime?: string }\n }): Promise<{ name?: string; expireTime?: string }>\n\n delete(params: { name: string }): Promise<unknown>\n}\n\nexport interface GoogleCacheStoreOptions {\n auth: AuthMaterial\n /** Injectable client for tests; skips SDK import when provided. */\n client?: GeminiCachesClientLike\n /**\n * When true, concurrent `getOrCreate` calls for the same key share one\n * in-flight create. Default false.\n */\n coalesce?: boolean\n /**\n * Subtracted from the local expiry so we stop using a cache slightly before\n * the server evicts it. Default 30 s.\n */\n expirySkewSeconds?: number\n /** Called on delete failures instead of rethrowing. */\n onDeleteError?: (cacheName: string, err: unknown) => void\n /** Optional structured logger. When provided, routes delete failures to logger.error. */\n logger?: Logger\n /** Injectable clock for deterministic tests. Default: `Date.now`. */\n now?: () => number\n /**\n * Opt-in pre-flight token-count gate applied before every cache create\n * (both `create()` directly and the `getOrCreate()` path it delegates to,\n * including the coalesced path — enforced once, inside `create()`, so\n * there is no separate \"in-flight\" gap to close).\n */\n preflight?: {\n /** Minimum token count required before a cache create is allowed to proceed. */\n minTokens: number\n /**\n * Counts tokens for the exact token-bearing payload of the impending\n * create — `model` + `contents` + `systemInstruction` only. `ttl` and\n * `displayName` are excluded: they carry no tokens and are irrelevant to\n * the pre-flight check.\n *\n * This callback receives genai-native `Content[]`/`Content|string` — it\n * does NOT receive the library's `Message[]` shape and there is no\n * automatic conversion between the two (explicit seam, by design). Hosts\n * using genai-native content directly can wire this to a raw\n * `client.models.countTokens` call; hosts building from the library's\n * `Message[]` should call `@gullabs/core`'s `client.countTokens` rather\n * than expecting this callback to convert for them.\n */\n countTokens: (payload: {\n model: string\n contents?: Content[]\n systemInstruction?: Content | string\n }) => Promise<number>\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_SKEW_SECONDS = 30\nconst DEFAULT_EXTENSION_SECONDS = 3600\n\nasync function buildCachesClient(auth: AuthMaterial): Promise<GeminiCachesClientLike> {\n const { GoogleGenAI } = await import('@google/genai')\n\n const ai = new GoogleGenAI({ apiKey: requireApiKey(auth) })\n\n return {\n async create(params) {\n const result = await (\n ai.caches.create as (p: unknown) => Promise<{\n name?: string\n model?: string\n expireTime?: string\n }>\n )(params)\n return result\n },\n\n async update(params) {\n const result = await (\n ai.caches.update as (p: unknown) => Promise<{\n name?: string\n expireTime?: string\n }>\n )(params)\n return result\n },\n\n async delete(params) {\n await (ai.caches.delete as (p: unknown) => Promise<unknown>)(params)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// GoogleCacheStore\n// ---------------------------------------------------------------------------\n\ninterface EntryRecord {\n handle: GoogleCacheHandle\n /** Original ttlSeconds used to create this entry; used as extension default. */\n ttlSeconds: number\n}\n\n/**\n * Process-scoped helper for the Gemini Context Cache API.\n *\n * NOTE: `getOrCreate` reuse is PROCESS-SCOPED only. Entries survive only for\n * the lifetime of this `GoogleCacheStore` instance. Across restarts, new\n * caches will be created (and old ones will be server-evicted after their TTL).\n *\n * **Auth snapshot note:** this store captures the `AuthMaterial` at construction\n * time and memoizes a single SDK client from it (`clientPromise`). This is\n * correct and sufficient for static API keys. If refreshable credentials\n * (short-lived OAuth/STS tokens) are added in the future, this memoization is\n * the seam that will need rework: the cached client would hold stale credentials\n * for the lifetime of a long-lived store instance. At that point, the store\n * will need to either rebuild the client on each operation or accept a\n * credential-resolver callback rather than a plain `AuthMaterial` value.\n * See ADR-020 in DECISIONS.md.\n */\nexport class GoogleCacheStore {\n private readonly auth: AuthMaterial\n private readonly clientOverride: GeminiCachesClientLike | undefined\n private readonly coalesce: boolean\n private readonly skewMs: number\n private readonly onDeleteError: (cacheName: string, err: unknown) => void\n private readonly logger: Logger | undefined\n private readonly now: () => number\n private readonly preflight: GoogleCacheStoreOptions['preflight']\n\n /** Memoised client promise — built at most once per store instance. */\n private clientPromise: Promise<GeminiCachesClientLike> | undefined\n\n /** In-process cache of live handles, keyed by `${model}:${stableKey}`. */\n private readonly entries: Map<string, EntryRecord> = new Map()\n\n /** In-flight create promises when coalescing is enabled. */\n private readonly inflight: Map<string, Promise<GoogleCacheHandle>> = new Map()\n\n constructor(opts: GoogleCacheStoreOptions) {\n this.auth = opts.auth\n this.clientOverride = opts.client\n this.coalesce = opts.coalesce ?? false\n this.skewMs = (opts.expirySkewSeconds ?? DEFAULT_SKEW_SECONDS) * 1000\n this.logger = opts.logger\n this.onDeleteError =\n opts.onDeleteError ??\n ((cacheName, err) => {\n if (this.logger !== undefined) {\n this.logger.error(\n { name: cacheName, error: redactSecrets(classifyError(err).message) },\n 'gemini.cache.delete.failed',\n )\n } else {\n console.error(\n `[GoogleCacheStore] delete failed for \"${cacheName}\":`,\n redactSecrets(classifyError(err).message),\n )\n }\n })\n this.now = opts.now ?? (() => Date.now())\n this.preflight = opts.preflight\n }\n\n private getClient(): Promise<GeminiCachesClientLike> {\n if (this.clientOverride !== undefined) return Promise.resolve(this.clientOverride)\n if (this.clientPromise === undefined) {\n this.clientPromise = buildCachesClient(this.auth)\n }\n return this.clientPromise\n }\n\n private isLive(handle: GoogleCacheHandle): boolean {\n return handle.expiresAt.getTime() - this.skewMs > this.now()\n }\n\n /**\n * Create a new cached content resource.\n *\n * The `expiresAt` on the returned handle is computed from the server's\n * `expireTime` when available, with a local-clock fallback of\n * `now + ttlSeconds * 1000`.\n */\n async create(input: {\n model: string\n ttlSeconds: number\n contents?: Content[]\n systemInstruction?: Content | string\n displayName?: string\n }): Promise<GoogleCacheHandle> {\n if (this.preflight !== undefined) {\n const counted = await this.preflight.countTokens({\n model: input.model,\n ...(input.contents !== undefined ? { contents: input.contents } : {}),\n ...(input.systemInstruction !== undefined\n ? { systemInstruction: input.systemInstruction }\n : {}),\n })\n if (counted < this.preflight.minTokens) {\n throw new LlmError(\n `GoogleCacheStore preflight: counted ${counted} token(s), below the configured ` +\n `minimum of ${this.preflight.minTokens} for model \"${input.model}\".`,\n { kind: 'bad_request', retryable: false },\n )\n }\n }\n\n const client = await this.getClient()\n\n const config: {\n ttl: string\n contents?: Content[]\n systemInstruction?: Content | string\n displayName?: string\n } = { ttl: `${input.ttlSeconds}s` }\n\n if (input.contents !== undefined) config.contents = input.contents\n if (input.systemInstruction !== undefined)\n config.systemInstruction = input.systemInstruction\n if (input.displayName !== undefined) config.displayName = input.displayName\n\n let resp: { name?: string; model?: string; expireTime?: string }\n try {\n resp = await client.create({ model: input.model, config })\n } catch (e) {\n throw classifyError(e)\n }\n\n if (resp.name === undefined || resp.name.length === 0) {\n // Provider fault, not caller fault: the SDK call succeeded but the\n // payload is malformed — classify as a server error. NOT retryable:\n // create() is side-effecting and not idempotent — the provider may have\n // already created the cached content even though the payload carries no\n // name, so there is no handle to clean up and an automatic retry could\n // orphan/duplicate provider-side resources.\n throw new LlmError('Cache create response missing required field: name', {\n kind: 'server',\n retryable: false,\n provider: 'google',\n })\n }\n\n const fallbackExpiry = new Date(this.now() + input.ttlSeconds * 1000)\n const expiresAt =\n resp.expireTime !== undefined && resp.expireTime.length > 0\n ? new Date(resp.expireTime)\n : fallbackExpiry\n\n return {\n cacheName: resp.name,\n model: resp.model ?? input.model,\n expiresAt,\n }\n }\n\n /**\n * Return a live cached-content handle, creating one if none exists or the\n * cached entry has expired (accounting for skew).\n *\n * Reuse is PROCESS-SCOPED only — this store instance's in-memory map.\n *\n * When `coalesce` is enabled, concurrent calls for the same key share one\n * in-flight create.\n */\n async getOrCreate(\n key: CacheKey,\n factory: () => Promise<{\n ttlSeconds: number\n contents?: Content[]\n systemInstruction?: Content | string\n }>,\n ): Promise<GoogleCacheHandle> {\n const mapKey = `${key.model}:${key.stableKey}`\n\n // Return existing live entry if available.\n const existing = this.entries.get(mapKey)\n if (existing !== undefined && this.isLive(existing.handle)) {\n return existing.handle\n }\n\n // If coalescing, piggyback on an in-flight create for this key.\n if (this.coalesce) {\n const inFlight = this.inflight.get(mapKey)\n if (inFlight !== undefined) {\n return inFlight\n }\n }\n\n const doCreate = async (): Promise<GoogleCacheHandle> => {\n const factoryResult = await factory()\n const handle = await this.create({\n model: key.model,\n ttlSeconds: factoryResult.ttlSeconds,\n ...(factoryResult.contents !== undefined\n ? { contents: factoryResult.contents }\n : {}),\n ...(factoryResult.systemInstruction !== undefined\n ? { systemInstruction: factoryResult.systemInstruction }\n : {}),\n })\n this.entries.set(mapKey, { handle, ttlSeconds: factoryResult.ttlSeconds })\n return handle\n }\n\n if (this.coalesce) {\n const promise = doCreate().finally(() => {\n this.inflight.delete(mapKey)\n })\n this.inflight.set(mapKey, promise)\n return promise\n }\n\n return doCreate()\n }\n\n /**\n * Extend the cache TTL if it will expire within `thresholdSeconds`.\n *\n * Fail-open: if the update call throws, the original handle is returned\n * unchanged. This method NEVER throws.\n *\n * @param handle - Handle to potentially refresh.\n * @param opts.thresholdSeconds - Extend if expiry is within this many seconds.\n * Default 300.\n * @param opts.extensionSeconds - New TTL to set. Default: original TTL from\n * entries map, or 3600 s when the handle was not created via `getOrCreate`.\n */\n async refreshIfExpiringSoon(\n handle: GoogleCacheHandle,\n opts?: { thresholdSeconds?: number; extensionSeconds?: number },\n ): Promise<GoogleCacheHandle> {\n const thresholdMs = (opts?.thresholdSeconds ?? 300) * 1000\n\n if (handle.expiresAt.getTime() - this.now() > thresholdMs) {\n // Not near expiry — return unchanged.\n return handle\n }\n\n // Find the original ttl from the entries map for this handle.\n let extensionSeconds = opts?.extensionSeconds\n if (extensionSeconds === undefined) {\n for (const entry of this.entries.values()) {\n if (entry.handle.cacheName === handle.cacheName) {\n extensionSeconds = entry.ttlSeconds\n break\n }\n }\n extensionSeconds = extensionSeconds ?? DEFAULT_EXTENSION_SECONDS\n }\n\n try {\n const client = await this.getClient()\n const resp = await client.update({\n name: handle.cacheName,\n config: { ttl: `${extensionSeconds}s` },\n })\n\n const fallbackExpiry = new Date(this.now() + extensionSeconds * 1000)\n const newExpiresAt =\n resp.expireTime !== undefined && resp.expireTime.length > 0\n ? new Date(resp.expireTime)\n : fallbackExpiry\n\n const newHandle: GoogleCacheHandle = {\n cacheName: handle.cacheName,\n model: handle.model,\n expiresAt: newExpiresAt,\n }\n\n // Update the entries map entry if this handle is tracked.\n for (const [k, entry] of this.entries.entries()) {\n if (entry.handle.cacheName === handle.cacheName) {\n this.entries.set(k, { handle: newHandle, ttlSeconds: extensionSeconds })\n break\n }\n }\n\n return newHandle\n } catch {\n // Fail-open: return original handle unchanged.\n return handle\n }\n }\n\n /**\n * Delete a cached content resource.\n *\n * Errors are forwarded to `onDeleteError` and NOT rethrown.\n * The handle is removed from the in-process entries map regardless.\n */\n async delete(handle: GoogleCacheHandle): Promise<void> {\n // Always remove from local map, even if delete fails.\n for (const [k, entry] of this.entries.entries()) {\n if (entry.handle.cacheName === handle.cacheName) {\n this.entries.delete(k)\n break\n }\n }\n\n try {\n const client = await this.getClient()\n await client.delete({ name: handle.cacheName })\n } catch (err) {\n this.onDeleteError(handle.cacheName, err)\n }\n }\n}\n","/**\n * normalizeGroundingCitations — shape Gemini's raw groundingMetadata.groundingChunks\n * into a clean, deduplicated citation list.\n *\n * This is a caller-owned, optional post-processing convenience helper — NOT\n * request validation. It NEVER throws: any missing/malformed input yields `[]`.\n *\n * @module\n */\n\nexport interface Citation {\n url: string\n sourceName: string\n}\n\n/**\n * Derive a human-readable source name for a hostname, stripping a leading\n * `www.` label (e.g. `www.example.com` → `example.com`).\n */\nfunction hostnameFrom(url: URL): string {\n return url.hostname.startsWith('www.') ? url.hostname.slice(4) : url.hostname\n}\n\n/**\n * Shape a single grounding chunk into a `Citation`, or `undefined` if the\n * chunk is malformed (missing/invalid `web.uri`, or a `web.uri` that isn't\n * a well-formed http(s) URL with a hostname).\n *\n * Real SDK shape (`@google/genai` `GroundingChunk.web`): `{ uri, title, domain }`,\n * which in practice is always an http(s) URL. This helper only ever produces\n * http(s) citations — any other scheme (`javascript:`, `mailto:`, `data:`,\n * `file:`, etc.) is treated as a malformed chunk and skipped, since callers\n * may render `Citation.url` as a clickable link.\n *\n * `title`, when present, is the human-readable page title and is preferred\n * over the hostname as `sourceName`; the hostname (parsed from `uri`) is the\n * robust fallback when `title` is absent.\n */\nfunction toCitation(chunk: unknown): Citation | undefined {\n if (chunk === null || typeof chunk !== 'object') return undefined\n\n const web = (chunk as Record<string, unknown>)['web']\n if (web === null || typeof web !== 'object') return undefined\n\n const uri = (web as Record<string, unknown>)['uri']\n if (typeof uri !== 'string' || uri.length === 0) return undefined\n\n let parsed: URL\n try {\n parsed = new URL(uri)\n } catch {\n return undefined\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return undefined\n if (parsed.hostname === '') return undefined\n\n const title = (web as Record<string, unknown>)['title']\n const sourceName =\n typeof title === 'string' && title.length > 0 ? title : hostnameFrom(parsed)\n\n return { url: uri, sourceName }\n}\n\n/**\n * Shape Gemini's raw `groundingMetadata.groundingChunks` into a clean,\n * deduplicated citation list (deduplicated by URL, first-seen order).\n *\n * Accepts `unknown` since `groundingMetadata` arrives as raw JSON on\n * `providerMetadata` (see `docs/grounded-structured.md`). Never throws —\n * any missing/malformed top-level shape returns `[]`; a malformed individual\n * chunk is skipped rather than failing the whole array.\n */\nexport function normalizeGroundingCitations(groundingMetadata: unknown): Citation[] {\n if (groundingMetadata === null || typeof groundingMetadata !== 'object') return []\n\n const chunks = (groundingMetadata as Record<string, unknown>)['groundingChunks']\n if (!Array.isArray(chunks)) return []\n\n const seen = new Set<string>()\n const citations: Citation[] = []\n\n for (const chunk of chunks) {\n const citation = toCitation(chunk)\n if (citation === undefined) continue\n if (seen.has(citation.url)) continue\n seen.add(citation.url)\n citations.push(citation)\n }\n\n return citations\n}\n","/**\n * geminiContentToMessages — migration utility: `@google/genai` `Content[]` →\n * any-llm's normalized `Message[]`.\n *\n * For consumers moving hand-authored `@google/genai` prompts onto this\n * library. Uses `@google/genai` TYPES ONLY (no runtime SDK dependency — the\n * package is a peer dep, imported here with `import type`).\n *\n * Reject-don't-map: every genai `Content`/`Part` shape this utility cannot\n * losslessly represent in any-llm's normalized types throws a typed\n * `LlmError('bad_request')` naming the offending field or kind. Nothing is\n * ever silently dropped — that silent-loss failure mode is exactly what this\n * utility exists to eliminate for migrating callers.\n *\n * Validation is an exhaustive own-key scan: the set of defined keys on each\n * `Part` must be EXACTLY one of the recognized combinations (`['text']`,\n * `['inlineData']`, `['inlineData', 'mediaResolution']`, `['fileData']`,\n * `['fileData', 'mediaResolution']`). Any other key — including unknown\n * future SDK fields — or any combination outside that set throws. Keys whose\n * value is `undefined` are treated as absent (genai types are all-optional;\n * only defined values count).\n *\n * @module\n */\n\nimport { LlmError } from '@gullabs/core'\nimport type { Message, Part } from '@gullabs/core'\nimport type { Content, Part as GenaiPart } from '@google/genai'\n\n/**\n * Input accepted by {@link geminiContentToMessages}.\n */\nexport interface GeminiContentToMessagesInput {\n /** Raw `@google/genai` conversation history to convert. */\n contents: Content[]\n /**\n * Raw `@google/genai` system instruction — either the SDK's shorthand\n * plain string, or a full `Content` (only text parts supported; any\n * non-text part throws).\n */\n systemInstruction?: Content | string\n}\n\n/**\n * Output produced by {@link geminiContentToMessages}.\n */\nexport interface GeminiContentToMessagesResult {\n /** Concatenated system text, present only when `systemInstruction` was given. */\n system?: string\n /** Normalized any-llm messages, one per input `Content`. */\n messages: Message[]\n}\n\nfunction badRequest(message: string): LlmError {\n return new LlmError(message, { kind: 'bad_request', retryable: false })\n}\n\n/**\n * Own keys of `obj` whose value is defined. genai types are all-optional;\n * a key explicitly set to `undefined` is treated as absent.\n */\nfunction definedKeys(obj: object): string[] {\n return Object.keys(obj).filter(\n (key) => (obj as Record<string, unknown>)[key] !== undefined,\n )\n}\n\n// ---------------------------------------------------------------------------\n// mediaResolution mapping (Gemini PartMediaResolutionLevel → our normalized hint)\n// ---------------------------------------------------------------------------\n\nfunction mapMediaResolutionLevel(\n level: string,\n location: string,\n): 'low' | 'medium' | 'high' {\n switch (level) {\n case 'MEDIA_RESOLUTION_LOW':\n return 'low'\n case 'MEDIA_RESOLUTION_MEDIUM':\n return 'medium'\n case 'MEDIA_RESOLUTION_HIGH':\n return 'high'\n default:\n throw badRequest(\n `${location}: unsupported Part.mediaResolution.level \"${level}\" — any-llm only ` +\n 'supports MEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH.',\n )\n }\n}\n\n/**\n * Convert a defined `Part.mediaResolution` object to the normalized hint.\n *\n * Exhaustive own-key scan: the only representable key is `level`, and it must\n * carry a usable value. An explicit-but-empty `mediaResolution` (empty object,\n * or `level: undefined`) is ambiguous — the caller wrote something any-llm\n * cannot interpret — so it throws rather than being silently ignored.\n */\nfunction convertMediaResolution(\n mediaResolution: NonNullable<GenaiPart['mediaResolution']>,\n location: string,\n): 'low' | 'medium' | 'high' {\n const extraKeys = definedKeys(mediaResolution).filter((key) => key !== 'level')\n if (extraKeys.length > 0) {\n throw badRequest(\n `${location}: Part.mediaResolution keys [${extraKeys.join(', ')}] are not ` +\n 'representable in any-llm — only mediaResolution.level is supported.',\n )\n }\n\n if (mediaResolution.level === undefined) {\n throw badRequest(\n `${location}: Part.mediaResolution is present but carries no level — an ` +\n 'explicit-but-empty mediaResolution is ambiguous; set level or omit the field.',\n )\n }\n\n return mapMediaResolutionLevel(mediaResolution.level, location)\n}\n\n// ---------------------------------------------------------------------------\n// Part mapping (exhaustive own-key scan, reject-don't-map)\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a single `@google/genai` `Part` to its any-llm equivalent.\n *\n * The defined-key set of the part must be exactly one of: `['text']`,\n * `['inlineData']`, `['inlineData', 'mediaResolution']`, `['fileData']`,\n * `['fileData', 'mediaResolution']`. Anything else — function calling,\n * executable code, tool results, thought-flagged parts, `thoughtSignature`,\n * `videoMetadata`, `partMetadata`, unknown future SDK fields, `text`\n * combined with any other key, or a part with zero recognized fields —\n * throws `LlmError('bad_request')` naming the offending key(s).\n */\nfunction convertPart(part: GenaiPart, location: string): Part {\n const keys = definedKeys(part)\n const baseKeys = keys.filter(\n (key) => key === 'text' || key === 'inlineData' || key === 'fileData',\n )\n\n if (baseKeys.length === 0) {\n if (keys.length === 0) {\n throw badRequest(\n `${location}: Part has no recognized fields set (expected exactly one of ` +\n 'text, inlineData, fileData).',\n )\n }\n throw badRequest(\n `${location}: Part keys [${keys.join(', ')}] are not supported by ` +\n 'geminiContentToMessages — only text, inlineData, and fileData parts can be ' +\n 'represented in any-llm.',\n )\n }\n\n if (baseKeys.length > 1) {\n throw badRequest(\n `${location}: Part has more than one of text/inlineData/fileData set ` +\n `([${baseKeys.join(', ')}]) — geminiContentToMessages requires exactly one.`,\n )\n }\n\n const base = baseKeys[0] as 'text' | 'inlineData' | 'fileData'\n const extraKeys = keys.filter(\n (key) => key !== base && !(base !== 'text' && key === 'mediaResolution'),\n )\n if (extraKeys.length > 0) {\n throw badRequest(\n `${location}: Part keys [${extraKeys.join(', ')}] cannot be represented in ` +\n `any-llm alongside ${base} — nothing is silently dropped.`,\n )\n }\n\n if (part.text !== undefined) {\n return { kind: 'text', text: part.text }\n }\n\n if (part.inlineData !== undefined) {\n const inlineData = part.inlineData\n const inlineExtraKeys = definedKeys(inlineData).filter(\n (key) => key !== 'mimeType' && key !== 'data',\n )\n if (inlineExtraKeys.length > 0) {\n throw badRequest(\n `${location}: Part.inlineData keys [${inlineExtraKeys.join(', ')}] are not ` +\n 'representable in any-llm.',\n )\n }\n if (inlineData.mimeType === undefined) {\n throw badRequest(`${location}: Part.inlineData.mimeType is required.`)\n }\n if (inlineData.data === undefined) {\n throw badRequest(`${location}: Part.inlineData.data is required.`)\n }\n return {\n kind: 'inline-media',\n mimeType: inlineData.mimeType,\n data: inlineData.data,\n ...(part.mediaResolution !== undefined\n ? { mediaResolution: convertMediaResolution(part.mediaResolution, location) }\n : {}),\n }\n }\n\n if (part.fileData !== undefined) {\n const fileData = part.fileData\n const fileExtraKeys = definedKeys(fileData).filter(\n (key) => key !== 'fileUri' && key !== 'mimeType',\n )\n if (fileExtraKeys.length > 0) {\n throw badRequest(\n `${location}: Part.fileData keys [${fileExtraKeys.join(', ')}] are not ` +\n 'representable in any-llm.',\n )\n }\n if (fileData.fileUri === undefined) {\n throw badRequest(`${location}: Part.fileData.fileUri is required.`)\n }\n if (fileData.mimeType === undefined) {\n throw badRequest(`${location}: Part.fileData.mimeType is required.`)\n }\n return {\n kind: 'file-uri',\n uri: fileData.fileUri,\n mimeType: fileData.mimeType,\n ...(part.mediaResolution !== undefined\n ? { mediaResolution: convertMediaResolution(part.mediaResolution, location) }\n : {}),\n }\n }\n\n // Unreachable: baseKeys.length === 1 guarantees one of the branches above.\n throw badRequest(`${location}: Part has no recognized fields set.`)\n}\n\n// ---------------------------------------------------------------------------\n// Role mapping (no inference)\n// ---------------------------------------------------------------------------\n\nfunction convertRole(role: string | undefined, location: string): 'user' | 'assistant' {\n if (role === 'user') return 'user'\n if (role === 'model') return 'assistant'\n throw badRequest(\n `${location}: Content.role \"${String(role)}\" is not supported — only \"user\" and ` +\n '\"model\" are recognized. any-llm never infers a missing role.',\n )\n}\n\n// ---------------------------------------------------------------------------\n// systemInstruction mapping (NEVER inferred from contents)\n// ---------------------------------------------------------------------------\n\n/**\n * Concatenate the text parts of a `systemInstruction`.\n *\n * A string is used as-is. For a `Content`, the envelope's defined-key set\n * must be exactly `['parts']` (or empty) — `role`, or any unknown future\n * Content field, throws naming the key(s). Every part's defined-key set must\n * be exactly `['text']` — any other key (media, tool shapes, thought flags,\n * `mediaResolution`, unknown future fields) throws naming the offending\n * key(s). A `Content` with zero parts yields `''` (the caller explicitly\n * supplied a system instruction; the derivation is just empty).\n */\nfunction convertSystemInstruction(systemInstruction: Content | string): string {\n if (typeof systemInstruction === 'string') {\n return systemInstruction\n }\n\n const envelopeExtraKeys = definedKeys(systemInstruction).filter(\n (key) => key !== 'parts',\n )\n if (envelopeExtraKeys.length > 0) {\n throw badRequest(\n `systemInstruction: Content keys [${envelopeExtraKeys.join(', ')}] are not ` +\n 'supported on a system instruction — only parts is allowed.',\n )\n }\n\n const parts = systemInstruction.parts ?? []\n const textFragments: string[] = []\n\n parts.forEach((part, index) => {\n const keys = definedKeys(part)\n if (keys.length !== 1 || keys[0] !== 'text' || part.text === undefined) {\n const offending = keys.filter((key) => key !== 'text')\n const named = offending.length > 0 ? offending : keys\n throw badRequest(\n `systemInstruction.parts[${index}]: only text parts are allowed in a system ` +\n `instruction — part keys [${named.length > 0 ? named.join(', ') : 'none'}] ` +\n 'are not supported.',\n )\n }\n textFragments.push(part.text)\n })\n\n return textFragments.join('')\n}\n\n// ---------------------------------------------------------------------------\n// geminiContentToMessages\n// ---------------------------------------------------------------------------\n\n/**\n * Convert `@google/genai` `Content[]` / `Part[]` into any-llm's normalized\n * `{ system?, messages }` shape.\n *\n * A migration utility for callers moving hand-authored `@google/genai`\n * prompts onto any-llm. Exhaustive and reject-don't-map: any genai shape\n * that cannot be losslessly represented in any-llm's normalized types\n * throws `LlmError('bad_request')` naming the offending kind/field instead\n * of silently dropping it.\n *\n * `system` is derived ONLY from the explicit `systemInstruction` input —\n * never inferred from `contents`.\n *\n * @example\n * ```ts\n * // Before: hand-rolled @google/genai prompt\n * const contents: Content[] = [\n * { role: 'user', parts: [{ text: 'Describe this image.' }, { inlineData: { mimeType: 'image/png', data } }] },\n * { role: 'model', parts: [{ text: 'A red bicycle leaning against a brick wall.' }] },\n * ]\n *\n * // After: migrate onto any-llm's normalized shape in one call\n * import { geminiContentToMessages } from '@gullabs/google'\n *\n * const { system, messages } = geminiContentToMessages({\n * contents,\n * systemInstruction: 'You are a concise visual describer.',\n * })\n *\n * const result = await client.generate({ provider: 'google', model: 'gemini-2.5-pro', system, messages }, { auth })\n * ```\n */\nexport function geminiContentToMessages(\n input: GeminiContentToMessagesInput,\n): GeminiContentToMessagesResult {\n const system =\n input.systemInstruction !== undefined\n ? convertSystemInstruction(input.systemInstruction)\n : undefined\n\n const messages: Message[] = input.contents.map((content, contentIndex) => {\n const location = `contents[${contentIndex}]`\n const envelopeExtraKeys = definedKeys(content).filter(\n (key) => key !== 'role' && key !== 'parts',\n )\n if (envelopeExtraKeys.length > 0) {\n throw badRequest(\n `${location}: Content keys [${envelopeExtraKeys.join(', ')}] are not ` +\n 'supported — only role and parts are allowed.',\n )\n }\n const role = convertRole(content.role, location)\n const parts = (content.parts ?? []).map((part, partIndex) =>\n convertPart(part, `${location}.parts[${partIndex}]`),\n )\n return { role, parts }\n })\n\n return { ...(system !== undefined ? { system } : {}), messages }\n}\n"]}
|