UNPKG

@genkit-ai/anthropic

Version:

Genkit AI framework plugin for Anthropic APIs.

1 lines 22.9 kB
{"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":[]}