{"version":3,"file":"adapter.mjs","names":["#baseline"],"sources":["../../../../src/batteries/llm/gemini_generate_content/adapter.ts"],"sourcesContent":["/**\n * Cross-environment executor adapter for Google's native Gemini `generateContent` endpoint.\n *\n * @module @nhtio/adk/batteries/llm/gemini_generate_content/adapter\n *\n * @remarks\n * Targets `POST {baseURL}/models/{model}:generateContent` (and `:streamGenerateContent` when\n * `stream` is set) — Gemini's OWN wire format, not an OpenAI-compatible façade in front of it.\n *\n * That distinction is the reason this battery exists. Pointing `openai_chat_completions` at a\n * Gemini-compatible gateway means some translator, not the ADK, decides how your primitives become\n * `contents[]` — including whether a `thoughtSignature` is stamped, whether consecutive same-role\n * turns get merged, and how a tool result is correlated to its call. For ordinary use that is fine.\n * For anything that needs to reason about what the VENDOR actually received — an ordering guard, a\n * wire-shape audit, a bug report against Google — the translation has to be ours and observable.\n * See the validation battery's \"Which API surface a rule applies to\" guide.\n *\n * Options layer exactly as the other batteries: constructor baseline → `executor()` overrides →\n * per-iteration `ctx.stash.geminiGenerateContent`, re-validated each iteration.\n */\n\nimport { DateTime } from 'luxon'\nimport { sha256 } from 'js-sha256'\nimport { v6 as uuidv6 } from 'uuid'\nimport { validateOptions } from './validation'\nimport { normalizeToolName } from '../chat_common/helpers'\nimport { isError, isObject, isInstanceOf } from '@nhtio/adk/guards'\nimport { resolveToolCallParser } from '../chat_common/tool_parsers'\nimport { canonicalStringify } from '../../../lib/utils/canonical_json'\nimport { ArtifactTool, Media, Message, Thought, Tokenizable, ToolCall } from '@nhtio/adk/common'\nimport {\n  DEFAULT_GEMINI_BUCKET_ORDER,\n  buildGeminiRequest,\n  extractGeminiGeneration,\n  mediaToGeminiInlineData,\n  renderGeminiToolResult,\n  toolsToGeminiTools,\n} from './helpers'\nimport {\n  E_GEMINI_GENERATE_CONTENT_CONTEXT_OVERFLOW,\n  E_INVALID_GEMINI_GENERATE_CONTENT_OPTIONS,\n  E_GEMINI_INVALID_TOOL_CALL_ARGS,\n  E_GEMINI_MISSING_THOUGHT_SIGNATURE,\n  E_GEMINI_REQUEST_FAILED,\n  E_GEMINI_STREAM_ERROR,\n} from './exceptions'\nimport {\n  descriptionToChatCompletionsJsonSchema,\n  filterThoughts,\n  renderChatCompletionsSystemPrompt,\n  renderFirstPartyRetrievables,\n  renderMemories,\n  renderRetrievableSafetyDirective,\n  renderRetrievables,\n  renderStandingInstructions,\n  renderThirdPartyPrivateRetrievables,\n  renderThirdPartyPublicRetrievables,\n  renderThought,\n  renderTrustedContent,\n  renderUntrustedContent,\n} from '../chat_common/helpers'\nimport type { DispatchContext } from '@nhtio/adk/types'\nimport type { Memory, SpooledArtifact, Tool } from '@nhtio/adk/common'\nimport type { TokenEncoding, TokenEncodingId } from '@nhtio/adk/types'\nimport type { DispatchExecutorFn, DispatchExecutorHelpers } from '@nhtio/adk/types'\nimport type {\n  GeminiGenerateContentAdapterOptions,\n  GeminiGenerateContentHelpers,\n  GeminiGenerateContentResponse,\n} from './types'\n\nconst nowIso = (): string => DateTime.now().toISO() ?? new Date().toISOString()\n\nconst DEFAULT_BASE_URL = 'https://generativelanguage.googleapis.com/v1beta'\n/**\n * Google's documented portable sentinel for replaying tool history that did not originate from a\n * Gemini reasoning session. See the option's TSDoc for why this is the default.\n */\nconst DEFAULT_SENTINEL = 'skip_thought_signature_validator'\n\nconst estimateTokensOf = async (\n  value: { estimateTokens: (encoding: TokenEncoding) => number | Promise<number> },\n  encoding: TokenEncodingId\n): Promise<number> => Promise.resolve(value.estimateTokens(encoding as TokenEncoding))\n\nconst computeChecksum = (tool: string, args: Record<string, unknown>): string =>\n  sha256(`${tool}:${canonicalStringify(args)}`)\n\n/** Merge the three option layers, later winning. */\nconst mergeOptions = (\n  ...layers: Array<Partial<GeminiGenerateContentAdapterOptions> | undefined>\n): Partial<GeminiGenerateContentAdapterOptions> => {\n  const out: Record<string, unknown> = {}\n  for (const layer of layers) {\n    if (!layer) continue\n    for (const [k, v] of Object.entries(layer)) if (v !== undefined) out[k] = v\n  }\n  return out as Partial<GeminiGenerateContentAdapterOptions>\n}\n\n/** Fill every injectable helper, preferring the caller's override. */\nconst resolveHelpers = (\n  overrides: Partial<GeminiGenerateContentHelpers> | undefined\n): GeminiGenerateContentHelpers => {\n  const src = (overrides ?? {}) as Record<string, unknown>\n  const pick = <T>(key: string, fallback: T): T => (src[key] as T | undefined) ?? fallback\n  return {\n    descriptionToChatCompletionsJsonSchema: pick(\n      'descriptionToChatCompletionsJsonSchema',\n      descriptionToChatCompletionsJsonSchema\n    ),\n    renderUntrustedContent: pick('renderUntrustedContent', renderUntrustedContent),\n    renderTrustedContent: pick('renderTrustedContent', renderTrustedContent),\n    renderStandingInstructions: pick('renderStandingInstructions', renderStandingInstructions),\n    renderMemories: pick('renderMemories', renderMemories),\n    renderRetrievables: pick('renderRetrievables', renderRetrievables),\n    renderRetrievableSafetyDirective: pick(\n      'renderRetrievableSafetyDirective',\n      renderRetrievableSafetyDirective\n    ),\n    renderFirstPartyRetrievables: pick(\n      'renderFirstPartyRetrievables',\n      renderFirstPartyRetrievables\n    ),\n    renderThirdPartyPublicRetrievables: pick(\n      'renderThirdPartyPublicRetrievables',\n      renderThirdPartyPublicRetrievables\n    ),\n    renderThirdPartyPrivateRetrievables: pick(\n      'renderThirdPartyPrivateRetrievables',\n      renderThirdPartyPrivateRetrievables\n    ),\n    renderThought: pick('renderThought', renderThought),\n    filterThoughts: pick('filterThoughts', filterThoughts),\n    renderChatCompletionsSystemPrompt: pick(\n      'renderChatCompletionsSystemPrompt',\n      renderChatCompletionsSystemPrompt\n    ),\n    toolsToGeminiTools: pick('toolsToGeminiTools', toolsToGeminiTools),\n    renderGeminiToolResult: pick('renderGeminiToolResult', renderGeminiToolResult),\n    buildGeminiRequest: pick('buildGeminiRequest', buildGeminiRequest),\n  } as GeminiGenerateContentHelpers\n}\n\n/**\n * Native Gemini `generateContent` executor adapter.\n *\n * @example\n * ```ts\n * const adapter = new GeminiGenerateContentAdapter({\n *   model: 'gemini-2.5-flash-lite',\n *   apiKey: process.env.GEMINI_API_KEY,\n * })\n * const runner = new TurnRunner({ executorCallback: adapter.executor(), ... })\n * ```\n */\nexport class GeminiGenerateContentAdapter {\n  /** Per-iteration override key on `ctx.stash`. */\n  public static readonly STASH_KEY = 'geminiGenerateContent' as const\n\n  readonly #baseline: GeminiGenerateContentAdapterOptions\n\n  /**\n   * @param options - Constructor-baseline options, re-validated每 iteration after overrides merge.\n   * @throws {@link E_INVALID_GEMINI_GENERATE_CONTENT_OPTIONS} when `options` is invalid.\n   */\n  constructor(options: unknown) {\n    this.#baseline = validateOptions(options)\n  }\n\n  /** Narrowing guard for cross-realm instances. */\n  public static isGeminiGenerateContentAdapter(\n    value: unknown\n  ): value is GeminiGenerateContentAdapter {\n    return isInstanceOf(value, 'GeminiGenerateContentAdapter', GeminiGenerateContentAdapter)\n  }\n\n  /**\n   * Build a {@link DispatchExecutorFn} bound to the baseline plus optional executor-scope overrides.\n   *\n   * @param overrides - Higher precedence than the baseline, lower than `ctx.stash`.\n   */\n  executor(overrides?: Partial<GeminiGenerateContentAdapterOptions>): DispatchExecutorFn {\n    const baseline = this.#baseline\n    const adapterClass = GeminiGenerateContentAdapter\n    return async (ctx: DispatchContext, helpers: DispatchExecutorHelpers): Promise<void> => {\n      const warn = (message: string): void => {\n        helpers.log.warn({ kind: 'helper-warning', message })\n      }\n\n      // ── merge & validate ────────────────────────────────────────────────\n      const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {}) as unknown\n      const stashOverrides = isObject(stashRaw)\n        ? (stashRaw as Partial<GeminiGenerateContentAdapterOptions>)\n        : {}\n      const merged = validateOptions(mergeOptions(baseline, overrides, stashOverrides))\n      if (\n        merged.tokenEncoding !== undefined &&\n        merged.tokenEncoding !== null &&\n        merged.contextWindow === undefined\n      ) {\n        throw new E_INVALID_GEMINI_GENERATE_CONTENT_OPTIONS([\n          'tokenEncoding is non-null but contextWindow is undefined',\n        ])\n      }\n      const resolved = resolveHelpers(merged.helpers)\n      const selfIdentity = 'assistant'\n      const dispatchStreamId = uuidv6()\n\n      // ── pre-render tool results ─────────────────────────────────────────\n      // Gemini wants an OBJECT in functionResponse.response, so results are rendered ahead of\n      // assembly and keyed by the live ToolCall instance. Keying by id lets a duplicate id\n      // overwrite an earlier result before assembly.\n      const renderedToolCallResults = new Map<ToolCall, Record<string, unknown>>()\n      for (const tc of ctx.turnToolCalls) {\n        renderedToolCallResults.set(\n          tc,\n          await resolved.renderGeminiToolResult({\n            toolCall: tc,\n            results: tc.results as never,\n            tool: ctx.tools.get(tc.tool) as Tool | ArtifactTool | undefined,\n            renderUntrustedContent: resolved.renderUntrustedContent,\n            renderTrustedContent: resolved.renderTrustedContent,\n            unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n            warn,\n          })\n        )\n      }\n\n      // ── context window enforcement ───────────────────────────────────────\n      if (\n        merged.tokenEncoding !== undefined &&\n        merged.tokenEncoding !== null &&\n        merged.contextWindow !== undefined\n      ) {\n        const encoding = merged.tokenEncoding\n        let total = await estimateTokensOf(ctx.systemPrompt, encoding)\n        for (const value of ctx.standingInstructions)\n          total += await estimateTokensOf(value, encoding)\n        for (const memory of ctx.turnMemories as Set<Memory>) {\n          total += await estimateTokensOf(memory.content, encoding)\n        }\n        for (const retrievable of ctx.turnRetrievables) {\n          total += await estimateTokensOf(\n            retrievable.inline\n              ? (retrievable.content as any)\n              : new Tokenizable(`[Reference available: ${retrievable.id}]`),\n            encoding\n          )\n        }\n        for (const message of ctx.turnMessages) {\n          if (message.content !== undefined)\n            total += await estimateTokensOf(message.content, encoding)\n        }\n        for (const thought of ctx.turnThoughts)\n          total += await estimateTokensOf(thought.content, encoding)\n        for (const result of renderedToolCallResults.values()) {\n          total += await estimateTokensOf(new Tokenizable(JSON.stringify(result)), encoding)\n        }\n        const tools = ctx.tools.visible()\n        // Tool DECLARATIONS: the Gemini wire ships tools as an array, which the PROVIDER\n        // serializes server-side into the model's own format. Tally the tokens of the wire\n        // tools JSON (`JSON.stringify`) as an honest FLOOR — a truthful lower bound. We add\n        // a highly conservative 50% margin to cover JSON structural overhead and nested formatting.\n        if (tools.length > 0) {\n          const toolTokens = await estimateTokensOf(\n            new Tokenizable(JSON.stringify(resolved.toolsToGeminiTools(tools))),\n            encoding\n          )\n          total += Math.ceil(toolTokens * 1.5)\n        }\n        if (total + (merged.maxOutputTokens ?? 0) > merged.contextWindow) {\n          throw new E_GEMINI_GENERATE_CONTENT_CONTEXT_OVERFLOW([\n            total + (merged.maxOutputTokens ?? 0),\n            merged.contextWindow,\n            encoding,\n          ])\n        }\n      }\n\n      // ── assemble ────────────────────────────────────────────────────────\n      const request = await resolved.buildGeminiRequest({\n        systemPrompt: ctx.systemPrompt,\n        standingInstructions: ctx.standingInstructions,\n        memories: ctx.turnMemories,\n        retrievables: ctx.turnRetrievables,\n        messages: ctx.turnMessages,\n        thoughts: ctx.turnThoughts,\n        toolCalls: ctx.turnToolCalls,\n        tools: ctx.tools,\n        renderedToolCallResults,\n        bucketOrder: merged.bucketOrder ?? (DEFAULT_GEMINI_BUCKET_ORDER as never),\n        selfIdentity,\n        thoughtSurfacing: merged.thoughtSurfacing ?? 'all-self',\n        replayCompatibility: [],\n        thoughtSignatureSentinel:\n          merged.thoughtSignatureSentinel === undefined\n            ? DEFAULT_SENTINEL\n            : merged.thoughtSignatureSentinel,\n        helpers: resolved,\n        decodeMedia: mediaToGeminiInlineData,\n        unsupportedMediaPolicy: merged.unsupportedMediaPolicy,\n        warn,\n      })\n\n      const generationConfig = {\n        ...(merged.maxOutputTokens !== undefined\n          ? { maxOutputTokens: merged.maxOutputTokens }\n          : {}),\n        ...(merged.temperature !== undefined ? { temperature: merged.temperature } : {}),\n        ...(merged.topP !== undefined ? { topP: merged.topP } : {}),\n        ...(merged.topK !== undefined ? { topK: merged.topK } : {}),\n        ...(merged.stopSequences ? { stopSequences: merged.stopSequences } : {}),\n        ...(merged.thinkingConfig ? { thinkingConfig: merged.thinkingConfig } : {}),\n      }\n      const body = {\n        ...request,\n        ...(Object.keys(generationConfig).length > 0 ? { generationConfig } : {}),\n        ...(merged.toolConfig ? { toolConfig: merged.toolConfig } : {}),\n        ...(merged.safetySettings ? { safetySettings: merged.safetySettings } : {}),\n      }\n\n      // Prompt-assembled tap: the EXACT body about to be POSTed. An ADK-control key — stripped\n      // from the wire request, never sent. Observer errors are swallowed so a tap can never\n      // corrupt a generation.\n      if (merged.onPromptAssembled) {\n        try {\n          merged.onPromptAssembled({\n            battery: 'gemini_generate_content',\n            kind: 'request-body',\n            messages: body.contents,\n            tools: body.tools,\n            requestBody: body,\n            streamed: merged.stream === true,\n            streamId: dispatchStreamId,\n          })\n        } catch {\n          /* observer errors are non-fatal */\n        }\n      }\n\n      // ── dispatch ────────────────────────────────────────────────────────\n      const base = (merged.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n      const action = merged.stream === true ? 'streamGenerateContent' : 'generateContent'\n      const url = `${base}/models/${merged.model}:${action}`\n      const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n      if (merged.apiKey) {\n        // Google's own endpoint wants x-goog-api-key; several gateways in front of it accept only\n        // Authorization, hence the switch rather than sending both.\n        if (merged.useBearerAuth === true) headers.Authorization = `Bearer ${merged.apiKey}`\n        else headers['x-goog-api-key'] = merged.apiKey\n      }\n\n      const doFetch = merged.fetch ?? globalThis.fetch\n      let parsed: GeminiGenerateContentResponse\n      try {\n        const res = await doFetch(url, {\n          method: 'POST',\n          headers,\n          body: JSON.stringify(body),\n          signal: merged.timeoutMs ? AbortSignal.timeout(merged.timeoutMs) : ctx.abortSignal,\n        })\n        const text = await res.text()\n        if (!res.ok) {\n          // Classify the vendor's own signature rejection separately — it is actionable, and\n          // Gemini's generic INVALID_ARGUMENT body gives a caller nothing to act on.\n          if (/thought_signature|thoughtSignature/i.test(text)) {\n            ctx.nack(new E_GEMINI_MISSING_THOUGHT_SIGNATURE([text.slice(0, 400)]))\n            return\n          }\n          ctx.nack(new E_GEMINI_REQUEST_FAILED([res.status, text.slice(0, 400)]))\n          return\n        }\n        parsed = JSON.parse(text) as GeminiGenerateContentResponse\n      } catch (err) {\n        ctx.nack(new E_GEMINI_STREAM_ERROR([isError(err) ? err.message : String(err)]))\n        return\n      }\n\n      // ── interpret ───────────────────────────────────────────────────────\n      const { text, reasoning, functionCalls, finishReason } = extractGeminiGeneration(parsed)\n      const responseId = uuidv6()\n\n      if (text.length > 0) {\n        const messageId = `${responseId}:message`\n        helpers.reportMessage(messageId, text, { isComplete: true })\n        await ctx.storeMessage(\n          new Message({\n            id: messageId,\n            role: 'assistant',\n            content: text,\n            identity: selfIdentity,\n            createdAt: nowIso(),\n            updatedAt: nowIso(),\n          })\n        )\n      }\n      if (reasoning.length > 0) {\n        const thoughtId = `${responseId}:thought`\n        helpers.reportThought(thoughtId, reasoning, { isComplete: true })\n        await ctx.storeThought(\n          new Thought({\n            id: thoughtId,\n            content: reasoning,\n            identity: selfIdentity,\n            createdAt: nowIso(),\n            updatedAt: nowIso(),\n          })\n        )\n      }\n\n      // Fallback recovery: only consulted when the provider returned NO structured calls, so a\n      // native functionCall always wins over a parsed one.\n      let calls = functionCalls.map((c) => ({ id: uuidv6(), name: c.name, args: c.args }))\n      if (calls.length === 0 && merged.localToolCallParser !== undefined && text.length > 0) {\n        const parser = resolveToolCallParser(merged.localToolCallParser)\n        // The parser returns { calls, cleanedText } — not an iterable of calls — and the\n        // second argument carries the tool names actually offered this turn so a parser can\n        // reject a hallucinated name rather than manufacture a call for it.\n        const recovered = parser(text, { toolNames: ctx.tools.all().map((t) => t.name) })\n        for (const call of recovered.calls) {\n          calls.push({\n            id: uuidv6(),\n            name: call.name,\n            args: (call.arguments ?? {}) as Record<string, unknown>,\n          })\n        }\n      }\n\n      if (merged.onRawGeneration) {\n        try {\n          merged.onRawGeneration({\n            rawText: text,\n            cleanedText: text,\n            reasoning: reasoning.length > 0 ? [reasoning] : [],\n            toolCalls: calls.map((c) => ({ name: c.name, arguments: c.args as never })),\n            streamed: merged.stream === true,\n            streamId: dispatchStreamId,\n          })\n        } catch {\n          /* observer errors are non-fatal */\n        }\n      }\n\n      if (calls.length === 0) {\n        // `finishReason` is recorded for the caller; an empty generation is NOT an error here —\n        // it is a real vendor outcome and the runner decides what to do with it.\n        helpers.log.trace({\n          kind: 'gemini-finish',\n          message: `generation ended with finishReason=${finishReason ?? 'unknown'} and no function calls`,\n          payload: { finishReason: finishReason ?? 'unknown' },\n        })\n        if (merged.autoAck) ctx.ack()\n        return\n      }\n\n      for (const call of calls) {\n        if (ctx.abortSignal.aborted) return\n        const toolName = normalizeToolName(call.name)\n        const tool = ctx.tools.get(toolName) as Tool | ArtifactTool | undefined\n        const completedAt = nowIso()\n\n        if (!isObject(call.args)) {\n          const results = new Tokenizable(\n            new E_GEMINI_INVALID_TOOL_CALL_ARGS([JSON.stringify(call.args)]).message\n          )\n          helpers.reportToolCall(call.id, { tool: toolName, args: {} })\n          helpers.reportToolCall(call.id, { results, isError: true, isComplete: true })\n          await ctx.storeToolCall(\n            new ToolCall({\n              id: call.id,\n              tool: toolName,\n              args: {},\n              checksum: computeChecksum(toolName, {}),\n              isComplete: true,\n              isError: true,\n              results,\n              createdAt: completedAt,\n              updatedAt: completedAt,\n              completedAt,\n            })\n          )\n          continue\n        }\n\n        if (!tool) {\n          const available = ctx.tools\n            .all()\n            .map((t) => t.name)\n            .sort()\n          const results = new Tokenizable(\n            available.length > 0\n              ? `Tool not found: ${toolName}. Available tools: ${available.join(', ')}.`\n              : `Tool not found: ${toolName}. No tools are available this turn.`\n          )\n          helpers.reportToolCall(call.id, { tool: toolName, args: call.args })\n          helpers.reportToolCall(call.id, { results, isError: true, isComplete: true })\n          await ctx.storeToolCall(\n            new ToolCall({\n              id: call.id,\n              tool: toolName,\n              args: call.args,\n              checksum: computeChecksum(toolName, call.args),\n              isComplete: true,\n              isError: true,\n              results,\n              createdAt: completedAt,\n              updatedAt: completedAt,\n              completedAt,\n            })\n          )\n          continue\n        }\n\n        helpers.reportToolCall(call.id, { tool: tool.name, args: call.args })\n        let results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[] =\n          new Tokenizable('')\n        let isToolError = false\n        try {\n          const raw = await tool.executor(ctx)(call.args)\n          results = Tokenizable.isTokenizable(raw)\n            ? raw\n            : new Tokenizable(typeof raw === 'string' ? raw : JSON.stringify(raw ?? ''))\n        } catch (err) {\n          isToolError = true\n          results = new Tokenizable(isError(err) ? err.message : String(err))\n        }\n        const finishedAt = nowIso()\n        helpers.reportToolCall(call.id, { results, isError: isToolError, isComplete: true })\n        await ctx.storeToolCall(\n          new ToolCall({\n            id: call.id,\n            tool: tool.name,\n            args: call.args,\n            checksum: computeChecksum(tool.name, call.args),\n            isComplete: true,\n            isError: isToolError,\n            results,\n            createdAt: finishedAt,\n            updatedAt: finishedAt,\n            completedAt: finishedAt,\n          })\n        )\n      }\n    }\n  }\n}\n"],"mappings":"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"}