@genkit-ai/vertexai
Version:
Genkit AI framework plugin for Google Cloud Vertex AI APIs including Gemini APIs, Imagen, and more.
1 lines • 24.3 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/modelgarden/v2/anthropic.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 type {\n ContentBlock as AnthropicContent,\n ImageBlockParam,\n Message,\n MessageCreateParamsBase,\n MessageParam,\n TextBlock,\n TextBlockParam,\n TextDelta,\n ThinkingBlock,\n ThinkingBlockParam,\n Tool,\n ToolResultBlockParam,\n ToolUseBlock,\n ToolUseBlockParam,\n} from '@anthropic-ai/sdk/resources/messages';\nimport { AnthropicVertex } from '@anthropic-ai/vertex-sdk';\nimport {\n ActionMetadata,\n z,\n type GenerateRequest,\n type Part as GenkitPart,\n type MessageData,\n type ModelReference,\n type ModelResponseData,\n type Part,\n} from 'genkit';\nimport {\n GenerationCommonConfigSchema,\n ModelInfo,\n getBasicUsageStats,\n modelRef,\n type ModelAction,\n} from 'genkit/model';\nimport { model as pluginModel } from 'genkit/plugin';\nimport { getGenkitClientHeader } from '../../common/index.mjs';\nimport { PluginOptions } from './types.mjs';\nimport { checkModelName } from './utils.mjs';\n\nexport const ThinkingConfigSchema = z\n .object({\n enabled: z.boolean().optional(),\n budgetTokens: z.number().min(1_024).optional(),\n adaptive: z.boolean().optional(),\n display: z.enum(['summarized', 'omitted']).optional(),\n })\n .passthrough()\n .superRefine((value, ctx) => {\n if (value.enabled && value.adaptive) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['adaptive'],\n message:\n 'Cannot use both enabled and adaptive thinking modes simultaneously',\n });\n }\n\n if (value.enabled) {\n if (value.budgetTokens === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['budgetTokens'],\n message: 'budgetTokens is required when thinking is enabled',\n });\n } else if (!Number.isInteger(value.budgetTokens)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['budgetTokens'],\n message: 'budgetTokens must be an integer',\n });\n }\n }\n });\n\nexport const AnthropicConfigSchema = GenerationCommonConfigSchema.extend({\n location: z.string().optional(),\n thinking: ThinkingConfigSchema.optional().describe(\n 'The thinking configuration to use for the request. Thinking is a feature that allows the model to think about the request and provide a better response.'\n ),\n output_config: z\n .object({\n effort: z.enum(['low', 'medium', 'high', 'xhigh']).optional(),\n })\n .passthrough()\n .describe(\n 'Configuration for output generation, such as setting the effort parameter.'\n )\n .optional(),\n}).passthrough();\nexport type AnthropicConfigSchemaType = typeof AnthropicConfigSchema;\nexport type AnthropicConfig = z.infer<AnthropicConfigSchemaType>;\n\n// All the config schema types\ntype ConfigSchemaType = AnthropicConfigSchemaType;\n\nfunction commonRef(\n name: string,\n info?: ModelInfo,\n configSchema: ConfigSchemaType = AnthropicConfigSchema\n): ModelReference<ConfigSchemaType> {\n return modelRef({\n name: `vertex-model-garden/${name}`,\n configSchema,\n info: info ?? {\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n systemRole: true,\n output: ['text'],\n },\n },\n });\n}\n\nexport const GENERIC_MODEL = commonRef('anthropic');\n\nexport const KNOWN_MODELS = {\n 'claude-opus-4-7': commonRef('claude-opus-4-7'),\n 'claude-sonnet-4-6': commonRef('claude-sonnet-4-6'),\n 'claude-opus-4-6': commonRef('claude-opus-4-6'),\n 'claude-haiku-4-5@20251001': commonRef('claude-haiku-4-5@20251001'),\n 'claude-sonnet-4-5@20250929': commonRef('claude-sonnet-4-5@20250929'),\n 'claude-sonnet-4@20250514': commonRef('claude-sonnet-4@20250514'),\n 'claude-opus-4-5@20251101': commonRef('claude-opus-4-5@20251101'),\n 'claude-opus-4-1@20250805': commonRef('claude-opus-4-1@20250805'),\n 'claude-opus-4@20250514': commonRef('claude-opus-4@20250514'),\n};\nexport type KnownModels = keyof typeof KNOWN_MODELS;\nexport type AnthropicModelName = `claude-${string}`;\nexport function isAnthropicModelName(\n value?: string\n): value is AnthropicModelName {\n return !!value?.startsWith('claude-');\n}\n\nexport function model(\n version: string,\n options: AnthropicConfig = {}\n): ModelReference<AnthropicConfigSchemaType> {\n const name = checkModelName(version);\n\n return modelRef({\n name: `vertex-model-garden/${name}`,\n config: options,\n configSchema: AnthropicConfigSchema,\n info: {\n ...GENERIC_MODEL.info,\n },\n });\n}\n\nexport interface ClientOptions {\n location: string; // e.g. 'us-central1' or 'global'\n projectId: string;\n}\n\nexport function listActions(clientOptions: ClientOptions): ActionMetadata[] {\n // TODO: figure out where to get the list of models.\n return [];\n}\n\nexport function listKnownModels(\n clientOptions: ClientOptions,\n pluginOptions?: PluginOptions\n) {\n return Object.keys(KNOWN_MODELS).map((name) =>\n defineModel(name, clientOptions, pluginOptions)\n );\n}\n\nexport function defineModel(\n name: string,\n clientOptions: ClientOptions,\n pluginOptions?: PluginOptions\n): ModelAction {\n const clients: Record<string, AnthropicVertex> = {};\n const clientFactory = (region: string): AnthropicVertex => {\n if (!clients[region]) {\n clients[region] = new AnthropicVertex({\n region: region,\n projectId: clientOptions.projectId,\n defaultHeaders: {\n 'X-Goog-Api-Client': getGenkitClientHeader(),\n },\n });\n }\n return clients[region];\n };\n const ref = model(name);\n\n return pluginModel(\n {\n name: ref.name,\n ...ref.info,\n configSchema: ref.configSchema,\n },\n async (request, { streamingRequested, sendChunk }) => {\n const client = clientFactory(\n request.config?.location || clientOptions.location\n );\n const modelVersion = checkModelName(ref.name);\n const anthropicRequest = toAnthropicRequest(modelVersion, request);\n if (!streamingRequested) {\n // Non-streaming\n const response = await client.messages.create({\n ...anthropicRequest,\n stream: false,\n });\n return fromAnthropicResponse(request, response);\n } else {\n // Streaming\n const stream = await client.messages.stream(anthropicRequest);\n for await (const event of stream) {\n if (event.type === 'content_block_delta') {\n sendChunk({\n index: 0,\n content: [\n {\n text: (event.delta as TextDelta).text,\n },\n ],\n });\n }\n }\n return fromAnthropicResponse(request, await stream.finalMessage());\n }\n }\n );\n}\n\nexport function toAnthropicRequest(\n model: string,\n input: GenerateRequest<typeof AnthropicConfigSchema>\n): MessageCreateParamsBase {\n let system: string | undefined = undefined;\n const messages: MessageParam[] = [];\n for (const msg of input.messages) {\n if (msg.role === 'system') {\n system = msg.content\n .map((c) => {\n if (!c.text) {\n throw new Error(\n 'Only text context is supported for system messages.'\n );\n }\n return c.text;\n })\n .join();\n }\n // If the last message is a tool response, we need to add a user message.\n // https://docs.anthropic.com/en/docs/build-with-claude/tool-use#handling-tool-use-and-tool-result-content-blocks\n else if (msg.content[msg.content.length - 1].toolResponse) {\n messages.push({\n role: 'user',\n content: toAnthropicContent(msg.content),\n });\n } else {\n messages.push({\n role: toAnthropicRole(msg.role),\n content: toAnthropicContent(msg.content),\n });\n }\n }\n const {\n location,\n version,\n maxOutputTokens,\n stopSequences,\n temperature,\n topK,\n topP,\n thinking,\n output_config,\n ...restConfig\n } = input.config ?? {};\n\n const request = {\n model,\n messages,\n // https://docs.anthropic.com/claude/docs/models-overview#model-comparison\n max_tokens: maxOutputTokens ?? 4096,\n ...restConfig,\n } as MessageCreateParamsBase & Record<string, any>;\n\n if (system) {\n request['system'] = system;\n }\n if (input.tools) {\n request.tools = input.tools?.map((tool) => {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n };\n }) as Array<Tool>;\n }\n if (stopSequences) {\n request.stop_sequences = stopSequences;\n }\n if (temperature !== undefined) {\n request.temperature = temperature;\n }\n if (topK !== undefined) {\n request.top_k = topK;\n }\n if (topP !== undefined) {\n request.top_p = topP;\n }\n\n if (thinking) {\n const anthropicThinking = toAnthropicThinking(thinking);\n if (anthropicThinking) {\n request.thinking = anthropicThinking;\n }\n }\n\n if (output_config) {\n request.output_config = output_config;\n }\n\n return request;\n}\n\nfunction toAnthropicThinking(\n config: z.infer<typeof ThinkingConfigSchema> | undefined\n):\n | { type: 'enabled'; budget_tokens: number }\n | { type: 'disabled' }\n | { type: 'adaptive'; display?: 'summarized' | 'omitted' }\n | undefined {\n if (!config) return undefined;\n\n const { enabled, budgetTokens, adaptive, display } = config;\n\n if (adaptive === true) {\n return {\n type: 'adaptive',\n ...(display !== undefined && { display }),\n };\n }\n\n if (enabled === true) {\n if (budgetTokens === undefined) {\n throw new Error('budgetTokens is required when thinking is enabled');\n }\n return { type: 'enabled', budget_tokens: budgetTokens };\n }\n\n if (enabled === false) {\n return { type: 'disabled' };\n }\n\n if (budgetTokens !== undefined) {\n return { type: 'enabled', budget_tokens: budgetTokens };\n }\n\n return undefined;\n}\n\nfunction toAnthropicContent(\n content: GenkitPart[]\n): Array<\n | TextBlockParam\n | ImageBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam\n | ThinkingBlockParam\n> {\n return content.map((p) => {\n if (p.reasoning) {\n const signature = p.metadata?.thoughtSignature;\n return {\n type: 'thinking',\n thinking: p.reasoning,\n ...(signature ? { signature } : {}),\n } as ThinkingBlockParam;\n }\n if (p.text) {\n return {\n type: 'text',\n text: p.text,\n };\n }\n if (p.media) {\n let b64Data = p.media.url;\n if (b64Data.startsWith('data:')) {\n b64Data = b64Data.substring(b64Data.indexOf(',')! + 1);\n }\n\n return {\n type: 'image',\n source: {\n type: 'base64',\n data: b64Data,\n media_type: p.media.contentType as\n | 'image/jpeg'\n | 'image/png'\n | 'image/gif'\n | 'image/webp',\n },\n };\n }\n if (p.toolRequest) {\n return toAnthropicToolRequest(p.toolRequest);\n }\n if (p.toolResponse) {\n return toAnthropicToolResponse(p);\n }\n throw new Error(`Unsupported content type: ${JSON.stringify(p)}`);\n });\n}\n\nfunction toAnthropicRole(role): 'user' | 'assistant' {\n if (role === 'model') {\n return 'assistant';\n }\n if (role === 'user') {\n return 'user';\n }\n if (role === 'tool') {\n return 'assistant';\n }\n throw new Error(`Unsupported role type ${role}`);\n}\n\nfunction fromAnthropicTextPart(part: TextBlock): Part {\n return { text: part.text };\n}\n\nfunction fromAnthropicToolCallPart(part: ToolUseBlock): Part {\n return {\n toolRequest: {\n name: part.name,\n input: part.input,\n ref: part.id,\n },\n };\n}\n\nfunction fromAnthropicThinkingPart(part: ThinkingBlock): Part {\n if (part.signature !== undefined) {\n return {\n reasoning: part.thinking,\n metadata: { thoughtSignature: part.signature },\n };\n }\n return { reasoning: part.thinking };\n}\n\n// Converts an Anthropic part to a Genkit part.\nfunction fromAnthropicPart(part: AnthropicContent): Part {\n if (part.type === 'text') return fromAnthropicTextPart(part);\n if (part.type === 'tool_use')\n return fromAnthropicToolCallPart(part as ToolUseBlock);\n if (part.type === 'thinking')\n return fromAnthropicThinkingPart(part as ThinkingBlock);\n\n const unknownType = (part as { type: string }).type;\n console.warn(\n `Unexpected Anthropic content block type: ${unknownType}. Returning empty text.`\n );\n return { text: '' };\n}\n\n// Converts an Anthropic response to a Genkit response.\nexport function fromAnthropicResponse(\n input: GenerateRequest<typeof AnthropicConfigSchema>,\n response: Message\n): ModelResponseData {\n const parts = response.content as AnthropicContent[];\n const message: MessageData = {\n role: 'model',\n content: parts.map(fromAnthropicPart),\n };\n\n return {\n message,\n finishReason: toGenkitFinishReason(\n response.stop_reason as\n | 'end_turn'\n | 'max_tokens'\n | 'stop_sequence'\n | 'tool_use'\n | null\n ),\n custom: {\n id: response.id,\n model: response.model,\n type: response.type,\n },\n raw: response,\n usage: {\n ...getBasicUsageStats(input.messages, message),\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n custom: {\n cache_creation_input_tokens:\n response.usage.cache_creation_input_tokens ?? 0,\n cache_read_input_tokens: response.usage.cache_read_input_tokens ?? 0,\n ephemeral_5m_input_tokens:\n response.usage.cache_creation?.ephemeral_5m_input_tokens ?? 0,\n ephemeral_1h_input_tokens:\n response.usage.cache_creation?.ephemeral_1h_input_tokens ?? 0,\n },\n },\n };\n}\n\nfunction toGenkitFinishReason(\n reason: 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use' | null\n): ModelResponseData['finishReason'] {\n switch (reason) {\n case 'end_turn':\n return 'stop';\n case 'max_tokens':\n return 'length';\n case 'stop_sequence':\n return 'stop';\n case 'tool_use':\n return 'stop';\n case null:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\nfunction toAnthropicToolRequest(tool: Record<string, any>): ToolUseBlockParam {\n if (!tool.name) {\n throw new Error('Tool name is required');\n }\n // Validate the tool name, Anthropic only supports letters, numbers, and underscores.\n // https://docs.anthropic.com/en/docs/build-with-claude/tool-use#specifying-tools\n if (!/^[a-zA-Z0-9_-]{1,64}$/.test(tool.name)) {\n throw new Error(\n `Tool name ${tool.name} contains invalid characters.\n Only letters, numbers, and underscores are allowed,\n and the name must be between 1 and 64 characters long.`\n );\n }\n const declaration: ToolUseBlockParam = {\n type: 'tool_use',\n id: tool.ref,\n name: tool.name,\n input: tool.input,\n };\n return declaration;\n}\n\nfunction toAnthropicToolResponse(part: Part): ToolResultBlockParam {\n if (!part.toolResponse?.ref) {\n throw new Error('Tool response reference is required');\n }\n\n if (!part.toolResponse.output) {\n throw new Error('Tool response output is required');\n }\n\n return {\n type: 'tool_result',\n tool_use_id: part.toolResponse.ref,\n content: JSON.stringify(part.toolResponse.output),\n };\n}\n"],"mappings":"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","names":["model"]}