@langchain/anthropic 0.3.31 → 1.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +8 -8
  2. package/dist/_virtual/rolldown_runtime.cjs +25 -0
  3. package/dist/chat_models.cjs +781 -1012
  4. package/dist/chat_models.cjs.map +1 -0
  5. package/dist/chat_models.d.cts +620 -0
  6. package/dist/chat_models.d.cts.map +1 -0
  7. package/dist/chat_models.d.ts +227 -211
  8. package/dist/chat_models.d.ts.map +1 -0
  9. package/dist/chat_models.js +775 -1003
  10. package/dist/chat_models.js.map +1 -0
  11. package/dist/index.cjs +6 -20
  12. package/dist/index.d.cts +4 -0
  13. package/dist/index.d.ts +4 -3
  14. package/dist/index.js +4 -2
  15. package/dist/output_parsers.cjs +65 -104
  16. package/dist/output_parsers.cjs.map +1 -0
  17. package/dist/output_parsers.js +64 -100
  18. package/dist/output_parsers.js.map +1 -0
  19. package/dist/types.d.cts +33 -0
  20. package/dist/types.d.cts.map +1 -0
  21. package/dist/types.d.ts +30 -32
  22. package/dist/types.d.ts.map +1 -0
  23. package/dist/utils/content.cjs +151 -0
  24. package/dist/utils/content.cjs.map +1 -0
  25. package/dist/utils/content.js +146 -0
  26. package/dist/utils/content.js.map +1 -0
  27. package/dist/utils/errors.cjs +16 -27
  28. package/dist/utils/errors.cjs.map +1 -0
  29. package/dist/utils/errors.js +17 -25
  30. package/dist/utils/errors.js.map +1 -0
  31. package/dist/utils/index.cjs +7 -0
  32. package/dist/utils/index.cjs.map +1 -0
  33. package/dist/utils/index.js +6 -0
  34. package/dist/utils/index.js.map +1 -0
  35. package/dist/utils/message_inputs.cjs +223 -534
  36. package/dist/utils/message_inputs.cjs.map +1 -0
  37. package/dist/utils/message_inputs.js +224 -532
  38. package/dist/utils/message_inputs.js.map +1 -0
  39. package/dist/utils/message_outputs.cjs +186 -250
  40. package/dist/utils/message_outputs.cjs.map +1 -0
  41. package/dist/utils/message_outputs.js +185 -247
  42. package/dist/utils/message_outputs.js.map +1 -0
  43. package/dist/utils/prompts.cjs +46 -45
  44. package/dist/utils/prompts.cjs.map +1 -0
  45. package/dist/utils/prompts.d.cts +45 -0
  46. package/dist/utils/prompts.d.cts.map +1 -0
  47. package/dist/utils/prompts.d.ts +8 -2
  48. package/dist/utils/prompts.d.ts.map +1 -0
  49. package/dist/utils/prompts.js +46 -42
  50. package/dist/utils/prompts.js.map +1 -0
  51. package/dist/utils/standard.cjs +285 -0
  52. package/dist/utils/standard.cjs.map +1 -0
  53. package/dist/utils/standard.js +285 -0
  54. package/dist/utils/standard.js.map +1 -0
  55. package/dist/utils/tools.cjs +15 -30
  56. package/dist/utils/tools.cjs.map +1 -0
  57. package/dist/utils/tools.js +15 -28
  58. package/dist/utils/tools.js.map +1 -0
  59. package/package.json +45 -71
  60. package/dist/experimental/index.cjs +0 -17
  61. package/dist/experimental/index.d.ts +0 -1
  62. package/dist/experimental/index.js +0 -1
  63. package/dist/experimental/tool_calling.cjs +0 -318
  64. package/dist/experimental/tool_calling.d.ts +0 -57
  65. package/dist/experimental/tool_calling.js +0 -314
  66. package/dist/experimental/utils/tool_calling.cjs +0 -106
  67. package/dist/experimental/utils/tool_calling.d.ts +0 -10
  68. package/dist/experimental/utils/tool_calling.js +0 -101
  69. package/dist/load/import_constants.cjs +0 -5
  70. package/dist/load/import_constants.d.ts +0 -1
  71. package/dist/load/import_constants.js +0 -2
  72. package/dist/load/import_map.cjs +0 -39
  73. package/dist/load/import_map.d.ts +0 -2
  74. package/dist/load/import_map.js +0 -3
  75. package/dist/load/import_type.cjs +0 -3
  76. package/dist/load/import_type.d.ts +0 -5
  77. package/dist/load/import_type.js +0 -2
  78. package/dist/load/index.cjs +0 -63
  79. package/dist/load/index.d.ts +0 -14
  80. package/dist/load/index.js +0 -25
  81. package/dist/load/map_keys.cjs +0 -2
  82. package/dist/load/map_keys.d.ts +0 -3
  83. package/dist/load/map_keys.js +0 -1
  84. package/dist/load/serializable.cjs +0 -17
  85. package/dist/load/serializable.d.ts +0 -1
  86. package/dist/load/serializable.js +0 -1
  87. package/dist/output_parsers.d.ts +0 -22
  88. package/dist/types.cjs +0 -48
  89. package/dist/types.js +0 -45
  90. package/dist/utils/errors.d.ts +0 -3
  91. package/dist/utils/message_inputs.d.ts +0 -14
  92. package/dist/utils/message_outputs.d.ts +0 -14
  93. package/dist/utils/tools.d.ts +0 -3
  94. package/experimental.cjs +0 -1
  95. package/experimental.d.cts +0 -1
  96. package/experimental.d.ts +0 -1
  97. package/experimental.js +0 -1
  98. package/index.cjs +0 -1
  99. package/index.d.cts +0 -1
  100. package/index.d.ts +0 -1
  101. package/index.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message_inputs.js","names":["imageUrl: string","parsedUrl: URL","messages: BaseMessage[]","toolCall: ToolCall","content: ContentBlock[]","block: AnthropicThinkingBlockParam","block: AnthropicRedactedThinkingBlockParam","block: AnthropicSearchResultBlockParam","message: BaseMessage","messages: AnthropicMessageCreateParams[\"messages\"]","result: AnthropicMessageCreateParams[\"messages\"]","content:\n | string\n | Array<\n | AnthropicTextBlockParam\n | AnthropicImageBlockParam\n | AnthropicToolUseBlockParam\n | AnthropicToolResultBlockParam\n | AnthropicDocumentBlockParam\n | AnthropicThinkingBlockParam\n | AnthropicRedactedThinkingBlockParam\n | AnthropicServerToolUseBlockParam\n | AnthropicWebSearchToolResultBlockParam\n | AnthropicSearchResultBlockParam\n >","msg: (typeof messages)[0]"],"sources":["../../src/utils/message_inputs.ts"],"sourcesContent":["/**\n * This util file contains functions for converting LangChain messages to Anthropic messages.\n */\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport {\n type BaseMessage,\n HumanMessage,\n ToolMessage,\n MessageContentComplex,\n isDataContentBlock,\n convertToProviderContentBlock,\n parseBase64DataUrl,\n ContentBlock,\n isAIMessage,\n} from \"@langchain/core/messages\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\nimport {\n AnthropicImageBlockParam,\n AnthropicMessageCreateParams,\n AnthropicTextBlockParam,\n AnthropicToolResultBlockParam,\n AnthropicToolUseBlockParam,\n AnthropicDocumentBlockParam,\n AnthropicThinkingBlockParam,\n AnthropicRedactedThinkingBlockParam,\n AnthropicServerToolUseBlockParam,\n AnthropicWebSearchToolResultBlockParam,\n AnthropicSearchResultBlockParam,\n AnthropicToolResponse,\n AnthropicContainerUploadBlockParam,\n} from \"../types.js\";\nimport {\n _isAnthropicImageBlockParam,\n _isAnthropicRedactedThinkingBlock,\n _isAnthropicSearchResultBlock,\n _isAnthropicThinkingBlock,\n standardContentBlockConverter,\n} from \"./content.js\";\nimport { _formatStandardContent } from \"./standard.js\";\n\nfunction _formatImage(imageUrl: string) {\n const parsed = parseBase64DataUrl({ dataUrl: imageUrl });\n if (parsed) {\n return {\n type: \"base64\",\n media_type: parsed.mime_type,\n data: parsed.data,\n };\n }\n let parsedUrl: URL;\n\n try {\n parsedUrl = new URL(imageUrl);\n } catch {\n throw new Error(\n [\n `Malformed image URL: ${JSON.stringify(\n imageUrl\n )}. Content blocks of type 'image_url' must be a valid http, https, or base64-encoded data URL.`,\n \"Example: data:image/png;base64,/9j/4AAQSk...\",\n \"Example: https://example.com/image.jpg\",\n ].join(\"\\n\\n\")\n );\n }\n\n if (parsedUrl.protocol === \"http:\" || parsedUrl.protocol === \"https:\") {\n return {\n type: \"url\",\n url: imageUrl,\n };\n }\n\n throw new Error(\n [\n `Invalid image URL protocol: ${JSON.stringify(\n parsedUrl.protocol\n )}. Anthropic only supports images as http, https, or base64-encoded data URLs on 'image_url' content blocks.`,\n \"Example: data:image/png;base64,/9j/4AAQSk...\",\n \"Example: https://example.com/image.jpg\",\n ].join(\"\\n\\n\")\n );\n}\n\nfunction _ensureMessageContents(messages: BaseMessage[]): BaseMessage[] {\n // Merge runs of human/tool messages into single human messages with content blocks.\n const updatedMsgs = [];\n for (const message of messages) {\n if (message._getType() === \"tool\") {\n if (typeof message.content === \"string\") {\n const previousMessage = updatedMsgs[updatedMsgs.length - 1];\n if (\n previousMessage?._getType() === \"human\" &&\n Array.isArray(previousMessage.content) &&\n \"type\" in previousMessage.content[0] &&\n previousMessage.content[0].type === \"tool_result\"\n ) {\n // If the previous message was a tool result, we merge this tool message into it.\n (previousMessage.content as MessageContentComplex[]).push({\n type: \"tool_result\",\n content: message.content,\n tool_use_id: (message as ToolMessage).tool_call_id,\n });\n } else {\n // If not, we create a new human message with the tool result.\n updatedMsgs.push(\n new HumanMessage({\n content: [\n {\n type: \"tool_result\",\n content: message.content,\n tool_use_id: (message as ToolMessage).tool_call_id,\n },\n ],\n })\n );\n }\n } else {\n updatedMsgs.push(\n new HumanMessage({\n content: [\n {\n type: \"tool_result\",\n // rare case: message.content could be undefined\n ...(message.content != null\n ? { content: _formatContent(message) }\n : {}),\n tool_use_id: (message as ToolMessage).tool_call_id,\n },\n ],\n })\n );\n }\n } else {\n updatedMsgs.push(message);\n }\n }\n return updatedMsgs;\n}\n\nexport function _convertLangChainToolCallToAnthropic(\n toolCall: ToolCall\n): AnthropicToolResponse {\n if (toolCall.id === undefined) {\n throw new Error(`Anthropic requires all tool calls to have an \"id\".`);\n }\n return {\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.name,\n input: toolCall.args,\n };\n}\n\nfunction* _formatContentBlocks(\n content: ContentBlock[]\n): Generator<Anthropic.Beta.BetaContentBlockParam> {\n const toolTypes = [\n \"bash_code_execution_tool_result\",\n \"input_json_delta\",\n \"server_tool_use\",\n \"text_editor_code_execution_tool_result\",\n \"tool_result\",\n \"tool_use\",\n \"web_search_result\",\n \"web_search_tool_result\",\n ];\n const textTypes = [\"text\", \"text_delta\"];\n for (const contentPart of content) {\n if (isDataContentBlock(contentPart)) {\n yield convertToProviderContentBlock(\n contentPart,\n standardContentBlockConverter\n );\n }\n\n const cacheControl =\n \"cache_control\" in contentPart ? contentPart.cache_control : undefined;\n\n if (contentPart.type === \"image_url\") {\n let source;\n if (typeof contentPart.image_url === \"string\") {\n source = _formatImage(contentPart.image_url);\n } else if (\n typeof contentPart.image_url === \"object\" &&\n contentPart.image_url !== null &&\n \"url\" in contentPart.image_url &&\n typeof contentPart.image_url.url === \"string\"\n ) {\n source = _formatImage(contentPart.image_url.url);\n }\n if (source) {\n yield {\n type: \"image\" as const, // Explicitly setting the type as \"image\"\n source,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as Anthropic.Messages.ImageBlockParam;\n }\n } else if (_isAnthropicImageBlockParam(contentPart)) {\n return contentPart;\n } else if (contentPart.type === \"document\") {\n // PDF\n yield {\n ...contentPart,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as Anthropic.Messages.DocumentBlockParam;\n } else if (_isAnthropicThinkingBlock(contentPart)) {\n const block: AnthropicThinkingBlockParam = {\n type: \"thinking\" as const, // Explicitly setting the type as \"thinking\"\n thinking: contentPart.thinking,\n signature: contentPart.signature,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n };\n yield block;\n } else if (_isAnthropicRedactedThinkingBlock(contentPart)) {\n const block: AnthropicRedactedThinkingBlockParam = {\n type: \"redacted_thinking\" as const, // Explicitly setting the type as \"redacted_thinking\"\n data: contentPart.data,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n };\n yield block;\n } else if (_isAnthropicSearchResultBlock(contentPart)) {\n const block: AnthropicSearchResultBlockParam = {\n type: \"search_result\" as const, // Explicitly setting the type as \"search_result\"\n title: contentPart.title,\n source: contentPart.source,\n ...(\"cache_control\" in contentPart && contentPart.cache_control\n ? { cache_control: contentPart.cache_control }\n : {}),\n ...(\"citations\" in contentPart && contentPart.citations\n ? { citations: contentPart.citations }\n : {}),\n content: contentPart.content,\n };\n yield block as Anthropic.Beta.BetaSearchResultBlockParam;\n } else if (\n textTypes.find((t) => t === contentPart.type) &&\n \"text\" in contentPart\n ) {\n // Assuming contentPart is of type MessageContentText here\n yield {\n type: \"text\" as const, // Explicitly setting the type as \"text\"\n text: contentPart.text,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n ...(\"citations\" in contentPart && contentPart.citations\n ? { citations: contentPart.citations }\n : {}),\n } as Anthropic.Messages.TextBlockParam;\n } else if (toolTypes.find((t) => t === contentPart.type)) {\n const contentPartCopy = { ...contentPart };\n if (\"index\" in contentPartCopy) {\n // Anthropic does not support passing the index field here, so we remove it.\n delete contentPartCopy.index;\n }\n\n if (contentPartCopy.type === \"input_json_delta\") {\n // `input_json_delta` type only represents yielding partial tool inputs\n // and is not a valid type for Anthropic messages.\n contentPartCopy.type = \"tool_use\";\n }\n\n if (\"input\" in contentPartCopy) {\n // Anthropic tool use inputs should be valid objects, when applicable.\n if (typeof contentPartCopy.input === \"string\") {\n try {\n contentPartCopy.input = JSON.parse(contentPartCopy.input);\n } catch {\n contentPartCopy.input = {};\n }\n }\n }\n // TODO: Fix when SDK types are fixed\n yield {\n ...contentPartCopy,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n } else if (contentPart.type === \"container_upload\") {\n yield {\n ...contentPart,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as AnthropicContainerUploadBlockParam;\n }\n\n // Note that we are intentionally dropping any blocks that we don't\n // recognize. This is to allow for cross-compatibility between different\n // providers that may have different block types. Ie if we take a message\n // output from OpenAI and send it to Anthropic, we want to drop any blocks\n // that Anthropic doesn't understand.\n }\n}\n\nfunction _formatContent(message: BaseMessage) {\n const { content } = message;\n\n if (typeof content === \"string\") {\n return content;\n } else {\n return Array.from(_formatContentBlocks(content));\n }\n}\n\n/**\n * Formats messages as a prompt for the model.\n * Used in LangSmith, export is important here.\n * @param messages The base messages to format as a prompt.\n * @returns The formatted prompt.\n */\nexport function _convertMessagesToAnthropicPayload(\n messages: BaseMessage[]\n): AnthropicMessageCreateParams {\n const mergedMessages = _ensureMessageContents(messages);\n let system;\n if (mergedMessages.length > 0 && mergedMessages[0]._getType() === \"system\") {\n system = messages[0].content;\n }\n const conversationMessages =\n system !== undefined ? mergedMessages.slice(1) : mergedMessages;\n const formattedMessages = conversationMessages.map((message) => {\n let role;\n if (message._getType() === \"human\") {\n role = \"user\" as const;\n } else if (message._getType() === \"ai\") {\n role = \"assistant\" as const;\n } else if (message._getType() === \"tool\") {\n role = \"user\" as const;\n } else if (message._getType() === \"system\") {\n throw new Error(\n \"System messages are only permitted as the first passed message.\"\n );\n } else {\n throw new Error(`Message type \"${message.type}\" is not supported.`);\n }\n if (\n isAIMessage(message) &&\n message.response_metadata?.output_version === \"v1\"\n ) {\n return {\n role,\n content: _formatStandardContent(message),\n };\n }\n if (isAIMessage(message) && !!message.tool_calls?.length) {\n if (typeof message.content === \"string\") {\n if (message.content === \"\") {\n return {\n role,\n content: message.tool_calls.map(\n _convertLangChainToolCallToAnthropic\n ),\n };\n } else {\n return {\n role,\n content: [\n { type: \"text\", text: message.content },\n ...message.tool_calls.map(_convertLangChainToolCallToAnthropic),\n ],\n };\n }\n } else {\n const { content } = message;\n const hasMismatchedToolCalls = !message.tool_calls.every((toolCall) =>\n content.find(\n (contentPart) =>\n (contentPart.type === \"tool_use\" ||\n contentPart.type === \"input_json_delta\" ||\n contentPart.type === \"server_tool_use\") &&\n contentPart.id === toolCall.id\n )\n );\n if (hasMismatchedToolCalls) {\n console.warn(\n `The \"tool_calls\" field on a message is only respected if content is a string.`\n );\n }\n return {\n role,\n content: _formatContent(message),\n };\n }\n } else {\n return {\n role,\n content: _formatContent(message),\n };\n }\n });\n return {\n messages: mergeMessages(\n formattedMessages as AnthropicMessageCreateParams[\"messages\"]\n ),\n system,\n } as AnthropicMessageCreateParams;\n}\n\nfunction mergeMessages(messages: AnthropicMessageCreateParams[\"messages\"]) {\n if (!messages || messages.length <= 1) {\n return messages;\n }\n\n const result: AnthropicMessageCreateParams[\"messages\"] = [];\n let currentMessage = messages[0];\n\n const normalizeContent = (\n content:\n | string\n | Array<\n | AnthropicTextBlockParam\n | AnthropicImageBlockParam\n | AnthropicToolUseBlockParam\n | AnthropicToolResultBlockParam\n | AnthropicDocumentBlockParam\n | AnthropicThinkingBlockParam\n | AnthropicRedactedThinkingBlockParam\n | AnthropicServerToolUseBlockParam\n | AnthropicWebSearchToolResultBlockParam\n | AnthropicSearchResultBlockParam\n >\n ): Array<\n | AnthropicTextBlockParam\n | AnthropicImageBlockParam\n | AnthropicToolUseBlockParam\n | AnthropicToolResultBlockParam\n | AnthropicDocumentBlockParam\n | AnthropicThinkingBlockParam\n | AnthropicRedactedThinkingBlockParam\n | AnthropicServerToolUseBlockParam\n | AnthropicWebSearchToolResultBlockParam\n | AnthropicSearchResultBlockParam\n > => {\n if (typeof content === \"string\") {\n return [\n {\n type: \"text\",\n text: content,\n },\n ];\n }\n return content;\n };\n\n const isToolResultMessage = (msg: (typeof messages)[0]) => {\n if (msg.role !== \"user\") return false;\n\n if (typeof msg.content === \"string\") {\n return false;\n }\n\n return (\n Array.isArray(msg.content) &&\n msg.content.every((item) => item.type === \"tool_result\")\n );\n };\n\n for (let i = 1; i < messages.length; i += 1) {\n const nextMessage = messages[i];\n\n if (\n isToolResultMessage(currentMessage) &&\n isToolResultMessage(nextMessage)\n ) {\n // Merge the messages by combining their content arrays\n currentMessage = {\n ...currentMessage,\n content: [\n ...normalizeContent(currentMessage.content),\n ...normalizeContent(nextMessage.content),\n ],\n };\n } else {\n result.push(currentMessage);\n currentMessage = nextMessage;\n }\n }\n\n result.push(currentMessage);\n return result;\n}\n"],"mappings":"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"}
