{"version":3,"file":"anthropic.cjs","names":["AIMessageChunk","ChatGenerationChunk","textContent"],"sources":["../../src/utils/anthropic.ts"],"sourcesContent":["import {\n  ChatGeneration,\n  ChatGenerationChunk,\n  ChatResult,\n} from \"@langchain/core/outputs\";\nimport {\n  BaseMessage,\n  BaseMessageChunk,\n  AIMessageChunk,\n  MessageContentComplex,\n  MessageContentText,\n  MessageContent,\n  MessageContentImageUrl,\n  AIMessageFields,\n  AIMessageChunkFields,\n  AIMessage,\n  StandardContentBlockConverter,\n  StandardImageBlock,\n  StandardTextBlock,\n  StandardFileBlock,\n  DataContentBlock,\n  isDataContentBlock,\n  convertToProviderContentBlock,\n  parseBase64DataUrl,\n  UsageMetadata,\n} from \"@langchain/core/messages\";\nimport {\n  ToolCall,\n  ToolCallChunk,\n  ToolMessage,\n} from \"@langchain/core/messages/tool\";\nimport {\n  AnthropicAPIConfig,\n  AnthropicCacheControl,\n  AnthropicContent,\n  AnthropicContentRedactedThinking,\n  AnthropicContentText,\n  AnthropicContentThinking,\n  AnthropicContentToolUse,\n  AnthropicMessage,\n  AnthropicMessageContent,\n  AnthropicMessageContentDocument,\n  AnthropicMessageContentImage,\n  AnthropicMessageContentRedactedThinking,\n  AnthropicMessageContentText,\n  AnthropicMessageContentThinking,\n  AnthropicMessageContentToolResult,\n  AnthropicMessageContentToolResultContent,\n  AnthropicMessageContentToolUse,\n  AnthropicRequest,\n  AnthropicRequestSettings,\n  AnthropicResponseData,\n  AnthropicResponseMessage,\n  AnthropicStreamContentBlockDeltaEvent,\n  AnthropicStreamContentBlockStartEvent,\n  AnthropicStreamInputJsonDelta,\n  AnthropicStreamMessageDeltaEvent,\n  AnthropicStreamMessageStartEvent,\n  AnthropicStreamTextDelta,\n  AnthropicTool,\n  AnthropicToolChoice,\n  GeminiTool,\n  GoogleAIAPI,\n  GoogleAIModelParams,\n  GoogleAIModelRequestParams,\n  GoogleAIToolType,\n  GoogleLLMResponse,\n} from \"../types.js\";\n\nexport function getAnthropicAPI(config?: AnthropicAPIConfig): GoogleAIAPI {\n  function partToString(part: AnthropicContent): string {\n    return \"text\" in part ? part.text : \"\";\n  }\n\n  function messageToString(message: AnthropicResponseMessage): string {\n    const content: AnthropicContent[] = message?.content ?? [];\n    const ret = content.reduce((acc, part) => {\n      const str = partToString(part);\n      return acc + str;\n    }, \"\");\n    return ret;\n  }\n\n  function responseToString(response: GoogleLLMResponse): string {\n    const data = response.data as AnthropicResponseData;\n    switch (data?.type) {\n      case \"message\":\n        return messageToString(data as AnthropicResponseMessage);\n      default:\n        throw Error(`Unknown type: ${data?.type}`);\n    }\n  }\n\n  /**\n   * Normalize the AIMessageChunk.\n   * If the fields are just a string - use that as content.\n   * If the content is an array of just text fields, turn them into a string.\n   * @param fields\n   */\n  function newAIMessageChunk(fields: string | AIMessageFields): AIMessageChunk {\n    if (typeof fields === \"string\") {\n      return new AIMessageChunk(fields);\n    }\n    const ret: AIMessageFields = {\n      ...fields,\n    };\n\n    if (Array.isArray(fields?.content)) {\n      let str: string | undefined = \"\";\n      fields.content.forEach((val) => {\n        if (str !== undefined && val.type === \"text\") {\n          str = `${str}${val.text}`;\n        } else {\n          str = undefined;\n        }\n      });\n      if (str) {\n        ret.content = str;\n      }\n    }\n\n    return new AIMessageChunk(ret);\n  }\n\n  function textContentToMessageFields(\n    textContent: AnthropicContentText\n  ): AIMessageFields {\n    return {\n      content: [textContent],\n    };\n  }\n\n  function toolUseContentToMessageFields(\n    toolUseContent: AnthropicContentToolUse\n  ): AIMessageFields {\n    const tool: ToolCall = {\n      id: toolUseContent.id,\n      name: toolUseContent.name,\n      type: \"tool_call\",\n      args: toolUseContent.input,\n    };\n    return {\n      content: [],\n      tool_calls: [tool],\n    };\n  }\n\n  function thinkingContentToMessageFields(\n    thinkingContent: AnthropicContentThinking\n  ): AIMessageFields {\n    // TODO: Once a reasoning/thinking type is defined in LangChain, use it\n    return {\n      content: [thinkingContent],\n    };\n  }\n\n  function redactedThinkingContentToMessageFields(\n    thinkingContent: AnthropicContentRedactedThinking\n  ): AIMessageFields {\n    // TODO: Once a reasoning/thinking type is defined in LangChain, use it\n    return {\n      content: [thinkingContent],\n    };\n  }\n\n  function anthropicContentToMessageFields(\n    anthropicContent: AnthropicContent\n  ): AIMessageFields | undefined {\n    const type = anthropicContent?.type;\n    switch (type) {\n      case \"text\":\n        return textContentToMessageFields(anthropicContent);\n      case \"tool_use\":\n        return toolUseContentToMessageFields(anthropicContent);\n      case \"thinking\":\n        return thinkingContentToMessageFields(anthropicContent);\n      case \"redacted_thinking\":\n        return redactedThinkingContentToMessageFields(anthropicContent);\n      default:\n        console.error(`Unknown message type: ${type}`, anthropicContent);\n        return undefined;\n    }\n  }\n\n  function contentToMessage(\n    anthropicContent: AnthropicContent[]\n  ): BaseMessageChunk {\n    const complexContent: MessageContentComplex[] = [];\n    const toolCalls: ToolCall[] = [];\n    anthropicContent.forEach((ac) => {\n      const messageFields = anthropicContentToMessageFields(ac);\n      if (messageFields?.content) {\n        complexContent.push(\n          ...(messageFields.content as MessageContentComplex[])\n        );\n      }\n      if (messageFields?.tool_calls) {\n        toolCalls.push(...messageFields.tool_calls);\n      }\n    });\n\n    const ret: AIMessageFields = {\n      content: complexContent,\n      tool_calls: toolCalls,\n    };\n    return newAIMessageChunk(ret);\n  }\n\n  function messageToUsageMetadata(\n    message: AnthropicResponseMessage\n  ): UsageMetadata {\n    const usage = message?.usage;\n    const inputTokens = usage?.input_tokens ?? 0;\n    const outputTokens = usage?.output_tokens ?? 0;\n    const usageMetadata: UsageMetadata = {\n      input_tokens: inputTokens,\n      output_tokens: outputTokens,\n      total_tokens: inputTokens + outputTokens,\n      input_token_details: {\n        cache_read: usage?.cache_read_input_tokens ?? 0,\n        cache_creation: usage?.cache_creation_input_tokens ?? 0,\n      },\n    };\n    return usageMetadata;\n  }\n\n  function messageToGenerationInfo(message: AnthropicResponseMessage) {\n    const usageMetadata = messageToUsageMetadata(message);\n\n    return {\n      usage_metadata: usageMetadata,\n      finish_reason: message.stop_reason,\n    };\n  }\n\n  function messageToChatGeneration(\n    responseMessage: AnthropicResponseMessage\n  ): ChatGenerationChunk {\n    const content: AnthropicContent[] = responseMessage?.content ?? [];\n    const text = messageToString(responseMessage);\n    const message = contentToMessage(content);\n    const generationInfo = messageToGenerationInfo(responseMessage);\n    return new ChatGenerationChunk({\n      text,\n      message,\n      generationInfo,\n    });\n  }\n\n  function messageStartToChatGeneration(\n    event: AnthropicStreamMessageStartEvent\n  ): ChatGenerationChunk {\n    const responseMessage = event.message;\n    return messageToChatGeneration(responseMessage);\n  }\n\n  function messageDeltaToChatGeneration(\n    event: AnthropicStreamMessageDeltaEvent\n  ): ChatGenerationChunk {\n    const responseMessage = event.delta;\n    return messageToChatGeneration(responseMessage as AnthropicResponseMessage);\n  }\n\n  function contentBlockStartTextToChatGeneration(\n    event: AnthropicStreamContentBlockStartEvent\n  ): ChatGenerationChunk | null {\n    const content = event.content_block;\n    const text = \"text\" in content ? content.text : \"\";\n    const message = new AIMessageChunk({\n      content: [{ index: event.index, ...content }],\n    });\n    return new ChatGenerationChunk({\n      message,\n      text,\n    });\n  }\n\n  function contentBlockStartToolUseToChatGeneration(\n    event: AnthropicStreamContentBlockStartEvent\n  ): ChatGenerationChunk | null {\n    const contentBlock = event.content_block as AnthropicContentToolUse;\n    const text: string = \"\";\n    const toolChunk: ToolCallChunk = {\n      type: \"tool_call_chunk\",\n      index: event.index,\n      name: contentBlock.name,\n      id: contentBlock.id,\n    };\n    if (\n      typeof contentBlock.input === \"object\" &&\n      Object.keys(contentBlock.input).length > 0\n    ) {\n      toolChunk.args = JSON.stringify(contentBlock.input);\n    }\n    const toolChunks: ToolCallChunk[] = [toolChunk];\n\n    const content: MessageContentComplex[] = [\n      {\n        index: event.index,\n        ...contentBlock,\n      },\n    ];\n    const messageFields: AIMessageChunkFields = {\n      content,\n      tool_call_chunks: toolChunks,\n    };\n    const message = newAIMessageChunk(messageFields);\n    return new ChatGenerationChunk({\n      message,\n      text,\n    });\n  }\n\n  function contentBlockStartToChatGeneration(\n    event: AnthropicStreamContentBlockStartEvent\n  ): ChatGenerationChunk | null {\n    switch (event.content_block.type) {\n      case \"text\":\n        return contentBlockStartTextToChatGeneration(event);\n      case \"tool_use\":\n        return contentBlockStartToolUseToChatGeneration(event);\n      default:\n        console.warn(\n          `Unexpected start content_block type: ${JSON.stringify(event)}`\n        );\n        return null;\n    }\n  }\n\n  function contentBlockDeltaTextToChatGeneration(\n    event: AnthropicStreamContentBlockDeltaEvent\n  ): ChatGenerationChunk {\n    const delta = event.delta as AnthropicStreamTextDelta;\n    const text = delta?.text;\n    const message = new AIMessageChunk({\n      content: [{ index: event.index, type: \"text\", text }],\n    });\n    return new ChatGenerationChunk({\n      message,\n      text,\n    });\n  }\n\n  function contentBlockDeltaInputJsonDeltaToChatGeneration(\n    event: AnthropicStreamContentBlockDeltaEvent\n  ): ChatGenerationChunk {\n    const delta = event.delta as AnthropicStreamInputJsonDelta;\n    const text: string = \"\";\n    const toolChunks: ToolCallChunk[] = [\n      {\n        index: event.index,\n        args: delta.partial_json,\n      },\n    ];\n    const content: MessageContentComplex[] = [\n      {\n        index: event.index,\n        ...delta,\n      },\n    ];\n    const messageFields: AIMessageChunkFields = {\n      content,\n      tool_call_chunks: toolChunks,\n    };\n    const message = newAIMessageChunk(messageFields);\n    return new ChatGenerationChunk({\n      message,\n      text,\n    });\n  }\n\n  function contentBlockDeltaToChatGeneration(\n    event: AnthropicStreamContentBlockDeltaEvent\n  ): ChatGenerationChunk | null {\n    switch (event.delta.type) {\n      case \"text_delta\":\n        return contentBlockDeltaTextToChatGeneration(event);\n      case \"input_json_delta\":\n        return contentBlockDeltaInputJsonDeltaToChatGeneration(event);\n      default:\n        console.warn(\n          `Unexpected delta content_block type: ${JSON.stringify(event)}`\n        );\n        return null;\n    }\n  }\n\n  function responseToChatGeneration(\n    response: GoogleLLMResponse\n  ): ChatGenerationChunk | null {\n    const data = response.data as AnthropicResponseData;\n    switch (data.type) {\n      case \"message\":\n        return messageToChatGeneration(data as AnthropicResponseMessage);\n      case \"message_start\":\n        return messageStartToChatGeneration(\n          data as AnthropicStreamMessageStartEvent\n        );\n      case \"message_delta\":\n        return messageDeltaToChatGeneration(\n          data as AnthropicStreamMessageDeltaEvent\n        );\n      case \"content_block_start\":\n        return contentBlockStartToChatGeneration(\n          data as AnthropicStreamContentBlockStartEvent\n        );\n      case \"content_block_delta\":\n        return contentBlockDeltaToChatGeneration(\n          data as AnthropicStreamContentBlockDeltaEvent\n        );\n\n      case \"ping\":\n      case \"message_stop\":\n      case \"content_block_stop\":\n        // These are ignorable\n        return null;\n\n      case \"error\":\n        throw new Error(\n          `Error while streaming results: ${JSON.stringify(data)}`\n        );\n\n      default:\n        // We don't know what type this is, but Anthropic may have added\n        // new ones without telling us. Don't error, but don't use them.\n        console.warn(\"Unknown data for responseToChatGeneration\", data);\n        // throw new Error(`Unknown response type: ${data.type}`);\n        return null;\n    }\n  }\n\n  function chunkToString(chunk: BaseMessageChunk): string {\n    if (chunk === null) {\n      return \"\";\n    } else if (typeof chunk.content === \"string\") {\n      return chunk.content;\n    } else if (chunk.content.length === 0) {\n      return \"\";\n    } else if (chunk.content[0].type === \"text\") {\n      return chunk.content[0].text;\n    } else {\n      throw new Error(`Unexpected chunk: ${chunk}`);\n    }\n  }\n\n  function responseToBaseMessage(response: GoogleLLMResponse): BaseMessage {\n    const data = response.data as AnthropicResponseMessage;\n    const content: AnthropicContent[] = data?.content ?? [];\n    return contentToMessage(content);\n  }\n\n  function responseToChatResult(response: GoogleLLMResponse): ChatResult {\n    const message = response.data as AnthropicResponseMessage;\n    const generations: ChatGeneration[] = [];\n    const gen = responseToChatGeneration(response);\n    if (gen) {\n      generations.push(gen);\n    }\n    const llmOutput = messageToGenerationInfo(message);\n    return {\n      generations,\n      llmOutput,\n    };\n  }\n\n  function formatAnthropicVersion(): string {\n    return config?.version ?? \"vertex-2023-10-16\";\n  }\n\n  function textContentToAnthropicContent(\n    content: MessageContentText\n  ): AnthropicMessageContentText | undefined {\n    if (!content.text) {\n      return undefined;\n    }\n    return { type: \"text\", text: content.text };\n  }\n\n  function extractMimeType(\n    str: string\n  ): { media_type: string; data: string } | null {\n    if (str.startsWith(\"data:\")) {\n      return {\n        media_type: str.split(\":\")[1].split(\";\")[0],\n        data: str.split(\",\")[1],\n      };\n    }\n    return null;\n  }\n\n  function imageContentToAnthropicContent(\n    content: MessageContentImageUrl\n  ): AnthropicMessageContentImage | undefined {\n    const dataUrl = content.image_url;\n    const url = typeof dataUrl === \"string\" ? dataUrl : dataUrl?.url;\n    const urlInfo = extractMimeType(url);\n\n    if (!urlInfo) {\n      return undefined;\n    }\n\n    return {\n      type: \"image\",\n      source: {\n        type: \"base64\",\n        ...urlInfo,\n      },\n    };\n  }\n\n  function toolUseContentToAnthropicContent(\n    content: Record<string, unknown>\n  ): AnthropicMessageContentToolUse {\n    return {\n      type: \"tool_use\",\n      id: content.id as string,\n      name: content.name as string,\n      input: content.input as Record<string, unknown>,\n    };\n  }\n\n  function thinkingContentToAnthropicContent(\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    content: Record<string, any>\n  ): AnthropicMessageContentThinking | undefined {\n    // TODO: Once a Langchain Thinking type is defined, use it\n    return {\n      type: \"thinking\",\n      thinking: content.thinking,\n      signature: content.signature,\n    };\n  }\n\n  function redactedThinkingContentToAnthropicContent(\n    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    content: Record<string, any>\n  ): AnthropicMessageContentRedactedThinking | undefined {\n    // TODO: Once a Langchain Thinking type is defined, use it\n    return {\n      type: \"redacted_thinking\",\n      data: content.data,\n    };\n  }\n\n  function contentComplexToAnthropicContent(\n    content: MessageContentComplex\n  ): AnthropicMessageContent | undefined {\n    const type = content?.type;\n    switch (type) {\n      case \"text\":\n        return textContentToAnthropicContent(content as MessageContentText);\n      case \"image_url\":\n        return imageContentToAnthropicContent(\n          content as MessageContentImageUrl\n        );\n      case \"tool_use\":\n        return toolUseContentToAnthropicContent(content);\n      case \"thinking\":\n        return thinkingContentToAnthropicContent(\n          content as Record<string, unknown>\n        );\n      case \"redacted_thinking\":\n        return redactedThinkingContentToAnthropicContent(\n          content as Record<string, unknown>\n        );\n      default:\n        if (type === \"tool_call\") {\n          return undefined;\n        }\n        console.warn(`Unexpected content type: ${type}`, content);\n        return undefined;\n    }\n  }\n\n  const anthropicContentConverter: StandardContentBlockConverter<{\n    text: AnthropicMessageContentText;\n    image: AnthropicMessageContentImage;\n    file: AnthropicMessageContentDocument;\n  }> = {\n    providerName: \"anthropic\",\n\n    fromStandardTextBlock(\n      block: StandardTextBlock\n    ): AnthropicMessageContentText {\n      return {\n        type: \"text\",\n        text: block.text,\n        ...(\"cache_control\" in (block.metadata ?? {})\n          ? {\n              cache_control: block.metadata!\n                .cache_control as AnthropicCacheControl,\n            }\n          : {}),\n      };\n    },\n\n    fromStandardImageBlock(\n      block: StandardImageBlock\n    ): AnthropicMessageContentImage {\n      if (block.source_type === \"url\") {\n        const data = parseBase64DataUrl({\n          dataUrl: block.url,\n          asTypedArray: false,\n        });\n        if (data) {\n          return {\n            type: \"image\",\n            source: {\n              type: \"base64\",\n              data: data.data,\n              media_type: data.mime_type,\n            },\n            ...(\"cache_control\" in (block.metadata ?? {})\n              ? { cache_control: block.metadata!.cache_control }\n              : {}),\n          } as AnthropicMessageContentImage;\n        } else {\n          return {\n            type: \"image\",\n            source: {\n              type: \"url\",\n              url: block.url,\n              media_type: block.mime_type ?? \"\",\n            },\n            ...(\"cache_control\" in (block.metadata ?? {})\n              ? { cache_control: block.metadata!.cache_control }\n              : {}),\n          } as AnthropicMessageContentImage;\n        }\n      } else {\n        if (block.source_type === \"base64\") {\n          return {\n            type: \"image\",\n            source: {\n              type: \"base64\",\n              data: block.data,\n              media_type: block.mime_type ?? \"\",\n            },\n            ...(\"cache_control\" in (block.metadata ?? {})\n              ? { cache_control: block.metadata!.cache_control }\n              : {}),\n          } as AnthropicMessageContentImage;\n        } else {\n          throw new Error(\n            `Unsupported image source type: ${block.source_type}`\n          );\n        }\n      }\n    },\n\n    fromStandardFileBlock(\n      block: StandardFileBlock\n    ): AnthropicMessageContentDocument {\n      const mime_type = (block.mime_type ?? \"\").split(\";\")[0];\n\n      if (block.source_type === \"url\") {\n        if (mime_type === \"application/pdf\" || mime_type === \"\") {\n          return {\n            type: \"document\",\n            source: {\n              type: \"url\",\n              url: block.url,\n              media_type: block.mime_type ?? \"\",\n            },\n            ...(\"cache_control\" in (block.metadata ?? {})\n              ? {\n                  cache_control: block.metadata!\n                    .cache_control as AnthropicCacheControl,\n                }\n              : {}),\n            ...(\"citations\" in (block.metadata ?? {})\n              ? {\n                  citations: block.metadata!.citations as { enabled?: boolean },\n                }\n              : {}),\n            ...(\"context\" in (block.metadata ?? {})\n              ? { context: block.metadata!.context as string }\n              : {}),\n            ...(block.metadata?.title ||\n            block.metadata?.filename ||\n            block.metadata?.name\n              ? {\n                  title: (block.metadata?.title ||\n                    block.metadata?.filename ||\n                    block.metadata?.name) as string,\n                }\n              : {}),\n          };\n        }\n        throw new Error(\n          `Unsupported file mime type for file url source: ${block.mime_type}`\n        );\n      } else if (block.source_type === \"text\") {\n        if (mime_type === \"text/plain\" || mime_type === \"\") {\n          return {\n            type: \"document\",\n            source: {\n              type: \"text\",\n              data: block.text,\n              media_type: block.mime_type ?? \"\",\n            },\n            ...(\"cache_control\" in (block.metadata ?? {})\n              ? {\n                  cache_control: block.metadata!\n                    .cache_control as AnthropicCacheControl,\n                }\n              : {}),\n            ...(\"citations\" in (block.metadata ?? {})\n              ? {\n                  citations: block.metadata!.citations as { enabled?: boolean },\n                }\n              : {}),\n            ...(\"context\" in (block.metadata ?? {})\n              ? { context: block.metadata!.context as string }\n              : {}),\n            ...(\"title\" in (block.metadata ?? {})\n              ? { title: block.metadata!.title as string }\n              : {}),\n          };\n        } else {\n          throw new Error(\n            `Unsupported file mime type for file text source: ${block.mime_type}`\n          );\n        }\n      } else if (block.source_type === \"base64\") {\n        if (mime_type === \"application/pdf\" || mime_type === \"\") {\n          return {\n            type: \"document\",\n            source: {\n              type: \"base64\",\n              data: block.data,\n              media_type: \"application/pdf\",\n            },\n            ...(\"cache_control\" in (block.metadata ?? {})\n              ? {\n                  cache_control: block.metadata!\n                    .cache_control as AnthropicCacheControl,\n                }\n              : {}),\n            ...(\"citations\" in (block.metadata ?? {})\n              ? {\n                  citations: block.metadata!.citations as { enabled?: boolean },\n                }\n              : {}),\n            ...(\"context\" in (block.metadata ?? {})\n              ? { context: block.metadata!.context as string }\n              : {}),\n            ...(\"title\" in (block.metadata ?? {})\n              ? { title: block.metadata!.title as string }\n              : {}),\n          };\n        } else if (\n          [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"].includes(\n            mime_type\n          )\n        ) {\n          return {\n            type: \"document\",\n            source: {\n              type: \"content\",\n              content: [\n                {\n                  type: \"image\",\n                  source: {\n                    type: \"base64\",\n                    data: block.data,\n                    media_type: mime_type as\n                      | \"image/jpeg\"\n                      | \"image/png\"\n                      | \"image/gif\"\n                      | \"image/webp\",\n                  },\n                },\n              ],\n            },\n            ...(\"cache_control\" in (block.metadata ?? {})\n              ? {\n                  cache_control: block.metadata!\n                    .cache_control as AnthropicCacheControl,\n                }\n              : {}),\n            ...(\"citations\" in (block.metadata ?? {})\n              ? {\n                  citations: block.metadata!.citations as { enabled?: boolean },\n                }\n              : {}),\n            ...(\"context\" in (block.metadata ?? {})\n              ? { context: block.metadata!.context as string }\n              : {}),\n            ...(\"title\" in (block.metadata ?? {})\n              ? { title: block.metadata!.title as string }\n              : {}),\n          };\n        } else {\n          throw new Error(\n            `Unsupported file mime type for file base64 source: ${block.mime_type}`\n          );\n        }\n      } else {\n        throw new Error(`Unsupported file source type: ${block.source_type}`);\n      }\n    },\n  };\n\n  function contentToAnthropicContent(\n    content: MessageContent | DataContentBlock[]\n  ): AnthropicMessageContent[] {\n    const ca =\n      typeof content === \"string\" ? [{ type: \"text\", text: content }] : content;\n    return ca\n      .map((complex) =>\n        isDataContentBlock(complex)\n          ? convertToProviderContentBlock(complex, anthropicContentConverter)\n          : contentComplexToAnthropicContent(complex)\n      )\n      .filter(Boolean) as AnthropicMessageContent[];\n  }\n\n  function toolCallToAnthropicContent(\n    toolCall: ToolCall\n  ): AnthropicMessageContentToolUse {\n    return {\n      type: \"tool_use\",\n      id: toolCall.id!,\n      name: toolCall.name,\n      input: toolCall.args,\n    };\n  }\n\n  function toolCallsToAnthropicContent(\n    toolCalls: ToolCall[] | undefined\n  ): AnthropicMessageContentToolUse[] {\n    if (toolCalls === undefined) {\n      return [];\n    }\n    return toolCalls.map(toolCallToAnthropicContent);\n  }\n\n  function baseRoleToAnthropicMessage(\n    base: BaseMessage,\n    role: string\n  ): AnthropicMessage {\n    const content = contentToAnthropicContent(base.content);\n    return {\n      role,\n      content,\n    };\n  }\n\n  function aiMessageToAnthropicMessage(base: AIMessage): AnthropicMessage {\n    const ret = baseRoleToAnthropicMessage(base, \"assistant\");\n\n    const content = ret.content as AnthropicMessageContent[];\n    const existingToolUseIds = new Set(\n      content\n        .filter(\n          (block): block is AnthropicMessageContentToolUse =>\n            block.type === \"tool_use\"\n        )\n        .map((block) => block.id)\n    );\n\n    const toolContent = toolCallsToAnthropicContent(base.tool_calls).filter(\n      (block) => !existingToolUseIds.has(block.id)\n    );\n    if (toolContent.length > 0) {\n      ret.content = [...content, ...toolContent];\n    }\n\n    return ret;\n  }\n\n  function toolMessageToAnthropicMessage(base: ToolMessage): AnthropicMessage {\n    const role = \"user\";\n    const toolUseId = base.tool_call_id;\n    const toolContent = contentToAnthropicContent(\n      base.content\n    ) as AnthropicMessageContentToolResultContent[];\n    const content: AnthropicMessageContentToolResult[] = [\n      {\n        type: \"tool_result\",\n        tool_use_id: toolUseId,\n        content: toolContent,\n      },\n    ];\n    return {\n      role,\n      content,\n    };\n  }\n\n  function baseToAnthropicMessage(\n    base: BaseMessage\n  ): AnthropicMessage | undefined {\n    const type = base._getType();\n    switch (type) {\n      case \"human\":\n        return baseRoleToAnthropicMessage(base, \"user\");\n      case \"ai\":\n        return aiMessageToAnthropicMessage(base as AIMessage);\n      case \"tool\":\n        return toolMessageToAnthropicMessage(base as ToolMessage);\n      case \"system\":\n        //  System messages are handled in formatSystem()\n        return undefined;\n      default:\n        console.warn(`Unknown BaseMessage type: ${type}`, base);\n        return undefined;\n    }\n  }\n\n  function formatMessages(input: BaseMessage[]): AnthropicMessage[] {\n    const ret: AnthropicMessage[] = [];\n\n    input.forEach((baseMessage) => {\n      const anthropicMessage = baseToAnthropicMessage(baseMessage);\n      if (anthropicMessage) {\n        ret.push(anthropicMessage);\n      }\n    });\n\n    return ret;\n  }\n\n  function formatSettings(\n    parameters: GoogleAIModelRequestParams\n  ): AnthropicRequestSettings {\n    const ret: AnthropicRequestSettings = {\n      stream: parameters?.streaming ?? false,\n      max_tokens: parameters?.maxOutputTokens ?? 8192,\n    };\n\n    if (parameters.topP) {\n      ret.top_p = parameters.topP;\n    }\n    if (parameters.topK) {\n      ret.top_k = parameters.topK;\n    }\n    if (parameters.temperature) {\n      ret.temperature = parameters.temperature;\n    }\n    if (parameters.stopSequences) {\n      ret.stop_sequences = parameters.stopSequences;\n    }\n\n    return ret;\n  }\n\n  function contentComplexArrayToText(\n    contentArray: MessageContentComplex[]\n  ): string {\n    let ret = \"\";\n\n    contentArray.forEach((content) => {\n      const contentType = content?.type;\n      if (contentType === \"text\") {\n        const textContent = content as MessageContentText;\n        ret = `${ret}\\n${textContent.text}`;\n      }\n    });\n\n    return ret;\n  }\n\n  function formatSystem(input: BaseMessage[]): string {\n    let ret = \"\";\n\n    input.forEach((message) => {\n      if (message._getType() === \"system\") {\n        const content = message?.content;\n        const contentString =\n          typeof content === \"string\"\n            ? (content as string)\n            : contentComplexArrayToText(content as MessageContentComplex[]);\n        ret = `${ret}\\n${contentString}`;\n      }\n    });\n\n    return ret;\n  }\n\n  function formatGeminiTool(tool: GeminiTool): AnthropicTool[] {\n    if (Object.hasOwn(tool, \"functionDeclarations\")) {\n      const funcs = tool?.functionDeclarations ?? [];\n      return funcs.map((func) => {\n        const inputSchema = func.parameters!;\n        return {\n          // type: \"tool\",  // This may only be valid for models 20241022+\n          name: func.name,\n          description: func.description,\n          input_schema: inputSchema,\n        };\n      });\n    } else {\n      console.warn(\n        `Unable to format GeminiTool: ${JSON.stringify(tool, null, 1)}`\n      );\n      return [];\n    }\n  }\n\n  function formatTool(tool: GoogleAIToolType): AnthropicTool[] {\n    if (Object.hasOwn(tool, \"name\")) {\n      return [tool as AnthropicTool];\n    } else {\n      return formatGeminiTool(tool as GeminiTool);\n    }\n  }\n\n  function formatTools(\n    parameters: GoogleAIModelRequestParams\n  ): AnthropicTool[] {\n    const tools: GoogleAIToolType[] = parameters?.tools ?? [];\n    const ret: AnthropicTool[] = [];\n    tools.forEach((tool) => {\n      const anthropicTools = formatTool(tool);\n      anthropicTools.forEach((anthropicTool) => {\n        if (anthropicTool) {\n          ret.push(anthropicTool);\n        }\n      });\n    });\n    return ret;\n  }\n\n  function formatToolChoice(\n    parameters: GoogleAIModelRequestParams\n  ): AnthropicToolChoice | undefined {\n    const choice = parameters?.tool_choice;\n    if (!choice) {\n      return undefined;\n    } else if (typeof choice === \"object\") {\n      return choice as AnthropicToolChoice;\n    } else {\n      switch (choice) {\n        case \"any\":\n        case \"auto\":\n          return {\n            type: choice,\n          };\n        case \"none\":\n          return undefined;\n        default:\n          return {\n            type: \"tool\",\n            name: choice,\n          };\n      }\n    }\n  }\n\n  async function formatData(\n    input: unknown,\n    parameters: GoogleAIModelRequestParams\n  ): Promise<AnthropicRequest> {\n    const typedInput = input as BaseMessage[];\n    const anthropicVersion = formatAnthropicVersion();\n    const messages = formatMessages(typedInput);\n    const settings = formatSettings(parameters);\n    const system = formatSystem(typedInput);\n    const tools = formatTools(parameters);\n    const toolChoice = formatToolChoice(parameters);\n    const ret: AnthropicRequest = {\n      anthropic_version: anthropicVersion,\n      messages,\n      ...settings,\n    };\n    if (tools && tools.length && parameters?.tool_choice !== \"none\") {\n      ret.tools = tools;\n    }\n    if (toolChoice) {\n      ret.tool_choice = toolChoice;\n    }\n    if (system?.length) {\n      ret.system = system;\n    }\n    if (config?.thinking) {\n      ret.thinking = config?.thinking;\n    }\n\n    return ret;\n  }\n\n  return {\n    responseToString,\n    responseToChatGeneration,\n    chunkToString,\n    responseToBaseMessage,\n    responseToChatResult,\n    formatData,\n  };\n}\n\nexport function validateClaudeParams(_params: GoogleAIModelParams): void {\n  // FIXME - validate the parameters\n}\n\nexport function isModelClaude(modelName: string): boolean {\n  return modelName.toLowerCase().startsWith(\"claude\");\n}\n"],"mappings":"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"}