@librechat/agents 3.1.75 → 3.1.77-dev.1
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/dist/cjs/graphs/Graph.cjs +22 -3
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/hitl/askUserQuestion.cjs +67 -0
- package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -0
- package/dist/cjs/hooks/HookRegistry.cjs +54 -0
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/createToolPolicyHook.cjs +115 -0
- package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -0
- package/dist/cjs/hooks/executeHooks.cjs +40 -1
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs +1 -0
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/langchain/google-common.cjs +3 -0
- package/dist/cjs/langchain/google-common.cjs.map +1 -0
- package/dist/cjs/langchain/index.cjs +86 -0
- package/dist/cjs/langchain/index.cjs.map +1 -0
- package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
- package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
- package/dist/cjs/langchain/messages/tool.cjs +3 -0
- package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
- package/dist/cjs/langchain/messages.cjs +51 -0
- package/dist/cjs/langchain/messages.cjs.map +1 -0
- package/dist/cjs/langchain/openai.cjs +3 -0
- package/dist/cjs/langchain/openai.cjs.map +1 -0
- package/dist/cjs/langchain/prompts.cjs +11 -0
- package/dist/cjs/langchain/prompts.cjs.map +1 -0
- package/dist/cjs/langchain/runnables.cjs +19 -0
- package/dist/cjs/langchain/runnables.cjs.map +1 -0
- package/dist/cjs/langchain/tools.cjs +23 -0
- package/dist/cjs/langchain/tools.cjs.map +1 -0
- package/dist/cjs/langchain/utils/env.cjs +11 -0
- package/dist/cjs/langchain/utils/env.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/index.cjs +145 -52
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +21 -14
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +84 -70
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +1 -1
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +213 -3
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +2 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +5 -4
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +519 -655
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +20 -458
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +57 -175
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +5 -3
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +112 -3
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +2 -1
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +7 -6
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +73 -15
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/langchain.cjs +26 -0
- package/dist/cjs/messages/langchain.cjs.map +1 -0
- package/dist/cjs/messages/prune.cjs +7 -6
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/run.cjs +400 -42
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +556 -56
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +55 -66
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-scraper.cjs +189 -0
- package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -0
- package/dist/cjs/tools/search/tavily-search.cjs +372 -0
- package/dist/cjs/tools/search/tavily-search.cjs.map +1 -0
- package/dist/cjs/tools/search/tool.cjs +26 -4
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +10 -3
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +22 -3
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/hitl/askUserQuestion.mjs +65 -0
- package/dist/esm/hitl/askUserQuestion.mjs.map +1 -0
- package/dist/esm/hooks/HookRegistry.mjs +54 -0
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/createToolPolicyHook.mjs +113 -0
- package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -0
- package/dist/esm/hooks/executeHooks.mjs +40 -1
- package/dist/esm/hooks/executeHooks.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs +1 -0
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/langchain/google-common.mjs +2 -0
- package/dist/esm/langchain/google-common.mjs.map +1 -0
- package/dist/esm/langchain/index.mjs +5 -0
- package/dist/esm/langchain/index.mjs.map +1 -0
- package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
- package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
- package/dist/esm/langchain/messages/tool.mjs +2 -0
- package/dist/esm/langchain/messages/tool.mjs.map +1 -0
- package/dist/esm/langchain/messages.mjs +2 -0
- package/dist/esm/langchain/messages.mjs.map +1 -0
- package/dist/esm/langchain/openai.mjs +2 -0
- package/dist/esm/langchain/openai.mjs.map +1 -0
- package/dist/esm/langchain/prompts.mjs +2 -0
- package/dist/esm/langchain/prompts.mjs.map +1 -0
- package/dist/esm/langchain/runnables.mjs +2 -0
- package/dist/esm/langchain/runnables.mjs.map +1 -0
- package/dist/esm/langchain/tools.mjs +2 -0
- package/dist/esm/langchain/tools.mjs.map +1 -0
- package/dist/esm/langchain/utils/env.mjs +2 -0
- package/dist/esm/langchain/utils/env.mjs.map +1 -0
- package/dist/esm/llm/anthropic/index.mjs +146 -54
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +21 -14
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +84 -71
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +1 -1
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +214 -4
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs +2 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +5 -4
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +520 -656
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +23 -459
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +57 -175
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +5 -3
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +7 -0
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +2 -1
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +7 -6
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +73 -15
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/langchain.mjs +23 -0
- package/dist/esm/messages/langchain.mjs.map +1 -0
- package/dist/esm/messages/prune.mjs +7 -6
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/run.mjs +400 -42
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +557 -57
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +55 -66
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-scraper.mjs +186 -0
- package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -0
- package/dist/esm/tools/search/tavily-search.mjs +370 -0
- package/dist/esm/tools/search/tavily-search.mjs.map +1 -0
- package/dist/esm/tools/search/tool.mjs +26 -4
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +10 -3
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/types/graphs/Graph.d.ts +7 -0
- package/dist/types/hitl/askUserQuestion.d.ts +55 -0
- package/dist/types/hitl/index.d.ts +6 -0
- package/dist/types/hooks/HookRegistry.d.ts +58 -0
- package/dist/types/hooks/createToolPolicyHook.d.ts +87 -0
- package/dist/types/hooks/index.d.ts +4 -1
- package/dist/types/hooks/types.d.ts +109 -3
- package/dist/types/index.d.ts +10 -0
- package/dist/types/langchain/google-common.d.ts +1 -0
- package/dist/types/langchain/index.d.ts +8 -0
- package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
- package/dist/types/langchain/messages/tool.d.ts +1 -0
- package/dist/types/langchain/messages.d.ts +2 -0
- package/dist/types/langchain/openai.d.ts +1 -0
- package/dist/types/langchain/prompts.d.ts +1 -0
- package/dist/types/langchain/runnables.d.ts +2 -0
- package/dist/types/langchain/tools.d.ts +2 -0
- package/dist/types/langchain/utils/env.d.ts +1 -0
- package/dist/types/llm/anthropic/index.d.ts +22 -9
- package/dist/types/llm/anthropic/types.d.ts +5 -1
- package/dist/types/llm/anthropic/utils/message_outputs.d.ts +13 -6
- package/dist/types/llm/anthropic/utils/output_parsers.d.ts +1 -1
- package/dist/types/llm/openai/index.d.ts +21 -24
- package/dist/types/llm/openrouter/index.d.ts +11 -9
- package/dist/types/llm/vertexai/index.d.ts +1 -0
- package/dist/types/messages/cache.d.ts +4 -1
- package/dist/types/messages/format.d.ts +4 -1
- package/dist/types/messages/langchain.d.ts +27 -0
- package/dist/types/run.d.ts +117 -1
- package/dist/types/tools/ToolNode.d.ts +26 -1
- package/dist/types/tools/search/tavily-scraper.d.ts +19 -0
- package/dist/types/tools/search/tavily-search.d.ts +4 -0
- package/dist/types/tools/search/types.d.ts +99 -5
- package/dist/types/tools/search/utils.d.ts +2 -2
- package/dist/types/types/graph.d.ts +23 -37
- package/dist/types/types/hitl.d.ts +272 -0
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/types/llm.d.ts +3 -3
- package/dist/types/types/run.d.ts +33 -0
- package/dist/types/types/stream.d.ts +1 -1
- package/dist/types/types/tools.d.ts +19 -0
- package/package.json +80 -17
- package/src/graphs/Graph.ts +33 -4
- package/src/graphs/__tests__/composition.smoke.test.ts +188 -0
- package/src/hitl/askUserQuestion.ts +72 -0
- package/src/hitl/index.ts +7 -0
- package/src/hooks/HookRegistry.ts +71 -0
- package/src/hooks/__tests__/createToolPolicyHook.test.ts +259 -0
- package/src/hooks/createToolPolicyHook.ts +184 -0
- package/src/hooks/executeHooks.ts +50 -1
- package/src/hooks/index.ts +6 -0
- package/src/hooks/types.ts +112 -0
- package/src/index.ts +22 -0
- package/src/langchain/google-common.ts +1 -0
- package/src/langchain/index.ts +8 -0
- package/src/langchain/language_models/chat_models.ts +1 -0
- package/src/langchain/messages/tool.ts +5 -0
- package/src/langchain/messages.ts +21 -0
- package/src/langchain/openai.ts +1 -0
- package/src/langchain/prompts.ts +1 -0
- package/src/langchain/runnables.ts +7 -0
- package/src/langchain/tools.ts +8 -0
- package/src/langchain/utils/env.ts +1 -0
- package/src/llm/anthropic/index.ts +252 -84
- package/src/llm/anthropic/llm.spec.ts +751 -102
- package/src/llm/anthropic/types.ts +9 -1
- package/src/llm/anthropic/utils/message_inputs.ts +37 -19
- package/src/llm/anthropic/utils/message_outputs.ts +119 -101
- package/src/llm/bedrock/index.ts +2 -2
- package/src/llm/bedrock/llm.spec.ts +341 -0
- package/src/llm/bedrock/utils/message_inputs.ts +303 -4
- package/src/llm/bedrock/utils/message_outputs.ts +2 -1
- package/src/llm/custom-chat-models.smoke.test.ts +836 -0
- package/src/llm/google/llm.spec.ts +339 -57
- package/src/llm/google/utils/common.ts +53 -48
- package/src/llm/openai/contentBlocks.test.ts +346 -0
- package/src/llm/openai/index.ts +856 -833
- package/src/llm/openai/utils/index.ts +107 -78
- package/src/llm/openai/utils/messages.test.ts +159 -0
- package/src/llm/openrouter/index.ts +124 -247
- package/src/llm/openrouter/reasoning.test.ts +8 -1
- package/src/llm/vertexai/index.ts +11 -5
- package/src/llm/vertexai/llm.spec.ts +28 -1
- package/src/messages/cache.test.ts +4 -3
- package/src/messages/cache.ts +3 -2
- package/src/messages/core.ts +16 -9
- package/src/messages/format.ts +96 -16
- package/src/messages/formatAgentMessages.test.ts +166 -1
- package/src/messages/langchain.ts +39 -0
- package/src/messages/prune.ts +12 -8
- package/src/run.ts +456 -47
- package/src/scripts/caching.ts +2 -3
- package/src/specs/summarization.test.ts +51 -58
- package/src/tools/ToolNode.ts +706 -63
- package/src/tools/__tests__/hitl.test.ts +3593 -0
- package/src/tools/search/search.ts +83 -73
- package/src/tools/search/tavily-scraper.ts +235 -0
- package/src/tools/search/tavily-search.ts +424 -0
- package/src/tools/search/tavily.test.ts +965 -0
- package/src/tools/search/tool.ts +36 -26
- package/src/tools/search/types.ts +133 -8
- package/src/tools/search/utils.ts +13 -5
- package/src/types/graph.ts +32 -87
- package/src/types/hitl.ts +303 -0
- package/src/types/index.ts +1 -0
- package/src/types/llm.ts +3 -3
- package/src/types/run.ts +33 -0
- package/src/types/stream.ts +1 -1
- package/src/types/tools.ts +19 -0
- package/src/utils/llmConfig.ts +1 -6
|
@@ -13,36 +13,53 @@ import type { Anthropic } from '@anthropic-ai/sdk';
|
|
|
13
13
|
import type {
|
|
14
14
|
AnthropicMessageCreateParams,
|
|
15
15
|
AnthropicStreamingMessageCreateParams,
|
|
16
|
-
AnthropicStreamUsage,
|
|
17
16
|
AnthropicMessageStartEvent,
|
|
18
17
|
AnthropicMessageDeltaEvent,
|
|
19
18
|
AnthropicOutputConfig,
|
|
19
|
+
AnthropicBeta,
|
|
20
|
+
ChatAnthropicToolType,
|
|
21
|
+
AnthropicMCPServerURLDefinition,
|
|
22
|
+
AnthropicContextManagementConfigParam,
|
|
20
23
|
} from '@/llm/anthropic/types';
|
|
21
|
-
import {
|
|
24
|
+
import {
|
|
25
|
+
_makeMessageChunkFromAnthropicEvent,
|
|
26
|
+
getAnthropicUsageMetadata,
|
|
27
|
+
} from './utils/message_outputs';
|
|
22
28
|
import { _convertMessagesToAnthropicPayload } from './utils/message_inputs';
|
|
23
29
|
import { handleToolChoice } from './utils/tools';
|
|
24
30
|
import { TextStream } from '@/llm/text';
|
|
25
31
|
|
|
32
|
+
const ANTHROPIC_TOOL_BETAS: Partial<Record<string, AnthropicBeta>> = {
|
|
33
|
+
tool_search_tool_regex_20251119: 'advanced-tool-use-2025-11-20',
|
|
34
|
+
tool_search_tool_bm25_20251119: 'advanced-tool-use-2025-11-20',
|
|
35
|
+
memory_20250818: 'context-management-2025-06-27',
|
|
36
|
+
web_fetch_20250910: 'web-fetch-2025-09-10',
|
|
37
|
+
code_execution_20250825: 'code-execution-2025-08-25',
|
|
38
|
+
computer_20251124: 'computer-use-2025-11-24',
|
|
39
|
+
computer_20250124: 'computer-use-2025-01-24',
|
|
40
|
+
mcp_toolset: 'mcp-client-2025-11-20',
|
|
41
|
+
};
|
|
42
|
+
|
|
26
43
|
function _toolsInParams(
|
|
27
44
|
params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams
|
|
28
45
|
): boolean {
|
|
29
46
|
return !!(params.tools && params.tools.length > 0);
|
|
30
47
|
}
|
|
31
|
-
function _documentsInParams(
|
|
48
|
+
export function _documentsInParams(
|
|
32
49
|
params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams
|
|
33
50
|
): boolean {
|
|
34
|
-
for (const message of params.messages
|
|
51
|
+
for (const message of params.messages) {
|
|
35
52
|
if (typeof message.content === 'string') {
|
|
36
53
|
continue;
|
|
37
54
|
}
|
|
38
|
-
for (const block of message.content
|
|
55
|
+
for (const block of message.content) {
|
|
39
56
|
if (
|
|
40
57
|
typeof block === 'object' &&
|
|
41
|
-
block
|
|
58
|
+
block !== null &&
|
|
42
59
|
block.type === 'document' &&
|
|
43
60
|
block.citations != null &&
|
|
44
61
|
typeof block.citations === 'object' &&
|
|
45
|
-
block.citations.enabled
|
|
62
|
+
block.citations.enabled === true
|
|
46
63
|
) {
|
|
47
64
|
return true;
|
|
48
65
|
}
|
|
@@ -61,15 +78,166 @@ function _thinkingInParams(
|
|
|
61
78
|
}
|
|
62
79
|
|
|
63
80
|
function _compactionInParams(
|
|
64
|
-
params:
|
|
81
|
+
params: (
|
|
82
|
+
| AnthropicMessageCreateParams
|
|
83
|
+
| AnthropicStreamingMessageCreateParams
|
|
84
|
+
) & {
|
|
85
|
+
context_management?: AnthropicContextManagementConfigParam;
|
|
86
|
+
}
|
|
65
87
|
): boolean {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
88
|
+
return (
|
|
89
|
+
params.context_management?.edits?.some(
|
|
90
|
+
(edit) => edit.type === 'compact_20260112'
|
|
91
|
+
) === true
|
|
70
92
|
);
|
|
71
93
|
}
|
|
72
94
|
|
|
95
|
+
function isThinkingEnabled(thinking: Anthropic.ThinkingConfigParam): boolean {
|
|
96
|
+
return thinking.type === 'enabled' || thinking.type === 'adaptive';
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function isOpus47Model(model?: string): boolean {
|
|
100
|
+
return /^claude-opus-4-7(?:-|$)/.test(model ?? '');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function combineBetas(
|
|
104
|
+
...betaGroups: (AnthropicBeta[] | undefined)[]
|
|
105
|
+
): AnthropicBeta[] {
|
|
106
|
+
const betas = new Set<AnthropicBeta>();
|
|
107
|
+
for (const betaGroup of betaGroups) {
|
|
108
|
+
for (const beta of betaGroup ?? []) {
|
|
109
|
+
betas.add(beta);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return [...betas];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function getToolBetas(tools?: ChatAnthropicToolType[]): AnthropicBeta[] {
|
|
116
|
+
const betas = new Set<AnthropicBeta>();
|
|
117
|
+
for (const tool of tools ?? []) {
|
|
118
|
+
if (typeof tool !== 'object' || !('type' in tool)) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const beta = ANTHROPIC_TOOL_BETAS[String(tool.type)];
|
|
122
|
+
if (beta != null) {
|
|
123
|
+
betas.add(beta);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return [...betas];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function getCompactionBetas(
|
|
130
|
+
contextManagement?: AnthropicContextManagementConfigParam
|
|
131
|
+
): AnthropicBeta[] {
|
|
132
|
+
return contextManagement?.edits?.some(
|
|
133
|
+
(edit) => edit.type === 'compact_20260112'
|
|
134
|
+
) === true
|
|
135
|
+
? ['compact-2026-01-12']
|
|
136
|
+
: [];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function getTaskBudgetBetas(
|
|
140
|
+
model: string,
|
|
141
|
+
outputConfig?: AnthropicOutputConfig
|
|
142
|
+
): AnthropicBeta[] {
|
|
143
|
+
return isOpus47Model(model) &&
|
|
144
|
+
outputConfig != null &&
|
|
145
|
+
'task_budget' in outputConfig &&
|
|
146
|
+
outputConfig.task_budget != null
|
|
147
|
+
? ['task-budgets-2026-03-13']
|
|
148
|
+
: [];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function isSetSamplingValue(value?: number | null): value is number {
|
|
152
|
+
return value != null && value !== -1;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function isNonDefaultTemperature(value?: number): boolean {
|
|
156
|
+
return isSetSamplingValue(value) && value !== 1;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function validateInvocationParamCompatibility({
|
|
160
|
+
model,
|
|
161
|
+
thinking,
|
|
162
|
+
topK,
|
|
163
|
+
topP,
|
|
164
|
+
temperature,
|
|
165
|
+
}: {
|
|
166
|
+
model: string;
|
|
167
|
+
thinking: Anthropic.ThinkingConfigParam;
|
|
168
|
+
topK?: number;
|
|
169
|
+
topP?: number | null;
|
|
170
|
+
temperature?: number;
|
|
171
|
+
}): void {
|
|
172
|
+
const opus47 = isOpus47Model(model);
|
|
173
|
+
if (opus47 && thinking.type === 'enabled') {
|
|
174
|
+
throw new Error(
|
|
175
|
+
'thinking.type="enabled" is not supported for claude-opus-4-7; use thinking.type="adaptive" instead'
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
if (opus47 && 'budget_tokens' in thinking) {
|
|
179
|
+
throw new Error(
|
|
180
|
+
'thinking.budget_tokens is not supported for claude-opus-4-7; use outputConfig.effort instead'
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
if (opus47) {
|
|
184
|
+
if (isSetSamplingValue(topK)) {
|
|
185
|
+
throw new Error(
|
|
186
|
+
'topK is not supported for claude-opus-4-7; omit topK/topP/temperature or use model prompting instead'
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
if (isSetSamplingValue(topP) && topP !== 1) {
|
|
190
|
+
throw new Error(
|
|
191
|
+
'topP is not supported for claude-opus-4-7 when set to non-default values'
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
if (isNonDefaultTemperature(temperature)) {
|
|
195
|
+
throw new Error(
|
|
196
|
+
'temperature is not supported for claude-opus-4-7 when set to non-default values'
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (!isThinkingEnabled(thinking)) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (isSetSamplingValue(topK)) {
|
|
204
|
+
throw new Error('topK is not supported when thinking is enabled');
|
|
205
|
+
}
|
|
206
|
+
if (isSetSamplingValue(topP)) {
|
|
207
|
+
throw new Error('topP is not supported when thinking is enabled');
|
|
208
|
+
}
|
|
209
|
+
if (isNonDefaultTemperature(temperature)) {
|
|
210
|
+
throw new Error('temperature is not supported when thinking is enabled');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function getSamplingParams({
|
|
215
|
+
model,
|
|
216
|
+
thinking,
|
|
217
|
+
topK,
|
|
218
|
+
topP,
|
|
219
|
+
temperature,
|
|
220
|
+
}: {
|
|
221
|
+
model: string;
|
|
222
|
+
thinking: Anthropic.ThinkingConfigParam;
|
|
223
|
+
topK?: number;
|
|
224
|
+
topP?: number | null;
|
|
225
|
+
temperature?: number;
|
|
226
|
+
}): {
|
|
227
|
+
temperature?: number;
|
|
228
|
+
top_k?: number;
|
|
229
|
+
top_p?: number;
|
|
230
|
+
} {
|
|
231
|
+
if (isThinkingEnabled(thinking) || isOpus47Model(model)) {
|
|
232
|
+
return {};
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
...(isSetSamplingValue(temperature) ? { temperature } : {}),
|
|
236
|
+
...(isSetSamplingValue(topK) ? { top_k: topK } : {}),
|
|
237
|
+
...(isSetSamplingValue(topP) ? { top_p: topP } : {}),
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
73
241
|
function extractToken(
|
|
74
242
|
chunk: AIMessageChunk
|
|
75
243
|
): [string, 'string' | 'input' | 'content'] | [undefined] {
|
|
@@ -88,13 +256,15 @@ function extractToken(
|
|
|
88
256
|
chunk.content.length >= 1 &&
|
|
89
257
|
'text' in chunk.content[0]
|
|
90
258
|
) {
|
|
91
|
-
|
|
259
|
+
const text = chunk.content[0].text;
|
|
260
|
+
return typeof text === 'string' ? [text, 'content'] : [undefined];
|
|
92
261
|
} else if (
|
|
93
262
|
Array.isArray(chunk.content) &&
|
|
94
263
|
chunk.content.length >= 1 &&
|
|
95
264
|
'thinking' in chunk.content[0]
|
|
96
265
|
) {
|
|
97
|
-
|
|
266
|
+
const thinking = chunk.content[0].thinking;
|
|
267
|
+
return typeof thinking === 'string' ? [thinking, 'content'] : [undefined];
|
|
98
268
|
}
|
|
99
269
|
return [undefined];
|
|
100
270
|
}
|
|
@@ -122,7 +292,11 @@ function cloneChunk(
|
|
|
122
292
|
content: [Object.assign({}, content, { text })],
|
|
123
293
|
})
|
|
124
294
|
);
|
|
125
|
-
} else if (
|
|
295
|
+
} else if (
|
|
296
|
+
tokenType === 'content' &&
|
|
297
|
+
typeof content.type === 'string' &&
|
|
298
|
+
content.type.startsWith('thinking')
|
|
299
|
+
) {
|
|
126
300
|
return new AIMessageChunk(
|
|
127
301
|
Object.assign({}, chunk, {
|
|
128
302
|
content: [Object.assign({}, content, { thinking: text })],
|
|
@@ -137,16 +311,26 @@ export type CustomAnthropicInput = AnthropicInput & {
|
|
|
137
311
|
_lc_stream_delay?: number;
|
|
138
312
|
outputConfig?: AnthropicOutputConfig;
|
|
139
313
|
inferenceGeo?: string;
|
|
140
|
-
|
|
141
|
-
contextManagement?: any;
|
|
314
|
+
contextManagement?: AnthropicContextManagementConfigParam;
|
|
142
315
|
} & BaseChatModelParams;
|
|
143
316
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
317
|
+
export type CustomAnthropicCallOptions = {
|
|
318
|
+
outputConfig?: AnthropicOutputConfig;
|
|
319
|
+
outputFormat?: Anthropic.Messages.JSONOutputFormat;
|
|
320
|
+
inferenceGeo?: string;
|
|
321
|
+
betas?: AnthropicBeta[];
|
|
322
|
+
container?: string;
|
|
323
|
+
mcp_servers?: AnthropicMCPServerURLDefinition[];
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
type CustomAnthropicInvocationParams = {
|
|
327
|
+
betas?: AnthropicBeta[];
|
|
328
|
+
container?: string;
|
|
329
|
+
context_management?: AnthropicContextManagementConfigParam;
|
|
330
|
+
inference_geo?: string;
|
|
331
|
+
mcp_servers?: AnthropicMCPServerURLDefinition[];
|
|
332
|
+
output_config?: AnthropicOutputConfig;
|
|
333
|
+
};
|
|
150
334
|
|
|
151
335
|
export class CustomAnthropic extends ChatAnthropicMessages {
|
|
152
336
|
_lc_stream_delay: number;
|
|
@@ -157,8 +341,7 @@ export class CustomAnthropic extends ChatAnthropicMessages {
|
|
|
157
341
|
top_k: number | undefined;
|
|
158
342
|
outputConfig?: AnthropicOutputConfig;
|
|
159
343
|
inferenceGeo?: string;
|
|
160
|
-
|
|
161
|
-
contextManagement?: any;
|
|
344
|
+
contextManagement?: AnthropicContextManagementConfigParam;
|
|
162
345
|
constructor(fields?: CustomAnthropicInput) {
|
|
163
346
|
super(fields);
|
|
164
347
|
this.resetTokenEvents();
|
|
@@ -177,20 +360,19 @@ export class CustomAnthropic extends ChatAnthropicMessages {
|
|
|
177
360
|
* Get the parameters used to invoke the model
|
|
178
361
|
*/
|
|
179
362
|
override invocationParams(
|
|
180
|
-
options?: this['ParsedCallOptions']
|
|
363
|
+
options?: this['ParsedCallOptions'] & CustomAnthropicCallOptions
|
|
181
364
|
): Omit<
|
|
182
365
|
AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams,
|
|
183
366
|
'messages'
|
|
184
367
|
> &
|
|
185
|
-
|
|
368
|
+
CustomAnthropicInvocationParams {
|
|
186
369
|
const tool_choice:
|
|
187
370
|
| Anthropic.Messages.ToolChoiceAuto
|
|
188
371
|
| Anthropic.Messages.ToolChoiceAny
|
|
189
372
|
| Anthropic.Messages.ToolChoiceTool
|
|
190
373
|
| undefined = handleToolChoice(options?.tool_choice);
|
|
191
374
|
|
|
192
|
-
|
|
193
|
-
const callOptions = options as Record<string, any> | undefined;
|
|
375
|
+
const callOptions = options as CustomAnthropicCallOptions | undefined;
|
|
194
376
|
const mergedOutputConfig: AnthropicOutputConfig | undefined = (():
|
|
195
377
|
| AnthropicOutputConfig
|
|
196
378
|
| undefined => {
|
|
@@ -207,49 +389,49 @@ export class CustomAnthropic extends ChatAnthropicMessages {
|
|
|
207
389
|
const inferenceGeo = callOptions?.inferenceGeo ?? this.inferenceGeo;
|
|
208
390
|
|
|
209
391
|
const contextManagement = this.contextManagement;
|
|
392
|
+
const toolBetas = getToolBetas(options?.tools);
|
|
393
|
+
const compactionBetas = getCompactionBetas(contextManagement);
|
|
394
|
+
const taskBudgetBetas = getTaskBudgetBetas(this.model, mergedOutputConfig);
|
|
395
|
+
const formattedTools = this.formatStructuredToolToAnthropic(options?.tools);
|
|
210
396
|
|
|
211
397
|
const sharedParams = {
|
|
212
|
-
tools:
|
|
398
|
+
tools: formattedTools,
|
|
213
399
|
tool_choice,
|
|
214
400
|
thinking: this.thinking,
|
|
215
|
-
|
|
216
|
-
...(inferenceGeo ? { inference_geo: inferenceGeo } : {}),
|
|
217
|
-
...(contextManagement ? { context_management: contextManagement } : {}),
|
|
401
|
+
context_management: contextManagement,
|
|
218
402
|
...this.invocationKwargs,
|
|
403
|
+
container: callOptions?.container,
|
|
404
|
+
betas: combineBetas(
|
|
405
|
+
this.betas,
|
|
406
|
+
callOptions?.betas,
|
|
407
|
+
toolBetas,
|
|
408
|
+
compactionBetas,
|
|
409
|
+
taskBudgetBetas
|
|
410
|
+
),
|
|
411
|
+
output_config: mergedOutputConfig,
|
|
412
|
+
inference_geo: inferenceGeo,
|
|
413
|
+
mcp_servers: callOptions?.mcp_servers,
|
|
219
414
|
};
|
|
415
|
+
validateInvocationParamCompatibility({
|
|
416
|
+
model: this.model,
|
|
417
|
+
thinking: this.thinking,
|
|
418
|
+
topK: this.top_k,
|
|
419
|
+
topP: this.topP,
|
|
420
|
+
temperature: this.temperature,
|
|
421
|
+
});
|
|
220
422
|
|
|
221
|
-
if (this.thinking.type === 'enabled' || this.thinking.type === 'adaptive') {
|
|
222
|
-
if (this.top_k !== -1 && (this.top_k as number | undefined) != null) {
|
|
223
|
-
throw new Error('topK is not supported when thinking is enabled');
|
|
224
|
-
}
|
|
225
|
-
if (this.topP !== -1 && (this.topP as number | undefined) != null) {
|
|
226
|
-
throw new Error('topP is not supported when thinking is enabled');
|
|
227
|
-
}
|
|
228
|
-
if (
|
|
229
|
-
this.temperature !== 1 &&
|
|
230
|
-
(this.temperature as number | undefined) != null
|
|
231
|
-
) {
|
|
232
|
-
throw new Error(
|
|
233
|
-
'temperature is not supported when thinking is enabled'
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
return {
|
|
238
|
-
model: this.model,
|
|
239
|
-
stop_sequences: options?.stop ?? this.stopSequences,
|
|
240
|
-
stream: this.streaming,
|
|
241
|
-
max_tokens: this.maxTokens,
|
|
242
|
-
...sharedParams,
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
423
|
return {
|
|
246
424
|
model: this.model,
|
|
247
|
-
temperature: this.temperature,
|
|
248
|
-
top_k: this.top_k,
|
|
249
|
-
top_p: this.topP,
|
|
250
425
|
stop_sequences: options?.stop ?? this.stopSequences,
|
|
251
426
|
stream: this.streaming,
|
|
252
427
|
max_tokens: this.maxTokens,
|
|
428
|
+
...getSamplingParams({
|
|
429
|
+
model: this.model,
|
|
430
|
+
thinking: this.thinking,
|
|
431
|
+
topK: this.top_k,
|
|
432
|
+
topP: this.topP,
|
|
433
|
+
temperature: this.temperature,
|
|
434
|
+
}),
|
|
253
435
|
...sharedParams,
|
|
254
436
|
};
|
|
255
437
|
}
|
|
@@ -262,34 +444,19 @@ export class CustomAnthropic extends ChatAnthropicMessages {
|
|
|
262
444
|
if (this.emitted_usage === true) {
|
|
263
445
|
return;
|
|
264
446
|
}
|
|
265
|
-
const inputUsage = this.message_start?.message.usage
|
|
266
|
-
|
|
267
|
-
| AnthropicStreamUsage;
|
|
268
|
-
const outputUsage = this.message_delta?.usage as
|
|
269
|
-
| undefined
|
|
270
|
-
| Partial<AnthropicStreamUsage>;
|
|
447
|
+
const inputUsage = this.message_start?.message.usage;
|
|
448
|
+
const outputUsage = this.message_delta?.usage;
|
|
271
449
|
if (!outputUsage) {
|
|
272
450
|
return;
|
|
273
451
|
}
|
|
274
|
-
const totalUsage: UsageMetadata = {
|
|
275
|
-
input_tokens: inputUsage?.input_tokens ?? 0,
|
|
276
|
-
output_tokens: outputUsage.output_tokens ?? 0,
|
|
277
|
-
total_tokens:
|
|
278
|
-
(inputUsage?.input_tokens ?? 0) + (outputUsage.output_tokens ?? 0),
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
if (
|
|
282
|
-
inputUsage?.cache_creation_input_tokens != null ||
|
|
283
|
-
inputUsage?.cache_read_input_tokens != null
|
|
284
|
-
) {
|
|
285
|
-
totalUsage.input_token_details = {
|
|
286
|
-
cache_creation: inputUsage.cache_creation_input_tokens ?? 0,
|
|
287
|
-
cache_read: inputUsage.cache_read_input_tokens ?? 0,
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
452
|
|
|
291
453
|
this.emitted_usage = true;
|
|
292
|
-
return
|
|
454
|
+
return getAnthropicUsageMetadata({
|
|
455
|
+
input_tokens: inputUsage?.input_tokens,
|
|
456
|
+
output_tokens: outputUsage.output_tokens,
|
|
457
|
+
cache_creation_input_tokens: inputUsage?.cache_creation_input_tokens,
|
|
458
|
+
cache_read_input_tokens: inputUsage?.cache_read_input_tokens,
|
|
459
|
+
});
|
|
293
460
|
}
|
|
294
461
|
|
|
295
462
|
resetTokenEvents(): void {
|
|
@@ -363,9 +530,10 @@ export class CustomAnthropic extends ChatAnthropicMessages {
|
|
|
363
530
|
|
|
364
531
|
const stream = await this.createStreamWithRetry(payload, {
|
|
365
532
|
headers: options.headers,
|
|
533
|
+
signal: options.signal,
|
|
366
534
|
});
|
|
367
535
|
|
|
368
|
-
const shouldStreamUsage =
|
|
536
|
+
const shouldStreamUsage = options.streamUsage ?? this.streamUsage;
|
|
369
537
|
|
|
370
538
|
for await (const data of stream) {
|
|
371
539
|
if (options.signal?.aborted === true) {
|