@@ -1,254 +1,190 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports._makeMessageChunkFromAnthropicEvent = _makeMessageChunkFromAnthropicEvent;
4
- exports.anthropicResponseToChatMessages = anthropicResponseToChatMessages;
5
- const messages_1 = require("@langchain/core/messages");
6
- const output_parsers_js_1 = require("../output_parsers.cjs");
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_output_parsers = require('../output_parsers.cjs');
3
+ const __langchain_core_messages = require_rolldown_runtime.__toESM(require("@langchain/core/messages"));
4
+
5
+ //#region src/utils/message_outputs.ts
7
6
  function _makeMessageChunkFromAnthropicEvent(data, fields) {
8
- if (data.type === "message_start") {
9
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
10
- const { content, usage, ...additionalKwargs } = data.message;
11
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
- const filteredAdditionalKwargs = {};
13
- for (const [key, value] of Object.entries(additionalKwargs)) {
14
- if (value !== undefined && value !== null) {
15
- filteredAdditionalKwargs[key] = value;
16
- }
17
- }
18
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
- const { input_tokens, output_tokens, ...rest } = usage ?? {};
20
- const usageMetadata = {
21
- input_tokens,
22
- output_tokens,
23
- total_tokens: input_tokens + output_tokens,
24
- input_token_details: {
25
- cache_creation: rest.cache_creation_input_tokens,
26
- cache_read: rest.cache_read_input_tokens,
27
- },
28
- };
29
- return {
30
- chunk: new messages_1.AIMessageChunk({
31
- content: fields.coerceContentToString ? "" : [],
32
- additional_kwargs: filteredAdditionalKwargs,
33
- usage_metadata: fields.streamUsage ? usageMetadata : undefined,
34
- response_metadata: {
35
- usage: {
36
- ...rest,
37
- },
38
- },
39
- id: data.message.id,
40
- }),
41
- };
42
- }
43
- else if (data.type === "message_delta") {
44
- const usageMetadata = {
45
- input_tokens: 0,
46
- output_tokens: data.usage.output_tokens,
47
- total_tokens: data.usage.output_tokens,
48
- input_token_details: {
49
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
- cache_creation: data.usage.cache_creation_input_tokens,
51
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
- cache_read: data.usage.cache_read_input_tokens,
53
- },
54
- };
55
- const responseMetadata = "context_management" in data.delta
56
- ? { context_management: data.delta.context_management }
57
- : undefined;
58
- return {
59
- chunk: new messages_1.AIMessageChunk({
60
- content: fields.coerceContentToString ? "" : [],
61
- additional_kwargs: { ...data.delta },
62
- usage_metadata: fields.streamUsage ? usageMetadata : undefined,
63
- response_metadata: responseMetadata,
64
- }),
65
- };
66
- }
67
- else if (data.type === "content_block_start" &&
68
- [
69
- "tool_use",
70
- "document",
71
- "server_tool_use",
72
- "web_search_tool_result",
73
- ].includes(data.content_block.type)) {
74
- const contentBlock = data.content_block;
75
- let toolCallChunks;
76
- if (contentBlock.type === "tool_use") {
77
- toolCallChunks = [
78
- {
79
- id: contentBlock.id,
80
- index: data.index,
81
- name: contentBlock.name,
82
- args: "",
83
- },
84
- ];
85
- }
86
- else {
87
- toolCallChunks = [];
88
- }
89
- return {
90
- chunk: new messages_1.AIMessageChunk({
91
- content: fields.coerceContentToString
92
- ? ""
93
- : [
94
- {
95
- index: data.index,
96
- ...data.content_block,
97
- input: contentBlock.type === "server_tool_use" ||
98
- contentBlock.type === "tool_use"
99
- ? ""
100
- : undefined,
101
- },
102
- ],
103
- additional_kwargs: {},
104
- tool_call_chunks: toolCallChunks,
105
- }),
106
- };
107
- }
108
- else if (data.type === "content_block_delta" &&
109
- [
110
- "text_delta",
111
- "citations_delta",
112
- "thinking_delta",
113
- "signature_delta",
114
- ].includes(data.delta.type)) {
115
- if (fields.coerceContentToString && "text" in data.delta) {
116
- return {
117
- chunk: new messages_1.AIMessageChunk({
118
- content: data.delta.text,
119
- }),
120
- };
121
- }
122
- else {
123
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
124
- const contentBlock = data.delta;
125
- if ("citation" in contentBlock) {
126
- contentBlock.citations = [contentBlock.citation];
127
- delete contentBlock.citation;
128
- }
129
- if (contentBlock.type === "thinking_delta" ||
130
- contentBlock.type === "signature_delta") {
131
- return {
132
- chunk: new messages_1.AIMessageChunk({
133
- content: [{ index: data.index, ...contentBlock, type: "thinking" }],
134
- }),
135
- };
136
- }
137
- return {
138
- chunk: new messages_1.AIMessageChunk({
139
- content: [{ index: data.index, ...contentBlock, type: "text" }],
140
- }),
141
- };
142
- }
143
- }
144
- else if (data.type === "content_block_delta" &&
145
- data.delta.type === "input_json_delta") {
146
- return {
147
- chunk: new messages_1.AIMessageChunk({
148
- content: fields.coerceContentToString
149
- ? ""
150
- : [
151
- {
152
- index: data.index,
153
- input: data.delta.partial_json,
154
- type: data.delta.type,
155
- },
156
- ],
157
- additional_kwargs: {},
158
- tool_call_chunks: [
159
- {
160
- index: data.index,
161
- args: data.delta.partial_json,
162
- },
163
- ],
164
- }),
165
- };
166
- }
167
- else if (data.type === "content_block_start" &&
168
- data.content_block.type === "text") {
169
- const content = data.content_block?.text;
170
- if (content !== undefined) {
171
- return {
172
- chunk: new messages_1.AIMessageChunk({
173
- content: fields.coerceContentToString
174
- ? content
175
- : [
176
- {
177
- index: data.index,
178
- ...data.content_block,
179
- },
180
- ],
181
- additional_kwargs: {},
182
- }),
183
- };
184
- }
185
- }
186
- else if (data.type === "content_block_start" &&
187
- data.content_block.type === "redacted_thinking") {
188
- return {
189
- chunk: new messages_1.AIMessageChunk({
190
- content: fields.coerceContentToString
191
- ? ""
192
- : [{ index: data.index, ...data.content_block }],
193
- }),
194
- };
195
- }
196
- else if (data.type === "content_block_start" &&
197
- data.content_block.type === "thinking") {
198
- const content = data.content_block.thinking;
199
- return {
200
- chunk: new messages_1.AIMessageChunk({
201
- content: fields.coerceContentToString
202
- ? content
203
- : [{ index: data.index, ...data.content_block }],
204
- }),
205
- };
206
- }
207
- return null;
7
+ const response_metadata = { model_provider: "anthropic" };
8
+ if (data.type === "message_start") {
9
+ const { content, usage,...additionalKwargs } = data.message;
10
+ const filteredAdditionalKwargs = {};
11
+ for (const [key, value] of Object.entries(additionalKwargs)) if (value !== void 0 && value !== null) filteredAdditionalKwargs[key] = value;
12
+ const { input_tokens, output_tokens,...rest } = usage ?? {};
13
+ const usageMetadata = {
14
+ input_tokens,
15
+ output_tokens,
16
+ total_tokens: input_tokens + output_tokens,
17
+ input_token_details: {
18
+ cache_creation: rest.cache_creation_input_tokens,
19
+ cache_read: rest.cache_read_input_tokens
20
+ }
21
+ };
22
+ return { chunk: new __langchain_core_messages.AIMessageChunk({
23
+ content: fields.coerceContentToString ? "" : [],
24
+ additional_kwargs: filteredAdditionalKwargs,
25
+ usage_metadata: fields.streamUsage ? usageMetadata : void 0,
26
+ response_metadata: {
27
+ ...response_metadata,
28
+ usage: { ...rest }
29
+ },
30
+ id: data.message.id
31
+ }) };
32
+ } else if (data.type === "message_delta") {
33
+ const usageMetadata = {
34
+ input_tokens: 0,
35
+ output_tokens: data.usage.output_tokens,
36
+ total_tokens: data.usage.output_tokens,
37
+ input_token_details: {
38
+ cache_creation: data.usage.cache_creation_input_tokens,
39
+ cache_read: data.usage.cache_read_input_tokens
40
+ }
41
+ };
42
+ const responseMetadata = "context_management" in data.delta ? { context_management: data.delta.context_management } : void 0;
43
+ return { chunk: new __langchain_core_messages.AIMessageChunk({
44
+ content: fields.coerceContentToString ? "" : [],
45
+ response_metadata: responseMetadata,
46
+ additional_kwargs: { ...data.delta },
47
+ usage_metadata: fields.streamUsage ? usageMetadata : void 0
48
+ }) };
49
+ } else if (data.type === "content_block_start" && [
50
+ "tool_use",
51
+ "document",
52
+ "server_tool_use",
53
+ "web_search_tool_result"
54
+ ].includes(data.content_block.type)) {
55
+ const contentBlock = data.content_block;
56
+ let toolCallChunks;
57
+ if (contentBlock.type === "tool_use") toolCallChunks = [{
58
+ id: contentBlock.id,
59
+ index: data.index,
60
+ name: contentBlock.name,
61
+ args: ""
62
+ }];
63
+ else toolCallChunks = [];
64
+ return { chunk: new __langchain_core_messages.AIMessageChunk({
65
+ content: fields.coerceContentToString ? "" : [{
66
+ index: data.index,
67
+ ...data.content_block,
68
+ input: contentBlock.type === "server_tool_use" || contentBlock.type === "tool_use" ? "" : void 0
69
+ }],
70
+ response_metadata,
71
+ additional_kwargs: {},
72
+ tool_call_chunks: toolCallChunks
73
+ }) };
74
+ } else if (data.type === "content_block_delta" && [
75
+ "text_delta",
76
+ "citations_delta",
77
+ "thinking_delta",
78
+ "signature_delta"
79
+ ].includes(data.delta.type)) if (fields.coerceContentToString && "text" in data.delta) return { chunk: new __langchain_core_messages.AIMessageChunk({ content: data.delta.text }) };
80
+ else {
81
+ const contentBlock = data.delta;
82
+ if ("citation" in contentBlock) {
83
+ contentBlock.citations = [contentBlock.citation];
84
+ delete contentBlock.citation;
85
+ }
86
+ if (contentBlock.type === "thinking_delta" || contentBlock.type === "signature_delta") return { chunk: new __langchain_core_messages.AIMessageChunk({
87
+ content: [{
88
+ index: data.index,
89
+ ...contentBlock,
90
+ type: "thinking"
91
+ }],
92
+ response_metadata
93
+ }) };
94
+ return { chunk: new __langchain_core_messages.AIMessageChunk({
95
+ content: [{
96
+ index: data.index,
97
+ ...contentBlock,
98
+ type: "text"
99
+ }],
100
+ response_metadata
101
+ }) };
102
+ }
103
+ else if (data.type === "content_block_delta" && data.delta.type === "input_json_delta") return { chunk: new __langchain_core_messages.AIMessageChunk({
104
+ content: fields.coerceContentToString ? "" : [{
105
+ index: data.index,
106
+ input: data.delta.partial_json,
107
+ type: data.delta.type
108
+ }],
109
+ response_metadata,
110
+ additional_kwargs: {},
111
+ tool_call_chunks: [{
112
+ index: data.index,
113
+ args: data.delta.partial_json
114
+ }]
115
+ }) };
116
+ else if (data.type === "content_block_start" && data.content_block.type === "text") {
117
+ const content = data.content_block?.text;
118
+ if (content !== void 0) return { chunk: new __langchain_core_messages.AIMessageChunk({
119
+ content: fields.coerceContentToString ? content : [{
120
+ index: data.index,
121
+ ...data.content_block
122
+ }],
123
+ response_metadata,
124
+ additional_kwargs: {}
125
+ }) };
126
+ } else if (data.type === "content_block_start" && data.content_block.type === "redacted_thinking") return { chunk: new __langchain_core_messages.AIMessageChunk({
127
+ content: fields.coerceContentToString ? "" : [{
128
+ index: data.index,
129
+ ...data.content_block
130
+ }],
131
+ response_metadata
132
+ }) };
133
+ else if (data.type === "content_block_start" && data.content_block.type === "thinking") {
134
+ const content = data.content_block.thinking;
135
+ return { chunk: new __langchain_core_messages.AIMessageChunk({
136
+ content: fields.coerceContentToString ? content : [{
137
+ index: data.index,
138
+ ...data.content_block
139
+ }],
140
+ response_metadata
141
+ }) };
142
+ }
143
+ return null;
208
144
  }
