{"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":[]}