@langchain/anthropic 1.6.1 → 1.6.3
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 +16 -0
- package/dist/chat_models.cjs +10 -6
- 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 +11 -7
- package/dist/chat_models.js.map +1 -1
- package/dist/output_parsers.cjs +8 -0
- package/dist/output_parsers.cjs.map +1 -1
- package/dist/output_parsers.js +8 -0
- package/dist/output_parsers.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/refusal.cjs +17 -0
- package/dist/utils/refusal.cjs.map +1 -0
- package/dist/utils/refusal.js +17 -0
- package/dist/utils/refusal.js.map +1 -0
- package/dist/utils/stream_events.cjs +6 -25
- package/dist/utils/stream_events.cjs.map +1 -1
- package/dist/utils/stream_events.js +6 -25
- package/dist/utils/stream_events.js.map +1 -1
- package/package.json +6 -6
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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/utils/refusal.ts
|
|
2
|
+
/**
|
|
3
|
+
* Returns the message's refusal block, if any.
|
|
4
|
+
*
|
|
5
|
+
* A translator error is treated as no refusal, so it cannot break parsing that
|
|
6
|
+
* worked before refusals were checked.
|
|
7
|
+
*/
|
|
8
|
+
function findRefusal(message) {
|
|
9
|
+
try {
|
|
10
|
+
return message.contentBlocks.find((block) => block.type === "refusal");
|
|
11
|
+
} catch {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.findRefusal = findRefusal;
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=refusal.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refusal.cjs","names":[],"sources":["../../src/utils/refusal.ts"],"sourcesContent":["import type { BaseMessage, ContentBlock } from \"@langchain/core/messages\";\n\n/**\n * Returns the message's refusal block, if any.\n *\n * A translator error is treated as no refusal, so it cannot break parsing that\n * worked before refusals were checked.\n */\nexport function findRefusal(\n message: BaseMessage\n): ContentBlock.Refusal | undefined {\n try {\n return message.contentBlocks.find(\n (block): block is ContentBlock.Refusal => block.type === \"refusal\"\n );\n } catch {\n return undefined;\n }\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,YACd,SACkC;CAClC,IAAI;EACF,OAAO,QAAQ,cAAc,MAC1B,UAAyC,MAAM,SAAS,SAC3D;CACF,QAAQ;EACN;CACF;AACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/utils/refusal.ts
|
|
2
|
+
/**
|
|
3
|
+
* Returns the message's refusal block, if any.
|
|
4
|
+
*
|
|
5
|
+
* A translator error is treated as no refusal, so it cannot break parsing that
|
|
6
|
+
* worked before refusals were checked.
|
|
7
|
+
*/
|
|
8
|
+
function findRefusal(message) {
|
|
9
|
+
try {
|
|
10
|
+
return message.contentBlocks.find((block) => block.type === "refusal");
|
|
11
|
+
} catch {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export { findRefusal };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=refusal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refusal.js","names":[],"sources":["../../src/utils/refusal.ts"],"sourcesContent":["import type { BaseMessage, ContentBlock } from \"@langchain/core/messages\";\n\n/**\n * Returns the message's refusal block, if any.\n *\n * A translator error is treated as no refusal, so it cannot break parsing that\n * worked before refusals were checked.\n */\nexport function findRefusal(\n message: BaseMessage\n): ContentBlock.Refusal | undefined {\n try {\n return message.contentBlocks.find(\n (block): block is ContentBlock.Refusal => block.type === \"refusal\"\n );\n } catch {\n return undefined;\n }\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,YACd,SACkC;CAClC,IAAI;EACF,OAAO,QAAQ,cAAc,MAC1B,UAAyC,MAAM,SAAS,SAC3D;CACF,QAAQ;EACN;CACF;AACF"}
|
|
@@ -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
|
|
@@ -114,23 +108,10 @@ function mapStopReason(stopReason) {
|
|
|
114
108
|
case "stop_sequence": return "stop";
|
|
115
109
|
case "tool_use": return "tool_use";
|
|
116
110
|
case "max_tokens": return "length";
|
|
111
|
+
case "refusal": return "content_filter";
|
|
117
112
|
default: return "stop";
|
|
118
113
|
}
|
|
119
114
|
}
|
|
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
115
|
function mapBlockToContentBlock(block, index) {
|
|
135
116
|
switch (block.type) {
|
|
136
117
|
case "text": return {
|