209
145
  function anthropicResponseToChatMessages(messages, additionalKwargs) {
210
- const usage = additionalKwargs.usage;
211
- const usageMetadata = usage != null
212
- ? {
213
- input_tokens: usage.input_tokens ?? 0,
214
- output_tokens: usage.output_tokens ?? 0,
215
- total_tokens: (usage.input_tokens ?? 0) + (usage.output_tokens ?? 0),
216
- input_token_details: {
217
- cache_creation: usage.cache_creation_input_tokens,
218
- cache_read: usage.cache_read_input_tokens,
219
- },
220
- }
221
- : undefined;
222
- if (messages.length === 1 && messages[0].type === "text") {
223
- return [
224
- {
225
- text: messages[0].text,
226
- message: new messages_1.AIMessage({
227
- content: messages[0].text,
228
- additional_kwargs: additionalKwargs,
229
- usage_metadata: usageMetadata,
230
- response_metadata: additionalKwargs,
231
- id: additionalKwargs.id,
232
- }),
233
- },
234
- ];
235
- }
236
- else {
237
- const toolCalls = (0, output_parsers_js_1.extractToolCalls)(messages);
238
- const generations = [
239
- {
240
- text: "",
241
- message: new messages_1.AIMessage({
242
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
243
- content: messages,
244
- additional_kwargs: additionalKwargs,
245
- tool_calls: toolCalls,
246
- usage_metadata: usageMetadata,
247
- response_metadata: additionalKwargs,
248
- id: additionalKwargs.id,
249
- }),
250
- },
251
- ];
252
- return generations;
253
- }
146
+ const response_metadata = {
147
+ ...additionalKwargs,
148
+ model_provider: "anthropic"
149
+ };
150
+ const usage = additionalKwargs.usage;
151
+ const usageMetadata = usage != null ? {
152
+ input_tokens: usage.input_tokens ?? 0,
153
+ output_tokens: usage.output_tokens ?? 0,
154
+ total_tokens: (usage.input_tokens ?? 0) + (usage.output_tokens ?? 0),
155
+ input_token_details: {
156
+ cache_creation: usage.cache_creation_input_tokens,
157
+ cache_read: usage.cache_read_input_tokens
158
+ }
159
+ } : void 0;
160
+ if (messages.length === 1 && messages[0].type === "text") return [{
161
+ text: messages[0].text,
162
+ message: new __langchain_core_messages.AIMessage({
163
+ content: messages[0].text,
164
+ additional_kwargs: additionalKwargs,
165
+ usage_metadata: usageMetadata,
166
+ response_metadata,
167
+ id: additionalKwargs.id
168
+ })
169
+ }];
170
+ else {
171
+ const toolCalls = require_output_parsers.extractToolCalls(messages);
172
+ const generations = [{
173
+ text: "",
174
+ message: new __langchain_core_messages.AIMessage({
175
+ content: messages,
176
+ additional_kwargs: additionalKwargs,
177
+ tool_calls: toolCalls,
178
+ usage_metadata: usageMetadata,
179
+ response_metadata,
180
+ id: additionalKwargs.id
181
+ })
182
+ }];
183
+ return generations;
184
+ }
254
185
  }
