genkitx-anthropic
Version:
Firebase Genkit AI framework plugin for Anthropic APIs.
1 lines • 23.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/claude.ts"],"sourcesContent":["/**\n * Copyright 2024 The Fire Company\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 { Message as GenkitMessage, z } from 'genkit';\nimport type {\n GenerateResponseData,\n GenerateRequest,\n MessageData,\n Part,\n Role,\n StreamingCallback,\n Genkit,\n ModelReference,\n} from 'genkit';\nimport { GenerationCommonConfigSchema } from 'genkit';\nimport type {\n CandidateData,\n GenerateResponseChunkData,\n ModelAction,\n ToolDefinition,\n} from 'genkit/model';\nimport { modelRef } from 'genkit/model';\nimport type Anthropic from '@anthropic-ai/sdk';\nimport type {\n ImageBlockParam,\n TextBlock,\n TextBlockParam,\n MessageCreateParams,\n Tool,\n ToolResultBlockParam,\n ContentBlock,\n Message,\n MessageParam,\n MessageStreamEvent,\n ToolUseBlockParam,\n} from '@anthropic-ai/sdk/resources/messages.mjs';\n\nexport const AnthropicConfigSchema = GenerationCommonConfigSchema.extend({\n tool_choice: z\n .union([\n z.object({\n type: z.literal('auto'),\n }),\n z.object({\n type: z.literal('any'),\n }),\n z.object({\n type: z.literal('tool'),\n name: z.string(),\n }),\n ])\n .optional(),\n metadata: z\n .object({\n user_id: z.string().optional(),\n })\n .optional(),\n});\n\nexport const claude37Sonnet = modelRef({\n name: 'anthropic/claude-3-7-sonnet',\n info: {\n versions: ['claude-3-7-sonnet-20250219', 'claude-3-7-sonnet-latest'],\n label: 'Anthropic - Claude 3.7 Sonnet',\n supports: {\n multiturn: true,\n tools: true,\n media: true,\n systemRole: true,\n output: ['text'],\n },\n },\n configSchema: AnthropicConfigSchema,\n version: 'claude-3-7-sonnet-latest',\n});\n\nexport const claude35Sonnet = modelRef({\n name: 'anthropic/claude-3-5-sonnet',\n info: {\n versions: [\n 'claude-3-5-sonnet-20240620',\n 'claude-3-5-sonnet-20241022',\n 'claude-3-5-sonnet-latest',\n ],\n label: 'Anthropic - Claude 3.5 Sonnet',\n supports: {\n multiturn: true,\n tools: true,\n media: true,\n systemRole: true,\n output: ['text'],\n },\n },\n configSchema: AnthropicConfigSchema,\n version: 'claude-3-5-sonnet-latest',\n});\n\nexport const claude3Opus = modelRef({\n name: 'anthropic/claude-3-opus',\n info: {\n versions: ['claude-3-opus-20240229'],\n label: 'Anthropic - Claude 3 Opus',\n supports: {\n multiturn: true,\n tools: true,\n media: true,\n systemRole: true,\n output: ['text'],\n },\n },\n configSchema: AnthropicConfigSchema,\n version: 'claude-3-opus-20240229',\n});\n\nexport const claude3Sonnet = modelRef({\n name: 'anthropic/claude-3-sonnet',\n info: {\n versions: ['claude-3-sonnet-20240229'],\n label: 'Anthropic - Claude 3 Sonnet',\n supports: {\n multiturn: true,\n tools: true,\n media: true,\n systemRole: true,\n output: ['text'],\n },\n },\n configSchema: AnthropicConfigSchema,\n version: 'claude-3-sonnet-20240229',\n});\n\nexport const claude3Haiku = modelRef({\n name: 'anthropic/claude-3-haiku',\n info: {\n versions: ['claude-3-haiku-20240307'],\n label: 'Anthropic - Claude 3 Haiku',\n supports: {\n multiturn: true,\n tools: true,\n media: true,\n systemRole: true,\n output: ['text'],\n },\n },\n configSchema: AnthropicConfigSchema,\n version: 'claude-3-haiku-20240307',\n});\n\nexport const claude35Haiku = modelRef({\n name: 'anthropic/claude-3-5-haiku',\n info: {\n versions: ['claude-3-5-haiku-20241022', 'claude-3-5-haiku-latest'],\n label: 'Anthropic - Claude 3.5 Haiku',\n supports: {\n multiturn: true,\n tools: true,\n media: true,\n systemRole: true,\n output: ['text'],\n },\n },\n configSchema: AnthropicConfigSchema,\n version: 'claude-3-5-haiku-latest',\n});\n\nexport const SUPPORTED_CLAUDE_MODELS: Record<\n string,\n ModelReference<typeof AnthropicConfigSchema>\n> = {\n 'claude-3-7-sonnet': claude37Sonnet,\n 'claude-3-5-sonnet': claude35Sonnet,\n 'claude-3-opus': claude3Opus,\n 'claude-3-sonnet': claude3Sonnet,\n 'claude-3-haiku': claude3Haiku,\n 'claude-3-5-haiku': claude35Haiku,\n};\n\n/**\n * Converts a Genkit role to the corresponding Anthropic role.\n */\nexport function toAnthropicRole(\n role: Role,\n toolMessageType?: 'tool_use' | 'tool_result'\n): MessageParam['role'] {\n switch (role) {\n case 'user':\n return 'user';\n case 'model':\n return 'assistant';\n case 'tool':\n return toolMessageType === 'tool_use' ? 'assistant' : 'user';\n default:\n throw new Error(`role ${role} doesn't map to an Anthropic role.`);\n }\n}\n\ninterface Media {\n url: string;\n contentType?: string;\n}\n\nconst isMediaObject = (obj: unknown): obj is Media =>\n typeof obj === 'object' &&\n obj !== null &&\n 'url' in obj &&\n typeof (obj as Media).url === 'string';\n\nconst extractDataFromBase64Url = (\n url: string\n): { data: string; contentType: string } | null => {\n const match = url.match(/^data:([^;]+);base64,(.+)$/);\n return (\n match && {\n contentType: match[1],\n data: match[2],\n }\n );\n};\n\n/**\n * Converts a Genkit message Part to the corresponding Anthropic TextBlockParam or ImageBlockParam.\n */\nexport function toAnthropicToolResponseContent(\n part: Part\n): TextBlockParam | ImageBlockParam {\n if (!part.toolResponse) {\n throw Error(\n `Invalid genkit part provided to toAnthropicToolResponseContent: ${JSON.stringify(\n part\n )}.`\n );\n }\n const isMedia = isMediaObject(part.toolResponse?.output);\n const isString = typeof part.toolResponse?.output === 'string';\n let base64Data;\n if (isMedia) {\n base64Data = extractDataFromBase64Url(\n (part.toolResponse?.output as Media).url\n );\n } else if (isString) {\n base64Data = extractDataFromBase64Url(part.toolResponse?.output as string);\n }\n return base64Data\n ? {\n type: 'image',\n source: {\n type: 'base64',\n data: base64Data.data,\n media_type:\n ((part.toolResponse?.output as Media)\n ?.contentType as ImageBlockParam.Source['media_type']) ??\n base64Data.contentType,\n },\n }\n : {\n type: 'text',\n text: isString\n ? (part.toolResponse?.output as string)\n : JSON.stringify(part.toolResponse?.output),\n };\n}\n\n/**\n * Converts a Genkit Part to the corresponding Anthropic TextBlock, ImageBlockParam, etc.\n */\nexport function toAnthropicMessageContent(\n part: Part\n): TextBlock | ImageBlockParam | ToolUseBlockParam | ToolResultBlockParam {\n if (part.text) {\n return {\n type: 'text',\n text: part.text,\n };\n }\n if (part.media) {\n const { data, contentType } =\n extractDataFromBase64Url(part.media.url) ?? {};\n if (!data) {\n throw Error(\n `Invalid genkit part media provided to toAnthropicMessageContent: ${JSON.stringify(\n part.media\n )}.`\n );\n }\n return {\n type: 'image',\n source: {\n type: 'base64',\n data,\n // @ts-expect-error TODO: improve these types\n media_type: part.media.contentType ?? contentType,\n },\n };\n }\n if (part.toolRequest) {\n return {\n type: 'tool_use',\n id: part.toolRequest.ref!,\n name: part.toolRequest.name,\n input: part.toolRequest.input,\n };\n }\n if (part.toolResponse) {\n return {\n type: 'tool_result',\n tool_use_id: part.toolResponse.ref!,\n content: [toAnthropicToolResponseContent(part)],\n };\n }\n throw Error(\n `Unsupported genkit part fields encountered for current message role: ${JSON.stringify(\n part\n )}.`\n );\n}\n\n/**\n * Converts a Genkit MessageData array to Anthropic system message and MessageParam array.\n * @param messages The Genkit MessageData array to convert.\n * @returns An object containing the optional Anthropic system message and the array of Anthropic MessageParam objects.\n */\nexport function toAnthropicMessages(messages: MessageData[]): {\n system?: string;\n messages: MessageParam[];\n} {\n const system =\n messages[0]?.role === 'system' ? messages[0].content?.[0]?.text : undefined;\n const messagesToIterate = system ? messages.slice(1) : messages;\n const anthropicMsgs: MessageParam[] = [];\n for (const message of messagesToIterate) {\n const msg = new GenkitMessage(message);\n const content = msg.content.map(toAnthropicMessageContent);\n const toolMessageType = content.find(\n (c) => c.type === 'tool_use' || c.type === 'tool_result'\n ) as ToolUseBlockParam | ToolResultBlockParam;\n const role = toAnthropicRole(message.role, toolMessageType?.type);\n anthropicMsgs.push({\n role: role,\n content,\n });\n }\n return { system, messages: anthropicMsgs };\n}\n\n/**\n * Converts a Genkit ToolDefinition to an Anthropic Tool object.\n * @param tool The Genkit ToolDefinition to convert.\n * @returns The converted Anthropic Tool object.\n */\nexport function toAnthropicTool(tool: ToolDefinition): Tool {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema as Tool.InputSchema,\n };\n}\n\n/**\n * Converts an Anthropic content block to a Genkit Part object.\n * @param contentBlock The Anthropic content block to convert.\n * @returns The converted Genkit Part object.\n * @param event The Anthropic message stream event to convert.\n * @returns The converted Genkit Part object if the event is a content block\n * start or delta, otherwise undefined.\n */\nfunction fromAnthropicContentBlock(contentBlock: ContentBlock): Part {\n return contentBlock.type === 'tool_use'\n ? {\n toolRequest: {\n ref: contentBlock.id,\n name: contentBlock.name,\n input: contentBlock.input,\n },\n }\n : { text: contentBlock.text };\n}\n\n/**\n * Converts an Anthropic message stream event to a Genkit Part object.\n */\nexport function fromAnthropicContentBlockChunk(\n event: MessageStreamEvent\n): Part | undefined {\n if (\n event.type !== 'content_block_start' &&\n event.type !== 'content_block_delta'\n ) {\n return;\n }\n const eventField =\n event.type === 'content_block_start' ? 'content_block' : 'delta';\n return ['text', 'text_delta'].includes(event[eventField].type)\n ? {\n text: event[eventField].text,\n }\n : {\n toolRequest: {\n ref: event[eventField].id,\n name: event[eventField].name,\n input: event[eventField].input,\n },\n };\n}\n\nexport function fromAnthropicStopReason(\n reason: Message['stop_reason']\n // TODO: CandidateData is deprecated\n): CandidateData['finishReason'] {\n switch (reason) {\n case 'max_tokens':\n return 'length';\n case 'end_turn':\n // fall through\n case 'stop_sequence':\n // fall through\n case 'tool_use':\n return 'stop';\n case null:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\nexport function fromAnthropicResponse(response: Message): GenerateResponseData {\n return {\n candidates: [\n {\n index: 0,\n finishReason: fromAnthropicStopReason(response.stop_reason),\n message: {\n role: 'model',\n content: response.content.map(fromAnthropicContentBlock),\n },\n },\n ],\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n },\n custom: response,\n };\n}\n\n/**\n * Converts an Anthropic request to an Anthropic API request body.\n * @param modelName The name of the Anthropic model to use.\n * @param request The Genkit GenerateRequest to convert.\n * @param stream Whether to stream the response.\n * @param cacheSystemPrompt Whether to cache the system prompt.\n * @returns The converted Anthropic API request body.\n * @throws An error if the specified model is not supported or if an unsupported output format is requested.\n */\nexport function toAnthropicRequestBody(\n modelName: string,\n request: GenerateRequest<typeof AnthropicConfigSchema>,\n stream?: boolean,\n cacheSystemPrompt?: boolean\n): MessageCreateParams {\n const model = SUPPORTED_CLAUDE_MODELS[modelName];\n if (!model) throw new Error(`Unsupported model: ${modelName}`);\n const { system, messages } = toAnthropicMessages(request.messages);\n const mappedModelName = request.config?.version ?? model.version ?? modelName;\n const body: MessageCreateParams = {\n system: cacheSystemPrompt\n ? [\n {\n type: 'text',\n text: system,\n // @ts-expect-error cache_control is in beta\n cache_control: { type: 'ephemeral' },\n },\n ]\n : system,\n messages,\n tools: request.tools?.map(toAnthropicTool),\n max_tokens: request.config?.maxOutputTokens ?? 4096,\n model: mappedModelName,\n top_k: request.config?.topK,\n top_p: request.config?.topP,\n temperature: request.config?.temperature,\n stop_sequences: request.config?.stopSequences,\n metadata: request.config?.metadata,\n tool_choice: request.config?.tool_choice,\n stream,\n };\n\n if (request.output?.format && request.output.format !== 'text') {\n throw new Error(\n `Only text output format is supported for Claude models currently`\n );\n }\n for (const key in body) {\n if (!body[key] || (Array.isArray(body[key]) && !body[key].length))\n delete body[key];\n }\n return body;\n}\n\n/**\n * Creates the runner used by Genkit to interact with the Claude model.\n * @param name The name of the Claude model.\n * @param client The Anthropic client instance.\n * @param cacheSystemPrompt Whether to cache the system prompt.\n * @returns The runner that Genkit will call when the model is invoked.\n */\nexport function claudeRunner(\n name: string,\n client: Anthropic,\n cacheSystemPrompt?: boolean\n) {\n return async (\n request: GenerateRequest<typeof AnthropicConfigSchema>,\n streamingCallback?: StreamingCallback<GenerateResponseChunkData>\n ): Promise<GenerateResponseData> => {\n let response: Message;\n const body = toAnthropicRequestBody(\n name,\n request,\n !!streamingCallback,\n cacheSystemPrompt\n );\n if (streamingCallback) {\n const stream = client.messages.stream(body);\n for await (const chunk of stream) {\n const c = fromAnthropicContentBlockChunk(chunk);\n if (c) {\n streamingCallback({\n index: 0,\n content: [c],\n });\n }\n }\n response = await stream.finalMessage();\n } else {\n response = (await client.messages.create(body)) as Message;\n }\n return fromAnthropicResponse(response);\n };\n}\n\n/**\n * Defines a Claude model with the given name and Anthropic client.\n */\nexport function claudeModel(\n ai: Genkit,\n name: string,\n client: Anthropic,\n cacheSystemPrompt?: boolean\n): ModelAction<typeof AnthropicConfigSchema> {\n const modelId = `anthropic/${name}`;\n const model = SUPPORTED_CLAUDE_MODELS[name];\n if (!model) throw new Error(`Unsupported model: ${name}`);\n\n return ai.defineModel(\n {\n name: modelId,\n ...model.info,\n configSchema: model.configSchema,\n },\n claudeRunner(name, client, cacheSystemPrompt)\n );\n}\n"],"mappings":"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","names":[]}