@langchain/anthropic 1.0.0-alpha.2 → 1.0.0

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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,37 @@
1
+ # @langchain/anthropic
2
+
3
+ ## 1.0.0
4
+
5
+ This release updates the package for compatibility with LangChain v1.0. See the v1.0 [release notes](https://docs.langchain.com/oss/javascript/releases/langchain-v1) for details on what's new.
6
+
7
+ ## 0.3.31
8
+
9
+ ### Patch Changes
10
+
11
+ - 51f638e: fix content management param
12
+
13
+ ## 0.3.30
14
+
15
+ ### Patch Changes
16
+
17
+ - 6c7eb84: fix sonnet-4.5 thinking
18
+
19
+ ## 0.3.29
20
+
21
+ ### Patch Changes
22
+
23
+ - 93493ee: add support for context management
24
+ - 93493ee: add support for memory server tools
25
+ - 93493ee: add default init options for sonnet-4.5
26
+
27
+ ## 0.3.28
28
+
29
+ ### Patch Changes
30
+
31
+ - 9ed7dfa: fix unhandled tool choice 'none'
32
+
33
+ ## 0.3.27
34
+
35
+ ### Patch Changes
36
+
37
+ - 49c242c: fix opus 4.1 topP error when streaming
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
- The MIT License
1
+ MIT License
2
2
 
3
- Copyright (c) Harrison Chase
3
+ Copyright (c) LangChain, Inc.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -9,13 +9,13 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
9
  copies of the Software, and to permit persons to whom the Software is
10
10
  furnished to do so, subject to the following conditions:
11
11
 
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
14
 
15
15
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
16
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
17
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -16,6 +16,21 @@ const __langchain_core_utils_types = require_rolldown_runtime.__toESM(require("@
16
16
  const __langchain_core_utils_function_calling = require_rolldown_runtime.__toESM(require("@langchain/core/utils/function_calling"));
17
17
 
18
18
  //#region src/chat_models.ts
19
+ const MODEL_DEFAULT_MAX_OUTPUT_TOKENS = {
20
+ "claude-opus-4-1": 8192,
21
+ "claude-opus-4": 8192,
22
+ "claude-sonnet-4": 8192,
23
+ "claude-sonnet-3-7-sonnet": 8192,
24
+ "claude-3-5-sonnet": 4096,
25
+ "claude-3-5-haiku": 4096,
26
+ "claude-3-haiku": 2048
27
+ };
28
+ const FALLBACK_MAX_OUTPUT_TOKENS = 2048;
29
+ function defaultMaxOutputTokensForModel(model) {
30
+ if (!model) return FALLBACK_MAX_OUTPUT_TOKENS;
31
+ const maxTokens = Object.entries(MODEL_DEFAULT_MAX_OUTPUT_TOKENS).find(([key]) => model.startsWith(key))?.[1];
32
+ return maxTokens ?? FALLBACK_MAX_OUTPUT_TOKENS;
33
+ }
19
34
  function _toolsInParams(params) {
20
35
  return !!(params.tools && params.tools.length > 0);
21
36
  }
@@ -94,7 +109,7 @@ function extractToken(chunk) {
94
109
  * import { ChatAnthropic } from '@langchain/anthropic';
95
110
  *
96
111
  * const llm = new ChatAnthropic({
97
- * model: "claude-3-5-sonnet-20240620",
112
+ * model: "claude-sonnet-4-5-20250929",
98
113
  * temperature: 0,
99
114
  * maxTokens: undefined,
100
115
  * maxRetries: 2,
@@ -124,7 +139,7 @@ function extractToken(chunk) {
124
139
  * "content": "Here's the translation to French:\n\nJ'adore la programmation.",
125
140
  * "response_metadata": {
126
141
  * "id": "msg_01QDpd78JUHpRP6bRRNyzbW3",
127
- * "model": "claude-3-5-sonnet-20240620",
142
+ * "model": "claude-sonnet-4-5-20250929",
128
143
  * "stop_reason": "end_turn",
129
144
  * "stop_sequence": null,
130
145
  * "usage": {
@@ -162,7 +177,7 @@ function extractToken(chunk) {
162
177
  * "id": "msg_01N8MwoYxiKo9w4chE4gXUs4",
163
178
  * "type": "message",
164
179
  * "role": "assistant",
165
- * "model": "claude-3-5-sonnet-20240620"
180
+ * "model": "claude-sonnet-4-5-20250929"
166
181
  * },
167
182
  * "usage_metadata": {
168
183
  * "input_tokens": 25,
@@ -231,7 +246,7 @@ function extractToken(chunk) {
231
246
  * "id": "msg_01SBTb5zSGXfjUc7yQ8EKEEA",
232
247
  * "type": "message",
233
248
  * "role": "assistant",
234
- * "model": "claude-3-5-sonnet-20240620",
249
+ * "model": "claude-sonnet-4-5-20250929",
235
250
  * "stop_reason": "end_turn",
236
251
  * "stop_sequence": null
237
252
  * },
@@ -416,7 +431,7 @@ function extractToken(chunk) {
416
431
  * ```txt
417
432
  * {
418
433
  * id: 'msg_01STxeQxJmp4sCSpioD6vK3L',
419
- * model: 'claude-3-5-sonnet-20240620',
434
+ * model: 'claude-sonnet-4-5-20250929',
420
435
  * stop_reason: 'end_turn',
421
436
  * stop_sequence: null,
422
437
  * usage: { input_tokens: 25, output_tokens: 19 },
@@ -445,12 +460,12 @@ var ChatAnthropicMessages = class extends __langchain_core_language_models_chat_
445
460
  anthropicApiKey;
446
461
  apiKey;
447
462
  apiUrl;
448
- temperature = 1;
449
- topK = -1;
450
- topP = -1;
451
- maxTokens = 2048;
452
- modelName = "claude-2.1";
453
- model = "claude-2.1";
463
+ temperature;
464
+ topK;
465
+ topP;
466
+ maxTokens;
467
+ modelName = "claude-3-5-sonnet-latest";
468
+ model = "claude-3-5-sonnet-latest";
454
469
  invocationKwargs;
455
470
  stopSequences;
456
471
  streaming = false;
@@ -478,11 +493,10 @@ var ChatAnthropicMessages = class extends __langchain_core_language_models_chat_
478
493
  this.modelName = fields?.model ?? fields?.modelName ?? this.model;
479
494
  this.model = this.modelName;
480
495
  this.invocationKwargs = fields?.invocationKwargs ?? {};
481
- if (this.model.includes("opus-4-1") || this.model.includes("sonnet-4-5")) this.topP = fields?.topP === null ? void 0 : fields?.topP;
482
- else this.topP = fields?.topP ?? this.topP;
483
- this.temperature = fields?.temperature === null ? void 0 : fields?.temperature ?? this.temperature;
496
+ this.topP = fields?.topP ?? this.topP;
497
+ this.temperature = fields?.temperature ?? this.temperature;
484
498
  this.topK = fields?.topK ?? this.topK;
485
- this.maxTokens = fields?.maxTokens ?? this.maxTokens;
499
+ this.maxTokens = fields?.maxTokens ?? defaultMaxOutputTokensForModel(this.model);
486
500
  this.stopSequences = fields?.stopSequences ?? this.stopSequences;
487
501
  this.streaming = fields?.streaming ?? false;
488
502
  this.streamUsage = fields?.streamUsage ?? this.streamUsage;
@@ -537,9 +551,8 @@ var ChatAnthropicMessages = class extends __langchain_core_language_models_chat_
537
551
  invocationParams(options) {
538
552
  const tool_choice = require_tools.handleToolChoice(options?.tool_choice);
539
553
  if (this.thinking.type === "enabled") {
540
- if (this.topK !== -1) throw new Error("topK is not supported when thinking is enabled");
541
- if (this.model.includes("opus-4-1") || this.model.includes("sonnet-4-5") ? this.topP !== void 0 : this.topP !== -1) throw new Error("topP is not supported when thinking is enabled");
542
- if (this.temperature !== 1) throw new Error("temperature is not supported when thinking is enabled");
554
+ if (this.topP !== void 0 && this.topK !== -1) throw new Error("topK is not supported when thinking is enabled");
555
+ if (this.temperature !== void 0 && this.temperature !== 1) throw new Error("temperature is not supported when thinking is enabled");
543
556
  return {
544
557
  model: this.model,
545
558
  stop_sequences: options?.stop ?? this.stopSequences,
@@ -758,6 +771,7 @@ var ChatAnthropicMessages = class extends __langchain_core_language_models_chat_
758
771
  const thinkingAdmonition = "Anthropic structured output relies on forced tool calling, which is not supported when `thinking` is enabled. This method will raise OutputParserException if tool calls are not generated. Consider disabling `thinking` or adjust your prompt to ensure the tool is called.";
759
772
  console.warn(thinkingAdmonition);
760
773
  llm = this.withConfig({
774
+ outputVersion: "v0",
761
775
  tools,
762
776
  ls_structured_output_format: {
763
777
  kwargs: { method: "functionCalling" },
@@ -770,6 +784,7 @@ var ChatAnthropicMessages = class extends __langchain_core_language_models_chat_
770
784
  };
771
785
  llm = llm.pipe(raiseIfNoToolCalls);
772
786
  } else llm = this.withConfig({
787
+ outputVersion: "v0",
773
788
  tools,
774
789
  tool_choice: {
775
790
  type: "tool",
@@ -1 +1 @@
1
- {"version":3,"file":"chat_models.cjs","names":["params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams","tool: any","tool: unknown","chunk: AIMessageChunk","BaseChatModel","fields?: AnthropicInput & BaseChatModelParams","options: ClientOptions","Anthropic","options: this[\"ParsedCallOptions\"]","tools: ChatAnthropicCallOptions[\"tools\"]","tools: ChatAnthropicToolType[]","kwargs?: Partial<CallOptions>","options?: this[\"ParsedCallOptions\"]","tool_choice:\n | Anthropic.Messages.ToolChoiceAuto\n | Anthropic.Messages.ToolChoiceAny\n | Anthropic.Messages.ToolChoiceTool\n | Anthropic.Messages.ToolChoiceNone\n | undefined","handleToolChoice","messages: BaseMessage[]","runManager?: CallbackManagerForLLMRun","_convertMessagesToAnthropicPayload","_makeMessageChunkFromAnthropicEvent","ChatGenerationChunk","AIMessageChunk","params: Omit<\n | Anthropic.Messages.MessageCreateParamsNonStreaming\n | Anthropic.Messages.MessageCreateParamsStreaming,\n \"messages\"\n > &\n Kwargs","requestOptions: AnthropicRequestOptions","anthropicResponseToChatMessages","finalChunk: ChatGenerationChunk | undefined","request: AnthropicStreamingMessageCreateParams & Kwargs","options?: AnthropicRequestOptions","wrapAnthropicClientError","request: AnthropicMessageCreateParams & Kwargs","options: AnthropicRequestOptions","options","outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>","config?: StructuredOutputMethodOptions<boolean>","schema: InteropZodType<RunOutput> | Record<string, any>","outputParser: BaseLLMOutputParser<RunOutput>","tools: Anthropic.Messages.Tool[]","AnthropicToolsOutputParser","anthropicTools: Anthropic.Messages.Tool","message: AIMessageChunk","RunnablePassthrough","input: any","config","RunnableSequence"],"sources":["../src/chat_models.ts"],"sourcesContent":["import { Anthropic, type ClientOptions } from \"@anthropic-ai/sdk\";\nimport type { Stream } from \"@anthropic-ai/sdk/streaming\";\n\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { AIMessageChunk, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseChatModel,\n BaseChatModelCallOptions,\n LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n type StructuredOutputMethodOptions,\n type BaseLanguageModelInput,\n isOpenAITool,\n} from \"@langchain/core/language_models/base\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { BaseLLMOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n Runnable,\n RunnablePassthrough,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport {\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\n\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport { AnthropicToolsOutputParser } from \"./output_parsers.js\";\nimport { handleToolChoice } from \"./utils/tools.js\";\nimport { _convertMessagesToAnthropicPayload } from \"./utils/message_inputs.js\";\nimport {\n _makeMessageChunkFromAnthropicEvent,\n anthropicResponseToChatMessages,\n} from \"./utils/message_outputs.js\";\nimport {\n AnthropicBuiltInToolUnion,\n AnthropicContextManagementConfigParam,\n AnthropicMessageCreateParams,\n AnthropicMessageStreamEvent,\n AnthropicRequestOptions,\n AnthropicStreamingMessageCreateParams,\n AnthropicThinkingConfigParam,\n AnthropicToolChoice,\n ChatAnthropicToolType,\n} from \"./types.js\";\nimport { wrapAnthropicClientError } from \"./utils/errors.js\";\n\nexport interface ChatAnthropicCallOptions\n extends BaseChatModelCallOptions,\n Pick<AnthropicInput, \"streamUsage\"> {\n tools?: ChatAnthropicToolType[];\n /**\n * Whether or not to specify what tool the model should use\n * @default \"auto\"\n */\n tool_choice?: AnthropicToolChoice;\n /**\n * Custom headers to pass to the Anthropic API\n * when making a request.\n */\n headers?: Record<string, string>;\n /**\n * Container ID for file persistence across turns with code execution.\n * Used with the code_execution_20250825 tool.\n */\n container?: string;\n}\n\nfunction _toolsInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n return !!(params.tools && params.tools.length > 0);\n}\n\nfunction _documentsInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n for (const message of params.messages ?? []) {\n if (typeof message.content === \"string\") {\n continue;\n }\n for (const block of message.content ?? []) {\n if (\n typeof block === \"object\" &&\n block != null &&\n block.type === \"document\" &&\n typeof block.citations === \"object\" &&\n block.citations?.enabled\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction _thinkingInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n return !!(params.thinking && params.thinking.type === \"enabled\");\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isAnthropicTool(tool: any): tool is Anthropic.Messages.Tool {\n return \"input_schema\" in tool;\n}\n\nfunction isBuiltinTool(tool: unknown): tool is AnthropicBuiltInToolUnion {\n const builtInToolPrefixes = [\n \"text_editor_\",\n \"computer_\",\n \"bash_\",\n \"web_search_\",\n \"web_fetch_\",\n \"str_replace_editor_\",\n \"str_replace_based_edit_tool_\",\n \"code_execution_\",\n \"memory_\",\n ];\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"type\" in tool &&\n \"name\" in tool &&\n typeof tool.type === \"string\" &&\n builtInToolPrefixes.some(\n (prefix) => typeof tool.type === \"string\" && tool.type.startsWith(prefix)\n )\n );\n}\n\n/**\n * @see https://docs.anthropic.com/claude/docs/models-overview\n */\nexport type AnthropicMessagesModelId =\n | Anthropic.Model\n | (string & NonNullable<unknown>);\n\n/**\n * Input to AnthropicChat class.\n */\nexport interface AnthropicInput {\n /** Amount of randomness injected into the response. Ranges\n * from 0 to 1. Use temp closer to 0 for analytical /\n * multiple choice, and temp closer to 1 for creative\n * and generative tasks.\n * To not set this field, pass `null`. If `undefined` is passed,\n * the default (1) will be used.\n */\n temperature?: number | null;\n\n /** Only sample from the top K options for each subsequent\n * token. Used to remove \"long tail\" low probability\n * responses. Defaults to -1, which disables it.\n */\n topK?: number;\n\n /** Does nucleus sampling, in which we compute the\n * cumulative distribution over all the options for each\n * subsequent token in decreasing probability order and\n * cut it off once it reaches a particular probability\n * specified by top_p. Defaults to -1, which disables it.\n * Note that you should either alter temperature or top_p,\n * but not both.\n *\n * To not set this field, pass `null`. If `undefined` is passed,\n * the default (-1) will be used.\n *\n * For Opus 4.1 and Sonnet 4.5, this defaults to `null`.\n */\n topP?: number | null;\n\n /** A maximum number of tokens to generate before stopping. */\n maxTokens?: number;\n\n /** A list of strings upon which to stop generating.\n * You probably want `[\"\\n\\nHuman:\"]`, as that's the cue for\n * the next turn in the dialog agent.\n */\n stopSequences?: string[];\n\n /** Whether to stream the results or not */\n streaming?: boolean;\n\n /** Anthropic API key */\n anthropicApiKey?: string;\n /** Anthropic API key */\n apiKey?: string;\n\n /** Anthropic API URL */\n anthropicApiUrl?: string;\n\n /** @deprecated Use \"model\" instead */\n modelName?: AnthropicMessagesModelId;\n /** Model name to use */\n model?: AnthropicMessagesModelId;\n\n /** Overridable Anthropic ClientOptions */\n clientOptions?: ClientOptions;\n\n /** Holds any additional parameters that are valid to pass to {@link\n * https://console.anthropic.com/docs/api/reference |\n * `anthropic.messages`} that are not explicitly specified on this class.\n */\n invocationKwargs?: Kwargs;\n\n /**\n * Whether or not to include token usage data in streamed chunks.\n * @default true\n */\n streamUsage?: boolean;\n\n /**\n * Optional method that returns an initialized underlying Anthropic client.\n * Useful for accessing Anthropic models hosted on other cloud services\n * such as Google Vertex.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createClient?: (options: ClientOptions) => any;\n\n /**\n * Options for extended thinking.\n */\n thinking?: AnthropicThinkingConfigParam;\n\n /**\n * Configuration for context management. See https://docs.claude.com/en/docs/build-with-claude/context-editing\n */\n contextManagement?: AnthropicContextManagementConfigParam;\n}\n\n/**\n * A type representing additional parameters that can be passed to the\n * Anthropic API.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Kwargs = Record<string, any>;\n\nfunction extractToken(chunk: AIMessageChunk): string | undefined {\n if (typeof chunk.content === \"string\") {\n return chunk.content;\n } else if (\n Array.isArray(chunk.content) &&\n chunk.content.length >= 1 &&\n \"input\" in chunk.content[0]\n ) {\n return typeof chunk.content[0].input === \"string\"\n ? chunk.content[0].input\n : JSON.stringify(chunk.content[0].input);\n } else if (\n Array.isArray(chunk.content) &&\n chunk.content.length >= 1 &&\n \"text\" in chunk.content[0] &&\n typeof chunk.content[0].text === \"string\"\n ) {\n return chunk.content[0].text;\n }\n return undefined;\n}\n\n/**\n * Anthropic chat model integration.\n *\n * Setup:\n * Install `@langchain/anthropic` and set an environment variable named `ANTHROPIC_API_KEY`.\n *\n * ```bash\n * npm install @langchain/anthropic\n * export ANTHROPIC_API_KEY=\"your-api-key\"\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/langchain_anthropic.ChatAnthropic.html#constructor)\n *\n * ## [Runtime args](https://api.js.langchain.com/interfaces/langchain_anthropic.ChatAnthropicCallOptions.html)\n *\n * Runtime args can be passed as the second argument to any of the base runnable methods `.invoke`. `.stream`, `.batch`, etc.\n * They can also be passed via `.bind`, or the second arg in `.bindTools`, like shown in the examples below:\n *\n * ```typescript\n * // When calling `.bind`, call options should be passed via the first argument\n * const llmWithArgsBound = llm.bindTools([...]).withConfig({\n * stop: [\"\\n\"],\n * });\n *\n * // When calling `.bindTools`, call options should be passed via the second argument\n * const llmWithTools = llm.bindTools(\n * [...],\n * {\n * tool_choice: \"auto\",\n * }\n * );\n * ```\n *\n * ## Examples\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { ChatAnthropic } from '@langchain/anthropic';\n *\n * const llm = new ChatAnthropic({\n * model: \"claude-3-5-sonnet-20240620\",\n * temperature: 0,\n * maxTokens: undefined,\n * maxRetries: 2,\n * // apiKey: \"...\",\n * // baseUrl: \"...\",\n * // other params...\n * });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Invoking</strong></summary>\n *\n * ```typescript\n * const input = `Translate \"I love programming\" into French.`;\n *\n * // Models also accept a list of chat messages or a formatted prompt\n * const result = await llm.invoke(input);\n * console.log(result);\n * ```\n *\n * ```txt\n * AIMessage {\n * \"id\": \"msg_01QDpd78JUHpRP6bRRNyzbW3\",\n * \"content\": \"Here's the translation to French:\\n\\nJ'adore la programmation.\",\n * \"response_metadata\": {\n * \"id\": \"msg_01QDpd78JUHpRP6bRRNyzbW3\",\n * \"model\": \"claude-3-5-sonnet-20240620\",\n * \"stop_reason\": \"end_turn\",\n * \"stop_sequence\": null,\n * \"usage\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 19\n * },\n * \"type\": \"message\",\n * \"role\": \"assistant\"\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 19,\n * \"total_tokens\": 44\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Streaming Chunks</strong></summary>\n *\n * ```typescript\n * for await (const chunk of await llm.stream(input)) {\n * console.log(chunk);\n * }\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"id\": \"msg_01N8MwoYxiKo9w4chE4gXUs4\",\n * \"content\": \"\",\n * \"additional_kwargs\": {\n * \"id\": \"msg_01N8MwoYxiKo9w4chE4gXUs4\",\n * \"type\": \"message\",\n * \"role\": \"assistant\",\n * \"model\": \"claude-3-5-sonnet-20240620\"\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 1,\n * \"total_tokens\": 26\n * }\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * }\n * AIMessageChunk {\n * \"content\": \"Here\",\n * }\n * AIMessageChunk {\n * \"content\": \"'s\",\n * }\n * AIMessageChunk {\n * \"content\": \" the translation to\",\n * }\n * AIMessageChunk {\n * \"content\": \" French:\\n\\nJ\",\n * }\n * AIMessageChunk {\n * \"content\": \"'adore la programmation\",\n * }\n * AIMessageChunk {\n * \"content\": \".\",\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {\n * \"stop_reason\": \"end_turn\",\n * \"stop_sequence\": null\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 0,\n * \"output_tokens\": 19,\n * \"total_tokens\": 19\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Aggregate Streamed Chunks</strong></summary>\n *\n * ```typescript\n * import { AIMessageChunk } from '@langchain/core/messages';\n * import { concat } from '@langchain/core/utils/stream';\n *\n * const stream = await llm.stream(input);\n * let full: AIMessageChunk | undefined;\n * for await (const chunk of stream) {\n * full = !full ? chunk : concat(full, chunk);\n * }\n * console.log(full);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"id\": \"msg_01SBTb5zSGXfjUc7yQ8EKEEA\",\n * \"content\": \"Here's the translation to French:\\n\\nJ'adore la programmation.\",\n * \"additional_kwargs\": {\n * \"id\": \"msg_01SBTb5zSGXfjUc7yQ8EKEEA\",\n * \"type\": \"message\",\n * \"role\": \"assistant\",\n * \"model\": \"claude-3-5-sonnet-20240620\",\n * \"stop_reason\": \"end_turn\",\n * \"stop_sequence\": null\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 20,\n * \"total_tokens\": 45\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Bind tools</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const GetWeather = {\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const GetPopulation = {\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const llmWithTools = llm.bindTools([GetWeather, GetPopulation]);\n * const aiMsg = await llmWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\"\n * );\n * console.log(aiMsg.tool_calls);\n * ```\n *\n * ```txt\n * [\n * {\n * name: 'GetWeather',\n * args: { location: 'Los Angeles, CA' },\n * id: 'toolu_01WjW3Dann6BPJVtLhovdBD5',\n * type: 'tool_call'\n * },\n * {\n * name: 'GetWeather',\n * args: { location: 'New York, NY' },\n * id: 'toolu_01G6wfJgqi5zRmJomsmkyZXe',\n * type: 'tool_call'\n * },\n * {\n * name: 'GetPopulation',\n * args: { location: 'Los Angeles, CA' },\n * id: 'toolu_0165qYWBA2VFyUst5RA18zew',\n * type: 'tool_call'\n * },\n * {\n * name: 'GetPopulation',\n * args: { location: 'New York, NY' },\n * id: 'toolu_01PGNyP33vxr13tGqr7i3rDo',\n * type: 'tool_call'\n * }\n * ]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Structured Output</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const Joke = z.object({\n * setup: z.string().describe(\"The setup of the joke\"),\n * punchline: z.string().describe(\"The punchline to the joke\"),\n * rating: z.number().optional().describe(\"How funny the joke is, from 1 to 10\")\n * }).describe('Joke to tell user.');\n *\n * const structuredLlm = llm.withStructuredOutput(Joke, { name: \"Joke\" });\n * const jokeResult = await structuredLlm.invoke(\"Tell me a joke about cats\");\n * console.log(jokeResult);\n * ```\n *\n * ```txt\n * {\n * setup: \"Why don't cats play poker in the jungle?\",\n * punchline: 'Too many cheetahs!',\n * rating: 7\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Multimodal</strong></summary>\n *\n * ```typescript\n * import { HumanMessage } from '@langchain/core/messages';\n *\n * const imageUrl = \"https://example.com/image.jpg\";\n * const imageData = await fetch(imageUrl).then(res => res.arrayBuffer());\n * const base64Image = Buffer.from(imageData).toString('base64');\n *\n * const message = new HumanMessage({\n * content: [\n * { type: \"text\", text: \"describe the weather in this image\" },\n * {\n * type: \"image_url\",\n * image_url: { url: `data:image/jpeg;base64,${base64Image}` },\n * },\n * ]\n * });\n *\n * const imageDescriptionAiMsg = await llm.invoke([message]);\n * console.log(imageDescriptionAiMsg.content);\n * ```\n *\n * ```txt\n * The weather in this image appears to be beautiful and clear. The sky is a vibrant blue with scattered white clouds, suggesting a sunny and pleasant day. The clouds are wispy and light, indicating calm conditions without any signs of storms or heavy weather. The bright green grass on the rolling hills looks lush and well-watered, which could mean recent rainfall or good growing conditions. Overall, the scene depicts a perfect spring or early summer day with mild temperatures, plenty of sunshine, and gentle breezes - ideal weather for enjoying the outdoors or for plant growth.\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Usage Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForMetadata = await llm.invoke(input);\n * console.log(aiMsgForMetadata.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 25, output_tokens: 19, total_tokens: 44 }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Stream Usage Metadata</strong></summary>\n *\n * ```typescript\n * const streamForMetadata = await llm.stream(\n * input,\n * {\n * streamUsage: true\n * }\n * );\n * let fullForMetadata: AIMessageChunk | undefined;\n * for await (const chunk of streamForMetadata) {\n * fullForMetadata = !fullForMetadata ? chunk : concat(fullForMetadata, chunk);\n * }\n * console.log(fullForMetadata?.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 25, output_tokens: 20, total_tokens: 45 }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Response Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForResponseMetadata = await llm.invoke(input);\n * console.log(aiMsgForResponseMetadata.response_metadata);\n * ```\n *\n * ```txt\n * {\n * id: 'msg_01STxeQxJmp4sCSpioD6vK3L',\n * model: 'claude-3-5-sonnet-20240620',\n * stop_reason: 'end_turn',\n * stop_sequence: null,\n * usage: { input_tokens: 25, output_tokens: 19 },\n * type: 'message',\n * role: 'assistant'\n * }\n * ```\n * </details>\n *\n * <br />\n */\nexport class ChatAnthropicMessages<\n CallOptions extends ChatAnthropicCallOptions = ChatAnthropicCallOptions\n >\n extends BaseChatModel<CallOptions, AIMessageChunk>\n implements AnthropicInput\n{\n static lc_name() {\n return \"ChatAnthropic\";\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n anthropicApiKey: \"ANTHROPIC_API_KEY\",\n apiKey: \"ANTHROPIC_API_KEY\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n modelName: \"model\",\n };\n }\n\n lc_serializable = true;\n\n anthropicApiKey?: string;\n\n apiKey?: string;\n\n apiUrl?: string;\n\n temperature: number | undefined = 1;\n\n topK = -1;\n\n topP: number | undefined = -1;\n\n maxTokens = 2048;\n\n modelName = \"claude-2.1\";\n\n model = \"claude-2.1\";\n\n invocationKwargs?: Kwargs;\n\n stopSequences?: string[];\n\n streaming = false;\n\n clientOptions: ClientOptions;\n\n thinking: AnthropicThinkingConfigParam = { type: \"disabled\" };\n\n contextManagement?: AnthropicContextManagementConfigParam;\n\n // Used for non-streaming requests\n protected batchClient: Anthropic;\n\n // Used for streaming requests\n protected streamingClient: Anthropic;\n\n streamUsage = true;\n\n /**\n * Optional method that returns an initialized underlying Anthropic client.\n * Useful for accessing Anthropic models hosted on other cloud services\n * such as Google Vertex.\n */\n createClient: (options: ClientOptions) => Anthropic;\n\n constructor(fields?: AnthropicInput & BaseChatModelParams) {\n super(fields ?? {});\n\n this.anthropicApiKey =\n fields?.apiKey ??\n fields?.anthropicApiKey ??\n getEnvironmentVariable(\"ANTHROPIC_API_KEY\");\n\n if (!this.anthropicApiKey && !fields?.createClient) {\n throw new Error(\"Anthropic API key not found\");\n }\n this.clientOptions = fields?.clientOptions ?? {};\n /** Keep anthropicApiKey for backwards compatibility */\n this.apiKey = this.anthropicApiKey;\n\n // Support overriding the default API URL (i.e., https://api.anthropic.com)\n this.apiUrl = fields?.anthropicApiUrl;\n\n /** Keep modelName for backwards compatibility */\n this.modelName = fields?.model ?? fields?.modelName ?? this.model;\n this.model = this.modelName;\n\n this.invocationKwargs = fields?.invocationKwargs ?? {};\n\n if (this.model.includes(\"opus-4-1\") || this.model.includes(\"sonnet-4-5\")) {\n // Default to `undefined` for `topP` for Opus 4.1 models\n this.topP = fields?.topP === null ? undefined : fields?.topP;\n } else {\n this.topP = fields?.topP ?? this.topP;\n }\n\n // If the user passes `null`, set it to `undefined`. Otherwise, use their value or the default. We have to check for null, because\n // there's no way for us to know if they explicitly set it to `undefined`, or never passed a value\n this.temperature =\n fields?.temperature === null\n ? undefined\n : fields?.temperature ?? this.temperature;\n this.topK = fields?.topK ?? this.topK;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.stopSequences = fields?.stopSequences ?? this.stopSequences;\n\n this.streaming = fields?.streaming ?? false;\n this.streamUsage = fields?.streamUsage ?? this.streamUsage;\n\n this.thinking = fields?.thinking ?? this.thinking;\n this.contextManagement =\n fields?.contextManagement ?? this.contextManagement;\n\n this.createClient =\n fields?.createClient ??\n ((options: ClientOptions) => new Anthropic(options));\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"anthropic\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.max_tokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n /**\n * Formats LangChain StructuredTools to AnthropicTools.\n *\n * @param {ChatAnthropicCallOptions[\"tools\"]} tools The tools to format\n * @returns {AnthropicTool[] | undefined} The formatted tools, or undefined if none are passed.\n */\n formatStructuredToolToAnthropic(\n tools: ChatAnthropicCallOptions[\"tools\"]\n ): Anthropic.Messages.ToolUnion[] | undefined {\n if (!tools || !tools.length) {\n return undefined;\n }\n return tools.map((tool) => {\n if (isBuiltinTool(tool)) {\n return tool;\n }\n if (isAnthropicTool(tool)) {\n return tool;\n }\n if (isOpenAITool(tool)) {\n return {\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function\n .parameters as Anthropic.Messages.Tool.InputSchema,\n };\n }\n if (isLangChainTool(tool)) {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: (isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema) as Anthropic.Messages.Tool.InputSchema,\n };\n }\n throw new Error(\n `Unknown tool type passed to ChatAnthropic: ${JSON.stringify(\n tool,\n null,\n 2\n )}`\n );\n });\n }\n\n override bindTools(\n tools: ChatAnthropicToolType[],\n kwargs?: Partial<CallOptions>\n ): Runnable<BaseLanguageModelInput, AIMessageChunk, CallOptions> {\n return this.withConfig({\n tools: this.formatStructuredToolToAnthropic(tools),\n ...kwargs,\n } as Partial<CallOptions>);\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): Omit<\n AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams,\n \"messages\"\n > &\n Kwargs {\n const tool_choice:\n | Anthropic.Messages.ToolChoiceAuto\n | Anthropic.Messages.ToolChoiceAny\n | Anthropic.Messages.ToolChoiceTool\n | Anthropic.Messages.ToolChoiceNone\n | undefined = handleToolChoice(options?.tool_choice);\n\n if (this.thinking.type === \"enabled\") {\n if (this.topK !== -1) {\n throw new Error(\"topK is not supported when thinking is enabled\");\n }\n if (\n this.model.includes(\"opus-4-1\") || this.model.includes(\"sonnet-4-5\")\n ? this.topP !== undefined\n : this.topP !== -1\n ) {\n throw new Error(\"topP is not supported when thinking is enabled\");\n }\n if (this.temperature !== 1) {\n throw new Error(\n \"temperature is not supported when thinking is enabled\"\n );\n }\n\n return {\n model: this.model,\n stop_sequences: options?.stop ?? this.stopSequences,\n stream: this.streaming,\n max_tokens: this.maxTokens,\n tools: this.formatStructuredToolToAnthropic(options?.tools),\n tool_choice,\n thinking: this.thinking,\n context_management: this.contextManagement,\n ...this.invocationKwargs,\n container: options?.container,\n };\n }\n return {\n model: this.model,\n temperature: this.temperature,\n top_k: this.topK,\n top_p: this.topP,\n stop_sequences: options?.stop ?? this.stopSequences,\n stream: this.streaming,\n max_tokens: this.maxTokens,\n tools: this.formatStructuredToolToAnthropic(options?.tools),\n tool_choice,\n thinking: this.thinking,\n context_management: this.contextManagement,\n ...this.invocationKwargs,\n container: options?.container,\n };\n }\n\n /** @ignore */\n _identifyingParams() {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams() {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n };\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const params = this.invocationParams(options);\n const formattedMessages = _convertMessagesToAnthropicPayload(messages);\n const payload = {\n ...params,\n ...formattedMessages,\n stream: true,\n } as const;\n const coerceContentToString =\n !_toolsInParams(payload) &&\n !_documentsInParams(payload) &&\n !_thinkingInParams(payload);\n\n const stream = await this.createStreamWithRetry(payload, {\n headers: options.headers,\n });\n\n for await (const data of stream) {\n if (options.signal?.aborted) {\n stream.controller.abort();\n throw new Error(\"AbortError: User aborted the request.\");\n }\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n const result = _makeMessageChunkFromAnthropicEvent(data, {\n streamUsage: shouldStreamUsage,\n coerceContentToString,\n });\n if (!result) continue;\n\n const { chunk } = result;\n\n // Extract the text content token for text field and runManager.\n const token = extractToken(chunk);\n const generationChunk = new ChatGenerationChunk({\n message: new AIMessageChunk({\n // Just yield chunk as it is and tool_use will be concat by BaseChatModel._generateUncached().\n content: chunk.content,\n additional_kwargs: chunk.additional_kwargs,\n tool_call_chunks: chunk.tool_call_chunks,\n usage_metadata: shouldStreamUsage ? chunk.usage_metadata : undefined,\n response_metadata: chunk.response_metadata,\n id: chunk.id,\n }),\n text: token ?? \"\",\n });\n yield generationChunk;\n\n await runManager?.handleLLMNewToken(\n token ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n }\n\n /** @ignore */\n async _generateNonStreaming(\n messages: BaseMessage[],\n params: Omit<\n | Anthropic.Messages.MessageCreateParamsNonStreaming\n | Anthropic.Messages.MessageCreateParamsStreaming,\n \"messages\"\n > &\n Kwargs,\n requestOptions: AnthropicRequestOptions\n ) {\n const response = await this.completionWithRetry(\n {\n ...params,\n stream: false,\n ..._convertMessagesToAnthropicPayload(messages),\n },\n requestOptions\n );\n\n const { content, ...additionalKwargs } = response;\n\n const generations = anthropicResponseToChatMessages(\n content,\n additionalKwargs\n );\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { role: _role, type: _type, ...rest } = additionalKwargs;\n return { generations, llmOutput: rest };\n }\n\n /** @ignore */\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.stopSequences && options.stop) {\n throw new Error(\n `\"stopSequence\" parameter found in input and default params`\n );\n }\n\n const params = this.invocationParams(options);\n if (params.stream) {\n let finalChunk: ChatGenerationChunk | undefined;\n const stream = this._streamResponseChunks(messages, options, runManager);\n for await (const chunk of stream) {\n if (finalChunk === undefined) {\n finalChunk = chunk;\n } else {\n finalChunk = finalChunk.concat(chunk);\n }\n }\n if (finalChunk === undefined) {\n throw new Error(\"No chunks returned from Anthropic API.\");\n }\n return {\n generations: [\n {\n text: finalChunk.text,\n message: finalChunk.message,\n },\n ],\n };\n } else {\n return this._generateNonStreaming(messages, params, {\n signal: options.signal,\n headers: options.headers,\n });\n }\n }\n\n /**\n * Creates a streaming request with retry.\n * @param request The parameters for creating a completion.\n * @param options\n * @returns A streaming request.\n */\n protected async createStreamWithRetry(\n request: AnthropicStreamingMessageCreateParams & Kwargs,\n options?: AnthropicRequestOptions\n ): Promise<Stream<AnthropicMessageStreamEvent>> {\n if (!this.streamingClient) {\n const options_ = this.apiUrl ? { baseURL: this.apiUrl } : undefined;\n this.streamingClient = this.createClient({\n dangerouslyAllowBrowser: true,\n ...this.clientOptions,\n ...options_,\n apiKey: this.apiKey,\n // Prefer LangChain built-in retries\n maxRetries: 0,\n });\n }\n const makeCompletionRequest = async () => {\n try {\n return await this.streamingClient.messages.create(\n {\n ...request,\n ...this.invocationKwargs,\n stream: true,\n } as AnthropicStreamingMessageCreateParams,\n options\n );\n } catch (e) {\n const error = wrapAnthropicClientError(e);\n throw error;\n }\n };\n return this.caller.call(makeCompletionRequest);\n }\n\n /** @ignore */\n protected async completionWithRetry(\n request: AnthropicMessageCreateParams & Kwargs,\n options: AnthropicRequestOptions\n ): Promise<Anthropic.Message> {\n if (!this.batchClient) {\n const options = this.apiUrl ? { baseURL: this.apiUrl } : undefined;\n this.batchClient = this.createClient({\n dangerouslyAllowBrowser: true,\n ...this.clientOptions,\n ...options,\n apiKey: this.apiKey,\n maxRetries: 0,\n });\n }\n const makeCompletionRequest = async () => {\n try {\n return await this.batchClient.messages.create(\n {\n ...request,\n ...this.invocationKwargs,\n } as AnthropicMessageCreateParams,\n options\n );\n } catch (e) {\n const error = wrapAnthropicClientError(e);\n throw error;\n }\n };\n return this.caller.callWithOptions(\n { signal: options.signal ?? undefined },\n makeCompletionRequest\n );\n }\n\n _llmType() {\n return \"anthropic\";\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const schema: InteropZodType<RunOutput> | Record<string, any> =\n outputSchema;\n const name = config?.name;\n const method = config?.method;\n const includeRaw = config?.includeRaw;\n if (method === \"jsonMode\") {\n throw new Error(`Anthropic only supports \"functionCalling\" as a method.`);\n }\n\n let functionName = name ?? \"extract\";\n let outputParser: BaseLLMOutputParser<RunOutput>;\n let tools: Anthropic.Messages.Tool[];\n if (isInteropZodSchema(schema)) {\n const jsonSchema = toJsonSchema(schema);\n tools = [\n {\n name: functionName,\n description:\n jsonSchema.description ?? \"A function available to call.\",\n input_schema: jsonSchema as Anthropic.Messages.Tool.InputSchema,\n },\n ];\n outputParser = new AnthropicToolsOutputParser({\n returnSingle: true,\n keyName: functionName,\n zodSchema: schema,\n });\n } else {\n let anthropicTools: Anthropic.Messages.Tool;\n if (\n typeof schema.name === \"string\" &&\n typeof schema.description === \"string\" &&\n typeof schema.input_schema === \"object\" &&\n schema.input_schema != null\n ) {\n anthropicTools = schema as Anthropic.Messages.Tool;\n functionName = schema.name;\n } else {\n anthropicTools = {\n name: functionName,\n description: schema.description ?? \"\",\n input_schema: schema as Anthropic.Messages.Tool.InputSchema,\n };\n }\n tools = [anthropicTools];\n outputParser = new AnthropicToolsOutputParser<RunOutput>({\n returnSingle: true,\n keyName: functionName,\n });\n }\n let llm;\n if (this.thinking?.type === \"enabled\") {\n const thinkingAdmonition =\n \"Anthropic structured output relies on forced tool calling, \" +\n \"which is not supported when `thinking` is enabled. This method will raise \" +\n \"OutputParserException if tool calls are not \" +\n \"generated. Consider disabling `thinking` or adjust your prompt to ensure \" +\n \"the tool is called.\";\n\n console.warn(thinkingAdmonition);\n\n llm = this.withConfig({\n tools,\n ls_structured_output_format: {\n kwargs: { method: \"functionCalling\" },\n schema: toJsonSchema(schema),\n },\n } as Partial<CallOptions>);\n\n const raiseIfNoToolCalls = (message: AIMessageChunk) => {\n if (!message.tool_calls || message.tool_calls.length === 0) {\n throw new Error(thinkingAdmonition);\n }\n return message;\n };\n\n llm = llm.pipe(raiseIfNoToolCalls);\n } else {\n llm = this.withConfig({\n tools,\n tool_choice: {\n type: \"tool\",\n name: functionName,\n },\n ls_structured_output_format: {\n kwargs: { method: \"functionCalling\" },\n schema: toJsonSchema(schema),\n },\n } as Partial<CallOptions>);\n }\n\n if (!includeRaw) {\n return llm.pipe(outputParser).withConfig({\n runName: \"ChatAnthropicStructuredOutput\",\n }) as Runnable<BaseLanguageModelInput, RunOutput>;\n }\n\n const parserAssign = RunnablePassthrough.assign({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parsed: (input: any, config) => outputParser.invoke(input.raw, config),\n });\n const parserNone = RunnablePassthrough.assign({\n parsed: () => null,\n });\n const parsedWithFallback = parserAssign.withFallbacks({\n fallbacks: [parserNone],\n });\n return RunnableSequence.from<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n >([\n {\n raw: llm,\n },\n parsedWithFallback,\n ]).withConfig({\n runName: \"StructuredOutputRunnable\",\n });\n }\n}\n\nexport class ChatAnthropic extends ChatAnthropicMessages {}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAwEA,SAAS,eACPA,QACS;AACT,QAAO,CAAC,EAAE,OAAO,SAAS,OAAO,MAAM,SAAS;AACjD;AAED,SAAS,mBACPA,QACS;AACT,MAAK,MAAM,WAAW,OAAO,YAAY,CAAE,GAAE;AAC3C,MAAI,OAAO,QAAQ,YAAY,SAC7B;AAEF,OAAK,MAAM,SAAS,QAAQ,WAAW,CAAE,EACvC,KACE,OAAO,UAAU,YACjB,SAAS,QACT,MAAM,SAAS,cACf,OAAO,MAAM,cAAc,YAC3B,MAAM,WAAW,QAEjB,QAAO;CAGZ;AACD,QAAO;AACR;AAED,SAAS,kBACPA,QACS;AACT,QAAO,CAAC,EAAE,OAAO,YAAY,OAAO,SAAS,SAAS;AACvD;AAGD,SAAS,gBAAgBC,MAA4C;AACnE,QAAO,kBAAkB;AAC1B;AAED,SAAS,cAAcC,MAAkD;CACvE,MAAM,sBAAsB;EAC1B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AACD,QACE,OAAO,SAAS,YAChB,SAAS,QACT,UAAU,QACV,UAAU,QACV,OAAO,KAAK,SAAS,YACrB,oBAAoB,KAClB,CAAC,WAAW,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,WAAW,OAAO,CAC1E;AAEJ;AA6GD,SAAS,aAAaC,OAA2C;AAC/D,KAAI,OAAO,MAAM,YAAY,SAC3B,QAAO,MAAM;UAEb,MAAM,QAAQ,MAAM,QAAQ,IAC5B,MAAM,QAAQ,UAAU,KACxB,WAAW,MAAM,QAAQ,GAEzB,QAAO,OAAO,MAAM,QAAQ,GAAG,UAAU,WACrC,MAAM,QAAQ,GAAG,QACjB,KAAK,UAAU,MAAM,QAAQ,GAAG,MAAM;UAE1C,MAAM,QAAQ,MAAM,QAAQ,IAC5B,MAAM,QAAQ,UAAU,KACxB,UAAU,MAAM,QAAQ,MACxB,OAAO,MAAM,QAAQ,GAAG,SAAS,SAEjC,QAAO,MAAM,QAAQ,GAAG;AAE1B,QAAO;AACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0XD,IAAa,wBAAb,cAGUC,2DAEV;CACE,OAAO,UAAU;AACf,SAAO;CACR;CAED,IAAI,aAAoD;AACtD,SAAO;GACL,iBAAiB;GACjB,QAAQ;EACT;CACF;CAED,IAAI,aAAqC;AACvC,SAAO,EACL,WAAW,QACZ;CACF;CAED,kBAAkB;CAElB;CAEA;CAEA;CAEA,cAAkC;CAElC,OAAO;CAEP,OAA2B;CAE3B,YAAY;CAEZ,YAAY;CAEZ,QAAQ;CAER;CAEA;CAEA,YAAY;CAEZ;CAEA,WAAyC,EAAE,MAAM,WAAY;CAE7D;CAGA,AAAU;CAGV,AAAU;CAEV,cAAc;;;;;;CAOd;CAEA,YAAYC,QAA+C;EACzD,MAAM,UAAU,CAAE,EAAC;EAEnB,KAAK,kBACH,QAAQ,UACR,QAAQ,0EACe,oBAAoB;AAE7C,MAAI,CAAC,KAAK,mBAAmB,CAAC,QAAQ,aACpC,OAAM,IAAI,MAAM;EAElB,KAAK,gBAAgB,QAAQ,iBAAiB,CAAE;;EAEhD,KAAK,SAAS,KAAK;EAGnB,KAAK,SAAS,QAAQ;;EAGtB,KAAK,YAAY,QAAQ,SAAS,QAAQ,aAAa,KAAK;EAC5D,KAAK,QAAQ,KAAK;EAElB,KAAK,mBAAmB,QAAQ,oBAAoB,CAAE;AAEtD,MAAI,KAAK,MAAM,SAAS,WAAW,IAAI,KAAK,MAAM,SAAS,aAAa,EAEtE,KAAK,OAAO,QAAQ,SAAS,OAAO,SAAY,QAAQ;OAExD,KAAK,OAAO,QAAQ,QAAQ,KAAK;EAKnC,KAAK,cACH,QAAQ,gBAAgB,OACpB,SACA,QAAQ,eAAe,KAAK;EAClC,KAAK,OAAO,QAAQ,QAAQ,KAAK;EACjC,KAAK,YAAY,QAAQ,aAAa,KAAK;EAC3C,KAAK,gBAAgB,QAAQ,iBAAiB,KAAK;EAEnD,KAAK,YAAY,QAAQ,aAAa;EACtC,KAAK,cAAc,QAAQ,eAAe,KAAK;EAE/C,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,oBACH,QAAQ,qBAAqB,KAAK;EAEpC,KAAK,eACH,QAAQ,iBACP,CAACC,YAA2B,IAAIC,6BAAU;CAC9C;CAED,YAAYC,SAAqD;EAC/D,MAAM,SAAS,KAAK,iBAAiB,QAAQ;AAC7C,SAAO;GACL,aAAa;GACb,eAAe,KAAK;GACpB,eAAe;GACf,gBAAgB,OAAO,eAAe;GACtC,eAAe,OAAO,cAAc;GACpC,SAAS,QAAQ;EAClB;CACF;;;;;;;CAQD,gCACEC,OAC4C;AAC5C,MAAI,CAAC,SAAS,CAAC,MAAM,OACnB,QAAO;AAET,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,OAAI,cAAc,KAAK,CACrB,QAAO;AAET,OAAI,gBAAgB,KAAK,CACvB,QAAO;AAET,+DAAiB,KAAK,CACpB,QAAO;IACL,MAAM,KAAK,SAAS;IACpB,aAAa,KAAK,SAAS;IAC3B,cAAc,KAAK,SAChB;GACJ;AAEH,oEAAoB,KAAK,CACvB,QAAO;IACL,MAAM,KAAK;IACX,aAAa,KAAK;IAClB,mEAAkC,KAAK,OAAO,wDAC7B,KAAK,OAAO,GACzB,KAAK;GACV;AAEH,SAAM,IAAI,MACR,CAAC,2CAA2C,EAAE,KAAK,UACjD,MACA,MACA,EACD,EAAE;EAEN,EAAC;CACH;CAED,AAAS,UACPC,OACAC,QAC+D;AAC/D,SAAO,KAAK,WAAW;GACrB,OAAO,KAAK,gCAAgC,MAAM;GAClD,GAAG;EACJ,EAAyB;CAC3B;;;;CAKD,AAAS,iBACPC,SAKO;EACP,MAAMC,cAKUC,+BAAiB,SAAS,YAAY;AAEtD,MAAI,KAAK,SAAS,SAAS,WAAW;AACpC,OAAI,KAAK,SAAS,GAChB,OAAM,IAAI,MAAM;AAElB,OACE,KAAK,MAAM,SAAS,WAAW,IAAI,KAAK,MAAM,SAAS,aAAa,GAChE,KAAK,SAAS,SACd,KAAK,SAAS,GAElB,OAAM,IAAI,MAAM;AAElB,OAAI,KAAK,gBAAgB,EACvB,OAAM,IAAI,MACR;AAIJ,UAAO;IACL,OAAO,KAAK;IACZ,gBAAgB,SAAS,QAAQ,KAAK;IACtC,QAAQ,KAAK;IACb,YAAY,KAAK;IACjB,OAAO,KAAK,gCAAgC,SAAS,MAAM;IAC3D;IACA,UAAU,KAAK;IACf,oBAAoB,KAAK;IACzB,GAAG,KAAK;IACR,WAAW,SAAS;GACrB;EACF;AACD,SAAO;GACL,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,gBAAgB,SAAS,QAAQ,KAAK;GACtC,QAAQ,KAAK;GACb,YAAY,KAAK;GACjB,OAAO,KAAK,gCAAgC,SAAS,MAAM;GAC3D;GACA,UAAU,KAAK;GACf,oBAAoB,KAAK;GACzB,GAAG,KAAK;GACR,WAAW,SAAS;EACrB;CACF;;CAGD,qBAAqB;AACnB,SAAO;GACL,YAAY,KAAK;GACjB,GAAG,KAAK,kBAAkB;EAC3B;CACF;;;;CAKD,oBAAoB;AAClB,SAAO;GACL,YAAY,KAAK;GACjB,GAAG,KAAK,kBAAkB;EAC3B;CACF;CAED,OAAO,sBACLC,UACAP,SACAQ,YACqC;EACrC,MAAM,SAAS,KAAK,iBAAiB,QAAQ;EAC7C,MAAM,oBAAoBC,0DAAmC,SAAS;EACtE,MAAM,UAAU;GACd,GAAG;GACH,GAAG;GACH,QAAQ;EACT;EACD,MAAM,wBACJ,CAAC,eAAe,QAAQ,IACxB,CAAC,mBAAmB,QAAQ,IAC5B,CAAC,kBAAkB,QAAQ;EAE7B,MAAM,SAAS,MAAM,KAAK,sBAAsB,SAAS,EACvD,SAAS,QAAQ,QAClB,EAAC;AAEF,aAAW,MAAM,QAAQ,QAAQ;AAC/B,OAAI,QAAQ,QAAQ,SAAS;IAC3B,OAAO,WAAW,OAAO;AACzB,UAAM,IAAI,MAAM;GACjB;GACD,MAAM,oBAAoB,KAAK,eAAe,QAAQ;GACtD,MAAM,SAASC,4DAAoC,MAAM;IACvD,aAAa;IACb;GACD,EAAC;AACF,OAAI,CAAC,OAAQ;GAEb,MAAM,EAAE,OAAO,GAAG;GAGlB,MAAM,QAAQ,aAAa,MAAM;GACjC,MAAM,kBAAkB,IAAIC,6CAAoB;IAC9C,SAAS,IAAIC,yCAAe;KAE1B,SAAS,MAAM;KACf,mBAAmB,MAAM;KACzB,kBAAkB,MAAM;KACxB,gBAAgB,oBAAoB,MAAM,iBAAiB;KAC3D,mBAAmB,MAAM;KACzB,IAAI,MAAM;IACX;IACD,MAAM,SAAS;GAChB;GACD,MAAM;GAEN,MAAM,YAAY,kBAChB,SAAS,IACT,QACA,QACA,QACA,QACA,EAAE,OAAO,gBAAiB,EAC3B;EACF;CACF;;CAGD,MAAM,sBACJL,UACAM,QAMAC,gBACA;EACA,MAAM,WAAW,MAAM,KAAK,oBAC1B;GACE,GAAG;GACH,QAAQ;GACR,GAAGL,0DAAmC,SAAS;EAChD,GACD,eACD;EAED,MAAM,EAAE,QAAS,GAAG,kBAAkB,GAAG;EAEzC,MAAM,cAAcM,wDAClB,SACA,iBACD;EAED,MAAM,EAAE,MAAM,OAAO,MAAM,MAAO,GAAG,MAAM,GAAG;AAC9C,SAAO;GAAE;GAAa,WAAW;EAAM;CACxC;;CAGD,MAAM,UACJR,UACAP,SACAQ,YACqB;AACrB,MAAI,KAAK,iBAAiB,QAAQ,KAChC,OAAM,IAAI,MACR,CAAC,0DAA0D,CAAC;EAIhE,MAAM,SAAS,KAAK,iBAAiB,QAAQ;AAC7C,MAAI,OAAO,QAAQ;GACjB,IAAIQ;GACJ,MAAM,SAAS,KAAK,sBAAsB,UAAU,SAAS,WAAW;AACxE,cAAW,MAAM,SAAS,OACxB,KAAI,eAAe,QACjB,aAAa;QAEb,aAAa,WAAW,OAAO,MAAM;AAGzC,OAAI,eAAe,OACjB,OAAM,IAAI,MAAM;AAElB,UAAO,EACL,aAAa,CACX;IACE,MAAM,WAAW;IACjB,SAAS,WAAW;GACrB,CACF,EACF;EACF,MACC,QAAO,KAAK,sBAAsB,UAAU,QAAQ;GAClD,QAAQ,QAAQ;GAChB,SAAS,QAAQ;EAClB,EAAC;CAEL;;;;;;;CAQD,MAAgB,sBACdC,SACAC,SAC8C;AAC9C,MAAI,CAAC,KAAK,iBAAiB;GACzB,MAAM,WAAW,KAAK,SAAS,EAAE,SAAS,KAAK,OAAQ,IAAG;GAC1D,KAAK,kBAAkB,KAAK,aAAa;IACvC,yBAAyB;IACzB,GAAG,KAAK;IACR,GAAG;IACH,QAAQ,KAAK;IAEb,YAAY;GACb,EAAC;EACH;EACD,MAAM,wBAAwB,YAAY;AACxC,OAAI;AACF,WAAO,MAAM,KAAK,gBAAgB,SAAS,OACzC;KACE,GAAG;KACH,GAAG,KAAK;KACR,QAAQ;IACT,GACD,QACD;GACF,SAAQ,GAAG;IACV,MAAM,QAAQC,wCAAyB,EAAE;AACzC,UAAM;GACP;EACF;AACD,SAAO,KAAK,OAAO,KAAK,sBAAsB;CAC/C;;CAGD,MAAgB,oBACdC,SACAC,SAC4B;AAC5B,MAAI,CAAC,KAAK,aAAa;GACrB,MAAMC,YAAU,KAAK,SAAS,EAAE,SAAS,KAAK,OAAQ,IAAG;GACzD,KAAK,cAAc,KAAK,aAAa;IACnC,yBAAyB;IACzB,GAAG,KAAK;IACR,GAAGA;IACH,QAAQ,KAAK;IACb,YAAY;GACb,EAAC;EACH;EACD,MAAM,wBAAwB,YAAY;AACxC,OAAI;AACF,WAAO,MAAM,KAAK,YAAY,SAAS,OACrC;KACE,GAAG;KACH,GAAG,KAAK;IACT,GACD,QACD;GACF,SAAQ,GAAG;IACV,MAAM,QAAQH,wCAAyB,EAAE;AACzC,UAAM;GACP;EACF;AACD,SAAO,KAAK,OAAO,gBACjB,EAAE,QAAQ,QAAQ,UAAU,OAAW,GACvC,sBACD;CACF;CAED,WAAW;AACT,SAAO;CACR;CAwBD,qBAIEI,cAIAC,QAMI;EAEJ,MAAMC,SACJ;EACF,MAAM,OAAO,QAAQ;EACrB,MAAM,SAAS,QAAQ;EACvB,MAAM,aAAa,QAAQ;AAC3B,MAAI,WAAW,WACb,OAAM,IAAI,MAAM,CAAC,sDAAsD,CAAC;EAG1E,IAAI,eAAe,QAAQ;EAC3B,IAAIC;EACJ,IAAIC;AACJ,2DAAuB,OAAO,EAAE;GAC9B,MAAM,kEAA0B,OAAO;GACvC,QAAQ,CACN;IACE,MAAM;IACN,aACE,WAAW,eAAe;IAC5B,cAAc;GACf,CACF;GACD,eAAe,IAAIC,kDAA2B;IAC5C,cAAc;IACd,SAAS;IACT,WAAW;GACZ;EACF,OAAM;GACL,IAAIC;AACJ,OACE,OAAO,OAAO,SAAS,YACvB,OAAO,OAAO,gBAAgB,YAC9B,OAAO,OAAO,iBAAiB,YAC/B,OAAO,gBAAgB,MACvB;IACA,iBAAiB;IACjB,eAAe,OAAO;GACvB,OACC,iBAAiB;IACf,MAAM;IACN,aAAa,OAAO,eAAe;IACnC,cAAc;GACf;GAEH,QAAQ,CAAC,cAAe;GACxB,eAAe,IAAID,kDAAsC;IACvD,cAAc;IACd,SAAS;GACV;EACF;EACD,IAAI;AACJ,MAAI,KAAK,UAAU,SAAS,WAAW;GACrC,MAAM,qBACJ;GAMF,QAAQ,KAAK,mBAAmB;GAEhC,MAAM,KAAK,WAAW;IACpB;IACA,6BAA6B;KAC3B,QAAQ,EAAE,QAAQ,kBAAmB;KACrC,6DAAqB,OAAO;IAC7B;GACF,EAAyB;GAE1B,MAAM,qBAAqB,CAACE,YAA4B;AACtD,QAAI,CAAC,QAAQ,cAAc,QAAQ,WAAW,WAAW,EACvD,OAAM,IAAI,MAAM;AAElB,WAAO;GACR;GAED,MAAM,IAAI,KAAK,mBAAmB;EACnC,OACC,MAAM,KAAK,WAAW;GACpB;GACA,aAAa;IACX,MAAM;IACN,MAAM;GACP;GACD,6BAA6B;IAC3B,QAAQ,EAAE,QAAQ,kBAAmB;IACrC,6DAAqB,OAAO;GAC7B;EACF,EAAyB;AAG5B,MAAI,CAAC,WACH,QAAO,IAAI,KAAK,aAAa,CAAC,WAAW,EACvC,SAAS,gCACV,EAAC;EAGJ,MAAM,eAAeC,+CAAoB,OAAO,EAE9C,QAAQ,CAACC,OAAYC,aAAW,aAAa,OAAO,MAAM,KAAKA,SAAO,CACvE,EAAC;EACF,MAAM,aAAaF,+CAAoB,OAAO,EAC5C,QAAQ,MAAM,KACf,EAAC;EACF,MAAM,qBAAqB,aAAa,cAAc,EACpD,WAAW,CAAC,UAAW,EACxB,EAAC;AACF,SAAOG,4CAAiB,KAGtB,CACA,EACE,KAAK,IACN,GACD,kBACD,EAAC,CAAC,WAAW,EACZ,SAAS,2BACV,EAAC;CACH;AACF;AAED,IAAa,gBAAb,cAAmC,sBAAsB,CAAE"}
1
+ {"version":3,"file":"chat_models.cjs","names":["MODEL_DEFAULT_MAX_OUTPUT_TOKENS: Partial<\n Record<Anthropic.Model, number>\n>","model?: Anthropic.Model","params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams","tool: any","tool: unknown","chunk: AIMessageChunk","BaseChatModel","fields?: AnthropicInput & BaseChatModelParams","options: ClientOptions","Anthropic","options: this[\"ParsedCallOptions\"]","tools: ChatAnthropicCallOptions[\"tools\"]","tools: ChatAnthropicToolType[]","kwargs?: Partial<CallOptions>","options?: this[\"ParsedCallOptions\"]","tool_choice:\n | Anthropic.Messages.ToolChoiceAuto\n | Anthropic.Messages.ToolChoiceAny\n | Anthropic.Messages.ToolChoiceTool\n | Anthropic.Messages.ToolChoiceNone\n | undefined","handleToolChoice","messages: BaseMessage[]","runManager?: CallbackManagerForLLMRun","_convertMessagesToAnthropicPayload","_makeMessageChunkFromAnthropicEvent","ChatGenerationChunk","AIMessageChunk","params: Omit<\n | Anthropic.Messages.MessageCreateParamsNonStreaming\n | Anthropic.Messages.MessageCreateParamsStreaming,\n \"messages\"\n > &\n Kwargs","requestOptions: AnthropicRequestOptions","anthropicResponseToChatMessages","finalChunk: ChatGenerationChunk | undefined","request: AnthropicStreamingMessageCreateParams & Kwargs","options?: AnthropicRequestOptions","wrapAnthropicClientError","request: AnthropicMessageCreateParams & Kwargs","options: AnthropicRequestOptions","options","outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>","config?: StructuredOutputMethodOptions<boolean>","schema: InteropZodType<RunOutput> | Record<string, any>","outputParser: BaseLLMOutputParser<RunOutput>","tools: Anthropic.Messages.Tool[]","AnthropicToolsOutputParser","anthropicTools: Anthropic.Messages.Tool","message: AIMessageChunk","RunnablePassthrough","input: any","config","RunnableSequence"],"sources":["../src/chat_models.ts"],"sourcesContent":["import { Anthropic, type ClientOptions } from \"@anthropic-ai/sdk\";\nimport type { Stream } from \"@anthropic-ai/sdk/streaming\";\n\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { AIMessageChunk, type BaseMessage } from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseChatModel,\n BaseChatModelCallOptions,\n LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n type StructuredOutputMethodOptions,\n type BaseLanguageModelInput,\n isOpenAITool,\n} from \"@langchain/core/language_models/base\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { BaseLLMOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n Runnable,\n RunnablePassthrough,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport {\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\n\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport { AnthropicToolsOutputParser } from \"./output_parsers.js\";\nimport { handleToolChoice } from \"./utils/tools.js\";\nimport { _convertMessagesToAnthropicPayload } from \"./utils/message_inputs.js\";\nimport {\n _makeMessageChunkFromAnthropicEvent,\n anthropicResponseToChatMessages,\n} from \"./utils/message_outputs.js\";\nimport {\n AnthropicBuiltInToolUnion,\n AnthropicContextManagementConfigParam,\n AnthropicMessageCreateParams,\n AnthropicMessageStreamEvent,\n AnthropicRequestOptions,\n AnthropicStreamingMessageCreateParams,\n AnthropicThinkingConfigParam,\n AnthropicToolChoice,\n ChatAnthropicToolType,\n} from \"./types.js\";\nimport { wrapAnthropicClientError } from \"./utils/errors.js\";\n\nconst MODEL_DEFAULT_MAX_OUTPUT_TOKENS: Partial<\n Record<Anthropic.Model, number>\n> = {\n \"claude-opus-4-1\": 8192,\n \"claude-opus-4\": 8192,\n \"claude-sonnet-4\": 8192,\n \"claude-sonnet-3-7-sonnet\": 8192,\n \"claude-3-5-sonnet\": 4096,\n \"claude-3-5-haiku\": 4096,\n \"claude-3-haiku\": 2048,\n};\nconst FALLBACK_MAX_OUTPUT_TOKENS = 2048;\n\nfunction defaultMaxOutputTokensForModel(model?: Anthropic.Model): number {\n if (!model) {\n return FALLBACK_MAX_OUTPUT_TOKENS;\n }\n const maxTokens = Object.entries(MODEL_DEFAULT_MAX_OUTPUT_TOKENS).find(\n ([key]) => model.startsWith(key)\n )?.[1];\n return maxTokens ?? FALLBACK_MAX_OUTPUT_TOKENS;\n}\n\nexport interface ChatAnthropicCallOptions\n extends BaseChatModelCallOptions,\n Pick<AnthropicInput, \"streamUsage\"> {\n tools?: ChatAnthropicToolType[];\n /**\n * Whether or not to specify what tool the model should use\n * @default \"auto\"\n */\n tool_choice?: AnthropicToolChoice;\n /**\n * Custom headers to pass to the Anthropic API\n * when making a request.\n */\n headers?: Record<string, string>;\n /**\n * Container ID for file persistence across turns with code execution.\n * Used with the code_execution_20250825 tool.\n */\n container?: string;\n}\n\nfunction _toolsInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n return !!(params.tools && params.tools.length > 0);\n}\n\nfunction _documentsInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n for (const message of params.messages ?? []) {\n if (typeof message.content === \"string\") {\n continue;\n }\n for (const block of message.content ?? []) {\n if (\n typeof block === \"object\" &&\n block != null &&\n block.type === \"document\" &&\n typeof block.citations === \"object\" &&\n block.citations?.enabled\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction _thinkingInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n return !!(params.thinking && params.thinking.type === \"enabled\");\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isAnthropicTool(tool: any): tool is Anthropic.Messages.Tool {\n return \"input_schema\" in tool;\n}\n\nfunction isBuiltinTool(tool: unknown): tool is AnthropicBuiltInToolUnion {\n const builtInToolPrefixes = [\n \"text_editor_\",\n \"computer_\",\n \"bash_\",\n \"web_search_\",\n \"web_fetch_\",\n \"str_replace_editor_\",\n \"str_replace_based_edit_tool_\",\n \"code_execution_\",\n \"memory_\",\n ];\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"type\" in tool &&\n \"name\" in tool &&\n typeof tool.type === \"string\" &&\n builtInToolPrefixes.some(\n (prefix) => typeof tool.type === \"string\" && tool.type.startsWith(prefix)\n )\n );\n}\n\n/**\n * @see https://docs.anthropic.com/claude/docs/models-overview\n */\nexport type AnthropicMessagesModelId =\n | Anthropic.Model\n | (string & NonNullable<unknown>);\n\n/**\n * Input to AnthropicChat class.\n */\nexport interface AnthropicInput {\n /**\n * Amount of randomness injected into the response. Ranges\n * from 0 to 1. Use temperature closer to 0 for analytical /\n * multiple choice, and temperature closer to 1 for creative\n * and generative tasks.\n */\n temperature?: number;\n\n /**\n * Only sample from the top K options for each subsequent\n * token. Used to remove \"long tail\" low probability\n * responses.\n */\n topK?: number;\n\n /**\n * Does nucleus sampling, in which we compute the\n * cumulative distribution over all the options for each\n * subsequent token in decreasing probability order and\n * cut it off once it reaches a particular probability\n * specified by top_p. Note that you should either alter\n * temperature or top_p, but not both.\n */\n topP?: number | null;\n\n /** A maximum number of tokens to generate before stopping. */\n maxTokens?: number;\n\n /**\n * A list of strings upon which to stop generating.\n * You probably want `[\"\\n\\nHuman:\"]`, as that's the cue for\n * the next turn in the dialog agent.\n */\n stopSequences?: string[];\n\n /** Whether to stream the results or not */\n streaming?: boolean;\n\n /** Anthropic API key */\n anthropicApiKey?: string;\n /** Anthropic API key */\n apiKey?: string;\n\n /** Anthropic API URL */\n anthropicApiUrl?: string;\n\n /** @deprecated Use \"model\" instead */\n modelName?: AnthropicMessagesModelId;\n /** Model name to use */\n model?: AnthropicMessagesModelId;\n\n /** Overridable Anthropic ClientOptions */\n clientOptions?: ClientOptions;\n\n /** Holds any additional parameters that are valid to pass to {@link\n * https://console.anthropic.com/docs/api/reference |\n * `anthropic.messages`} that are not explicitly specified on this class.\n */\n invocationKwargs?: Kwargs;\n\n /**\n * Whether or not to include token usage data in streamed chunks.\n * @default true\n */\n streamUsage?: boolean;\n\n /**\n * Optional method that returns an initialized underlying Anthropic client.\n * Useful for accessing Anthropic models hosted on other cloud services\n * such as Google Vertex.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createClient?: (options: ClientOptions) => any;\n\n /**\n * Options for extended thinking.\n */\n thinking?: AnthropicThinkingConfigParam;\n\n /**\n * Configuration for context management. See https://docs.claude.com/en/docs/build-with-claude/context-editing\n */\n contextManagement?: AnthropicContextManagementConfigParam;\n}\n\n/**\n * A type representing additional parameters that can be passed to the\n * Anthropic API.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Kwargs = Record<string, any>;\n\nfunction extractToken(chunk: AIMessageChunk): string | undefined {\n if (typeof chunk.content === \"string\") {\n return chunk.content;\n } else if (\n Array.isArray(chunk.content) &&\n chunk.content.length >= 1 &&\n \"input\" in chunk.content[0]\n ) {\n return typeof chunk.content[0].input === \"string\"\n ? chunk.content[0].input\n : JSON.stringify(chunk.content[0].input);\n } else if (\n Array.isArray(chunk.content) &&\n chunk.content.length >= 1 &&\n \"text\" in chunk.content[0] &&\n typeof chunk.content[0].text === \"string\"\n ) {\n return chunk.content[0].text;\n }\n return undefined;\n}\n\n/**\n * Anthropic chat model integration.\n *\n * Setup:\n * Install `@langchain/anthropic` and set an environment variable named `ANTHROPIC_API_KEY`.\n *\n * ```bash\n * npm install @langchain/anthropic\n * export ANTHROPIC_API_KEY=\"your-api-key\"\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/langchain_anthropic.ChatAnthropic.html#constructor)\n *\n * ## [Runtime args](https://api.js.langchain.com/interfaces/langchain_anthropic.ChatAnthropicCallOptions.html)\n *\n * Runtime args can be passed as the second argument to any of the base runnable methods `.invoke`. `.stream`, `.batch`, etc.\n * They can also be passed via `.bind`, or the second arg in `.bindTools`, like shown in the examples below:\n *\n * ```typescript\n * // When calling `.bind`, call options should be passed via the first argument\n * const llmWithArgsBound = llm.bindTools([...]).withConfig({\n * stop: [\"\\n\"],\n * });\n *\n * // When calling `.bindTools`, call options should be passed via the second argument\n * const llmWithTools = llm.bindTools(\n * [...],\n * {\n * tool_choice: \"auto\",\n * }\n * );\n * ```\n *\n * ## Examples\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { ChatAnthropic } from '@langchain/anthropic';\n *\n * const llm = new ChatAnthropic({\n * model: \"claude-sonnet-4-5-20250929\",\n * temperature: 0,\n * maxTokens: undefined,\n * maxRetries: 2,\n * // apiKey: \"...\",\n * // baseUrl: \"...\",\n * // other params...\n * });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Invoking</strong></summary>\n *\n * ```typescript\n * const input = `Translate \"I love programming\" into French.`;\n *\n * // Models also accept a list of chat messages or a formatted prompt\n * const result = await llm.invoke(input);\n * console.log(result);\n * ```\n *\n * ```txt\n * AIMessage {\n * \"id\": \"msg_01QDpd78JUHpRP6bRRNyzbW3\",\n * \"content\": \"Here's the translation to French:\\n\\nJ'adore la programmation.\",\n * \"response_metadata\": {\n * \"id\": \"msg_01QDpd78JUHpRP6bRRNyzbW3\",\n * \"model\": \"claude-sonnet-4-5-20250929\",\n * \"stop_reason\": \"end_turn\",\n * \"stop_sequence\": null,\n * \"usage\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 19\n * },\n * \"type\": \"message\",\n * \"role\": \"assistant\"\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 19,\n * \"total_tokens\": 44\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Streaming Chunks</strong></summary>\n *\n * ```typescript\n * for await (const chunk of await llm.stream(input)) {\n * console.log(chunk);\n * }\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"id\": \"msg_01N8MwoYxiKo9w4chE4gXUs4\",\n * \"content\": \"\",\n * \"additional_kwargs\": {\n * \"id\": \"msg_01N8MwoYxiKo9w4chE4gXUs4\",\n * \"type\": \"message\",\n * \"role\": \"assistant\",\n * \"model\": \"claude-sonnet-4-5-20250929\"\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 1,\n * \"total_tokens\": 26\n * }\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * }\n * AIMessageChunk {\n * \"content\": \"Here\",\n * }\n * AIMessageChunk {\n * \"content\": \"'s\",\n * }\n * AIMessageChunk {\n * \"content\": \" the translation to\",\n * }\n * AIMessageChunk {\n * \"content\": \" French:\\n\\nJ\",\n * }\n * AIMessageChunk {\n * \"content\": \"'adore la programmation\",\n * }\n * AIMessageChunk {\n * \"content\": \".\",\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {\n * \"stop_reason\": \"end_turn\",\n * \"stop_sequence\": null\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 0,\n * \"output_tokens\": 19,\n * \"total_tokens\": 19\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Aggregate Streamed Chunks</strong></summary>\n *\n * ```typescript\n * import { AIMessageChunk } from '@langchain/core/messages';\n * import { concat } from '@langchain/core/utils/stream';\n *\n * const stream = await llm.stream(input);\n * let full: AIMessageChunk | undefined;\n * for await (const chunk of stream) {\n * full = !full ? chunk : concat(full, chunk);\n * }\n * console.log(full);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"id\": \"msg_01SBTb5zSGXfjUc7yQ8EKEEA\",\n * \"content\": \"Here's the translation to French:\\n\\nJ'adore la programmation.\",\n * \"additional_kwargs\": {\n * \"id\": \"msg_01SBTb5zSGXfjUc7yQ8EKEEA\",\n * \"type\": \"message\",\n * \"role\": \"assistant\",\n * \"model\": \"claude-sonnet-4-5-20250929\",\n * \"stop_reason\": \"end_turn\",\n * \"stop_sequence\": null\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 20,\n * \"total_tokens\": 45\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Bind tools</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const GetWeather = {\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const GetPopulation = {\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const llmWithTools = llm.bindTools([GetWeather, GetPopulation]);\n * const aiMsg = await llmWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\"\n * );\n * console.log(aiMsg.tool_calls);\n * ```\n *\n * ```txt\n * [\n * {\n * name: 'GetWeather',\n * args: { location: 'Los Angeles, CA' },\n * id: 'toolu_01WjW3Dann6BPJVtLhovdBD5',\n * type: 'tool_call'\n * },\n * {\n * name: 'GetWeather',\n * args: { location: 'New York, NY' },\n * id: 'toolu_01G6wfJgqi5zRmJomsmkyZXe',\n * type: 'tool_call'\n * },\n * {\n * name: 'GetPopulation',\n * args: { location: 'Los Angeles, CA' },\n * id: 'toolu_0165qYWBA2VFyUst5RA18zew',\n * type: 'tool_call'\n * },\n * {\n * name: 'GetPopulation',\n * args: { location: 'New York, NY' },\n * id: 'toolu_01PGNyP33vxr13tGqr7i3rDo',\n * type: 'tool_call'\n * }\n * ]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Structured Output</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n *\n * const Joke = z.object({\n * setup: z.string().describe(\"The setup of the joke\"),\n * punchline: z.string().describe(\"The punchline to the joke\"),\n * rating: z.number().optional().describe(\"How funny the joke is, from 1 to 10\")\n * }).describe('Joke to tell user.');\n *\n * const structuredLlm = llm.withStructuredOutput(Joke, { name: \"Joke\" });\n * const jokeResult = await structuredLlm.invoke(\"Tell me a joke about cats\");\n * console.log(jokeResult);\n * ```\n *\n * ```txt\n * {\n * setup: \"Why don't cats play poker in the jungle?\",\n * punchline: 'Too many cheetahs!',\n * rating: 7\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Multimodal</strong></summary>\n *\n * ```typescript\n * import { HumanMessage } from '@langchain/core/messages';\n *\n * const imageUrl = \"https://example.com/image.jpg\";\n * const imageData = await fetch(imageUrl).then(res => res.arrayBuffer());\n * const base64Image = Buffer.from(imageData).toString('base64');\n *\n * const message = new HumanMessage({\n * content: [\n * { type: \"text\", text: \"describe the weather in this image\" },\n * {\n * type: \"image_url\",\n * image_url: { url: `data:image/jpeg;base64,${base64Image}` },\n * },\n * ]\n * });\n *\n * const imageDescriptionAiMsg = await llm.invoke([message]);\n * console.log(imageDescriptionAiMsg.content);\n * ```\n *\n * ```txt\n * The weather in this image appears to be beautiful and clear. The sky is a vibrant blue with scattered white clouds, suggesting a sunny and pleasant day. The clouds are wispy and light, indicating calm conditions without any signs of storms or heavy weather. The bright green grass on the rolling hills looks lush and well-watered, which could mean recent rainfall or good growing conditions. Overall, the scene depicts a perfect spring or early summer day with mild temperatures, plenty of sunshine, and gentle breezes - ideal weather for enjoying the outdoors or for plant growth.\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Usage Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForMetadata = await llm.invoke(input);\n * console.log(aiMsgForMetadata.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 25, output_tokens: 19, total_tokens: 44 }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Stream Usage Metadata</strong></summary>\n *\n * ```typescript\n * const streamForMetadata = await llm.stream(\n * input,\n * {\n * streamUsage: true\n * }\n * );\n * let fullForMetadata: AIMessageChunk | undefined;\n * for await (const chunk of streamForMetadata) {\n * fullForMetadata = !fullForMetadata ? chunk : concat(fullForMetadata, chunk);\n * }\n * console.log(fullForMetadata?.usage_metadata);\n * ```\n *\n * ```txt\n * { input_tokens: 25, output_tokens: 20, total_tokens: 45 }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Response Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForResponseMetadata = await llm.invoke(input);\n * console.log(aiMsgForResponseMetadata.response_metadata);\n * ```\n *\n * ```txt\n * {\n * id: 'msg_01STxeQxJmp4sCSpioD6vK3L',\n * model: 'claude-sonnet-4-5-20250929',\n * stop_reason: 'end_turn',\n * stop_sequence: null,\n * usage: { input_tokens: 25, output_tokens: 19 },\n * type: 'message',\n * role: 'assistant'\n * }\n * ```\n * </details>\n *\n * <br />\n */\nexport class ChatAnthropicMessages<\n CallOptions extends ChatAnthropicCallOptions = ChatAnthropicCallOptions\n >\n extends BaseChatModel<CallOptions, AIMessageChunk>\n implements AnthropicInput\n{\n static lc_name() {\n return \"ChatAnthropic\";\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n anthropicApiKey: \"ANTHROPIC_API_KEY\",\n apiKey: \"ANTHROPIC_API_KEY\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n modelName: \"model\",\n };\n }\n\n lc_serializable = true;\n\n anthropicApiKey?: string;\n\n apiKey?: string;\n\n apiUrl?: string;\n\n temperature?: number;\n\n topK?: number;\n\n topP?: number;\n\n maxTokens: number;\n\n modelName = \"claude-3-5-sonnet-latest\";\n\n model = \"claude-3-5-sonnet-latest\";\n\n invocationKwargs?: Kwargs;\n\n stopSequences?: string[];\n\n streaming = false;\n\n clientOptions: ClientOptions;\n\n thinking: AnthropicThinkingConfigParam = { type: \"disabled\" };\n\n contextManagement?: AnthropicContextManagementConfigParam;\n\n // Used for non-streaming requests\n protected batchClient: Anthropic;\n\n // Used for streaming requests\n protected streamingClient: Anthropic;\n\n streamUsage = true;\n\n /**\n * Optional method that returns an initialized underlying Anthropic client.\n * Useful for accessing Anthropic models hosted on other cloud services\n * such as Google Vertex.\n */\n createClient: (options: ClientOptions) => Anthropic;\n\n constructor(fields?: AnthropicInput & BaseChatModelParams) {\n super(fields ?? {});\n\n this.anthropicApiKey =\n fields?.apiKey ??\n fields?.anthropicApiKey ??\n getEnvironmentVariable(\"ANTHROPIC_API_KEY\");\n\n if (!this.anthropicApiKey && !fields?.createClient) {\n throw new Error(\"Anthropic API key not found\");\n }\n this.clientOptions = fields?.clientOptions ?? {};\n /** Keep anthropicApiKey for backwards compatibility */\n this.apiKey = this.anthropicApiKey;\n\n // Support overriding the default API URL (i.e., https://api.anthropic.com)\n this.apiUrl = fields?.anthropicApiUrl;\n\n /** Keep modelName for backwards compatibility */\n this.modelName = fields?.model ?? fields?.modelName ?? this.model;\n this.model = this.modelName;\n\n this.invocationKwargs = fields?.invocationKwargs ?? {};\n\n this.topP = fields?.topP ?? this.topP;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.topK = fields?.topK ?? this.topK;\n this.maxTokens =\n fields?.maxTokens ?? defaultMaxOutputTokensForModel(this.model);\n this.stopSequences = fields?.stopSequences ?? this.stopSequences;\n\n this.streaming = fields?.streaming ?? false;\n this.streamUsage = fields?.streamUsage ?? this.streamUsage;\n\n this.thinking = fields?.thinking ?? this.thinking;\n this.contextManagement =\n fields?.contextManagement ?? this.contextManagement;\n\n this.createClient =\n fields?.createClient ??\n ((options: ClientOptions) => new Anthropic(options));\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"anthropic\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.max_tokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n /**\n * Formats LangChain StructuredTools to AnthropicTools.\n *\n * @param {ChatAnthropicCallOptions[\"tools\"]} tools The tools to format\n * @returns {AnthropicTool[] | undefined} The formatted tools, or undefined if none are passed.\n */\n formatStructuredToolToAnthropic(\n tools: ChatAnthropicCallOptions[\"tools\"]\n ): Anthropic.Messages.ToolUnion[] | undefined {\n if (!tools || !tools.length) {\n return undefined;\n }\n return tools.map((tool) => {\n if (isBuiltinTool(tool)) {\n return tool;\n }\n if (isAnthropicTool(tool)) {\n return tool;\n }\n if (isOpenAITool(tool)) {\n return {\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function\n .parameters as Anthropic.Messages.Tool.InputSchema,\n };\n }\n if (isLangChainTool(tool)) {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: (isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema) as Anthropic.Messages.Tool.InputSchema,\n };\n }\n throw new Error(\n `Unknown tool type passed to ChatAnthropic: ${JSON.stringify(\n tool,\n null,\n 2\n )}`\n );\n });\n }\n\n override bindTools(\n tools: ChatAnthropicToolType[],\n kwargs?: Partial<CallOptions>\n ): Runnable<BaseLanguageModelInput, AIMessageChunk, CallOptions> {\n return this.withConfig({\n tools: this.formatStructuredToolToAnthropic(tools),\n ...kwargs,\n } as Partial<CallOptions>);\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n override invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): Omit<\n AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams,\n \"messages\"\n > &\n Kwargs {\n const tool_choice:\n | Anthropic.Messages.ToolChoiceAuto\n | Anthropic.Messages.ToolChoiceAny\n | Anthropic.Messages.ToolChoiceTool\n | Anthropic.Messages.ToolChoiceNone\n | undefined = handleToolChoice(options?.tool_choice);\n\n if (this.thinking.type === \"enabled\") {\n if (this.topP !== undefined && this.topK !== -1) {\n throw new Error(\"topK is not supported when thinking is enabled\");\n }\n if (this.temperature !== undefined && this.temperature !== 1) {\n throw new Error(\n \"temperature is not supported when thinking is enabled\"\n );\n }\n\n return {\n model: this.model,\n stop_sequences: options?.stop ?? this.stopSequences,\n stream: this.streaming,\n max_tokens: this.maxTokens,\n tools: this.formatStructuredToolToAnthropic(options?.tools),\n tool_choice,\n thinking: this.thinking,\n context_management: this.contextManagement,\n ...this.invocationKwargs,\n container: options?.container,\n };\n }\n return {\n model: this.model,\n temperature: this.temperature,\n top_k: this.topK,\n top_p: this.topP,\n stop_sequences: options?.stop ?? this.stopSequences,\n stream: this.streaming,\n max_tokens: this.maxTokens,\n tools: this.formatStructuredToolToAnthropic(options?.tools),\n tool_choice,\n thinking: this.thinking,\n context_management: this.contextManagement,\n ...this.invocationKwargs,\n container: options?.container,\n };\n }\n\n /** @ignore */\n _identifyingParams() {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams() {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n };\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const params = this.invocationParams(options);\n const formattedMessages = _convertMessagesToAnthropicPayload(messages);\n const payload = {\n ...params,\n ...formattedMessages,\n stream: true,\n } as const;\n const coerceContentToString =\n !_toolsInParams(payload) &&\n !_documentsInParams(payload) &&\n !_thinkingInParams(payload);\n\n const stream = await this.createStreamWithRetry(payload, {\n headers: options.headers,\n });\n\n for await (const data of stream) {\n if (options.signal?.aborted) {\n stream.controller.abort();\n throw new Error(\"AbortError: User aborted the request.\");\n }\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n const result = _makeMessageChunkFromAnthropicEvent(data, {\n streamUsage: shouldStreamUsage,\n coerceContentToString,\n });\n if (!result) continue;\n\n const { chunk } = result;\n\n // Extract the text content token for text field and runManager.\n const token = extractToken(chunk);\n const generationChunk = new ChatGenerationChunk({\n message: new AIMessageChunk({\n // Just yield chunk as it is and tool_use will be concat by BaseChatModel._generateUncached().\n content: chunk.content,\n additional_kwargs: chunk.additional_kwargs,\n tool_call_chunks: chunk.tool_call_chunks,\n usage_metadata: shouldStreamUsage ? chunk.usage_metadata : undefined,\n response_metadata: chunk.response_metadata,\n id: chunk.id,\n }),\n text: token ?? \"\",\n });\n yield generationChunk;\n\n await runManager?.handleLLMNewToken(\n token ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n }\n\n /** @ignore */\n async _generateNonStreaming(\n messages: BaseMessage[],\n params: Omit<\n | Anthropic.Messages.MessageCreateParamsNonStreaming\n | Anthropic.Messages.MessageCreateParamsStreaming,\n \"messages\"\n > &\n Kwargs,\n requestOptions: AnthropicRequestOptions\n ) {\n const response = await this.completionWithRetry(\n {\n ...params,\n stream: false,\n ..._convertMessagesToAnthropicPayload(messages),\n },\n requestOptions\n );\n\n const { content, ...additionalKwargs } = response;\n\n const generations = anthropicResponseToChatMessages(\n content,\n additionalKwargs\n );\n const { role: _role, type: _type, ...rest } = additionalKwargs;\n return { generations, llmOutput: rest };\n }\n\n /** @ignore */\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.stopSequences && options.stop) {\n throw new Error(\n `\"stopSequence\" parameter found in input and default params`\n );\n }\n\n const params = this.invocationParams(options);\n if (params.stream) {\n let finalChunk: ChatGenerationChunk | undefined;\n const stream = this._streamResponseChunks(messages, options, runManager);\n for await (const chunk of stream) {\n if (finalChunk === undefined) {\n finalChunk = chunk;\n } else {\n finalChunk = finalChunk.concat(chunk);\n }\n }\n if (finalChunk === undefined) {\n throw new Error(\"No chunks returned from Anthropic API.\");\n }\n return {\n generations: [\n {\n text: finalChunk.text,\n message: finalChunk.message,\n },\n ],\n };\n } else {\n return this._generateNonStreaming(messages, params, {\n signal: options.signal,\n headers: options.headers,\n });\n }\n }\n\n /**\n * Creates a streaming request with retry.\n * @param request The parameters for creating a completion.\n * @param options\n * @returns A streaming request.\n */\n protected async createStreamWithRetry(\n request: AnthropicStreamingMessageCreateParams & Kwargs,\n options?: AnthropicRequestOptions\n ): Promise<Stream<AnthropicMessageStreamEvent>> {\n if (!this.streamingClient) {\n const options_ = this.apiUrl ? { baseURL: this.apiUrl } : undefined;\n this.streamingClient = this.createClient({\n dangerouslyAllowBrowser: true,\n ...this.clientOptions,\n ...options_,\n apiKey: this.apiKey,\n // Prefer LangChain built-in retries\n maxRetries: 0,\n });\n }\n const makeCompletionRequest = async () => {\n try {\n return await this.streamingClient.messages.create(\n {\n ...request,\n ...this.invocationKwargs,\n stream: true,\n } as AnthropicStreamingMessageCreateParams,\n options\n );\n } catch (e) {\n const error = wrapAnthropicClientError(e);\n throw error;\n }\n };\n return this.caller.call(makeCompletionRequest);\n }\n\n /** @ignore */\n protected async completionWithRetry(\n request: AnthropicMessageCreateParams & Kwargs,\n options: AnthropicRequestOptions\n ): Promise<Anthropic.Message> {\n if (!this.batchClient) {\n const options = this.apiUrl ? { baseURL: this.apiUrl } : undefined;\n this.batchClient = this.createClient({\n dangerouslyAllowBrowser: true,\n ...this.clientOptions,\n ...options,\n apiKey: this.apiKey,\n maxRetries: 0,\n });\n }\n const makeCompletionRequest = async () => {\n try {\n return await this.batchClient.messages.create(\n {\n ...request,\n ...this.invocationKwargs,\n } as AnthropicMessageCreateParams,\n options\n );\n } catch (e) {\n const error = wrapAnthropicClientError(e);\n throw error;\n }\n };\n return this.caller.callWithOptions(\n { signal: options.signal ?? undefined },\n makeCompletionRequest\n );\n }\n\n _llmType() {\n return \"anthropic\";\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const schema: InteropZodType<RunOutput> | Record<string, any> =\n outputSchema;\n const name = config?.name;\n const method = config?.method;\n const includeRaw = config?.includeRaw;\n if (method === \"jsonMode\") {\n throw new Error(`Anthropic only supports \"functionCalling\" as a method.`);\n }\n\n let functionName = name ?? \"extract\";\n let outputParser: BaseLLMOutputParser<RunOutput>;\n let tools: Anthropic.Messages.Tool[];\n if (isInteropZodSchema(schema)) {\n const jsonSchema = toJsonSchema(schema);\n tools = [\n {\n name: functionName,\n description:\n jsonSchema.description ?? \"A function available to call.\",\n input_schema: jsonSchema as Anthropic.Messages.Tool.InputSchema,\n },\n ];\n outputParser = new AnthropicToolsOutputParser({\n returnSingle: true,\n keyName: functionName,\n zodSchema: schema,\n });\n } else {\n let anthropicTools: Anthropic.Messages.Tool;\n if (\n typeof schema.name === \"string\" &&\n typeof schema.description === \"string\" &&\n typeof schema.input_schema === \"object\" &&\n schema.input_schema != null\n ) {\n anthropicTools = schema as Anthropic.Messages.Tool;\n functionName = schema.name;\n } else {\n anthropicTools = {\n name: functionName,\n description: schema.description ?? \"\",\n input_schema: schema as Anthropic.Messages.Tool.InputSchema,\n };\n }\n tools = [anthropicTools];\n outputParser = new AnthropicToolsOutputParser<RunOutput>({\n returnSingle: true,\n keyName: functionName,\n });\n }\n let llm;\n if (this.thinking?.type === \"enabled\") {\n const thinkingAdmonition =\n \"Anthropic structured output relies on forced tool calling, \" +\n \"which is not supported when `thinking` is enabled. This method will raise \" +\n \"OutputParserException if tool calls are not \" +\n \"generated. Consider disabling `thinking` or adjust your prompt to ensure \" +\n \"the tool is called.\";\n\n console.warn(thinkingAdmonition);\n\n llm = this.withConfig({\n outputVersion: \"v0\",\n tools,\n ls_structured_output_format: {\n kwargs: { method: \"functionCalling\" },\n schema: toJsonSchema(schema),\n },\n } as Partial<CallOptions>);\n\n const raiseIfNoToolCalls = (message: AIMessageChunk) => {\n if (!message.tool_calls || message.tool_calls.length === 0) {\n throw new Error(thinkingAdmonition);\n }\n return message;\n };\n\n llm = llm.pipe(raiseIfNoToolCalls);\n } else {\n llm = this.withConfig({\n outputVersion: \"v0\",\n tools,\n tool_choice: {\n type: \"tool\",\n name: functionName,\n },\n ls_structured_output_format: {\n kwargs: { method: \"functionCalling\" },\n schema: toJsonSchema(schema),\n },\n } as Partial<CallOptions>);\n }\n\n if (!includeRaw) {\n return llm.pipe(outputParser).withConfig({\n runName: \"ChatAnthropicStructuredOutput\",\n }) as Runnable<BaseLanguageModelInput, RunOutput>;\n }\n\n const parserAssign = RunnablePassthrough.assign({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parsed: (input: any, config) => outputParser.invoke(input.raw, config),\n });\n const parserNone = RunnablePassthrough.assign({\n parsed: () => null,\n });\n const parsedWithFallback = parserAssign.withFallbacks({\n fallbacks: [parserNone],\n });\n return RunnableSequence.from<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n >([\n {\n raw: llm,\n },\n parsedWithFallback,\n ]).withConfig({\n runName: \"StructuredOutputRunnable\",\n });\n }\n}\n\nexport class ChatAnthropic extends ChatAnthropicMessages {}\n"],"mappings":"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"}
@@ -37,36 +37,32 @@ type AnthropicMessagesModelId = Anthropic$1.Model | (string & NonNullable<unknow
37
37
  * Input to AnthropicChat class.
38
38
  */
39
39
  interface AnthropicInput {
40
- /** Amount of randomness injected into the response. Ranges
41
- * from 0 to 1. Use temp closer to 0 for analytical /
42
- * multiple choice, and temp closer to 1 for creative
40
+ /**
41
+ * Amount of randomness injected into the response. Ranges
42
+ * from 0 to 1. Use temperature closer to 0 for analytical /
43
+ * multiple choice, and temperature closer to 1 for creative
43
44
  * and generative tasks.
44
- * To not set this field, pass `null`. If `undefined` is passed,
45
- * the default (1) will be used.
46
45
  */
47
- temperature?: number | null;
48
- /** Only sample from the top K options for each subsequent
46
+ temperature?: number;
47
+ /**
48
+ * Only sample from the top K options for each subsequent
49
49
  * token. Used to remove "long tail" low probability
50
- * responses. Defaults to -1, which disables it.
50
+ * responses.
51
51
  */
52
52
  topK?: number;
53
- /** Does nucleus sampling, in which we compute the
53
+ /**
54
+ * Does nucleus sampling, in which we compute the
54
55
  * cumulative distribution over all the options for each
55
56
  * subsequent token in decreasing probability order and
56
57
  * cut it off once it reaches a particular probability
57
- * specified by top_p. Defaults to -1, which disables it.
58
- * Note that you should either alter temperature or top_p,
59
- * but not both.
60
- *
61
- * To not set this field, pass `null`. If `undefined` is passed,
62
- * the default (-1) will be used.
63
- *
64
- * For Opus 4.1 and Sonnet 4.5, this defaults to `null`.
58
+ * specified by top_p. Note that you should either alter
59
+ * temperature or top_p, but not both.
65
60
  */
66
61
  topP?: number | null;
67
62
  /** A maximum number of tokens to generate before stopping. */
68
63
  maxTokens?: number;
69
- /** A list of strings upon which to stop generating.
64
+ /**
65
+ * A list of strings upon which to stop generating.
70
66
  * You probably want `["\n\nHuman:"]`, as that's the cue for
71
67
  * the next turn in the dialog agent.
72
68
  */
@@ -159,7 +155,7 @@ type Kwargs = Record<string, any>;
159
155
  * import { ChatAnthropic } from '@langchain/anthropic';
160
156
  *
161
157
  * const llm = new ChatAnthropic({
162
- * model: "claude-3-5-sonnet-20240620",
158
+ * model: "claude-sonnet-4-5-20250929",
163
159
  * temperature: 0,
164
160
  * maxTokens: undefined,
165
161
  * maxRetries: 2,
@@ -189,7 +185,7 @@ type Kwargs = Record<string, any>;
189
185
  * "content": "Here's the translation to French:\n\nJ'adore la programmation.",
190
186
  * "response_metadata": {
191
187
  * "id": "msg_01QDpd78JUHpRP6bRRNyzbW3",
192
- * "model": "claude-3-5-sonnet-20240620",
188
+ * "model": "claude-sonnet-4-5-20250929",
193
189
  * "stop_reason": "end_turn",
194
190
  * "stop_sequence": null,
195
191
  * "usage": {
@@ -227,7 +223,7 @@ type Kwargs = Record<string, any>;
227
223
  * "id": "msg_01N8MwoYxiKo9w4chE4gXUs4",
228
224
  * "type": "message",
229
225
  * "role": "assistant",
230
- * "model": "claude-3-5-sonnet-20240620"
226
+ * "model": "claude-sonnet-4-5-20250929"
231
227
  * },
232
228
  * "usage_metadata": {
233
229
  * "input_tokens": 25,
@@ -296,7 +292,7 @@ type Kwargs = Record<string, any>;
296
292
  * "id": "msg_01SBTb5zSGXfjUc7yQ8EKEEA",
297
293
  * "type": "message",
298
294
  * "role": "assistant",
299
- * "model": "claude-3-5-sonnet-20240620",
295
+ * "model": "claude-sonnet-4-5-20250929",
300
296
  * "stop_reason": "end_turn",
301
297
  * "stop_sequence": null
302
298
  * },
@@ -481,7 +477,7 @@ type Kwargs = Record<string, any>;
481
477
  * ```txt
482
478
  * {
483
479
  * id: 'msg_01STxeQxJmp4sCSpioD6vK3L',
484
- * model: 'claude-3-5-sonnet-20240620',
480
+ * model: 'claude-sonnet-4-5-20250929',
485
481
  * stop_reason: 'end_turn',
486
482
  * stop_sequence: null,
487
483
  * usage: { input_tokens: 25, output_tokens: 19 },
@@ -503,9 +499,9 @@ declare class ChatAnthropicMessages<CallOptions extends ChatAnthropicCallOptions
503
499
  anthropicApiKey?: string;
504
500
  apiKey?: string;
505
501
  apiUrl?: string;
506
- temperature: number | undefined;
507
- topK: number;
508
- topP: number | undefined;
502
+ temperature?: number;
503
+ topK?: number;
504
+ topP?: number;
509
505
  maxTokens: number;
510
506
  modelName: string;
511
507
  model: string;