186
+
187
+ //#endregion
188
+ exports._makeMessageChunkFromAnthropicEvent = _makeMessageChunkFromAnthropicEvent;
189
+ exports.anthropicResponseToChatMessages = anthropicResponseToChatMessages;
190
+ //# sourceMappingURL=message_outputs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message_outputs.cjs","names":["data: Anthropic.Messages.RawMessageStreamEvent","fields: {\n streamUsage: boolean;\n coerceContentToString: boolean;\n }","filteredAdditionalKwargs: Record<string, any>","usageMetadata: UsageMetadata","AIMessageChunk","toolCallChunks: ToolCallChunk[]","contentBlock: Record<string, any>","messages: AnthropicMessageResponse[]","additionalKwargs: Record<string, unknown>","usage: Record<string, number> | null | undefined","AIMessage","extractToolCalls","generations: ChatGeneration[]"],"sources":["../../src/utils/message_outputs.ts"],"sourcesContent":["/**\n * This util file contains functions for converting Anthropic messages to LangChain messages.\n */\nimport Anthropic from \"@anthropic-ai/sdk\";\nimport {\n AIMessage,\n AIMessageChunk,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport type { ToolCallChunk } from \"@langchain/core/messages/tool\";\nimport { ChatGeneration } from \"@langchain/core/outputs\";\nimport { AnthropicMessageResponse } from \"../types.js\";\nimport { extractToolCalls } from \"../output_parsers.js\";\n\nexport function _makeMessageChunkFromAnthropicEvent(\n data: Anthropic.Messages.RawMessageStreamEvent,\n fields: {\n streamUsage: boolean;\n coerceContentToString: boolean;\n }\n): {\n chunk: AIMessageChunk;\n} | null {\n const response_metadata = { model_provider: \"anthropic\" };\n if (data.type === \"message_start\") {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { content, usage, ...additionalKwargs } = data.message;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const filteredAdditionalKwargs: Record<string, any> = {};\n for (const [key, value] of Object.entries(additionalKwargs)) {\n if (value !== undefined && value !== null) {\n filteredAdditionalKwargs[key] = value;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { input_tokens, output_tokens, ...rest }: Record<string, any> =\n usage ?? {};\n const usageMetadata: UsageMetadata = {\n input_tokens,\n output_tokens,\n total_tokens: input_tokens + output_tokens,\n input_token_details: {\n cache_creation: rest.cache_creation_input_tokens,\n cache_read: rest.cache_read_input_tokens,\n },\n };\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n additional_kwargs: filteredAdditionalKwargs,\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n response_metadata: {\n ...response_metadata,\n usage: {\n ...rest,\n },\n },\n id: data.message.id,\n }),\n };\n } else if (data.type === \"message_delta\") {\n const usageMetadata: UsageMetadata = {\n input_tokens: 0,\n output_tokens: data.usage.output_tokens,\n total_tokens: data.usage.output_tokens,\n input_token_details: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cache_creation: (data.usage as any).cache_creation_input_tokens,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cache_read: (data.usage as any).cache_read_input_tokens,\n },\n };\n const responseMetadata =\n \"context_management\" in data.delta\n ? { context_management: data.delta.context_management }\n : undefined;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n response_metadata: responseMetadata,\n additional_kwargs: { ...data.delta },\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n [\n \"tool_use\",\n \"document\",\n \"server_tool_use\",\n \"web_search_tool_result\",\n ].includes(data.content_block.type)\n ) {\n const contentBlock = data.content_block;\n let toolCallChunks: ToolCallChunk[];\n if (contentBlock.type === \"tool_use\") {\n toolCallChunks = [\n {\n id: contentBlock.id,\n index: data.index,\n name: contentBlock.name,\n args: \"\",\n },\n ];\n } else {\n toolCallChunks = [];\n }\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n ...data.content_block,\n input:\n contentBlock.type === \"server_tool_use\" ||\n contentBlock.type === \"tool_use\"\n ? \"\"\n : undefined,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n tool_call_chunks: toolCallChunks,\n }),\n };\n } else if (\n data.type === \"content_block_delta\" &&\n [\n \"text_delta\",\n \"citations_delta\",\n \"thinking_delta\",\n \"signature_delta\",\n ].includes(data.delta.type)\n ) {\n if (fields.coerceContentToString && \"text\" in data.delta) {\n return {\n chunk: new AIMessageChunk({\n content: data.delta.text,\n }),\n };\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const contentBlock: Record<string, any> = data.delta;\n if (\"citation\" in contentBlock) {\n contentBlock.citations = [contentBlock.citation];\n delete contentBlock.citation;\n }\n if (\n contentBlock.type === \"thinking_delta\" ||\n contentBlock.type === \"signature_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"thinking\" }],\n response_metadata,\n }),\n };\n }\n\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"text\" }],\n response_metadata,\n }),\n };\n }\n } else if (\n data.type === \"content_block_delta\" &&\n data.delta.type === \"input_json_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n input: data.delta.partial_json,\n type: data.delta.type,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n tool_call_chunks: [\n {\n index: data.index,\n args: data.delta.partial_json,\n },\n ],\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"text\"\n ) {\n const content = data.content_block?.text;\n if (content !== undefined) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [\n {\n index: data.index,\n ...data.content_block,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n }),\n };\n }\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"redacted_thinking\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"thinking\"\n ) {\n const content = data.content_block.thinking;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n }\n return null;\n}\n\nexport function anthropicResponseToChatMessages(\n messages: AnthropicMessageResponse[],\n additionalKwargs: Record<string, unknown>\n): ChatGeneration[] {\n const response_metadata = {\n ...additionalKwargs,\n model_provider: \"anthropic\",\n };\n const usage: Record<string, number> | null | undefined =\n additionalKwargs.usage as Record<string, number> | null | undefined;\n const usageMetadata =\n usage != null\n ? {\n input_tokens: usage.input_tokens ?? 0,\n output_tokens: usage.output_tokens ?? 0,\n total_tokens: (usage.input_tokens ?? 0) + (usage.output_tokens ?? 0),\n input_token_details: {\n cache_creation: usage.cache_creation_input_tokens,\n cache_read: usage.cache_read_input_tokens,\n },\n }\n : undefined;\n if (messages.length === 1 && messages[0].type === \"text\") {\n return [\n {\n text: messages[0].text,\n message: new AIMessage({\n content: messages[0].text,\n additional_kwargs: additionalKwargs,\n usage_metadata: usageMetadata,\n response_metadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n } else {\n const toolCalls = extractToolCalls(messages);\n const generations: ChatGeneration[] = [\n {\n text: \"\",\n message: new AIMessage({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n content: messages as any,\n additional_kwargs: additionalKwargs,\n tool_calls: toolCalls,\n usage_metadata: usageMetadata,\n response_metadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n return generations;\n }\n}\n"],"mappings":"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"}