{"version":3,"sources":["../../src/runner/beta.ts"],"sourcesContent":["/**\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BetaMessageStream } from '@anthropic-ai/sdk/lib/BetaMessageStream.js';\nimport type {\n  BetaContentBlock,\n  BetaImageBlockParam,\n  BetaMessage,\n  MessageCreateParams as BetaMessageCreateParams,\n  MessageCreateParamsNonStreaming as BetaMessageCreateParamsNonStreaming,\n  MessageCreateParamsStreaming as BetaMessageCreateParamsStreaming,\n  BetaMessageParam,\n  BetaRawMessageStreamEvent,\n  BetaRedactedThinkingBlockParam,\n  BetaRequestDocumentBlock,\n  BetaStopReason,\n  BetaTextBlockParam,\n  BetaThinkingBlockParam,\n  BetaTool,\n  BetaToolResultBlockParam,\n  BetaToolUseBlockParam,\n} from '@anthropic-ai/sdk/resources/beta/messages';\n\nimport type {\n  GenerateRequest,\n  GenerateResponseData,\n  ModelResponseData,\n  Part,\n} from 'genkit';\nimport { logger } from 'genkit/logging';\n\nimport {\n  AnthropicConfigSchema,\n  type AnthropicDocumentOptions,\n  type ClaudeRunnerParams,\n} from '../types.mjs';\nimport { checkModelName, removeUndefinedProperties } from '../utils.mjs';\nimport { BaseRunner } from './base.mjs';\nimport {\n  betaServerToolUseBlockToPart,\n  toBetaDocumentBlock,\n  unsupportedServerToolError,\n} from './converters/beta.mjs';\nimport {\n  citationsDeltaToPart,\n  redactedThinkingBlockToPart,\n  textBlockToPart,\n  textDeltaToPart,\n  thinkingBlockToPart,\n  thinkingDeltaToPart,\n  toolUseBlockToPart,\n  webSearchToolResultBlockToPart,\n} from './converters/shared.mjs';\nimport { RunnerTypes } from './types.mjs';\n\nconst BETA_APIS = [\n  // 'message-batches-2024-09-24',\n  // 'prompt-caching-2024-07-31',\n  // 'computer-use-2025-01-24',\n  // 'pdfs-2024-09-25',\n  // 'token-counting-2024-11-01',\n  // 'token-efficient-tools-2025-02-19',\n  // 'output-128k-2025-02-19',\n  'files-api-2025-04-14',\n  // 'mcp-client-2025-04-04',\n  // 'dev-full-thinking-2025-05-14',\n  // 'interleaved-thinking-2025-05-14',\n  // 'code-execution-2025-05-22',\n  // 'extended-cache-ttl-2025-04-11',\n  // 'context-1m-2025-08-07',\n  // 'context-management-2025-06-27',\n  // 'model-context-window-exceeded-2025-08-26',\n  // 'skills-2025-10-02',\n  'effort-2025-11-24',\n  // 'advanced-tool-use-2025-11-20',\n  'structured-outputs-2025-11-13',\n  'task-budgets-2026-03-13',\n];\n\n/**\n * Transforms a JSON schema to be compatible with Anthropic's structured output requirements.\n * Anthropic requires `additionalProperties: false` on all object types.\n * @see https://docs.anthropic.com/en/docs/build-with-claude/structured-outputs#json-schema-limitations\n */\nfunction toAnthropicSchema(\n  schema: Record<string, unknown>\n): Record<string, unknown> {\n  const out = structuredClone(schema);\n\n  // Remove $schema if present\n  delete out.$schema;\n\n  // Add additionalProperties: false to objects\n  if (out.type === 'object') {\n    out.additionalProperties = false;\n  }\n\n  // Recursively process nested objects\n  for (const key in out) {\n    if (typeof out[key] === 'object' && out[key] !== null) {\n      out[key] = toAnthropicSchema(out[key] as Record<string, unknown>);\n    }\n  }\n\n  return out;\n}\n\ninterface BetaRunnerTypes extends RunnerTypes {\n  Message: BetaMessage;\n  Stream: BetaMessageStream;\n  StreamEvent: BetaRawMessageStreamEvent;\n  RequestBody: BetaMessageCreateParamsNonStreaming;\n  StreamingRequestBody: BetaMessageCreateParamsStreaming;\n  Tool: BetaTool;\n  MessageParam: BetaMessageParam;\n  ToolResponseContent: BetaTextBlockParam | BetaImageBlockParam;\n  ContentBlockParam:\n    | BetaTextBlockParam\n    | BetaImageBlockParam\n    | BetaRequestDocumentBlock\n    | BetaToolUseBlockParam\n    | BetaToolResultBlockParam\n    | BetaThinkingBlockParam\n    | BetaRedactedThinkingBlockParam;\n}\n\n/**\n * Runner for the Anthropic Beta API.\n */\nexport class BetaRunner extends BaseRunner<BetaRunnerTypes> {\n  constructor(params: ClaudeRunnerParams) {\n    super(params);\n  }\n\n  /**\n   * Map a Genkit Part -> Anthropic beta content block param.\n   * Supports: text, images (base64 data URLs), PDFs (document source),\n   * tool_use (client tool request), tool_result (client tool response).\n   */\n  protected toAnthropicMessageContent(\n    part: Part\n  ):\n    | BetaTextBlockParam\n    | BetaImageBlockParam\n    | BetaRequestDocumentBlock\n    | BetaToolUseBlockParam\n    | BetaToolResultBlockParam\n    | BetaThinkingBlockParam\n    | BetaRedactedThinkingBlockParam {\n    if (part.reasoning) {\n      const signature = this.getThinkingSignature(part);\n      if (!signature) {\n        throw new Error(\n          'Anthropic thinking parts require a signature when sending back to the API. Preserve the `metadata.thoughtSignature` value from the original response.'\n        );\n      }\n      return {\n        type: 'thinking',\n        thinking: part.reasoning,\n        signature,\n      };\n    }\n\n    const redactedThinking = this.getRedactedThinkingData(part);\n    if (redactedThinking !== undefined) {\n      return {\n        type: 'redacted_thinking',\n        data: redactedThinking,\n      };\n    }\n\n    // Text\n    if (part.text) {\n      return { type: 'text', text: part.text };\n    }\n\n    // Custom document (for citations support)\n    if (part.custom?.anthropicDocument) {\n      return toBetaDocumentBlock(\n        part.custom.anthropicDocument as AnthropicDocumentOptions\n      );\n    }\n\n    // Media\n    if (part.media) {\n      if (part.media.contentType === 'anthropic/file') {\n        return {\n          type: 'document',\n          source: {\n            type: 'file',\n            file_id: part.media.url,\n          },\n        };\n      }\n\n      if (part.media.contentType === 'anthropic/image') {\n        return {\n          type: 'image',\n          source: {\n            type: 'file',\n            file_id: part.media.url,\n          },\n        };\n      }\n\n      if (part.media.contentType === 'application/pdf') {\n        return {\n          type: 'document',\n          source: this.toPdfDocumentSource(part.media),\n        };\n      }\n\n      const source = this.toImageSource(part.media);\n      if (source.kind === 'base64') {\n        return {\n          type: 'image',\n          source: {\n            type: 'base64',\n            data: source.data,\n            media_type: source.mediaType,\n          },\n        };\n      }\n      return {\n        type: 'image',\n        source: {\n          type: 'url',\n          url: source.url,\n        },\n      };\n    }\n\n    // Tool request (client tool use)\n    if (part.toolRequest) {\n      if (!part.toolRequest.ref) {\n        throw new Error(\n          `Tool request ref is required for Anthropic API. Part: ${JSON.stringify(\n            part.toolRequest\n          )}`\n        );\n      }\n      return {\n        type: 'tool_use',\n        id: part.toolRequest.ref,\n        name: part.toolRequest.name,\n        input: part.toolRequest.input,\n      };\n    }\n\n    // Tool response (client tool result)\n    if (part.toolResponse) {\n      if (!part.toolResponse.ref) {\n        throw new Error(\n          `Tool response ref is required for Anthropic API. Part: ${JSON.stringify(\n            part.toolResponse\n          )}`\n        );\n      }\n      const betaResult: BetaToolResultBlockParam = {\n        type: 'tool_result',\n        tool_use_id: part.toolResponse.ref,\n        content: [this.toAnthropicToolResponseContent(part)],\n      };\n      return betaResult;\n    }\n\n    throw new Error(\n      `Unsupported genkit part fields encountered for current message role: ${JSON.stringify(\n        part\n      )}.`\n    );\n  }\n\n  protected createMessage(\n    body: BetaMessageCreateParamsNonStreaming,\n    abortSignal: AbortSignal\n  ): Promise<BetaMessage> {\n    return this.client.beta.messages.create(body, { signal: abortSignal });\n  }\n\n  protected streamMessages(\n    body: BetaMessageCreateParamsStreaming,\n    abortSignal: AbortSignal\n  ): BetaMessageStream {\n    return this.client.beta.messages.stream(body, { signal: abortSignal });\n  }\n\n  /**\n   * Build non-streaming request body.\n   */\n  protected toAnthropicRequestBody(\n    modelName: string,\n    request: GenerateRequest<typeof AnthropicConfigSchema>\n  ): BetaMessageCreateParamsNonStreaming {\n    const { system, messages } = this.toAnthropicMessages(request.messages);\n    const mappedModelName =\n      request.config?.version ?? checkModelName(modelName);\n\n    const thinkingConfig = this.toAnthropicThinkingConfig(\n      request.config?.thinking\n    ) as BetaMessageCreateParams['thinking'] | undefined;\n\n    // Need to extract topP and topK from request.config to avoid duplicate properties being added to the body\n    // This happens because topP and topK have different property names (top_p and top_k) in the Anthropic API.\n    // Thinking is extracted separately to avoid type issues.\n    // ApiVersion is extracted separately as it's not a valid property for the Anthropic API.\n    const {\n      topP,\n      topK,\n      apiVersion: _1,\n      thinking: _2,\n      maxOutputTokens,\n      stopSequences,\n      version,\n      apiKey,\n      ...restConfig\n    } = request.config ?? {};\n\n    const body = {\n      model: mappedModelName,\n      max_tokens: maxOutputTokens ?? this.DEFAULT_MAX_OUTPUT_TOKENS,\n      messages,\n      system: system as BetaTextBlockParam[],\n      stop_sequences: stopSequences,\n      temperature: request.config?.temperature,\n      top_k: topK,\n      top_p: topP,\n      tool_choice: request.config?.tool_choice,\n      metadata: request.config?.metadata,\n      tools: request.tools?.map((tool) => this.toAnthropicTool(tool)),\n      thinking: thinkingConfig,\n      output_format: this.isStructuredOutputEnabled(request)\n        ? {\n            type: 'json_schema',\n            schema: toAnthropicSchema(request.output!.schema!),\n          }\n        : undefined,\n      betas: Array.isArray(request.config?.betas)\n        ? [...(request.config?.betas ?? [])]\n        : [...BETA_APIS],\n      ...restConfig,\n    } as BetaMessageCreateParamsNonStreaming;\n\n    return removeUndefinedProperties(body);\n  }\n\n  /**\n   * Build streaming request body.\n   */\n  protected toAnthropicStreamingRequestBody(\n    modelName: string,\n    request: GenerateRequest<typeof AnthropicConfigSchema>\n  ): BetaMessageCreateParamsStreaming {\n    const { system, messages } = this.toAnthropicMessages(request.messages);\n    const mappedModelName =\n      request.config?.version ?? checkModelName(modelName);\n\n    const thinkingConfig = this.toAnthropicThinkingConfig(\n      request.config?.thinking\n    ) as BetaMessageCreateParams['thinking'] | undefined;\n\n    // Need to extract topP and topK from request.config to avoid duplicate properties being added to the body\n    // This happens because topP and topK have different property names (top_p and top_k) in the Anthropic API.\n    // Thinking is extracted separately to avoid type issues.\n    // ApiVersion is extracted separately as it's not a valid property for the Anthropic API.\n    const {\n      topP,\n      topK,\n      apiVersion: _1,\n      thinking: _2,\n      maxOutputTokens,\n      stopSequences,\n      version,\n      apiKey,\n      ...restConfig\n    } = request.config ?? {};\n\n    const body = {\n      model: mappedModelName,\n      max_tokens: maxOutputTokens ?? this.DEFAULT_MAX_OUTPUT_TOKENS,\n      messages,\n      stream: true,\n      system: system as BetaTextBlockParam[],\n      stop_sequences: stopSequences,\n      temperature: request.config?.temperature,\n      top_k: topK,\n      top_p: topP,\n      tool_choice: request.config?.tool_choice,\n      metadata: request.config?.metadata,\n      tools: request.tools?.map((tool) => this.toAnthropicTool(tool)),\n      thinking: thinkingConfig,\n      output_format: this.isStructuredOutputEnabled(request)\n        ? {\n            type: 'json_schema',\n            schema: toAnthropicSchema(request.output!.schema!),\n          }\n        : undefined,\n      betas: Array.isArray(request.config?.betas)\n        ? [...(request.config?.betas ?? [])]\n        : [...BETA_APIS],\n      ...restConfig,\n    } as BetaMessageCreateParamsStreaming;\n\n    return removeUndefinedProperties(body);\n  }\n\n  protected toGenkitResponse(message: BetaMessage): GenerateResponseData {\n    return {\n      candidates: [\n        {\n          index: 0,\n          finishReason: this.fromBetaStopReason(message.stop_reason),\n          message: {\n            role: 'model',\n            content: message.content.map((block) =>\n              this.fromBetaContentBlock(block)\n            ),\n          },\n        },\n      ],\n      usage: {\n        inputTokens: message.usage.input_tokens,\n        outputTokens: message.usage.output_tokens,\n      },\n      custom: message,\n      raw: message,\n    };\n  }\n\n  protected toGenkitPart(event: BetaRawMessageStreamEvent): Part | undefined {\n    if (event.type === 'content_block_start') {\n      return this.fromBetaContentBlock(event.content_block);\n    }\n    if (event.type === 'content_block_delta') {\n      if (event.delta.type === 'text_delta') {\n        return textDeltaToPart(event.delta);\n      }\n      if (event.delta.type === 'thinking_delta') {\n        return thinkingDeltaToPart(event.delta);\n      }\n      if (event.delta.type === 'citations_delta') {\n        return citationsDeltaToPart(event.delta);\n      }\n      // input_json_delta - ignore\n      // signature_delta - ignore\n      return undefined;\n    }\n    return undefined;\n  }\n\n  private fromBetaContentBlock(contentBlock: BetaContentBlock): Part {\n    switch (contentBlock.type) {\n      case 'text':\n        return textBlockToPart(contentBlock);\n\n      case 'tool_use':\n        // Beta API may have undefined name, fallback to 'unknown_tool'\n        return toolUseBlockToPart({\n          id: contentBlock.id,\n          name: contentBlock.name ?? 'unknown_tool',\n          input: contentBlock.input,\n        });\n\n      case 'thinking':\n        return thinkingBlockToPart(contentBlock);\n\n      case 'redacted_thinking':\n        return redactedThinkingBlockToPart(contentBlock);\n\n      case 'server_tool_use':\n        return betaServerToolUseBlockToPart(contentBlock);\n\n      case 'web_search_tool_result':\n        return webSearchToolResultBlockToPart(contentBlock);\n\n      // Unsupported beta server tool types\n      case 'mcp_tool_use':\n      case 'mcp_tool_result':\n      case 'web_fetch_tool_result':\n      case 'code_execution_tool_result':\n      case 'bash_code_execution_tool_result':\n      case 'text_editor_code_execution_tool_result':\n      case 'container_upload':\n      case 'tool_search_tool_result':\n        throw new Error(unsupportedServerToolError(contentBlock.type));\n\n      default: {\n        const unknownType = (contentBlock as { type: string }).type;\n        logger.warn(\n          `Unexpected Anthropic beta content block type: ${unknownType}. Returning empty text. Content block: ${JSON.stringify(contentBlock)}`\n        );\n        return { text: '' };\n      }\n    }\n  }\n\n  private fromBetaStopReason(\n    reason: BetaStopReason | null\n  ): ModelResponseData['finishReason'] {\n    switch (reason) {\n      case 'max_tokens':\n      case 'model_context_window_exceeded':\n        return 'length';\n      case 'end_turn':\n      case 'stop_sequence':\n      case 'tool_use':\n      case 'pause_turn':\n        return 'stop';\n      case null:\n        return 'unknown';\n      case 'refusal':\n        return 'other';\n      default:\n        return 'other';\n    }\n  }\n\n  private isStructuredOutputEnabled(\n    request: GenerateRequest<typeof AnthropicConfigSchema>\n  ): boolean {\n    return !!(\n      request.output?.schema &&\n      request.output.constrained &&\n      request.output.format === 'json'\n    );\n  }\n}\n"],"mappings":"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","names":[]}