@langchain/anthropic 1.6.1 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/chat_models.cjs +8 -5
- package/dist/chat_models.cjs.map +1 -1
- package/dist/chat_models.d.cts.map +1 -1
- package/dist/chat_models.d.ts.map +1 -1
- package/dist/chat_models.js +9 -6
- package/dist/chat_models.js.map +1 -1
- package/dist/profiles.cjs +82 -47
- package/dist/profiles.cjs.map +1 -1
- package/dist/profiles.js +82 -47
- package/dist/profiles.js.map +1 -1
- package/dist/utils/message_outputs.cjs +18 -14
- package/dist/utils/message_outputs.cjs.map +1 -1
- package/dist/utils/message_outputs.js +17 -15
- package/dist/utils/message_outputs.js.map +1 -1
- package/dist/utils/params.cjs +5 -1
- package/dist/utils/params.cjs.map +1 -1
- package/dist/utils/params.js +5 -2
- package/dist/utils/params.js.map +1 -1
- package/dist/utils/stream_events.cjs +5 -25
- package/dist/utils/stream_events.cjs.map +1 -1
- package/dist/utils/stream_events.js +5 -25
- package/dist/utils/stream_events.js.map +1 -1
- package/package.json +4 -4
package/dist/profiles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.js","names":[],"sources":["../src/profiles.ts"],"sourcesContent":["/**\n * This file was automatically generated by an automated script. Do not edit manually.\n */\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nconst PROFILES: Record<string, ModelProfile> = {\n \"claude-haiku-4-5\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-opus-4-5\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-sonnet-4-5\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-opus-5-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-fable-5-1\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-opus-4-5-20251101\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-opus-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-fable-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-opus-4-8\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-sonnet-4-5-20250929\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-sonnet-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: false,\n },\n \"claude-opus-4-6\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-haiku-4-5-20251001\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-haiku-5-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-sonnet-4-6\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-sonnet-5-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-opus-4-7\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-mythos-5\": {\n imageUrlInputs: true,\n pdfInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n structuredOutput: false,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-mythos-5-1\": {\n imageUrlInputs: true,\n pdfInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n structuredOutput: false,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n};\nexport default PROFILES;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"profiles.js","names":[],"sources":["../src/profiles.ts"],"sourcesContent":["/**\n * This file was automatically generated by an automated script. Do not edit manually.\n */\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nconst PROFILES: Record<string, ModelProfile> = {\n \"claude-opus-4-5\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-sonnet-4-6\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-fable-5-1\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-opus-5-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-haiku-5-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-haiku-4-5-20251001\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-opus-4-7\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-sonnet-4-5-20250929\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-sonnet-4-5\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-opus-4-5-20251101\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-sonnet-5-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-sonnet-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: false,\n },\n \"claude-opus-4-8\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-fable-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-opus-4-6\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-haiku-4-5\": {\n maxInputTokens: 200000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n },\n \"claude-opus-5\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-mythos-5\": {\n imageUrlInputs: true,\n pdfInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n structuredOutput: false,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-mythos-5-1\": {\n imageUrlInputs: true,\n pdfInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n structuredOutput: false,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-fable-5-2\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: true,\n videoInputs: false,\n maxOutputTokens: 128000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n imageUrlInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n toolChoice: false,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n \"claude-mythos-5-2\": {\n imageUrlInputs: true,\n pdfInputs: true,\n pdfToolMessage: true,\n imageToolMessage: true,\n structuredOutput: true,\n maxInputTokens: 1000000,\n maxOutputTokens: 128000,\n imageInputs: true,\n reasoningOutput: true,\n toolCalling: true,\n toolChoice: false,\n midConversationSystemMessages: true,\n midConversationTools: true,\n },\n};\nexport default PROFILES;\n"],"mappings":"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"}
|
|
@@ -3,34 +3,36 @@ const require_content = require("./content.cjs");
|
|
|
3
3
|
const require_index = require("./index.cjs");
|
|
4
4
|
let _langchain_core_messages = require("@langchain/core/messages");
|
|
5
5
|
// src/utils/message_outputs.ts
|
|
6
|
+
/**
|
|
7
|
+
* `message_delta` usage is cumulative for the request, but some providers
|
|
8
|
+
* (e.g. Bedrock) leave out or null fields that `message_start` reported, so
|
|
9
|
+
* those keep their `message_start` values.
|
|
10
|
+
*/
|
|
11
|
+
function _mergeStreamUsage(startUsage, deltaUsage) {
|
|
12
|
+
const merged = { ...startUsage };
|
|
13
|
+
for (const [key, value] of Object.entries(deltaUsage)) if (value != null) merged[key] = value;
|
|
14
|
+
return merged;
|
|
15
|
+
}
|
|
6
16
|
function _makeMessageChunkFromAnthropicEvent(data, fields) {
|
|
7
17
|
const response_metadata = { model_provider: "anthropic" };
|
|
8
18
|
if (data.type === "message_start") {
|
|
9
19
|
const { content, usage, ...additionalKwargs } = data.message;
|
|
10
20
|
const filteredAdditionalKwargs = {};
|
|
11
21
|
for (const [key, value] of Object.entries(additionalKwargs)) if (value !== void 0 && value !== null) filteredAdditionalKwargs[key] = value;
|
|
12
|
-
const { input_tokens, output_tokens, ...rest } = usage ?? {};
|
|
13
|
-
const usageMetadata = buildUsageMetadata(usage);
|
|
14
22
|
return { chunk: new _langchain_core_messages.AIMessageChunk({
|
|
15
23
|
content: fields.coerceContentToString ? "" : [],
|
|
16
24
|
additional_kwargs: filteredAdditionalKwargs,
|
|
17
|
-
|
|
18
|
-
response_metadata: {
|
|
19
|
-
...response_metadata,
|
|
20
|
-
usage: { ...rest }
|
|
21
|
-
},
|
|
25
|
+
response_metadata,
|
|
22
26
|
id: data.message.id
|
|
23
27
|
}) };
|
|
24
28
|
} else if (data.type === "message_delta") {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
total_tokens: data.usage.output_tokens
|
|
29
|
-
};
|
|
29
|
+
const deltaUsage = _mergeStreamUsage(fields.startUsage, data.usage);
|
|
30
|
+
const { input_tokens, output_tokens, ...usage } = deltaUsage;
|
|
31
|
+
const usageMetadata = buildUsageMetadata(deltaUsage);
|
|
30
32
|
const responseMetadata = require_index.iife(() => {
|
|
31
33
|
const output = {};
|
|
32
34
|
if ("context_management" in data.delta) output["context_management"] = data.delta.context_management;
|
|
33
|
-
if (
|
|
35
|
+
if (Object.keys(usage).length > 0) output["usage"] = usage;
|
|
34
36
|
return output;
|
|
35
37
|
});
|
|
36
38
|
return { chunk: new _langchain_core_messages.AIMessageChunk({
|
|
@@ -188,7 +190,7 @@ function anthropicResponseToChatMessages(messages, additionalKwargs) {
|
|
|
188
190
|
function buildUsageMetadata(usage) {
|
|
189
191
|
const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;
|
|
190
192
|
const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;
|
|
191
|
-
const totalInputTokens = usage.input_tokens + cacheCreationInputTokens + cacheReadInputTokens;
|
|
193
|
+
const totalInputTokens = (usage.input_tokens ?? 0) + cacheCreationInputTokens + cacheReadInputTokens;
|
|
192
194
|
return {
|
|
193
195
|
input_tokens: totalInputTokens,
|
|
194
196
|
output_tokens: usage.output_tokens,
|
|
@@ -200,6 +202,8 @@ function buildUsageMetadata(usage) {
|
|
|
200
202
|
};
|
|
201
203
|
}
|
|
202
204
|
exports._makeMessageChunkFromAnthropicEvent = _makeMessageChunkFromAnthropicEvent;
|
|
205
|
+
exports._mergeStreamUsage = _mergeStreamUsage;
|
|
203
206
|
exports.anthropicResponseToChatMessages = anthropicResponseToChatMessages;
|
|
207
|
+
exports.buildUsageMetadata = buildUsageMetadata;
|
|
204
208
|
|
|
205
209
|
//# sourceMappingURL=message_outputs.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message_outputs.cjs","names":["AIMessageChunk","iife","_isAnthropicCompactionBlock","AIMessage","extractToolCalls"],"sources":["../../src/utils/message_outputs.ts"],"sourcesContent":["/**\n * This util file contains functions for converting Anthropic messages to LangChain messages.\n */\nimport Anthropic from \"@anthropic-ai/sdk\";\nimport {\n AIMessage,\n AIMessageChunk,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport type { ToolCallChunk } from \"@langchain/core/messages/tool\";\nimport { ChatGeneration } from \"@langchain/core/outputs\";\nimport { AnthropicMessageResponse } from \"../types.js\";\nimport { extractToolCalls } from \"../output_parsers.js\";\nimport { _isAnthropicCompactionBlock } from \"./content.js\";\nimport { iife } from \"./index.js\";\n\nexport function _makeMessageChunkFromAnthropicEvent(\n data: Anthropic.Beta.Messages.BetaRawMessageStreamEvent,\n fields: {\n streamUsage: boolean;\n coerceContentToString: boolean;\n }\n): {\n chunk: AIMessageChunk;\n} | null {\n const response_metadata = { model_provider: \"anthropic\" };\n if (data.type === \"message_start\") {\n const { content, usage, ...additionalKwargs } = data.message;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const filteredAdditionalKwargs: Record<string, any> = {};\n for (const [key, value] of Object.entries(additionalKwargs)) {\n if (value !== undefined && value !== null) {\n filteredAdditionalKwargs[key] = value;\n }\n }\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const { input_tokens, output_tokens, ...rest }: Record<string, any> =\n usage ?? {};\n const usageMetadata = buildUsageMetadata(usage);\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n additional_kwargs: filteredAdditionalKwargs,\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n response_metadata: {\n ...response_metadata,\n usage: {\n ...rest,\n },\n },\n id: data.message.id,\n }),\n };\n } else if (data.type === \"message_delta\") {\n const usageMetadata: UsageMetadata = {\n input_tokens: 0,\n output_tokens: data.usage.output_tokens,\n total_tokens: data.usage.output_tokens,\n };\n const responseMetadata = iife(() => {\n const output = {};\n if (\"context_management\" in data.delta) {\n output[\"context_management\"] = data.delta.context_management;\n }\n if (\n \"usage\" in data &&\n \"cost\" in data.usage &&\n typeof data.usage.cost === \"number\"\n ) {\n output[\"usage\"] = { cost: data.usage.cost };\n }\n return output;\n });\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n response_metadata: responseMetadata,\n additional_kwargs: { ...data.delta },\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n [\n \"tool_use\",\n \"document\",\n \"server_tool_use\",\n \"web_search_tool_result\",\n \"tool_search_tool_result\",\n \"tool_search_tool_bm25_tool_result\",\n \"tool_search_tool_regex_tool_result\",\n ].includes(data.content_block.type)\n ) {\n const contentBlock = data.content_block;\n let toolCallChunks: ToolCallChunk[];\n if (contentBlock.type === \"tool_use\") {\n toolCallChunks = [\n {\n id: contentBlock.id,\n index: data.index,\n name: contentBlock.name,\n args: \"\",\n },\n ];\n } else {\n toolCallChunks = [];\n }\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n ...data.content_block,\n input:\n contentBlock.type === \"server_tool_use\" ||\n contentBlock.type === \"tool_use\"\n ? \"\"\n : undefined,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n tool_call_chunks: toolCallChunks,\n }),\n };\n } else if (\n data.type === \"content_block_delta\" &&\n [\n \"text_delta\",\n \"citations_delta\",\n \"thinking_delta\",\n \"signature_delta\",\n ].includes(data.delta.type)\n ) {\n if (fields.coerceContentToString && \"text\" in data.delta) {\n return {\n chunk: new AIMessageChunk({\n content: data.delta.text,\n }),\n };\n } else {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const contentBlock: Record<string, any> = data.delta;\n if (\"citation\" in contentBlock) {\n contentBlock.citations = [contentBlock.citation];\n delete contentBlock.citation;\n }\n if (\n contentBlock.type === \"thinking_delta\" ||\n contentBlock.type === \"signature_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"thinking\" }],\n response_metadata,\n }),\n };\n }\n\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"text\" }],\n response_metadata,\n }),\n };\n }\n } else if (\n data.type === \"content_block_delta\" &&\n data.delta.type === \"input_json_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n input: data.delta.partial_json,\n type: data.delta.type,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n tool_call_chunks: [\n {\n index: data.index,\n args: data.delta.partial_json,\n },\n ],\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"text\"\n ) {\n const content = data.content_block?.text;\n if (content !== undefined) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [\n {\n index: data.index,\n ...data.content_block,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n }),\n };\n }\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"redacted_thinking\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"thinking\"\n ) {\n const content = data.content_block.thinking;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n _isAnthropicCompactionBlock(data.content_block)\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_delta\" &&\n data.delta.type === \"compaction_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n ...data.delta,\n type: \"compaction\",\n },\n ],\n response_metadata,\n }),\n };\n }\n return null;\n}\n\nexport function anthropicResponseToChatMessages(\n messages: AnthropicMessageResponse[],\n additionalKwargs: Record<string, unknown>\n): ChatGeneration[] {\n const response_metadata = {\n ...additionalKwargs,\n model_provider: \"anthropic\",\n };\n const usage: Record<string, number> | null | undefined =\n additionalKwargs.usage as Record<string, number> | null | undefined;\n const usageMetadata = usage != null ? buildUsageMetadata(usage) : undefined;\n if (messages.length === 1 && messages[0].type === \"text\") {\n return [\n {\n text: messages[0].text,\n message: new AIMessage({\n content: messages[0].text,\n additional_kwargs: additionalKwargs,\n usage_metadata: usageMetadata,\n response_metadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n } else {\n const toolCalls = extractToolCalls(messages);\n const generations: ChatGeneration[] = [\n {\n text: \"\",\n message: new AIMessage({\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: messages as any,\n additional_kwargs: additionalKwargs,\n tool_calls: toolCalls,\n usage_metadata: usageMetadata,\n response_metadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n return generations;\n }\n}\n\nfunction buildUsageMetadata(\n usage: Anthropic.Messages.Usage | Record<string, number>\n): UsageMetadata {\n const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;\n const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;\n // Total input tokens in a Claude API request is the summation of `input_tokens`, `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n // ref: https://platform.claude.com/docs/en/api/messages\n const totalInputTokens =\n usage.input_tokens + cacheCreationInputTokens + cacheReadInputTokens;\n return {\n input_tokens: totalInputTokens,\n output_tokens: usage.output_tokens,\n total_tokens: totalInputTokens + usage.output_tokens,\n input_token_details: {\n cache_creation: cacheCreationInputTokens,\n cache_read: cacheReadInputTokens,\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"message_outputs.cjs","names":["AIMessageChunk","iife","_isAnthropicCompactionBlock","AIMessage","extractToolCalls"],"sources":["../../src/utils/message_outputs.ts"],"sourcesContent":["/**\n * This util file contains functions for converting Anthropic messages to LangChain messages.\n */\nimport Anthropic from \"@anthropic-ai/sdk\";\nimport {\n AIMessage,\n AIMessageChunk,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport type { ToolCallChunk } from \"@langchain/core/messages/tool\";\nimport { ChatGeneration } from \"@langchain/core/outputs\";\nimport { AnthropicMessageResponse } from \"../types.js\";\nimport { extractToolCalls } from \"../output_parsers.js\";\nimport { _isAnthropicCompactionBlock } from \"./content.js\";\nimport { iife } from \"./index.js\";\n\n/**\n * `message_delta` usage is cumulative for the request, but some providers\n * (e.g. Bedrock) leave out or null fields that `message_start` reported, so\n * those keep their `message_start` values.\n */\nexport function _mergeStreamUsage<T extends object>(\n startUsage: object | undefined,\n deltaUsage: T\n): T {\n const merged: Record<string, unknown> = { ...startUsage };\n for (const [key, value] of Object.entries(deltaUsage)) {\n if (value != null) {\n merged[key] = value;\n }\n }\n return merged as T;\n}\n\nexport function _makeMessageChunkFromAnthropicEvent(\n data: Anthropic.Beta.Messages.BetaRawMessageStreamEvent,\n fields: {\n streamUsage: boolean;\n coerceContentToString: boolean;\n /** Usage from this response's `message_start`. */\n startUsage?: object;\n }\n): {\n chunk: AIMessageChunk;\n} | null {\n const response_metadata = { model_provider: \"anthropic\" };\n if (data.type === \"message_start\") {\n const { content, usage, ...additionalKwargs } = data.message;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const filteredAdditionalKwargs: Record<string, any> = {};\n for (const [key, value] of Object.entries(additionalKwargs)) {\n if (value !== undefined && value !== null) {\n filteredAdditionalKwargs[key] = value;\n }\n }\n // Usage is reported on `message_delta`, which is cumulative for the whole\n // request, so none is emitted here.\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n additional_kwargs: filteredAdditionalKwargs,\n response_metadata,\n id: data.message.id,\n }),\n };\n } else if (data.type === \"message_delta\") {\n const deltaUsage = _mergeStreamUsage(fields.startUsage, data.usage);\n const { input_tokens, output_tokens, ...usage } = deltaUsage;\n const usageMetadata = buildUsageMetadata(deltaUsage);\n const responseMetadata = iife(() => {\n const output = {};\n if (\"context_management\" in data.delta) {\n output[\"context_management\"] = data.delta.context_management;\n }\n if (Object.keys(usage).length > 0) {\n output[\"usage\"] = usage;\n }\n return output;\n });\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n response_metadata: responseMetadata,\n additional_kwargs: { ...data.delta },\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n [\n \"tool_use\",\n \"document\",\n \"server_tool_use\",\n \"web_search_tool_result\",\n \"tool_search_tool_result\",\n \"tool_search_tool_bm25_tool_result\",\n \"tool_search_tool_regex_tool_result\",\n ].includes(data.content_block.type)\n ) {\n const contentBlock = data.content_block;\n let toolCallChunks: ToolCallChunk[];\n if (contentBlock.type === \"tool_use\") {\n toolCallChunks = [\n {\n id: contentBlock.id,\n index: data.index,\n name: contentBlock.name,\n args: \"\",\n },\n ];\n } else {\n toolCallChunks = [];\n }\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n ...data.content_block,\n input:\n contentBlock.type === \"server_tool_use\" ||\n contentBlock.type === \"tool_use\"\n ? \"\"\n : undefined,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n tool_call_chunks: toolCallChunks,\n }),\n };\n } else if (\n data.type === \"content_block_delta\" &&\n [\n \"text_delta\",\n \"citations_delta\",\n \"thinking_delta\",\n \"signature_delta\",\n ].includes(data.delta.type)\n ) {\n if (fields.coerceContentToString && \"text\" in data.delta) {\n return {\n chunk: new AIMessageChunk({\n content: data.delta.text,\n }),\n };\n } else {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const contentBlock: Record<string, any> = data.delta;\n if (\"citation\" in contentBlock) {\n contentBlock.citations = [contentBlock.citation];\n delete contentBlock.citation;\n }\n if (\n contentBlock.type === \"thinking_delta\" ||\n contentBlock.type === \"signature_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"thinking\" }],\n response_metadata,\n }),\n };\n }\n\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"text\" }],\n response_metadata,\n }),\n };\n }\n } else if (\n data.type === \"content_block_delta\" &&\n data.delta.type === \"input_json_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n input: data.delta.partial_json,\n type: data.delta.type,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n tool_call_chunks: [\n {\n index: data.index,\n args: data.delta.partial_json,\n },\n ],\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"text\"\n ) {\n const content = data.content_block?.text;\n if (content !== undefined) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [\n {\n index: data.index,\n ...data.content_block,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n }),\n };\n }\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"redacted_thinking\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"thinking\"\n ) {\n const content = data.content_block.thinking;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n _isAnthropicCompactionBlock(data.content_block)\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_delta\" &&\n data.delta.type === \"compaction_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n ...data.delta,\n type: \"compaction\",\n },\n ],\n response_metadata,\n }),\n };\n }\n return null;\n}\n\nexport function anthropicResponseToChatMessages(\n messages: AnthropicMessageResponse[],\n additionalKwargs: Record<string, unknown>\n): ChatGeneration[] {\n const response_metadata = {\n ...additionalKwargs,\n model_provider: \"anthropic\",\n };\n const usage: Record<string, number> | null | undefined =\n additionalKwargs.usage as Record<string, number> | null | undefined;\n const usageMetadata = usage != null ? buildUsageMetadata(usage) : undefined;\n if (messages.length === 1 && messages[0].type === \"text\") {\n return [\n {\n text: messages[0].text,\n message: new AIMessage({\n content: messages[0].text,\n additional_kwargs: additionalKwargs,\n usage_metadata: usageMetadata,\n response_metadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n } else {\n const toolCalls = extractToolCalls(messages);\n const generations: ChatGeneration[] = [\n {\n text: \"\",\n message: new AIMessage({\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: messages as any,\n additional_kwargs: additionalKwargs,\n tool_calls: toolCalls,\n usage_metadata: usageMetadata,\n response_metadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n return generations;\n }\n}\n\nexport function buildUsageMetadata(\n usage:\n | Anthropic.Messages.Usage\n | Anthropic.Messages.MessageDeltaUsage\n | Anthropic.Beta.Messages.BetaMessageDeltaUsage\n | Record<string, number>\n): UsageMetadata {\n const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;\n const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;\n // Total input tokens in a Claude API request is the summation of `input_tokens`, `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n // ref: https://platform.claude.com/docs/en/api/messages\n const totalInputTokens =\n (usage.input_tokens ?? 0) + cacheCreationInputTokens + cacheReadInputTokens;\n return {\n input_tokens: totalInputTokens,\n output_tokens: usage.output_tokens,\n total_tokens: totalInputTokens + usage.output_tokens,\n input_token_details: {\n cache_creation: cacheCreationInputTokens,\n cache_read: cacheReadInputTokens,\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -3,34 +3,36 @@ import { _isAnthropicCompactionBlock } from "./content.js";
|
|
|
3
3
|
import { iife } from "./index.js";
|
|
4
4
|
import { AIMessage, AIMessageChunk } from "@langchain/core/messages";
|
|
5
5
|
// src/utils/message_outputs.ts
|
|
6
|
+
/**
|
|
7
|
+
* `message_delta` usage is cumulative for the request, but some providers
|
|
8
|
+
* (e.g. Bedrock) leave out or null fields that `message_start` reported, so
|
|
9
|
+
* those keep their `message_start` values.
|
|
10
|
+
*/
|
|
11
|
+
function _mergeStreamUsage(startUsage, deltaUsage) {
|
|
12
|
+
const merged = { ...startUsage };
|
|
13
|
+
for (const [key, value] of Object.entries(deltaUsage)) if (value != null) merged[key] = value;
|
|
14
|
+
return merged;
|
|
15
|
+
}
|
|
6
16
|
function _makeMessageChunkFromAnthropicEvent(data, fields) {
|
|
7
17
|
const response_metadata = { model_provider: "anthropic" };
|
|
8
18
|
if (data.type === "message_start") {
|
|
9
19
|
const { content, usage, ...additionalKwargs } = data.message;
|
|
10
20
|
const filteredAdditionalKwargs = {};
|
|
11
21
|
for (const [key, value] of Object.entries(additionalKwargs)) if (value !== void 0 && value !== null) filteredAdditionalKwargs[key] = value;
|
|
12
|
-
const { input_tokens, output_tokens, ...rest } = usage ?? {};
|
|
13
|
-
const usageMetadata = buildUsageMetadata(usage);
|
|
14
22
|
return { chunk: new AIMessageChunk({
|
|
15
23
|
content: fields.coerceContentToString ? "" : [],
|
|
16
24
|
additional_kwargs: filteredAdditionalKwargs,
|
|
17
|
-
|
|
18
|
-
response_metadata: {
|
|
19
|
-
...response_metadata,
|
|
20
|
-
usage: { ...rest }
|
|
21
|
-
},
|
|
25
|
+
response_metadata,
|
|
22
26
|
id: data.message.id
|
|
23
27
|
}) };
|
|
24
28
|
} else if (data.type === "message_delta") {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
total_tokens: data.usage.output_tokens
|
|
29
|
-
};
|
|
29
|
+
const deltaUsage = _mergeStreamUsage(fields.startUsage, data.usage);
|
|
30
|
+
const { input_tokens, output_tokens, ...usage } = deltaUsage;
|
|
31
|
+
const usageMetadata = buildUsageMetadata(deltaUsage);
|
|
30
32
|
const responseMetadata = iife(() => {
|
|
31
33
|
const output = {};
|
|
32
34
|
if ("context_management" in data.delta) output["context_management"] = data.delta.context_management;
|
|
33
|
-
if (
|
|
35
|
+
if (Object.keys(usage).length > 0) output["usage"] = usage;
|
|
34
36
|
return output;
|
|
35
37
|
});
|
|
36
38
|
return { chunk: new AIMessageChunk({
|
|
@@ -188,7 +190,7 @@ function anthropicResponseToChatMessages(messages, additionalKwargs) {
|
|
|
188
190
|
function buildUsageMetadata(usage) {
|
|
189
191
|
const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;
|
|
190
192
|
const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;
|
|
191
|
-
const totalInputTokens = usage.input_tokens + cacheCreationInputTokens + cacheReadInputTokens;
|
|
193
|
+
const totalInputTokens = (usage.input_tokens ?? 0) + cacheCreationInputTokens + cacheReadInputTokens;
|
|
192
194
|
return {
|
|
193
195
|
input_tokens: totalInputTokens,
|
|
194
196
|
output_tokens: usage.output_tokens,
|
|
@@ -199,6 +201,6 @@ function buildUsageMetadata(usage) {
|
|
|
199
201
|
}
|
|
200
202
|
};
|
|
201
203
|
}
|
|
202
|
-
export { _makeMessageChunkFromAnthropicEvent, anthropicResponseToChatMessages };
|
|
204
|
+
export { _makeMessageChunkFromAnthropicEvent, _mergeStreamUsage, anthropicResponseToChatMessages, buildUsageMetadata };
|
|
203
205
|
|
|
204
206
|
//# sourceMappingURL=message_outputs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message_outputs.js","names":[],"sources":["../../src/utils/message_outputs.ts"],"sourcesContent":["/**\n * This util file contains functions for converting Anthropic messages to LangChain messages.\n */\nimport Anthropic from \"@anthropic-ai/sdk\";\nimport {\n AIMessage,\n AIMessageChunk,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport type { ToolCallChunk } from \"@langchain/core/messages/tool\";\nimport { ChatGeneration } from \"@langchain/core/outputs\";\nimport { AnthropicMessageResponse } from \"../types.js\";\nimport { extractToolCalls } from \"../output_parsers.js\";\nimport { _isAnthropicCompactionBlock } from \"./content.js\";\nimport { iife } from \"./index.js\";\n\nexport function _makeMessageChunkFromAnthropicEvent(\n data: Anthropic.Beta.Messages.BetaRawMessageStreamEvent,\n fields: {\n streamUsage: boolean;\n coerceContentToString: boolean;\n }\n): {\n chunk: AIMessageChunk;\n} | null {\n const response_metadata = { model_provider: \"anthropic\" };\n if (data.type === \"message_start\") {\n const { content, usage, ...additionalKwargs } = data.message;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const filteredAdditionalKwargs: Record<string, any> = {};\n for (const [key, value] of Object.entries(additionalKwargs)) {\n if (value !== undefined && value !== null) {\n filteredAdditionalKwargs[key] = value;\n }\n }\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const { input_tokens, output_tokens, ...rest }: Record<string, any> =\n usage ?? {};\n const usageMetadata = buildUsageMetadata(usage);\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n additional_kwargs: filteredAdditionalKwargs,\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n response_metadata: {\n ...response_metadata,\n usage: {\n ...rest,\n },\n },\n id: data.message.id,\n }),\n };\n } else if (data.type === \"message_delta\") {\n const usageMetadata: UsageMetadata = {\n input_tokens: 0,\n output_tokens: data.usage.output_tokens,\n total_tokens: data.usage.output_tokens,\n };\n const responseMetadata = iife(() => {\n const output = {};\n if (\"context_management\" in data.delta) {\n output[\"context_management\"] = data.delta.context_management;\n }\n if (\n \"usage\" in data &&\n \"cost\" in data.usage &&\n typeof data.usage.cost === \"number\"\n ) {\n output[\"usage\"] = { cost: data.usage.cost };\n }\n return output;\n });\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n response_metadata: responseMetadata,\n additional_kwargs: { ...data.delta },\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n [\n \"tool_use\",\n \"document\",\n \"server_tool_use\",\n \"web_search_tool_result\",\n \"tool_search_tool_result\",\n \"tool_search_tool_bm25_tool_result\",\n \"tool_search_tool_regex_tool_result\",\n ].includes(data.content_block.type)\n ) {\n const contentBlock = data.content_block;\n let toolCallChunks: ToolCallChunk[];\n if (contentBlock.type === \"tool_use\") {\n toolCallChunks = [\n {\n id: contentBlock.id,\n index: data.index,\n name: contentBlock.name,\n args: \"\",\n },\n ];\n } else {\n toolCallChunks = [];\n }\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n ...data.content_block,\n input:\n contentBlock.type === \"server_tool_use\" ||\n contentBlock.type === \"tool_use\"\n ? \"\"\n : undefined,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n tool_call_chunks: toolCallChunks,\n }),\n };\n } else if (\n data.type === \"content_block_delta\" &&\n [\n \"text_delta\",\n \"citations_delta\",\n \"thinking_delta\",\n \"signature_delta\",\n ].includes(data.delta.type)\n ) {\n if (fields.coerceContentToString && \"text\" in data.delta) {\n return {\n chunk: new AIMessageChunk({\n content: data.delta.text,\n }),\n };\n } else {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const contentBlock: Record<string, any> = data.delta;\n if (\"citation\" in contentBlock) {\n contentBlock.citations = [contentBlock.citation];\n delete contentBlock.citation;\n }\n if (\n contentBlock.type === \"thinking_delta\" ||\n contentBlock.type === \"signature_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"thinking\" }],\n response_metadata,\n }),\n };\n }\n\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"text\" }],\n response_metadata,\n }),\n };\n }\n } else if (\n data.type === \"content_block_delta\" &&\n data.delta.type === \"input_json_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n input: data.delta.partial_json,\n type: data.delta.type,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n tool_call_chunks: [\n {\n index: data.index,\n args: data.delta.partial_json,\n },\n ],\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"text\"\n ) {\n const content = data.content_block?.text;\n if (content !== undefined) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [\n {\n index: data.index,\n ...data.content_block,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n }),\n };\n }\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"redacted_thinking\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"thinking\"\n ) {\n const content = data.content_block.thinking;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n _isAnthropicCompactionBlock(data.content_block)\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_delta\" &&\n data.delta.type === \"compaction_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n ...data.delta,\n type: \"compaction\",\n },\n ],\n response_metadata,\n }),\n };\n }\n return null;\n}\n\nexport function anthropicResponseToChatMessages(\n messages: AnthropicMessageResponse[],\n additionalKwargs: Record<string, unknown>\n): ChatGeneration[] {\n const response_metadata = {\n ...additionalKwargs,\n model_provider: \"anthropic\",\n };\n const usage: Record<string, number> | null | undefined =\n additionalKwargs.usage as Record<string, number> | null | undefined;\n const usageMetadata = usage != null ? buildUsageMetadata(usage) : undefined;\n if (messages.length === 1 && messages[0].type === \"text\") {\n return [\n {\n text: messages[0].text,\n message: new AIMessage({\n content: messages[0].text,\n additional_kwargs: additionalKwargs,\n usage_metadata: usageMetadata,\n response_metadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n } else {\n const toolCalls = extractToolCalls(messages);\n const generations: ChatGeneration[] = [\n {\n text: \"\",\n message: new AIMessage({\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: messages as any,\n additional_kwargs: additionalKwargs,\n tool_calls: toolCalls,\n usage_metadata: usageMetadata,\n response_metadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n return generations;\n }\n}\n\nfunction buildUsageMetadata(\n usage: Anthropic.Messages.Usage | Record<string, number>\n): UsageMetadata {\n const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;\n const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;\n // Total input tokens in a Claude API request is the summation of `input_tokens`, `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n // ref: https://platform.claude.com/docs/en/api/messages\n const totalInputTokens =\n usage.input_tokens + cacheCreationInputTokens + cacheReadInputTokens;\n return {\n input_tokens: totalInputTokens,\n output_tokens: usage.output_tokens,\n total_tokens: totalInputTokens + usage.output_tokens,\n input_token_details: {\n cache_creation: cacheCreationInputTokens,\n cache_read: cacheReadInputTokens,\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"message_outputs.js","names":[],"sources":["../../src/utils/message_outputs.ts"],"sourcesContent":["/**\n * This util file contains functions for converting Anthropic messages to LangChain messages.\n */\nimport Anthropic from \"@anthropic-ai/sdk\";\nimport {\n AIMessage,\n AIMessageChunk,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport type { ToolCallChunk } from \"@langchain/core/messages/tool\";\nimport { ChatGeneration } from \"@langchain/core/outputs\";\nimport { AnthropicMessageResponse } from \"../types.js\";\nimport { extractToolCalls } from \"../output_parsers.js\";\nimport { _isAnthropicCompactionBlock } from \"./content.js\";\nimport { iife } from \"./index.js\";\n\n/**\n * `message_delta` usage is cumulative for the request, but some providers\n * (e.g. Bedrock) leave out or null fields that `message_start` reported, so\n * those keep their `message_start` values.\n */\nexport function _mergeStreamUsage<T extends object>(\n startUsage: object | undefined,\n deltaUsage: T\n): T {\n const merged: Record<string, unknown> = { ...startUsage };\n for (const [key, value] of Object.entries(deltaUsage)) {\n if (value != null) {\n merged[key] = value;\n }\n }\n return merged as T;\n}\n\nexport function _makeMessageChunkFromAnthropicEvent(\n data: Anthropic.Beta.Messages.BetaRawMessageStreamEvent,\n fields: {\n streamUsage: boolean;\n coerceContentToString: boolean;\n /** Usage from this response's `message_start`. */\n startUsage?: object;\n }\n): {\n chunk: AIMessageChunk;\n} | null {\n const response_metadata = { model_provider: \"anthropic\" };\n if (data.type === \"message_start\") {\n const { content, usage, ...additionalKwargs } = data.message;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const filteredAdditionalKwargs: Record<string, any> = {};\n for (const [key, value] of Object.entries(additionalKwargs)) {\n if (value !== undefined && value !== null) {\n filteredAdditionalKwargs[key] = value;\n }\n }\n // Usage is reported on `message_delta`, which is cumulative for the whole\n // request, so none is emitted here.\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n additional_kwargs: filteredAdditionalKwargs,\n response_metadata,\n id: data.message.id,\n }),\n };\n } else if (data.type === \"message_delta\") {\n const deltaUsage = _mergeStreamUsage(fields.startUsage, data.usage);\n const { input_tokens, output_tokens, ...usage } = deltaUsage;\n const usageMetadata = buildUsageMetadata(deltaUsage);\n const responseMetadata = iife(() => {\n const output = {};\n if (\"context_management\" in data.delta) {\n output[\"context_management\"] = data.delta.context_management;\n }\n if (Object.keys(usage).length > 0) {\n output[\"usage\"] = usage;\n }\n return output;\n });\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n response_metadata: responseMetadata,\n additional_kwargs: { ...data.delta },\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n [\n \"tool_use\",\n \"document\",\n \"server_tool_use\",\n \"web_search_tool_result\",\n \"tool_search_tool_result\",\n \"tool_search_tool_bm25_tool_result\",\n \"tool_search_tool_regex_tool_result\",\n ].includes(data.content_block.type)\n ) {\n const contentBlock = data.content_block;\n let toolCallChunks: ToolCallChunk[];\n if (contentBlock.type === \"tool_use\") {\n toolCallChunks = [\n {\n id: contentBlock.id,\n index: data.index,\n name: contentBlock.name,\n args: \"\",\n },\n ];\n } else {\n toolCallChunks = [];\n }\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n ...data.content_block,\n input:\n contentBlock.type === \"server_tool_use\" ||\n contentBlock.type === \"tool_use\"\n ? \"\"\n : undefined,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n tool_call_chunks: toolCallChunks,\n }),\n };\n } else if (\n data.type === \"content_block_delta\" &&\n [\n \"text_delta\",\n \"citations_delta\",\n \"thinking_delta\",\n \"signature_delta\",\n ].includes(data.delta.type)\n ) {\n if (fields.coerceContentToString && \"text\" in data.delta) {\n return {\n chunk: new AIMessageChunk({\n content: data.delta.text,\n }),\n };\n } else {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const contentBlock: Record<string, any> = data.delta;\n if (\"citation\" in contentBlock) {\n contentBlock.citations = [contentBlock.citation];\n delete contentBlock.citation;\n }\n if (\n contentBlock.type === \"thinking_delta\" ||\n contentBlock.type === \"signature_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"thinking\" }],\n response_metadata,\n }),\n };\n }\n\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"text\" }],\n response_metadata,\n }),\n };\n }\n } else if (\n data.type === \"content_block_delta\" &&\n data.delta.type === \"input_json_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n input: data.delta.partial_json,\n type: data.delta.type,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n tool_call_chunks: [\n {\n index: data.index,\n args: data.delta.partial_json,\n },\n ],\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"text\"\n ) {\n const content = data.content_block?.text;\n if (content !== undefined) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [\n {\n index: data.index,\n ...data.content_block,\n },\n ],\n response_metadata,\n additional_kwargs: {},\n }),\n };\n }\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"redacted_thinking\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n data.content_block.type === \"thinking\"\n ) {\n const content = data.content_block.thinking;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_start\" &&\n _isAnthropicCompactionBlock(data.content_block)\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [{ index: data.index, ...data.content_block }],\n response_metadata,\n }),\n };\n } else if (\n data.type === \"content_block_delta\" &&\n data.delta.type === \"compaction_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? \"\"\n : [\n {\n index: data.index,\n ...data.delta,\n type: \"compaction\",\n },\n ],\n response_metadata,\n }),\n };\n }\n return null;\n}\n\nexport function anthropicResponseToChatMessages(\n messages: AnthropicMessageResponse[],\n additionalKwargs: Record<string, unknown>\n): ChatGeneration[] {\n const response_metadata = {\n ...additionalKwargs,\n model_provider: \"anthropic\",\n };\n const usage: Record<string, number> | null | undefined =\n additionalKwargs.usage as Record<string, number> | null | undefined;\n const usageMetadata = usage != null ? buildUsageMetadata(usage) : undefined;\n if (messages.length === 1 && messages[0].type === \"text\") {\n return [\n {\n text: messages[0].text,\n message: new AIMessage({\n content: messages[0].text,\n additional_kwargs: additionalKwargs,\n usage_metadata: usageMetadata,\n response_metadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n } else {\n const toolCalls = extractToolCalls(messages);\n const generations: ChatGeneration[] = [\n {\n text: \"\",\n message: new AIMessage({\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: messages as any,\n additional_kwargs: additionalKwargs,\n tool_calls: toolCalls,\n usage_metadata: usageMetadata,\n response_metadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n return generations;\n }\n}\n\nexport function buildUsageMetadata(\n usage:\n | Anthropic.Messages.Usage\n | Anthropic.Messages.MessageDeltaUsage\n | Anthropic.Beta.Messages.BetaMessageDeltaUsage\n | Record<string, number>\n): UsageMetadata {\n const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;\n const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;\n // Total input tokens in a Claude API request is the summation of `input_tokens`, `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n // ref: https://platform.claude.com/docs/en/api/messages\n const totalInputTokens =\n (usage.input_tokens ?? 0) + cacheCreationInputTokens + cacheReadInputTokens;\n return {\n input_tokens: totalInputTokens,\n output_tokens: usage.output_tokens,\n total_tokens: totalInputTokens + usage.output_tokens,\n input_token_details: {\n cache_creation: cacheCreationInputTokens,\n cache_read: cacheReadInputTokens,\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/utils/params.cjs
CHANGED
|
@@ -8,7 +8,10 @@ const ADAPTIVE_ONLY_MODEL_PREFIXES = [
|
|
|
8
8
|
"claude-mythos-5",
|
|
9
9
|
"claude-mythos-preview"
|
|
10
10
|
];
|
|
11
|
-
const FABLE_MODEL_PREFIXES = ["claude-fable-5"];
|
|
11
|
+
const FABLE_MODEL_PREFIXES = ["claude-fable-5", "claude-mythos-5-2"];
|
|
12
|
+
function hasAlwaysOnThinking(model) {
|
|
13
|
+
return modelStartsWithAnyPrefix(model, FABLE_MODEL_PREFIXES);
|
|
14
|
+
}
|
|
12
15
|
function modelStartsWithAnyPrefix(model, prefixes) {
|
|
13
16
|
return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;
|
|
14
17
|
}
|
|
@@ -56,6 +59,7 @@ function getSamplingParams(fields) {
|
|
|
56
59
|
}
|
|
57
60
|
exports.getSamplingParams = getSamplingParams;
|
|
58
61
|
exports.getTaskBudgetBetas = getTaskBudgetBetas;
|
|
62
|
+
exports.hasAlwaysOnThinking = hasAlwaysOnThinking;
|
|
59
63
|
exports.isAdaptiveOnlyModel = isAdaptiveOnlyModel;
|
|
60
64
|
exports.isOpus47Model = isOpus47Model;
|
|
61
65
|
exports.validateInvocationParamCompatibility = validateInvocationParamCompatibility;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.cjs","names":[],"sources":["../../src/utils/params.ts"],"sourcesContent":["import { AnthropicBeta } from \"@anthropic-ai/sdk/resources\";\n\nimport {\n AnthropicInvocationParams,\n AnthropicOutputConfig,\n AnthropicThinkingConfigParam,\n} from \"../types.js\";\n\ntype InvocationCompatibilityFields = {\n model?: string;\n thinking: AnthropicThinkingConfigParam;\n thinkingExplicitlySet?: boolean;\n outputConfig?: AnthropicOutputConfig;\n topK?: number;\n topP?: number;\n temperature?: number;\n};\n\nconst ADAPTIVE_ONLY_MODEL_PREFIXES = [\n \"claude-opus-4-7\",\n \"claude-opus-4-8\",\n \"claude-opus-5\",\n \"claude-sonnet-5\",\n \"claude-fable-5\",\n \"claude-mythos-5\",\n \"claude-mythos-preview\",\n] as const;\n\nconst FABLE_MODEL_PREFIXES = [\"claude-fable-5\"] as const;\n\nfunction modelStartsWithAnyPrefix(\n model: string | undefined,\n prefixes: readonly string[]\n): boolean {\n return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;\n}\n\nfunction isThinkingEnabled(thinking: AnthropicThinkingConfigParam): boolean {\n return thinking.type === \"enabled\" || thinking.type === \"adaptive\";\n}\n\nexport function isOpus47Model(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, [\"claude-opus-4-7\"]);\n}\n\nexport function isAdaptiveOnlyModel(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, ADAPTIVE_ONLY_MODEL_PREFIXES);\n}\n\nexport function getTaskBudgetBetas(\n model?: string,\n outputConfig?: AnthropicOutputConfig\n): AnthropicBeta[] {\n const hasTaskBudget =\n outputConfig &&\n typeof outputConfig === \"object\" &&\n \"task_budget\" in outputConfig &&\n outputConfig.task_budget != null;\n\n return isOpus47Model(model) && hasTaskBudget\n ? ([\"task-budgets-2026-03-13\"] as AnthropicBeta[])\n : [];\n}\n\nexport function validateInvocationParamCompatibility(\n fields: InvocationCompatibilityFields\n): void {\n const {\n model,\n thinking,\n thinkingExplicitlySet,\n outputConfig,\n topK,\n topP,\n temperature,\n } = fields;\n const adaptiveOnlyModel = isAdaptiveOnlyModel(model);\n const fableModel = modelStartsWithAnyPrefix(model, FABLE_MODEL_PREFIXES);\n const modelName = model ?? \"this model\";\n\n if (fableModel && thinkingExplicitlySet && thinking.type === \"disabled\") {\n throw new Error(\n `thinking.type=\"disabled\" is not supported for ${modelName}; omit thinking to use adaptive thinking instead`\n );\n }\n if (adaptiveOnlyModel && thinking.type === \"enabled\") {\n throw new Error(\n `thinking.type=\"enabled\" is not supported for ${modelName}; use thinking.type=\"adaptive\" instead`\n );\n }\n if (\n adaptiveOnlyModel &&\n typeof thinking === \"object\" &&\n thinking != null &&\n \"budget_tokens\" in thinking\n ) {\n throw new Error(\n `thinking.budget_tokens is not supported for ${modelName}; use outputConfig.effort instead`\n );\n }\n if (\n modelStartsWithAnyPrefix(model, [\"claude-opus-5\"]) &&\n thinking.type === \"disabled\" &&\n (outputConfig?.effort === \"xhigh\" || outputConfig?.effort === \"max\")\n ) {\n throw new Error(\n `thinking.type=\"disabled\" is not supported for ${modelName} with outputConfig.effort=\"${outputConfig.effort}\"; use thinking.type=\"adaptive\" or omit thinking instead`\n );\n }\n if (adaptiveOnlyModel) {\n if (topK !== undefined) {\n throw new Error(\n `topK is not supported for ${modelName}; omit topK/topP/temperature or use model prompting instead`\n );\n }\n if (topP !== undefined && topP !== 1) {\n throw new Error(\n `topP is not supported for ${modelName} when set to non-default values`\n );\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\n `temperature is not supported for ${modelName} when set to non-default values`\n );\n }\n }\n\n if (!fableModel && isThinkingEnabled(thinking)) {\n if (topK !== undefined) {\n throw new Error(\"topK is not supported when thinking is enabled\");\n }\n if (topP !== undefined) {\n throw new Error(\"topP is not supported when thinking is enabled\");\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\"temperature is not supported when thinking is enabled\");\n }\n }\n}\n\nexport function getSamplingParams(\n fields: InvocationCompatibilityFields\n): Pick<AnthropicInvocationParams, \"temperature\" | \"top_k\" | \"top_p\"> {\n const { model, thinking, topK, topP, temperature } = fields;\n const output: Pick<\n AnthropicInvocationParams,\n \"temperature\" | \"top_k\" | \"top_p\"\n > = {};\n\n if (isThinkingEnabled(thinking) || isAdaptiveOnlyModel(model)) {\n return output;\n }\n\n if (temperature !== undefined) {\n output.temperature = temperature;\n }\n if (topK !== undefined) {\n output.top_k = topK;\n }\n if (topP !== undefined) {\n output.top_p = topP;\n }\n\n return output;\n}\n"],"mappings":";AAkBA,MAAM,+BAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,uBAAuB,CAAC,
|
|
1
|
+
{"version":3,"file":"params.cjs","names":[],"sources":["../../src/utils/params.ts"],"sourcesContent":["import { AnthropicBeta } from \"@anthropic-ai/sdk/resources\";\n\nimport {\n AnthropicInvocationParams,\n AnthropicOutputConfig,\n AnthropicThinkingConfigParam,\n} from \"../types.js\";\n\ntype InvocationCompatibilityFields = {\n model?: string;\n thinking: AnthropicThinkingConfigParam;\n thinkingExplicitlySet?: boolean;\n outputConfig?: AnthropicOutputConfig;\n topK?: number;\n topP?: number;\n temperature?: number;\n};\n\nconst ADAPTIVE_ONLY_MODEL_PREFIXES = [\n \"claude-opus-4-7\",\n \"claude-opus-4-8\",\n \"claude-opus-5\",\n \"claude-sonnet-5\",\n \"claude-fable-5\",\n \"claude-mythos-5\",\n \"claude-mythos-preview\",\n] as const;\n\nconst FABLE_MODEL_PREFIXES = [\"claude-fable-5\", \"claude-mythos-5-2\"] as const;\n\nexport function hasAlwaysOnThinking(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, FABLE_MODEL_PREFIXES);\n}\n\nfunction modelStartsWithAnyPrefix(\n model: string | undefined,\n prefixes: readonly string[]\n): boolean {\n return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;\n}\n\nfunction isThinkingEnabled(thinking: AnthropicThinkingConfigParam): boolean {\n return thinking.type === \"enabled\" || thinking.type === \"adaptive\";\n}\n\nexport function isOpus47Model(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, [\"claude-opus-4-7\"]);\n}\n\nexport function isAdaptiveOnlyModel(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, ADAPTIVE_ONLY_MODEL_PREFIXES);\n}\n\nexport function getTaskBudgetBetas(\n model?: string,\n outputConfig?: AnthropicOutputConfig\n): AnthropicBeta[] {\n const hasTaskBudget =\n outputConfig &&\n typeof outputConfig === \"object\" &&\n \"task_budget\" in outputConfig &&\n outputConfig.task_budget != null;\n\n return isOpus47Model(model) && hasTaskBudget\n ? ([\"task-budgets-2026-03-13\"] as AnthropicBeta[])\n : [];\n}\n\nexport function validateInvocationParamCompatibility(\n fields: InvocationCompatibilityFields\n): void {\n const {\n model,\n thinking,\n thinkingExplicitlySet,\n outputConfig,\n topK,\n topP,\n temperature,\n } = fields;\n const adaptiveOnlyModel = isAdaptiveOnlyModel(model);\n const fableModel = modelStartsWithAnyPrefix(model, FABLE_MODEL_PREFIXES);\n const modelName = model ?? \"this model\";\n\n if (fableModel && thinkingExplicitlySet && thinking.type === \"disabled\") {\n throw new Error(\n `thinking.type=\"disabled\" is not supported for ${modelName}; omit thinking to use adaptive thinking instead`\n );\n }\n if (adaptiveOnlyModel && thinking.type === \"enabled\") {\n throw new Error(\n `thinking.type=\"enabled\" is not supported for ${modelName}; use thinking.type=\"adaptive\" instead`\n );\n }\n if (\n adaptiveOnlyModel &&\n typeof thinking === \"object\" &&\n thinking != null &&\n \"budget_tokens\" in thinking\n ) {\n throw new Error(\n `thinking.budget_tokens is not supported for ${modelName}; use outputConfig.effort instead`\n );\n }\n if (\n modelStartsWithAnyPrefix(model, [\"claude-opus-5\"]) &&\n thinking.type === \"disabled\" &&\n (outputConfig?.effort === \"xhigh\" || outputConfig?.effort === \"max\")\n ) {\n throw new Error(\n `thinking.type=\"disabled\" is not supported for ${modelName} with outputConfig.effort=\"${outputConfig.effort}\"; use thinking.type=\"adaptive\" or omit thinking instead`\n );\n }\n if (adaptiveOnlyModel) {\n if (topK !== undefined) {\n throw new Error(\n `topK is not supported for ${modelName}; omit topK/topP/temperature or use model prompting instead`\n );\n }\n if (topP !== undefined && topP !== 1) {\n throw new Error(\n `topP is not supported for ${modelName} when set to non-default values`\n );\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\n `temperature is not supported for ${modelName} when set to non-default values`\n );\n }\n }\n\n if (!fableModel && isThinkingEnabled(thinking)) {\n if (topK !== undefined) {\n throw new Error(\"topK is not supported when thinking is enabled\");\n }\n if (topP !== undefined) {\n throw new Error(\"topP is not supported when thinking is enabled\");\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\"temperature is not supported when thinking is enabled\");\n }\n }\n}\n\nexport function getSamplingParams(\n fields: InvocationCompatibilityFields\n): Pick<AnthropicInvocationParams, \"temperature\" | \"top_k\" | \"top_p\"> {\n const { model, thinking, topK, topP, temperature } = fields;\n const output: Pick<\n AnthropicInvocationParams,\n \"temperature\" | \"top_k\" | \"top_p\"\n > = {};\n\n if (isThinkingEnabled(thinking) || isAdaptiveOnlyModel(model)) {\n return output;\n }\n\n if (temperature !== undefined) {\n output.temperature = temperature;\n }\n if (topK !== undefined) {\n output.top_k = topK;\n }\n if (topP !== undefined) {\n output.top_p = topP;\n }\n\n return output;\n}\n"],"mappings":";AAkBA,MAAM,+BAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,uBAAuB,CAAC,kBAAkB,mBAAmB;AAEnE,SAAgB,oBAAoB,OAAyB;CAC3D,OAAO,yBAAyB,OAAO,oBAAoB;AAC7D;AAEA,SAAS,yBACP,OACA,UACS;CACT,OAAO,QAAQ,SAAS,MAAM,WAAW,MAAM,WAAW,MAAM,CAAC,IAAI;AACvE;AAEA,SAAS,kBAAkB,UAAiD;CAC1E,OAAO,SAAS,SAAS,aAAa,SAAS,SAAS;AAC1D;AAEA,SAAgB,cAAc,OAAyB;CACrD,OAAO,yBAAyB,OAAO,CAAC,iBAAiB,CAAC;AAC5D;AAEA,SAAgB,oBAAoB,OAAyB;CAC3D,OAAO,yBAAyB,OAAO,4BAA4B;AACrE;AAEA,SAAgB,mBACd,OACA,cACiB;CACjB,MAAM,gBACJ,gBACA,OAAO,iBAAiB,YACxB,iBAAiB,gBACjB,aAAa,eAAe;CAE9B,OAAO,cAAc,KAAK,KAAK,gBAC1B,CAAC,yBAAyB,IAC3B,CAAC;AACP;AAEA,SAAgB,qCACd,QACM;CACN,MAAM,EACJ,OACA,UACA,uBACA,cACA,MACA,MACA,gBACE;CACJ,MAAM,oBAAoB,oBAAoB,KAAK;CACnD,MAAM,aAAa,yBAAyB,OAAO,oBAAoB;CACvE,MAAM,YAAY,SAAS;CAE3B,IAAI,cAAc,yBAAyB,SAAS,SAAS,YAC3D,MAAM,IAAI,MACR,iDAAiD,UAAU,iDAC7D;CAEF,IAAI,qBAAqB,SAAS,SAAS,WACzC,MAAM,IAAI,MACR,gDAAgD,UAAU,uCAC5D;CAEF,IACE,qBACA,OAAO,aAAa,YACpB,YAAY,QACZ,mBAAmB,UAEnB,MAAM,IAAI,MACR,+CAA+C,UAAU,kCAC3D;CAEF,IACE,yBAAyB,OAAO,CAAC,eAAe,CAAC,KACjD,SAAS,SAAS,eACjB,cAAc,WAAW,WAAW,cAAc,WAAW,QAE9D,MAAM,IAAI,MACR,iDAAiD,UAAU,6BAA6B,aAAa,OAAO,yDAC9G;CAEF,IAAI,mBAAmB;EACrB,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MACR,6BAA6B,UAAU,4DACzC;EAEF,IAAI,SAAS,KAAA,KAAa,SAAS,GACjC,MAAM,IAAI,MACR,6BAA6B,UAAU,gCACzC;EAEF,IAAI,gBAAgB,KAAA,KAAa,gBAAgB,GAC/C,MAAM,IAAI,MACR,oCAAoC,UAAU,gCAChD;CAEJ;CAEA,IAAI,CAAC,cAAc,kBAAkB,QAAQ,GAAG;EAC9C,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MAAM,gDAAgD;EAElE,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MAAM,gDAAgD;EAElE,IAAI,gBAAgB,KAAA,KAAa,gBAAgB,GAC/C,MAAM,IAAI,MAAM,uDAAuD;CAE3E;AACF;AAEA,SAAgB,kBACd,QACoE;CACpE,MAAM,EAAE,OAAO,UAAU,MAAM,MAAM,gBAAgB;CACrD,MAAM,SAGF,CAAC;CAEL,IAAI,kBAAkB,QAAQ,KAAK,oBAAoB,KAAK,GAC1D,OAAO;CAGT,IAAI,gBAAgB,KAAA,GAClB,OAAO,cAAc;CAEvB,IAAI,SAAS,KAAA,GACX,OAAO,QAAQ;CAEjB,IAAI,SAAS,KAAA,GACX,OAAO,QAAQ;CAGjB,OAAO;AACT"}
|
package/dist/utils/params.js
CHANGED
|
@@ -8,7 +8,10 @@ const ADAPTIVE_ONLY_MODEL_PREFIXES = [
|
|
|
8
8
|
"claude-mythos-5",
|
|
9
9
|
"claude-mythos-preview"
|
|
10
10
|
];
|
|
11
|
-
const FABLE_MODEL_PREFIXES = ["claude-fable-5"];
|
|
11
|
+
const FABLE_MODEL_PREFIXES = ["claude-fable-5", "claude-mythos-5-2"];
|
|
12
|
+
function hasAlwaysOnThinking(model) {
|
|
13
|
+
return modelStartsWithAnyPrefix(model, FABLE_MODEL_PREFIXES);
|
|
14
|
+
}
|
|
12
15
|
function modelStartsWithAnyPrefix(model, prefixes) {
|
|
13
16
|
return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;
|
|
14
17
|
}
|
|
@@ -54,6 +57,6 @@ function getSamplingParams(fields) {
|
|
|
54
57
|
if (topP !== void 0) output.top_p = topP;
|
|
55
58
|
return output;
|
|
56
59
|
}
|
|
57
|
-
export { getSamplingParams, getTaskBudgetBetas, isAdaptiveOnlyModel, isOpus47Model, validateInvocationParamCompatibility };
|
|
60
|
+
export { getSamplingParams, getTaskBudgetBetas, hasAlwaysOnThinking, isAdaptiveOnlyModel, isOpus47Model, validateInvocationParamCompatibility };
|
|
58
61
|
|
|
59
62
|
//# sourceMappingURL=params.js.map
|
package/dist/utils/params.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.js","names":[],"sources":["../../src/utils/params.ts"],"sourcesContent":["import { AnthropicBeta } from \"@anthropic-ai/sdk/resources\";\n\nimport {\n AnthropicInvocationParams,\n AnthropicOutputConfig,\n AnthropicThinkingConfigParam,\n} from \"../types.js\";\n\ntype InvocationCompatibilityFields = {\n model?: string;\n thinking: AnthropicThinkingConfigParam;\n thinkingExplicitlySet?: boolean;\n outputConfig?: AnthropicOutputConfig;\n topK?: number;\n topP?: number;\n temperature?: number;\n};\n\nconst ADAPTIVE_ONLY_MODEL_PREFIXES = [\n \"claude-opus-4-7\",\n \"claude-opus-4-8\",\n \"claude-opus-5\",\n \"claude-sonnet-5\",\n \"claude-fable-5\",\n \"claude-mythos-5\",\n \"claude-mythos-preview\",\n] as const;\n\nconst FABLE_MODEL_PREFIXES = [\"claude-fable-5\"] as const;\n\nfunction modelStartsWithAnyPrefix(\n model: string | undefined,\n prefixes: readonly string[]\n): boolean {\n return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;\n}\n\nfunction isThinkingEnabled(thinking: AnthropicThinkingConfigParam): boolean {\n return thinking.type === \"enabled\" || thinking.type === \"adaptive\";\n}\n\nexport function isOpus47Model(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, [\"claude-opus-4-7\"]);\n}\n\nexport function isAdaptiveOnlyModel(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, ADAPTIVE_ONLY_MODEL_PREFIXES);\n}\n\nexport function getTaskBudgetBetas(\n model?: string,\n outputConfig?: AnthropicOutputConfig\n): AnthropicBeta[] {\n const hasTaskBudget =\n outputConfig &&\n typeof outputConfig === \"object\" &&\n \"task_budget\" in outputConfig &&\n outputConfig.task_budget != null;\n\n return isOpus47Model(model) && hasTaskBudget\n ? ([\"task-budgets-2026-03-13\"] as AnthropicBeta[])\n : [];\n}\n\nexport function validateInvocationParamCompatibility(\n fields: InvocationCompatibilityFields\n): void {\n const {\n model,\n thinking,\n thinkingExplicitlySet,\n outputConfig,\n topK,\n topP,\n temperature,\n } = fields;\n const adaptiveOnlyModel = isAdaptiveOnlyModel(model);\n const fableModel = modelStartsWithAnyPrefix(model, FABLE_MODEL_PREFIXES);\n const modelName = model ?? \"this model\";\n\n if (fableModel && thinkingExplicitlySet && thinking.type === \"disabled\") {\n throw new Error(\n `thinking.type=\"disabled\" is not supported for ${modelName}; omit thinking to use adaptive thinking instead`\n );\n }\n if (adaptiveOnlyModel && thinking.type === \"enabled\") {\n throw new Error(\n `thinking.type=\"enabled\" is not supported for ${modelName}; use thinking.type=\"adaptive\" instead`\n );\n }\n if (\n adaptiveOnlyModel &&\n typeof thinking === \"object\" &&\n thinking != null &&\n \"budget_tokens\" in thinking\n ) {\n throw new Error(\n `thinking.budget_tokens is not supported for ${modelName}; use outputConfig.effort instead`\n );\n }\n if (\n modelStartsWithAnyPrefix(model, [\"claude-opus-5\"]) &&\n thinking.type === \"disabled\" &&\n (outputConfig?.effort === \"xhigh\" || outputConfig?.effort === \"max\")\n ) {\n throw new Error(\n `thinking.type=\"disabled\" is not supported for ${modelName} with outputConfig.effort=\"${outputConfig.effort}\"; use thinking.type=\"adaptive\" or omit thinking instead`\n );\n }\n if (adaptiveOnlyModel) {\n if (topK !== undefined) {\n throw new Error(\n `topK is not supported for ${modelName}; omit topK/topP/temperature or use model prompting instead`\n );\n }\n if (topP !== undefined && topP !== 1) {\n throw new Error(\n `topP is not supported for ${modelName} when set to non-default values`\n );\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\n `temperature is not supported for ${modelName} when set to non-default values`\n );\n }\n }\n\n if (!fableModel && isThinkingEnabled(thinking)) {\n if (topK !== undefined) {\n throw new Error(\"topK is not supported when thinking is enabled\");\n }\n if (topP !== undefined) {\n throw new Error(\"topP is not supported when thinking is enabled\");\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\"temperature is not supported when thinking is enabled\");\n }\n }\n}\n\nexport function getSamplingParams(\n fields: InvocationCompatibilityFields\n): Pick<AnthropicInvocationParams, \"temperature\" | \"top_k\" | \"top_p\"> {\n const { model, thinking, topK, topP, temperature } = fields;\n const output: Pick<\n AnthropicInvocationParams,\n \"temperature\" | \"top_k\" | \"top_p\"\n > = {};\n\n if (isThinkingEnabled(thinking) || isAdaptiveOnlyModel(model)) {\n return output;\n }\n\n if (temperature !== undefined) {\n output.temperature = temperature;\n }\n if (topK !== undefined) {\n output.top_k = topK;\n }\n if (topP !== undefined) {\n output.top_p = topP;\n }\n\n return output;\n}\n"],"mappings":";AAkBA,MAAM,+BAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,uBAAuB,CAAC,
|
|
1
|
+
{"version":3,"file":"params.js","names":[],"sources":["../../src/utils/params.ts"],"sourcesContent":["import { AnthropicBeta } from \"@anthropic-ai/sdk/resources\";\n\nimport {\n AnthropicInvocationParams,\n AnthropicOutputConfig,\n AnthropicThinkingConfigParam,\n} from \"../types.js\";\n\ntype InvocationCompatibilityFields = {\n model?: string;\n thinking: AnthropicThinkingConfigParam;\n thinkingExplicitlySet?: boolean;\n outputConfig?: AnthropicOutputConfig;\n topK?: number;\n topP?: number;\n temperature?: number;\n};\n\nconst ADAPTIVE_ONLY_MODEL_PREFIXES = [\n \"claude-opus-4-7\",\n \"claude-opus-4-8\",\n \"claude-opus-5\",\n \"claude-sonnet-5\",\n \"claude-fable-5\",\n \"claude-mythos-5\",\n \"claude-mythos-preview\",\n] as const;\n\nconst FABLE_MODEL_PREFIXES = [\"claude-fable-5\", \"claude-mythos-5-2\"] as const;\n\nexport function hasAlwaysOnThinking(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, FABLE_MODEL_PREFIXES);\n}\n\nfunction modelStartsWithAnyPrefix(\n model: string | undefined,\n prefixes: readonly string[]\n): boolean {\n return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;\n}\n\nfunction isThinkingEnabled(thinking: AnthropicThinkingConfigParam): boolean {\n return thinking.type === \"enabled\" || thinking.type === \"adaptive\";\n}\n\nexport function isOpus47Model(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, [\"claude-opus-4-7\"]);\n}\n\nexport function isAdaptiveOnlyModel(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, ADAPTIVE_ONLY_MODEL_PREFIXES);\n}\n\nexport function getTaskBudgetBetas(\n model?: string,\n outputConfig?: AnthropicOutputConfig\n): AnthropicBeta[] {\n const hasTaskBudget =\n outputConfig &&\n typeof outputConfig === \"object\" &&\n \"task_budget\" in outputConfig &&\n outputConfig.task_budget != null;\n\n return isOpus47Model(model) && hasTaskBudget\n ? ([\"task-budgets-2026-03-13\"] as AnthropicBeta[])\n : [];\n}\n\nexport function validateInvocationParamCompatibility(\n fields: InvocationCompatibilityFields\n): void {\n const {\n model,\n thinking,\n thinkingExplicitlySet,\n outputConfig,\n topK,\n topP,\n temperature,\n } = fields;\n const adaptiveOnlyModel = isAdaptiveOnlyModel(model);\n const fableModel = modelStartsWithAnyPrefix(model, FABLE_MODEL_PREFIXES);\n const modelName = model ?? \"this model\";\n\n if (fableModel && thinkingExplicitlySet && thinking.type === \"disabled\") {\n throw new Error(\n `thinking.type=\"disabled\" is not supported for ${modelName}; omit thinking to use adaptive thinking instead`\n );\n }\n if (adaptiveOnlyModel && thinking.type === \"enabled\") {\n throw new Error(\n `thinking.type=\"enabled\" is not supported for ${modelName}; use thinking.type=\"adaptive\" instead`\n );\n }\n if (\n adaptiveOnlyModel &&\n typeof thinking === \"object\" &&\n thinking != null &&\n \"budget_tokens\" in thinking\n ) {\n throw new Error(\n `thinking.budget_tokens is not supported for ${modelName}; use outputConfig.effort instead`\n );\n }\n if (\n modelStartsWithAnyPrefix(model, [\"claude-opus-5\"]) &&\n thinking.type === \"disabled\" &&\n (outputConfig?.effort === \"xhigh\" || outputConfig?.effort === \"max\")\n ) {\n throw new Error(\n `thinking.type=\"disabled\" is not supported for ${modelName} with outputConfig.effort=\"${outputConfig.effort}\"; use thinking.type=\"adaptive\" or omit thinking instead`\n );\n }\n if (adaptiveOnlyModel) {\n if (topK !== undefined) {\n throw new Error(\n `topK is not supported for ${modelName}; omit topK/topP/temperature or use model prompting instead`\n );\n }\n if (topP !== undefined && topP !== 1) {\n throw new Error(\n `topP is not supported for ${modelName} when set to non-default values`\n );\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\n `temperature is not supported for ${modelName} when set to non-default values`\n );\n }\n }\n\n if (!fableModel && isThinkingEnabled(thinking)) {\n if (topK !== undefined) {\n throw new Error(\"topK is not supported when thinking is enabled\");\n }\n if (topP !== undefined) {\n throw new Error(\"topP is not supported when thinking is enabled\");\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\"temperature is not supported when thinking is enabled\");\n }\n }\n}\n\nexport function getSamplingParams(\n fields: InvocationCompatibilityFields\n): Pick<AnthropicInvocationParams, \"temperature\" | \"top_k\" | \"top_p\"> {\n const { model, thinking, topK, topP, temperature } = fields;\n const output: Pick<\n AnthropicInvocationParams,\n \"temperature\" | \"top_k\" | \"top_p\"\n > = {};\n\n if (isThinkingEnabled(thinking) || isAdaptiveOnlyModel(model)) {\n return output;\n }\n\n if (temperature !== undefined) {\n output.temperature = temperature;\n }\n if (topK !== undefined) {\n output.top_k = topK;\n }\n if (topP !== undefined) {\n output.top_p = topP;\n }\n\n return output;\n}\n"],"mappings":";AAkBA,MAAM,+BAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,uBAAuB,CAAC,kBAAkB,mBAAmB;AAEnE,SAAgB,oBAAoB,OAAyB;CAC3D,OAAO,yBAAyB,OAAO,oBAAoB;AAC7D;AAEA,SAAS,yBACP,OACA,UACS;CACT,OAAO,QAAQ,SAAS,MAAM,WAAW,MAAM,WAAW,MAAM,CAAC,IAAI;AACvE;AAEA,SAAS,kBAAkB,UAAiD;CAC1E,OAAO,SAAS,SAAS,aAAa,SAAS,SAAS;AAC1D;AAEA,SAAgB,cAAc,OAAyB;CACrD,OAAO,yBAAyB,OAAO,CAAC,iBAAiB,CAAC;AAC5D;AAEA,SAAgB,oBAAoB,OAAyB;CAC3D,OAAO,yBAAyB,OAAO,4BAA4B;AACrE;AAEA,SAAgB,mBACd,OACA,cACiB;CACjB,MAAM,gBACJ,gBACA,OAAO,iBAAiB,YACxB,iBAAiB,gBACjB,aAAa,eAAe;CAE9B,OAAO,cAAc,KAAK,KAAK,gBAC1B,CAAC,yBAAyB,IAC3B,CAAC;AACP;AAEA,SAAgB,qCACd,QACM;CACN,MAAM,EACJ,OACA,UACA,uBACA,cACA,MACA,MACA,gBACE;CACJ,MAAM,oBAAoB,oBAAoB,KAAK;CACnD,MAAM,aAAa,yBAAyB,OAAO,oBAAoB;CACvE,MAAM,YAAY,SAAS;CAE3B,IAAI,cAAc,yBAAyB,SAAS,SAAS,YAC3D,MAAM,IAAI,MACR,iDAAiD,UAAU,iDAC7D;CAEF,IAAI,qBAAqB,SAAS,SAAS,WACzC,MAAM,IAAI,MACR,gDAAgD,UAAU,uCAC5D;CAEF,IACE,qBACA,OAAO,aAAa,YACpB,YAAY,QACZ,mBAAmB,UAEnB,MAAM,IAAI,MACR,+CAA+C,UAAU,kCAC3D;CAEF,IACE,yBAAyB,OAAO,CAAC,eAAe,CAAC,KACjD,SAAS,SAAS,eACjB,cAAc,WAAW,WAAW,cAAc,WAAW,QAE9D,MAAM,IAAI,MACR,iDAAiD,UAAU,6BAA6B,aAAa,OAAO,yDAC9G;CAEF,IAAI,mBAAmB;EACrB,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MACR,6BAA6B,UAAU,4DACzC;EAEF,IAAI,SAAS,KAAA,KAAa,SAAS,GACjC,MAAM,IAAI,MACR,6BAA6B,UAAU,gCACzC;EAEF,IAAI,gBAAgB,KAAA,KAAa,gBAAgB,GAC/C,MAAM,IAAI,MACR,oCAAoC,UAAU,gCAChD;CAEJ;CAEA,IAAI,CAAC,cAAc,kBAAkB,QAAQ,GAAG;EAC9C,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MAAM,gDAAgD;EAElE,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MAAM,gDAAgD;EAElE,IAAI,gBAAgB,KAAA,KAAa,gBAAgB,GAC/C,MAAM,IAAI,MAAM,uDAAuD;CAE3E;AACF;AAEA,SAAgB,kBACd,QACoE;CACpE,MAAM,EAAE,OAAO,UAAU,MAAM,MAAM,gBAAgB;CACrD,MAAM,SAGF,CAAC;CAEL,IAAI,kBAAkB,QAAQ,KAAK,oBAAoB,KAAK,GAC1D,OAAO;CAGT,IAAI,gBAAgB,KAAA,GAClB,OAAO,cAAc;CAEvB,IAAI,SAAS,KAAA,GACX,OAAO,QAAQ;CAEjB,IAAI,SAAS,KAAA,GACX,OAAO,QAAQ;CAGjB,OAAO;AACT"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const require_message_outputs = require("./message_outputs.cjs");
|
|
1
2
|
// src/utils/stream_events.ts
|
|
2
3
|
/**
|
|
3
4
|
* Convert an async iterable of raw Anthropic stream events into
|
|
@@ -6,13 +7,15 @@
|
|
|
6
7
|
async function* convertAnthropicStream(source, options = {}) {
|
|
7
8
|
const shouldStreamUsage = options.streamUsage ?? true;
|
|
8
9
|
const blockAccumulators = /* @__PURE__ */ new Map();
|
|
10
|
+
let startUsage;
|
|
9
11
|
let usageSnapshot;
|
|
10
12
|
let responseMetadata = {};
|
|
11
13
|
let stopReason = null;
|
|
12
14
|
for await (const data of source) switch (data.type) {
|
|
13
15
|
case "message_start": {
|
|
14
16
|
const { usage, id, model } = data.message;
|
|
15
|
-
|
|
17
|
+
startUsage = usage;
|
|
18
|
+
if (usage && shouldStreamUsage) usageSnapshot = require_message_outputs.buildUsageMetadata(usage);
|
|
16
19
|
yield {
|
|
17
20
|
event: "message-start",
|
|
18
21
|
id,
|
|
@@ -33,16 +36,7 @@ async function* convertAnthropicStream(source, options = {}) {
|
|
|
33
36
|
stopReason = data.delta.stop_reason;
|
|
34
37
|
if ("usage" in data && "cost" in data.usage && typeof data.usage.cost === "number") responseMetadata = { usage: { cost: data.usage.cost } };
|
|
35
38
|
if (shouldStreamUsage && data.usage) {
|
|
36
|
-
|
|
37
|
-
input_tokens: 0,
|
|
38
|
-
output_tokens: data.usage.output_tokens,
|
|
39
|
-
total_tokens: data.usage.output_tokens
|
|
40
|
-
};
|
|
41
|
-
else usageSnapshot = {
|
|
42
|
-
...usageSnapshot,
|
|
43
|
-
output_tokens: usageSnapshot.output_tokens + data.usage.output_tokens,
|
|
44
|
-
total_tokens: usageSnapshot.input_tokens + usageSnapshot.output_tokens + data.usage.output_tokens
|
|
45
|
-
};
|
|
39
|
+
usageSnapshot = require_message_outputs.buildUsageMetadata(require_message_outputs._mergeStreamUsage(startUsage, data.usage));
|
|
46
40
|
yield {
|
|
47
41
|
event: "usage",
|
|
48
42
|
usage: usageSnapshot
|
|
@@ -117,20 +111,6 @@ function mapStopReason(stopReason) {
|
|
|
117
111
|
default: return "stop";
|
|
118
112
|
}
|
|
119
113
|
}
|
|
120
|
-
function buildUsageSnapshot(usage) {
|
|
121
|
-
const cacheCreation = usage.cache_creation_input_tokens ?? 0;
|
|
122
|
-
const cacheRead = usage.cache_read_input_tokens ?? 0;
|
|
123
|
-
const totalInput = usage.input_tokens + cacheCreation + cacheRead;
|
|
124
|
-
return {
|
|
125
|
-
input_tokens: totalInput,
|
|
126
|
-
output_tokens: usage.output_tokens,
|
|
127
|
-
total_tokens: totalInput + usage.output_tokens,
|
|
128
|
-
input_token_details: {
|
|
129
|
-
cache_creation: cacheCreation,
|
|
130
|
-
cache_read: cacheRead
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
114
|
function mapBlockToContentBlock(block, index) {
|
|
135
115
|
switch (block.type) {
|
|
136
116
|
case "text": return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream_events.cjs","names":[],"sources":["../../src/utils/stream_events.ts"],"sourcesContent":["/**\n * Converts a raw Anthropic SSE event stream into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ChatModelStreamEvent,\n ContentBlockDelta,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport type { AnthropicMessageStreamEvent } from \"../types.js\";\n\n// ─── Public API ─────────────────────────────────────────────────\n\nexport interface ConvertAnthropicStreamOptions {\n streamUsage?: boolean;\n}\n\n/**\n * Convert an async iterable of raw Anthropic stream events into\n * LangChain `ChatModelStreamEvent`s with typed deltas.\n */\nexport async function* convertAnthropicStream(\n source: AsyncIterable<AnthropicMessageStreamEvent>,\n options: ConvertAnthropicStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n\n // Track accumulated state per content block (for finalization)\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n let usageSnapshot: UsageMetadata | undefined;\n let responseMetadata: Record<string, unknown> = {};\n let stopReason: string | null = null;\n\n for await (const data of source) {\n switch (data.type) {\n // ── Message lifecycle ──────────────────────────────────\n case \"message_start\": {\n const { usage, id, model } = data.message;\n if (usage && shouldStreamUsage) {\n usageSnapshot = buildUsageSnapshot(usage);\n }\n yield {\n event: \"message-start\" as const,\n id,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n };\n yield {\n event: \"provider\" as const,\n provider: \"anthropic\",\n name: \"message_start\",\n payload: { model, id },\n };\n break;\n }\n\n case \"message_delta\": {\n stopReason = data.delta.stop_reason;\n // Some gateway providers add additional usage values to the final usage object\n if (\n \"usage\" in data &&\n \"cost\" in data.usage &&\n typeof data.usage.cost === \"number\"\n ) {\n responseMetadata = { usage: { cost: data.usage.cost } };\n }\n if (shouldStreamUsage && data.usage) {\n if (!usageSnapshot) {\n usageSnapshot = {\n input_tokens: 0,\n output_tokens: data.usage.output_tokens,\n total_tokens: data.usage.output_tokens,\n };\n } else {\n usageSnapshot = {\n ...usageSnapshot,\n output_tokens:\n usageSnapshot.output_tokens + data.usage.output_tokens,\n total_tokens:\n usageSnapshot.input_tokens +\n usageSnapshot.output_tokens +\n data.usage.output_tokens,\n };\n }\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n if (\n \"context_management\" in data.delta &&\n data.delta.context_management\n ) {\n yield {\n event: \"provider\" as const,\n provider: \"anthropic\",\n name: \"context_management\",\n payload: data.delta.context_management,\n };\n }\n break;\n }\n\n case \"message_stop\": {\n yield {\n event: \"message-finish\" as const,\n reason: mapStopReason(stopReason),\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n metadata: { model_provider: \"anthropic\" },\n responseMetadata,\n };\n break;\n }\n\n // ── Content block lifecycle ───────────────────────────\n case \"content_block_start\": {\n const { index, content_block } = data;\n const mapped = mapBlockToContentBlock(content_block, index);\n blockAccumulators.set(index, { ...mapped });\n yield {\n event: \"content-block-start\" as const,\n index,\n content: mapped,\n };\n break;\n }\n\n case \"content_block_delta\": {\n const { index, delta } = data;\n const acc = blockAccumulators.get(index);\n if (!acc) break;\n\n const { contentDelta, accumulated } = applyAnthropicDelta(acc, delta);\n blockAccumulators.set(index, accumulated);\n\n if (contentDelta) {\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: contentDelta,\n };\n }\n break;\n }\n\n case \"content_block_stop\": {\n const { index } = data;\n const acc = blockAccumulators.get(index);\n if (!acc) break;\n\n const finalized = finalizeBlock(acc);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalized,\n };\n blockAccumulators.delete(index);\n break;\n }\n\n // ── Unhandled → provider passthrough ───────────────────\n default: {\n yield {\n event: \"provider\" as const,\n provider: \"anthropic\",\n name: data.type,\n payload: data,\n };\n break;\n }\n }\n }\n}\n\n// ─── Internal helpers ───────────────────────────────────────────\n\nfunction mapStopReason(stopReason: string | null | undefined): FinishReason {\n switch (stopReason) {\n case \"end_turn\":\n case \"stop_sequence\":\n return \"stop\";\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"length\";\n default:\n return \"stop\";\n }\n}\n\nfunction buildUsageSnapshot(\n usage: Anthropic.Messages.Usage | Record<string, number>\n): UsageMetadata {\n const cacheCreation =\n (usage as Record<string, number>).cache_creation_input_tokens ?? 0;\n const cacheRead =\n (usage as Record<string, number>).cache_read_input_tokens ?? 0;\n const totalInput = usage.input_tokens + cacheCreation + cacheRead;\n return {\n input_tokens: totalInput,\n output_tokens: usage.output_tokens,\n total_tokens: totalInput + usage.output_tokens,\n input_token_details: {\n cache_creation: cacheCreation,\n cache_read: cacheRead,\n },\n };\n}\n\nfunction mapBlockToContentBlock(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n block: any,\n index: number\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n): Record<string, any> {\n switch (block.type) {\n case \"text\":\n return { type: \"text\" as const, text: block.text ?? \"\", index };\n case \"thinking\":\n return {\n type: \"reasoning\" as const,\n reasoning: block.thinking ?? \"\",\n index,\n };\n case \"redacted_thinking\":\n return { type: \"non_standard\" as const, value: { ...block }, index };\n case \"tool_use\":\n return {\n type: \"tool_call_chunk\" as const,\n id: block.id,\n name: block.name,\n args: \"\",\n index,\n };\n case \"server_tool_use\":\n return {\n type: \"server_tool_call_chunk\" as const,\n id: block.id,\n name: block.name,\n args: \"\",\n index,\n };\n default:\n return { type: \"non_standard\" as const, value: { ...block }, index };\n }\n}\n\n/**\n * Map an Anthropic content_block_delta to a content block delta\n * and update the accumulated state. `contentDelta` is undefined when\n * there's nothing new to send.\n */\nfunction applyAnthropicDelta(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n accumulated: Record<string, any>,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n delta: any\n): {\n contentDelta: ContentBlockDelta | undefined;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n accumulated: Record<string, any>;\n} {\n switch (delta.type) {\n case \"text_delta\":\n return {\n contentDelta: { type: \"text-delta\" as const, text: delta.text },\n accumulated: {\n ...accumulated,\n text: (accumulated.text ?? \"\") + delta.text,\n },\n };\n\n case \"thinking_delta\":\n return {\n contentDelta: {\n type: \"reasoning-delta\" as const,\n reasoning: delta.thinking,\n },\n accumulated: {\n ...accumulated,\n reasoning: (accumulated.reasoning ?? \"\") + delta.thinking,\n },\n };\n\n case \"input_json_delta\": {\n // `tool-call-delta` is for tool calls only. Other blocks that stream\n // JSON input, such as `mcp_tool_use`, keep sending `block-delta`.\n if (\n accumulated.type !== \"tool_call_chunk\" &&\n accumulated.type !== \"server_tool_call_chunk\"\n ) {\n const newArgs = (accumulated.args ?? \"\") + delta.partial_json;\n return {\n contentDelta: {\n type: \"block-delta\" as const,\n fields: { type: accumulated.type, args: newArgs },\n },\n accumulated: { ...accumulated, args: newArgs },\n };\n }\n if (!delta.partial_json) {\n return { contentDelta: undefined, accumulated };\n }\n return {\n contentDelta: {\n type: \"tool-call-delta\" as const,\n args: delta.partial_json,\n },\n accumulated: {\n ...accumulated,\n args: (accumulated.args ?? \"\") + delta.partial_json,\n },\n };\n }\n\n case \"citations_delta\": {\n const annotations = [...(accumulated.annotations ?? []), delta.citation];\n return {\n contentDelta: {\n type: \"block-delta\" as const,\n fields: {\n type: accumulated.type,\n annotations,\n },\n },\n accumulated: {\n ...accumulated,\n annotations,\n },\n };\n }\n\n case \"signature_delta\":\n return {\n contentDelta: {\n type: \"block-delta\" as const,\n fields: { type: accumulated.type, signature: delta.signature },\n },\n accumulated: { ...accumulated, signature: delta.signature },\n };\n\n case \"compaction_delta\":\n return {\n contentDelta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"non_standard\",\n value: { ...(accumulated.value ?? {}), compaction: delta },\n },\n },\n accumulated: {\n ...accumulated,\n value: { ...(accumulated.value ?? {}), compaction: delta },\n },\n };\n\n default:\n return {\n contentDelta: {\n type: \"block-delta\" as const,\n fields: { type: accumulated.type, ...delta },\n },\n accumulated,\n };\n }\n}\n\nfunction finalizeBlock(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n accumulated: Record<string, any>\n): ContentBlock {\n if (\n accumulated.type === \"tool_call_chunk\" ||\n accumulated.type === \"server_tool_call_chunk\"\n ) {\n const finalType =\n accumulated.type === \"tool_call_chunk\"\n ? (\"tool_call\" as const)\n : (\"server_tool_call\" as const);\n let parsedArgs: unknown;\n try {\n parsedArgs = JSON.parse(accumulated.args || \"{}\");\n } catch {\n return {\n type: \"invalid_tool_call\" as const,\n id: accumulated.id,\n name: accumulated.name,\n args: accumulated.args,\n error: \"Failed to parse tool call arguments as JSON\",\n } as ContentBlock.Tools.InvalidToolCall;\n }\n return {\n type: finalType,\n id: accumulated.id,\n name: accumulated.name,\n args: parsedArgs,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n }\n\n const { index: _index, ...rest } = accumulated;\n return rest as ContentBlock;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream_events.cjs","names":["buildUsageMetadata","_mergeStreamUsage"],"sources":["../../src/utils/stream_events.ts"],"sourcesContent":["/**\n * Converts a raw Anthropic SSE event stream into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport type {\n ChatModelStreamEvent,\n ContentBlockDelta,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport type { AnthropicMessageStreamEvent } from \"../types.js\";\nimport { _mergeStreamUsage, buildUsageMetadata } from \"./message_outputs.js\";\n\n// ─── Public API ─────────────────────────────────────────────────\n\nexport interface ConvertAnthropicStreamOptions {\n streamUsage?: boolean;\n}\n\n/**\n * Convert an async iterable of raw Anthropic stream events into\n * LangChain `ChatModelStreamEvent`s with typed deltas.\n */\nexport async function* convertAnthropicStream(\n source: AsyncIterable<AnthropicMessageStreamEvent>,\n options: ConvertAnthropicStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n\n // Track accumulated state per content block (for finalization)\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n let startUsage: object | undefined;\n let usageSnapshot: UsageMetadata | undefined;\n let responseMetadata: Record<string, unknown> = {};\n let stopReason: string | null = null;\n\n for await (const data of source) {\n switch (data.type) {\n // ── Message lifecycle ──────────────────────────────────\n case \"message_start\": {\n const { usage, id, model } = data.message;\n startUsage = usage;\n if (usage && shouldStreamUsage) {\n usageSnapshot = buildUsageMetadata(usage);\n }\n yield {\n event: \"message-start\" as const,\n id,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n };\n yield {\n event: \"provider\" as const,\n provider: \"anthropic\",\n name: \"message_start\",\n payload: { model, id },\n };\n break;\n }\n\n case \"message_delta\": {\n stopReason = data.delta.stop_reason;\n // Some gateway providers add additional usage values to the final usage object\n if (\n \"usage\" in data &&\n \"cost\" in data.usage &&\n typeof data.usage.cost === \"number\"\n ) {\n responseMetadata = { usage: { cost: data.usage.cost } };\n }\n if (shouldStreamUsage && data.usage) {\n // Delta usage is cumulative for the whole request, so it replaces\n // the snapshot.\n usageSnapshot = buildUsageMetadata(\n _mergeStreamUsage(startUsage, data.usage)\n );\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n if (\n \"context_management\" in data.delta &&\n data.delta.context_management\n ) {\n yield {\n event: \"provider\" as const,\n provider: \"anthropic\",\n name: \"context_management\",\n payload: data.delta.context_management,\n };\n }\n break;\n }\n\n case \"message_stop\": {\n yield {\n event: \"message-finish\" as const,\n reason: mapStopReason(stopReason),\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n metadata: { model_provider: \"anthropic\" },\n responseMetadata,\n };\n break;\n }\n\n // ── Content block lifecycle ───────────────────────────\n case \"content_block_start\": {\n const { index, content_block } = data;\n const mapped = mapBlockToContentBlock(content_block, index);\n blockAccumulators.set(index, { ...mapped });\n yield {\n event: \"content-block-start\" as const,\n index,\n content: mapped,\n };\n break;\n }\n\n case \"content_block_delta\": {\n const { index, delta } = data;\n const acc = blockAccumulators.get(index);\n if (!acc) break;\n\n const { contentDelta, accumulated } = applyAnthropicDelta(acc, delta);\n blockAccumulators.set(index, accumulated);\n\n if (contentDelta) {\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: contentDelta,\n };\n }\n break;\n }\n\n case \"content_block_stop\": {\n const { index } = data;\n const acc = blockAccumulators.get(index);\n if (!acc) break;\n\n const finalized = finalizeBlock(acc);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalized,\n };\n blockAccumulators.delete(index);\n break;\n }\n\n // ── Unhandled → provider passthrough ───────────────────\n default: {\n yield {\n event: \"provider\" as const,\n provider: \"anthropic\",\n name: data.type,\n payload: data,\n };\n break;\n }\n }\n }\n}\n\n// ─── Internal helpers ───────────────────────────────────────────\n\nfunction mapStopReason(stopReason: string | null | undefined): FinishReason {\n switch (stopReason) {\n case \"end_turn\":\n case \"stop_sequence\":\n return \"stop\";\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"length\";\n default:\n return \"stop\";\n }\n}\n\nfunction mapBlockToContentBlock(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n block: any,\n index: number\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n): Record<string, any> {\n switch (block.type) {\n case \"text\":\n return { type: \"text\" as const, text: block.text ?? \"\", index };\n case \"thinking\":\n return {\n type: \"reasoning\" as const,\n reasoning: block.thinking ?? \"\",\n index,\n };\n case \"redacted_thinking\":\n return { type: \"non_standard\" as const, value: { ...block }, index };\n case \"tool_use\":\n return {\n type: \"tool_call_chunk\" as const,\n id: block.id,\n name: block.name,\n args: \"\",\n index,\n };\n case \"server_tool_use\":\n return {\n type: \"server_tool_call_chunk\" as const,\n id: block.id,\n name: block.name,\n args: \"\",\n index,\n };\n default:\n return { type: \"non_standard\" as const, value: { ...block }, index };\n }\n}\n\n/**\n * Map an Anthropic content_block_delta to a content block delta\n * and update the accumulated state. `contentDelta` is undefined when\n * there's nothing new to send.\n */\nfunction applyAnthropicDelta(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n accumulated: Record<string, any>,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n delta: any\n): {\n contentDelta: ContentBlockDelta | undefined;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n accumulated: Record<string, any>;\n} {\n switch (delta.type) {\n case \"text_delta\":\n return {\n contentDelta: { type: \"text-delta\" as const, text: delta.text },\n accumulated: {\n ...accumulated,\n text: (accumulated.text ?? \"\") + delta.text,\n },\n };\n\n case \"thinking_delta\":\n return {\n contentDelta: {\n type: \"reasoning-delta\" as const,\n reasoning: delta.thinking,\n },\n accumulated: {\n ...accumulated,\n reasoning: (accumulated.reasoning ?? \"\") + delta.thinking,\n },\n };\n\n case \"input_json_delta\": {\n // `tool-call-delta` is for tool calls only. Other blocks that stream\n // JSON input, such as `mcp_tool_use`, keep sending `block-delta`.\n if (\n accumulated.type !== \"tool_call_chunk\" &&\n accumulated.type !== \"server_tool_call_chunk\"\n ) {\n const newArgs = (accumulated.args ?? \"\") + delta.partial_json;\n return {\n contentDelta: {\n type: \"block-delta\" as const,\n fields: { type: accumulated.type, args: newArgs },\n },\n accumulated: { ...accumulated, args: newArgs },\n };\n }\n if (!delta.partial_json) {\n return { contentDelta: undefined, accumulated };\n }\n return {\n contentDelta: {\n type: \"tool-call-delta\" as const,\n args: delta.partial_json,\n },\n accumulated: {\n ...accumulated,\n args: (accumulated.args ?? \"\") + delta.partial_json,\n },\n };\n }\n\n case \"citations_delta\": {\n const annotations = [...(accumulated.annotations ?? []), delta.citation];\n return {\n contentDelta: {\n type: \"block-delta\" as const,\n fields: {\n type: accumulated.type,\n annotations,\n },\n },\n accumulated: {\n ...accumulated,\n annotations,\n },\n };\n }\n\n case \"signature_delta\":\n return {\n contentDelta: {\n type: \"block-delta\" as const,\n fields: { type: accumulated.type, signature: delta.signature },\n },\n accumulated: { ...accumulated, signature: delta.signature },\n };\n\n case \"compaction_delta\":\n return {\n contentDelta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"non_standard\",\n value: { ...(accumulated.value ?? {}), compaction: delta },\n },\n },\n accumulated: {\n ...accumulated,\n value: { ...(accumulated.value ?? {}), compaction: delta },\n },\n };\n\n default:\n return {\n contentDelta: {\n type: \"block-delta\" as const,\n fields: { type: accumulated.type, ...delta },\n },\n accumulated,\n };\n }\n}\n\nfunction finalizeBlock(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n accumulated: Record<string, any>\n): ContentBlock {\n if (\n accumulated.type === \"tool_call_chunk\" ||\n accumulated.type === \"server_tool_call_chunk\"\n ) {\n const finalType =\n accumulated.type === \"tool_call_chunk\"\n ? (\"tool_call\" as const)\n : (\"server_tool_call\" as const);\n let parsedArgs: unknown;\n try {\n parsedArgs = JSON.parse(accumulated.args || \"{}\");\n } catch {\n return {\n type: \"invalid_tool_call\" as const,\n id: accumulated.id,\n name: accumulated.name,\n args: accumulated.args,\n error: \"Failed to parse tool call arguments as JSON\",\n } as ContentBlock.Tools.InvalidToolCall;\n }\n return {\n type: finalType,\n id: accumulated.id,\n name: accumulated.name,\n args: parsedArgs,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n }\n\n const { index: _index, ...rest } = accumulated;\n return rest as ContentBlock;\n}\n"],"mappings":"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"}
|