{"version":3,"file":"adapter.cjs","names":["#baseline"],"sources":["../../../../src/batteries/llm/bedrock_converse/adapter.ts"],"sourcesContent":["/**\n * Cross-environment executor adapter for AWS Bedrock's native Converse API.\n *\n * @module @nhtio/adk/batteries/llm/bedrock_converse/adapter\n *\n * @remarks\n * Targets `POST {baseURL}/model/{modelId}/converse` (and `/converse-stream` when `stream` is set)\n * over plain HTTPS with a Bedrock API key (`Authorization: Bearer ABSK…`). Deliberately NO AWS SDK\n * and no SigV4 signer: the battery must stay cross-environment and dependency-light, and a bearer\n * key removes the only reason to pull in a signer.\n *\n * Why a native battery rather than pointing `openai_chat_completions` at a Converse-backed gateway:\n * Converse is a content-BLOCK protocol with strict role alternation, a required `toolConfig`\n * whenever tool blocks appear, and tool results carried on `user` turns. A gateway must repair all\n * of that on your behalf — most notably by MERGING consecutive same-role turns — and that repair is\n * invisible in the response. For ordinary use it is fine; for anything that needs to know what the\n * VENDOR received it is fatal, because a gateway's fix is indistinguishable from vendor tolerance.\n * See the validation battery's \"Which API surface a rule applies to\" guide, and\n * {@link BedrockConverseAdapterOptions.alternationPolicy} for the `'reject'` escape hatch that lets\n * Converse's own error surface.\n *\n * Options layer as in every other battery: constructor baseline → `executor()` overrides →\n * per-iteration `ctx.stash.bedrockConverse`, 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 { Media, Message, Thought, Tokenizable, ToolCall } from '@nhtio/adk/common'\nimport {\n  DEFAULT_CONVERSE_BUCKET_ORDER,\n  buildConverseRequest,\n  extractConverseGeneration,\n  mediaToConverseImage,\n  renderConverseToolResult,\n  toolsToConverseTools,\n} from './helpers'\nimport {\n  E_BEDROCK_CONVERSE_CONTEXT_OVERFLOW,\n  E_INVALID_BEDROCK_CONVERSE_OPTIONS,\n  E_CONVERSE_ALTERNATION_VIOLATION,\n  E_CONVERSE_INVALID_TOOL_INPUT,\n  E_CONVERSE_MISSING_TOOL_CONFIG,\n  E_CONVERSE_REQUEST_FAILED,\n  E_CONVERSE_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 { TokenEncoding, TokenEncodingId } from '@nhtio/adk/types'\nimport type { DispatchExecutorFn, DispatchExecutorHelpers } from '@nhtio/adk/types'\nimport type { ArtifactTool, Memory, SpooledArtifact, Tool } from '@nhtio/adk/common'\nimport type {\n  BedrockConverseAdapterOptions,\n  BedrockConverseHelpers,\n  ConverseResponse,\n} from './types'\n\nconst nowIso = (): string => DateTime.now().toISO() ?? new Date().toISOString()\n\nconst DEFAULT_REGION = 'us-east-1'\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<BedrockConverseAdapterOptions> | undefined>\n): Partial<BedrockConverseAdapterOptions> => {\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<BedrockConverseAdapterOptions>\n}\n\n/** Fill every injectable helper, preferring the caller's override. */\nconst resolveHelpers = (\n  overrides: Partial<BedrockConverseHelpers> | undefined\n): BedrockConverseHelpers => {\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    toolsToConverseTools: pick('toolsToConverseTools', toolsToConverseTools),\n    renderConverseToolResult: pick('renderConverseToolResult', renderConverseToolResult),\n    buildConverseRequest: pick('buildConverseRequest', buildConverseRequest),\n  } as BedrockConverseHelpers\n}\n\n/**\n * Native Bedrock Converse executor adapter.\n *\n * @example\n * ```ts\n * const adapter = new BedrockConverseAdapter({\n *   model: 'us.amazon.nova-2-lite-v1:0',\n *   apiKey: process.env.AWS_BEARER_TOKEN_BEDROCK,\n *   region: 'us-east-1',\n * })\n * const runner = new TurnRunner({ executorCallback: adapter.executor(), ... })\n * ```\n */\nexport class BedrockConverseAdapter {\n  /** Per-iteration override key on `ctx.stash`. */\n  public static readonly STASH_KEY = 'bedrockConverse' as const\n\n  readonly #baseline: BedrockConverseAdapterOptions\n\n  /**\n   * @param options - Constructor-baseline options, re-validated each iteration after overrides merge.\n   * @throws {@link E_INVALID_BEDROCK_CONVERSE_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 isBedrockConverseAdapter(value: unknown): value is BedrockConverseAdapter {\n    return isInstanceOf(value, 'BedrockConverseAdapter', BedrockConverseAdapter)\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<BedrockConverseAdapterOptions>): DispatchExecutorFn {\n    const baseline = this.#baseline\n    const adapterClass = BedrockConverseAdapter\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      const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {}) as unknown\n      const stashOverrides = isObject(stashRaw)\n        ? (stashRaw as Partial<BedrockConverseAdapterOptions>)\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_BEDROCK_CONVERSE_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      // Converse wants toolResult.content[] blocks, so results render ahead of assembly.\n      const renderedToolCallResults = new Map<\n        ToolCall,\n        Array<{ text?: string; json?: Record<string, unknown> }>\n      >()\n      for (const tc of ctx.turnToolCalls) {\n        renderedToolCallResults.set(\n          tc,\n          await resolved.renderConverseToolResult({\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      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        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        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        if (tools.length > 0) {\n          // Tool DECLARATIONS: the Bedrock 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 safe 10% margin to cover JSON structural overhead and nested formatting.\n          const toolTokens = await estimateTokensOf(\n            new Tokenizable(JSON.stringify(resolved.toolsToConverseTools(tools))),\n            encoding\n          )\n          total += Math.ceil(toolTokens * 1.1)\n        }\n        if (total + (merged.maxTokens ?? 0) > merged.contextWindow) {\n          throw new E_BEDROCK_CONVERSE_CONTEXT_OVERFLOW([\n            total + (merged.maxTokens ?? 0),\n            merged.contextWindow,\n            encoding,\n          ])\n        }\n      }\n\n      const request = await resolved.buildConverseRequest({\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_CONVERSE_BUCKET_ORDER as never),\n        selfIdentity,\n        thoughtSurfacing: merged.thoughtSurfacing ?? 'all-self',\n        replayCompatibility: [],\n        alternationPolicy: merged.alternationPolicy ?? 'merge',\n        helpers: resolved,\n        decodeMedia: mediaToConverseImage,\n        unsupportedMediaPolicy: merged.unsupportedMediaPolicy,\n        warn,\n      })\n\n      const inferenceConfig = {\n        ...(merged.maxTokens !== undefined ? { maxTokens: merged.maxTokens } : {}),\n        ...(merged.temperature !== undefined ? { temperature: merged.temperature } : {}),\n        ...(merged.topP !== undefined ? { topP: merged.topP } : {}),\n        ...(merged.stopSequences ? { stopSequences: merged.stopSequences } : {}),\n      }\n      const body = {\n        ...request,\n        ...(merged.toolChoice && request.toolConfig\n          ? { toolConfig: { ...request.toolConfig, toolChoice: merged.toolChoice } }\n          : {}),\n        ...(Object.keys(inferenceConfig).length > 0 ? { inferenceConfig } : {}),\n        ...(merged.additionalModelRequestFields\n          ? { additionalModelRequestFields: merged.additionalModelRequestFields }\n          : {}),\n      }\n\n      // The EXACT body about to be POSTed. An ADK-control key — stripped from the wire request.\n      if (merged.onPromptAssembled) {\n        try {\n          merged.onPromptAssembled({\n            battery: 'bedrock_converse',\n            kind: 'request-body',\n            messages: body.messages,\n            tools: body.toolConfig?.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      const base = (\n        merged.baseURL ?? `https://bedrock-runtime.${merged.region ?? DEFAULT_REGION}.amazonaws.com`\n      ).replace(/\\/$/, '')\n      const action = merged.stream === true ? 'converse-stream' : 'converse'\n      // The model id contains ':' and '.', both legal in a path segment but worth encoding so a\n      // future id with a reserved character does not silently reshape the URL.\n      const url = `${base}/model/${encodeURIComponent(merged.model)}/${action}`\n      const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n      if (merged.apiKey) headers.Authorization = `Bearer ${merged.apiKey}`\n\n      const doFetch = merged.fetch ?? globalThis.fetch\n      let parsed: ConverseResponse\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 two Converse-specific rejections: both are actionable, and both otherwise\n          // arrive as an undifferentiated ValidationException.\n          if (/toolConfig/i.test(text)) {\n            ctx.nack(new E_CONVERSE_MISSING_TOOL_CONFIG([text.slice(0, 400)]))\n            return\n          }\n          if (/alternat|consecutive|must alternate/i.test(text)) {\n            ctx.nack(new E_CONVERSE_ALTERNATION_VIOLATION([text.slice(0, 400)]))\n            return\n          }\n          ctx.nack(new E_CONVERSE_REQUEST_FAILED([res.status, text.slice(0, 400)]))\n          return\n        }\n        parsed = JSON.parse(text) as ConverseResponse\n      } catch (err) {\n        ctx.nack(new E_CONVERSE_STREAM_ERROR([isError(err) ? err.message : String(err)]))\n        return\n      }\n\n      const { text, reasoning, toolUses, stopReason } = extractConverseGeneration(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 is consulted ONLY when the provider returned no structured tool use, so\n      // a native toolUse always wins over a parsed one.\n      const calls = toolUses.map((t) => ({ id: t.toolUseId, name: t.name, args: t.input }))\n      if (calls.length === 0 && merged.localToolCallParser !== undefined && text.length > 0) {\n        const parser = resolveToolCallParser(merged.localToolCallParser)\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        helpers.log.trace({\n          kind: 'converse-finish',\n          message: `generation ended with stopReason=${stopReason ?? 'unknown'} and no tool use`,\n          payload: { stopReason: stopReason ?? '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        // Resolve once at ingress; Converse sanitises only when rendering, so this preserves the\n        // filtered id consistently for reporting, persistence, and any spool key.\n        const callId = merged.toolCallIdFilter?.(call.id, ctx) ?? call.id\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_CONVERSE_INVALID_TOOL_INPUT([JSON.stringify(call.args)]).message\n          )\n          helpers.reportToolCall(callId, { tool: toolName, args: {} })\n          helpers.reportToolCall(callId, { results, isError: true, isComplete: true })\n          await ctx.storeToolCall(\n            new ToolCall({\n              id: callId,\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(callId, { tool: toolName, args: call.args })\n          helpers.reportToolCall(callId, { results, isError: true, isComplete: true })\n          await ctx.storeToolCall(\n            new ToolCall({\n              id: callId,\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(callId, { 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(callId, { results, isError: isToolError, isComplete: true })\n        await ctx.storeToolCall(\n          new ToolCall({\n            id: callId,\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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"}