@langchain/anthropic 1.5.8 → 1.5.10-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/_virtual/_rolldown/runtime.cjs +1 -1
- package/dist/chat_models.cjs +5 -2
- package/dist/chat_models.cjs.map +1 -1
- package/dist/chat_models.d.cts +2 -2
- package/dist/chat_models.d.cts.map +1 -1
- package/dist/chat_models.d.ts +2 -2
- package/dist/chat_models.d.ts.map +1 -1
- package/dist/chat_models.js +5 -2
- package/dist/chat_models.js.map +1 -1
- package/dist/output_parsers.cjs.map +1 -1
- package/dist/profiles.cjs +17 -0
- package/dist/profiles.cjs.map +1 -1
- package/dist/profiles.js +17 -0
- package/dist/profiles.js.map +1 -1
- package/dist/tools/bash.cjs.map +1 -1
- package/dist/tools/computer.cjs.map +1 -1
- package/dist/tools/memory.cjs.map +1 -1
- package/dist/tools/textEditor.cjs.map +1 -1
- package/dist/utils/content.cjs +52 -50
- package/dist/utils/content.cjs.map +1 -1
- package/dist/utils/content.js +52 -50
- package/dist/utils/content.js.map +1 -1
- package/dist/utils/errors.cjs.map +1 -1
- package/dist/utils/message_inputs.cjs +43 -40
- package/dist/utils/message_inputs.cjs.map +1 -1
- package/dist/utils/message_inputs.js +43 -40
- package/dist/utils/message_inputs.js.map +1 -1
- package/dist/utils/message_outputs.cjs +39 -35
- package/dist/utils/message_outputs.cjs.map +1 -1
- package/dist/utils/message_outputs.js +39 -35
- package/dist/utils/message_outputs.js.map +1 -1
- package/dist/utils/params.cjs +6 -2
- package/dist/utils/params.cjs.map +1 -1
- package/dist/utils/params.js +6 -2
- package/dist/utils/params.js.map +1 -1
- package/dist/utils/prompts.cjs +2 -1
- package/dist/utils/prompts.cjs.map +1 -1
- package/dist/utils/prompts.js +2 -1
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/standard.cjs +11 -10
- package/dist/utils/standard.cjs.map +1 -1
- package/dist/utils/standard.js +11 -10
- package/dist/utils/standard.js.map +1 -1
- package/dist/utils/stream_events.cjs +6 -8
- package/dist/utils/stream_events.cjs.map +1 -1
- package/dist/utils/stream_events.js +6 -8
- package/dist/utils/stream_events.js.map +1 -1
- package/package.json +6 -6
|
@@ -72,31 +72,32 @@ function _makeMessageChunkFromAnthropicEvent(data, fields) {
|
|
|
72
72
|
"citations_delta",
|
|
73
73
|
"thinking_delta",
|
|
74
74
|
"signature_delta"
|
|
75
|
-
].includes(data.delta.type))
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
].includes(data.delta.type)) {
|
|
76
|
+
if (fields.coerceContentToString && "text" in data.delta) return { chunk: new AIMessageChunk({ content: data.delta.text }) };
|
|
77
|
+
else {
|
|
78
|
+
const contentBlock = data.delta;
|
|
79
|
+
if ("citation" in contentBlock) {
|
|
80
|
+
contentBlock.citations = [contentBlock.citation];
|
|
81
|
+
delete contentBlock.citation;
|
|
82
|
+
}
|
|
83
|
+
if (contentBlock.type === "thinking_delta" || contentBlock.type === "signature_delta") return { chunk: new AIMessageChunk({
|
|
84
|
+
content: [{
|
|
85
|
+
index: data.index,
|
|
86
|
+
...contentBlock,
|
|
87
|
+
type: "thinking"
|
|
88
|
+
}],
|
|
89
|
+
response_metadata
|
|
90
|
+
}) };
|
|
91
|
+
return { chunk: new AIMessageChunk({
|
|
92
|
+
content: [{
|
|
93
|
+
index: data.index,
|
|
94
|
+
...contentBlock,
|
|
95
|
+
type: "text"
|
|
96
|
+
}],
|
|
97
|
+
response_metadata
|
|
98
|
+
}) };
|
|
81
99
|
}
|
|
82
|
-
|
|
83
|
-
content: [{
|
|
84
|
-
index: data.index,
|
|
85
|
-
...contentBlock,
|
|
86
|
-
type: "thinking"
|
|
87
|
-
}],
|
|
88
|
-
response_metadata
|
|
89
|
-
}) };
|
|
90
|
-
return { chunk: new AIMessageChunk({
|
|
91
|
-
content: [{
|
|
92
|
-
index: data.index,
|
|
93
|
-
...contentBlock,
|
|
94
|
-
type: "text"
|
|
95
|
-
}],
|
|
96
|
-
response_metadata
|
|
97
|
-
}) };
|
|
98
|
-
}
|
|
99
|
-
else if (data.type === "content_block_delta" && data.delta.type === "input_json_delta") return { chunk: new AIMessageChunk({
|
|
100
|
+
} else if (data.type === "content_block_delta" && data.delta.type === "input_json_delta") return { chunk: new AIMessageChunk({
|
|
100
101
|
content: fields.coerceContentToString ? "" : [{
|
|
101
102
|
index: data.index,
|
|
102
103
|
input: data.delta.partial_json,
|
|
@@ -169,17 +170,20 @@ function anthropicResponseToChatMessages(messages, additionalKwargs) {
|
|
|
169
170
|
id: additionalKwargs.id
|
|
170
171
|
})
|
|
171
172
|
}];
|
|
172
|
-
else
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
173
|
+
else {
|
|
174
|
+
const toolCalls = extractToolCalls(messages);
|
|
175
|
+
return [{
|
|
176
|
+
text: "",
|
|
177
|
+
message: new AIMessage({
|
|
178
|
+
content: messages,
|
|
179
|
+
additional_kwargs: additionalKwargs,
|
|
180
|
+
tool_calls: toolCalls,
|
|
181
|
+
usage_metadata: usageMetadata,
|
|
182
|
+
response_metadata,
|
|
183
|
+
id: additionalKwargs.id
|
|
184
|
+
})
|
|
185
|
+
}];
|
|
186
|
+
}
|
|
183
187
|
}
|
|
184
188
|
function buildUsageMetadata(usage) {
|
|
185
189
|
const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;
|
|
@@ -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":";;;;;AAgBA,SAAgB,oCACd,MACA,QAMO;CACP,MAAM,oBAAoB,EAAE,gBAAgB,YAAY;CACxD,IAAI,KAAK,SAAS,iBAAiB;EACjC,MAAM,EAAE,SAAS,OAAO,GAAG,qBAAqB,KAAK;EAErD,MAAM,2BAAgD,CAAC;EACvD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,gBAAgB,GACxD,IAAI,UAAU,KAAA,KAAa,UAAU,MACnC,yBAAyB,OAAO;EAIpC,MAAM,EAAE,cAAc,eAAe,GAAG,SACtC,SAAS,CAAC;EACZ,MAAM,gBAAgB,mBAAmB,KAAK;EAC9C,OAAO,EACL,OAAO,IAAI,eAAe;GACxB,SAAS,OAAO,wBAAwB,KAAK,CAAC;GAC9C,mBAAmB;GACnB,gBAAgB,OAAO,cAAc,gBAAgB,KAAA;GACrD,mBAAmB;IACjB,GAAG;IACH,OAAO,EACL,GAAG,KACL;GACF;GACA,IAAI,KAAK,QAAQ;EACnB,CAAC,EACH;CACF,OAAO,IAAI,KAAK,SAAS,iBAAiB;EACxC,MAAM,gBAA+B;GACnC,cAAc;GACd,eAAe,KAAK,MAAM;GAC1B,cAAc,KAAK,MAAM;EAC3B;EACA,MAAM,mBAAmB,WAAW;GAClC,MAAM,SAAS,CAAC;GAChB,IAAI,wBAAwB,KAAK,OAC/B,OAAO,wBAAwB,KAAK,MAAM;GAE5C,IACE,WAAW,QACX,UAAU,KAAK,SACf,OAAO,KAAK,MAAM,SAAS,UAE3B,OAAO,WAAW,EAAE,MAAM,KAAK,MAAM,KAAK;GAE5C,OAAO;EACT,CAAC;EACD,OAAO,EACL,OAAO,IAAI,eAAe;GACxB,SAAS,OAAO,wBAAwB,KAAK,CAAC;GAC9C,mBAAmB;GACnB,mBAAmB,EAAE,GAAG,KAAK,MAAM;GACnC,gBAAgB,OAAO,cAAc,gBAAgB,KAAA;EACvD,CAAC,EACH;CACF,OAAO,IACL,KAAK,SAAS,yBACd;EACE;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,SAAS,KAAK,cAAc,IAAI,GAClC;EACA,MAAM,eAAe,KAAK;EAC1B,IAAI;EACJ,IAAI,aAAa,SAAS,YACxB,iBAAiB,CACf;GACE,IAAI,aAAa;GACjB,OAAO,KAAK;GACZ,MAAM,aAAa;GACnB,MAAM;EACR,CACF;OAEA,iBAAiB,CAAC;EAEpB,OAAO,EACL,OAAO,IAAI,eAAe;GACxB,SAAS,OAAO,wBACZ,KACA,CACE;IACE,OAAO,KAAK;IACZ,GAAG,KAAK;IACR,OACE,aAAa,SAAS,qBACtB,aAAa,SAAS,aAClB,KACA,KAAA;GACR,CACF;GACJ;GACA,mBAAmB,CAAC;GACpB,kBAAkB;EACpB,CAAC,EACH;CACF,OAAO,IACL,KAAK,SAAS,yBACd;EACE;EACA;EACA;EACA;CACF,CAAC,CAAC,SAAS,KAAK,MAAM,IAAI,GAE1B,IAAI,OAAO,yBAAyB,UAAU,KAAK,OACjD,OAAO,EACL,OAAO,IAAI,eAAe,EACxB,SAAS,KAAK,MAAM,KACtB,CAAC,EACH;MACK;EAEL,MAAM,eAAoC,KAAK;EAC/C,IAAI,cAAc,cAAc;GAC9B,aAAa,YAAY,CAAC,aAAa,QAAQ;GAC/C,OAAO,aAAa;EACtB;EACA,IACE,aAAa,SAAS,oBACtB,aAAa,SAAS,mBAEtB,OAAO,EACL,OAAO,IAAI,eAAe;GACxB,SAAS,CAAC;IAAE,OAAO,KAAK;IAAO,GAAG;IAAc,MAAM;GAAW,CAAC;GAClE;EACF,CAAC,EACH;EAGF,OAAO,EACL,OAAO,IAAI,eAAe;GACxB,SAAS,CAAC;IAAE,OAAO,KAAK;IAAO,GAAG;IAAc,MAAM;GAAO,CAAC;GAC9D;EACF,CAAC,EACH;CACF;MACK,IACL,KAAK,SAAS,yBACd,KAAK,MAAM,SAAS,oBAEpB,OAAO,EACL,OAAO,IAAI,eAAe;EACxB,SAAS,OAAO,wBACZ,KACA,CACE;GACE,OAAO,KAAK;GACZ,OAAO,KAAK,MAAM;GAClB,MAAM,KAAK,MAAM;EACnB,CACF;EACJ;EACA,mBAAmB,CAAC;EACpB,kBAAkB,CAChB;GACE,OAAO,KAAK;GACZ,MAAM,KAAK,MAAM;EACnB,CACF;CACF,CAAC,EACH;MACK,IACL,KAAK,SAAS,yBACd,KAAK,cAAc,SAAS,QAC5B;EACA,MAAM,UAAU,KAAK,eAAe;EACpC,IAAI,YAAY,KAAA,GACd,OAAO,EACL,OAAO,IAAI,eAAe;GACxB,SAAS,OAAO,wBACZ,UACA,CACE;IACE,OAAO,KAAK;IACZ,GAAG,KAAK;GACV,CACF;GACJ;GACA,mBAAmB,CAAC;EACtB,CAAC,EACH;CAEJ,OAAO,IACL,KAAK,SAAS,yBACd,KAAK,cAAc,SAAS,qBAE5B,OAAO,EACL,OAAO,IAAI,eAAe;EACxB,SAAS,OAAO,wBACZ,KACA,CAAC;GAAE,OAAO,KAAK;GAAO,GAAG,KAAK;EAAc,CAAC;EACjD;CACF,CAAC,EACH;MACK,IACL,KAAK,SAAS,yBACd,KAAK,cAAc,SAAS,YAC5B;EACA,MAAM,UAAU,KAAK,cAAc;EACnC,OAAO,EACL,OAAO,IAAI,eAAe;GACxB,SAAS,OAAO,wBACZ,UACA,CAAC;IAAE,OAAO,KAAK;IAAO,GAAG,KAAK;GAAc,CAAC;GACjD;EACF,CAAC,EACH;CACF,OAAO,IACL,KAAK,SAAS,yBACd,4BAA4B,KAAK,aAAa,GAE9C,OAAO,EACL,OAAO,IAAI,eAAe;EACxB,SAAS,OAAO,wBACZ,KACA,CAAC;GAAE,OAAO,KAAK;GAAO,GAAG,KAAK;EAAc,CAAC;EACjD;CACF,CAAC,EACH;MACK,IACL,KAAK,SAAS,yBACd,KAAK,MAAM,SAAS,oBAEpB,OAAO,EACL,OAAO,IAAI,eAAe;EACxB,SAAS,OAAO,wBACZ,KACA,CACE;GACE,OAAO,KAAK;GACZ,GAAG,KAAK;GACR,MAAM;EACR,CACF;EACJ;CACF,CAAC,EACH;CAEF,OAAO;AACT;AAEA,SAAgB,gCACd,UACA,kBACkB;CAClB,MAAM,oBAAoB;EACxB,GAAG;EACH,gBAAgB;CAClB;CACA,MAAM,QACJ,iBAAiB;CACnB,MAAM,gBAAgB,SAAS,OAAO,mBAAmB,KAAK,IAAI,KAAA;CAClE,IAAI,SAAS,WAAW,KAAK,SAAS,EAAE,CAAC,SAAS,QAChD,OAAO,CACL;EACE,MAAM,SAAS,EAAE,CAAC;EAClB,SAAS,IAAI,UAAU;GACrB,SAAS,SAAS,EAAE,CAAC;GACrB,mBAAmB;GACnB,gBAAgB;GAChB;GACA,IAAI,iBAAiB;EACvB,CAAC;CACH,CACF;MAiBA,OAAO,CAbL;EACE,MAAM;EACN,SAAS,IAAI,UAAU;GAErB,SAAS;GACT,mBAAmB;GACnB,YARY,iBAAiB,QAQT;GACpB,gBAAgB;GAChB;GACA,IAAI,iBAAiB;EACvB,CAAC;CACH,CAEe;AAErB;AAEA,SAAS,mBACP,OACe;CACf,MAAM,2BAA2B,MAAM,+BAA+B;CACtE,MAAM,uBAAuB,MAAM,2BAA2B;CAG9D,MAAM,mBACJ,MAAM,eAAe,2BAA2B;CAClD,OAAO;EACL,cAAc;EACd,eAAe,MAAM;EACrB,cAAc,mBAAmB,MAAM;EACvC,qBAAqB;GACnB,gBAAgB;GAChB,YAAY;EACd;CACF;AACF"}
|
|
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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"}
|
package/dist/utils/params.cjs
CHANGED
|
@@ -3,10 +3,12 @@ const ADAPTIVE_ONLY_MODEL_PREFIXES = [
|
|
|
3
3
|
"claude-opus-4-7",
|
|
4
4
|
"claude-opus-4-8",
|
|
5
5
|
"claude-opus-5",
|
|
6
|
+
"claude-sonnet-5",
|
|
6
7
|
"claude-fable-5",
|
|
7
8
|
"claude-mythos-5",
|
|
8
9
|
"claude-mythos-preview"
|
|
9
10
|
];
|
|
11
|
+
const FABLE_MODEL_PREFIXES = ["claude-fable-5"];
|
|
10
12
|
function modelStartsWithAnyPrefix(model, prefixes) {
|
|
11
13
|
return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;
|
|
12
14
|
}
|
|
@@ -24,9 +26,11 @@ function getTaskBudgetBetas(model, outputConfig) {
|
|
|
24
26
|
return isOpus47Model(model) && hasTaskBudget ? ["task-budgets-2026-03-13"] : [];
|
|
25
27
|
}
|
|
26
28
|
function validateInvocationParamCompatibility(fields) {
|
|
27
|
-
const { model, thinking, outputConfig, topK, topP, temperature } = fields;
|
|
29
|
+
const { model, thinking, thinkingExplicitlySet, outputConfig, topK, topP, temperature } = fields;
|
|
28
30
|
const adaptiveOnlyModel = isAdaptiveOnlyModel(model);
|
|
31
|
+
const fableModel = modelStartsWithAnyPrefix(model, FABLE_MODEL_PREFIXES);
|
|
29
32
|
const modelName = model ?? "this model";
|
|
33
|
+
if (fableModel && thinkingExplicitlySet && thinking.type === "disabled") throw new Error(`thinking.type="disabled" is not supported for ${modelName}; omit thinking to use adaptive thinking instead`);
|
|
30
34
|
if (adaptiveOnlyModel && thinking.type === "enabled") throw new Error(`thinking.type="enabled" is not supported for ${modelName}; use thinking.type="adaptive" instead`);
|
|
31
35
|
if (adaptiveOnlyModel && typeof thinking === "object" && thinking != null && "budget_tokens" in thinking) throw new Error(`thinking.budget_tokens is not supported for ${modelName}; use outputConfig.effort instead`);
|
|
32
36
|
if (modelStartsWithAnyPrefix(model, ["claude-opus-5"]) && thinking.type === "disabled" && (outputConfig?.effort === "xhigh" || outputConfig?.effort === "max")) throw new Error(`thinking.type="disabled" is not supported for ${modelName} with outputConfig.effort="${outputConfig.effort}"; use thinking.type="adaptive" or omit thinking instead`);
|
|
@@ -35,7 +39,7 @@ function validateInvocationParamCompatibility(fields) {
|
|
|
35
39
|
if (topP !== void 0 && topP !== 1) throw new Error(`topP is not supported for ${modelName} when set to non-default values`);
|
|
36
40
|
if (temperature !== void 0 && temperature !== 1) throw new Error(`temperature is not supported for ${modelName} when set to non-default values`);
|
|
37
41
|
}
|
|
38
|
-
if (isThinkingEnabled(thinking)) {
|
|
42
|
+
if (!fableModel && isThinkingEnabled(thinking)) {
|
|
39
43
|
if (topK !== void 0) throw new Error("topK is not supported when thinking is enabled");
|
|
40
44
|
if (topP !== void 0) throw new Error("topP is not supported when thinking is enabled");
|
|
41
45
|
if (temperature !== void 0 && temperature !== 1) throw new Error("temperature is not supported when thinking is enabled");
|
|
@@ -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 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-fable-5\",\n \"claude-mythos-5\",\n \"claude-mythos-preview\",\n] 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 {
|
|
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,gBAAgB;AAE9C,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
|
@@ -3,10 +3,12 @@ const ADAPTIVE_ONLY_MODEL_PREFIXES = [
|
|
|
3
3
|
"claude-opus-4-7",
|
|
4
4
|
"claude-opus-4-8",
|
|
5
5
|
"claude-opus-5",
|
|
6
|
+
"claude-sonnet-5",
|
|
6
7
|
"claude-fable-5",
|
|
7
8
|
"claude-mythos-5",
|
|
8
9
|
"claude-mythos-preview"
|
|
9
10
|
];
|
|
11
|
+
const FABLE_MODEL_PREFIXES = ["claude-fable-5"];
|
|
10
12
|
function modelStartsWithAnyPrefix(model, prefixes) {
|
|
11
13
|
return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;
|
|
12
14
|
}
|
|
@@ -24,9 +26,11 @@ function getTaskBudgetBetas(model, outputConfig) {
|
|
|
24
26
|
return isOpus47Model(model) && hasTaskBudget ? ["task-budgets-2026-03-13"] : [];
|
|
25
27
|
}
|
|
26
28
|
function validateInvocationParamCompatibility(fields) {
|
|
27
|
-
const { model, thinking, outputConfig, topK, topP, temperature } = fields;
|
|
29
|
+
const { model, thinking, thinkingExplicitlySet, outputConfig, topK, topP, temperature } = fields;
|
|
28
30
|
const adaptiveOnlyModel = isAdaptiveOnlyModel(model);
|
|
31
|
+
const fableModel = modelStartsWithAnyPrefix(model, FABLE_MODEL_PREFIXES);
|
|
29
32
|
const modelName = model ?? "this model";
|
|
33
|
+
if (fableModel && thinkingExplicitlySet && thinking.type === "disabled") throw new Error(`thinking.type="disabled" is not supported for ${modelName}; omit thinking to use adaptive thinking instead`);
|
|
30
34
|
if (adaptiveOnlyModel && thinking.type === "enabled") throw new Error(`thinking.type="enabled" is not supported for ${modelName}; use thinking.type="adaptive" instead`);
|
|
31
35
|
if (adaptiveOnlyModel && typeof thinking === "object" && thinking != null && "budget_tokens" in thinking) throw new Error(`thinking.budget_tokens is not supported for ${modelName}; use outputConfig.effort instead`);
|
|
32
36
|
if (modelStartsWithAnyPrefix(model, ["claude-opus-5"]) && thinking.type === "disabled" && (outputConfig?.effort === "xhigh" || outputConfig?.effort === "max")) throw new Error(`thinking.type="disabled" is not supported for ${modelName} with outputConfig.effort="${outputConfig.effort}"; use thinking.type="adaptive" or omit thinking instead`);
|
|
@@ -35,7 +39,7 @@ function validateInvocationParamCompatibility(fields) {
|
|
|
35
39
|
if (topP !== void 0 && topP !== 1) throw new Error(`topP is not supported for ${modelName} when set to non-default values`);
|
|
36
40
|
if (temperature !== void 0 && temperature !== 1) throw new Error(`temperature is not supported for ${modelName} when set to non-default values`);
|
|
37
41
|
}
|
|
38
|
-
if (isThinkingEnabled(thinking)) {
|
|
42
|
+
if (!fableModel && isThinkingEnabled(thinking)) {
|
|
39
43
|
if (topK !== void 0) throw new Error("topK is not supported when thinking is enabled");
|
|
40
44
|
if (topP !== void 0) throw new Error("topP is not supported when thinking is enabled");
|
|
41
45
|
if (temperature !== void 0 && temperature !== 1) throw new Error("temperature is not supported when thinking is enabled");
|
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 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-fable-5\",\n \"claude-mythos-5\",\n \"claude-mythos-preview\",\n] 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 {
|
|
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,gBAAgB;AAE9C,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/prompts.cjs
CHANGED
|
@@ -37,7 +37,8 @@ const require_message_inputs = require("./message_inputs.cjs");
|
|
|
37
37
|
* @returns A partial Anthropic payload.
|
|
38
38
|
*/
|
|
39
39
|
function convertPromptToAnthropic(formattedPrompt) {
|
|
40
|
-
const
|
|
40
|
+
const messages = formattedPrompt.toChatMessages();
|
|
41
|
+
const anthropicBody = require_message_inputs._convertMessagesToAnthropicPayload(messages);
|
|
41
42
|
if (anthropicBody.messages === void 0) anthropicBody.messages = [];
|
|
42
43
|
return anthropicBody;
|
|
43
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.cjs","names":["_convertMessagesToAnthropicPayload"],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport Anthropic from \"@anthropic-ai/sdk\";\n\nimport { _convertMessagesToAnthropicPayload } from \"./message_inputs.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by Anthropic's JS SDK.\n *\n * Requires the \"@langchain/anthropic\" package to be installed in addition\n * to the Anthropic SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToAnthropic } from \"langsmith/utils/hub/anthropic\";\n * import { pull } from \"langchain/hub\";\n *\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { system, messages } = convertPromptToAnthropic(formattedPrompt);\n *\n * const anthropicClient = new Anthropic({\n * apiKey: 'your_api_key',\n * });\n *\n * const anthropicResponse = await anthropicClient.messages.create({\n * model: \"claude-sonnet-4-5-20250929\",\n * max_tokens: 1024,\n * stream: false,\n * system,\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial Anthropic payload.\n */\nexport function convertPromptToAnthropic(\n formattedPrompt: BasePromptValue\n): Anthropic.Messages.MessageCreateParams {\n const messages = formattedPrompt.toChatMessages();\n const anthropicBody = _convertMessagesToAnthropicPayload(messages);\n if (anthropicBody.messages === undefined) {\n anthropicBody.messages = [];\n }\n return anthropicBody;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,yBACd,iBACwC;
|
|
1
|
+
{"version":3,"file":"prompts.cjs","names":["_convertMessagesToAnthropicPayload"],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport Anthropic from \"@anthropic-ai/sdk\";\n\nimport { _convertMessagesToAnthropicPayload } from \"./message_inputs.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by Anthropic's JS SDK.\n *\n * Requires the \"@langchain/anthropic\" package to be installed in addition\n * to the Anthropic SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToAnthropic } from \"langsmith/utils/hub/anthropic\";\n * import { pull } from \"langchain/hub\";\n *\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { system, messages } = convertPromptToAnthropic(formattedPrompt);\n *\n * const anthropicClient = new Anthropic({\n * apiKey: 'your_api_key',\n * });\n *\n * const anthropicResponse = await anthropicClient.messages.create({\n * model: \"claude-sonnet-4-5-20250929\",\n * max_tokens: 1024,\n * stream: false,\n * system,\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial Anthropic payload.\n */\nexport function convertPromptToAnthropic(\n formattedPrompt: BasePromptValue\n): Anthropic.Messages.MessageCreateParams {\n const messages = formattedPrompt.toChatMessages();\n const anthropicBody = _convertMessagesToAnthropicPayload(messages);\n if (anthropicBody.messages === undefined) {\n anthropicBody.messages = [];\n }\n return anthropicBody;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,yBACd,iBACwC;CACxC,MAAM,WAAW,gBAAgB,eAAe;CAChD,MAAM,gBAAgBA,uBAAAA,mCAAmC,QAAQ;CACjE,IAAI,cAAc,aAAa,KAAA,GAC7B,cAAc,WAAW,CAAC;CAE5B,OAAO;AACT"}
|
package/dist/utils/prompts.js
CHANGED
|
@@ -37,7 +37,8 @@ import { _convertMessagesToAnthropicPayload } from "./message_inputs.js";
|
|
|
37
37
|
* @returns A partial Anthropic payload.
|
|
38
38
|
*/
|
|
39
39
|
function convertPromptToAnthropic(formattedPrompt) {
|
|
40
|
-
const
|
|
40
|
+
const messages = formattedPrompt.toChatMessages();
|
|
41
|
+
const anthropicBody = _convertMessagesToAnthropicPayload(messages);
|
|
41
42
|
if (anthropicBody.messages === void 0) anthropicBody.messages = [];
|
|
42
43
|
return anthropicBody;
|
|
43
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","names":[],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport Anthropic from \"@anthropic-ai/sdk\";\n\nimport { _convertMessagesToAnthropicPayload } from \"./message_inputs.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by Anthropic's JS SDK.\n *\n * Requires the \"@langchain/anthropic\" package to be installed in addition\n * to the Anthropic SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToAnthropic } from \"langsmith/utils/hub/anthropic\";\n * import { pull } from \"langchain/hub\";\n *\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { system, messages } = convertPromptToAnthropic(formattedPrompt);\n *\n * const anthropicClient = new Anthropic({\n * apiKey: 'your_api_key',\n * });\n *\n * const anthropicResponse = await anthropicClient.messages.create({\n * model: \"claude-sonnet-4-5-20250929\",\n * max_tokens: 1024,\n * stream: false,\n * system,\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial Anthropic payload.\n */\nexport function convertPromptToAnthropic(\n formattedPrompt: BasePromptValue\n): Anthropic.Messages.MessageCreateParams {\n const messages = formattedPrompt.toChatMessages();\n const anthropicBody = _convertMessagesToAnthropicPayload(messages);\n if (anthropicBody.messages === undefined) {\n anthropicBody.messages = [];\n }\n return anthropicBody;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,yBACd,iBACwC;
|
|
1
|
+
{"version":3,"file":"prompts.js","names":[],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport Anthropic from \"@anthropic-ai/sdk\";\n\nimport { _convertMessagesToAnthropicPayload } from \"./message_inputs.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by Anthropic's JS SDK.\n *\n * Requires the \"@langchain/anthropic\" package to be installed in addition\n * to the Anthropic SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToAnthropic } from \"langsmith/utils/hub/anthropic\";\n * import { pull } from \"langchain/hub\";\n *\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { system, messages } = convertPromptToAnthropic(formattedPrompt);\n *\n * const anthropicClient = new Anthropic({\n * apiKey: 'your_api_key',\n * });\n *\n * const anthropicResponse = await anthropicClient.messages.create({\n * model: \"claude-sonnet-4-5-20250929\",\n * max_tokens: 1024,\n * stream: false,\n * system,\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial Anthropic payload.\n */\nexport function convertPromptToAnthropic(\n formattedPrompt: BasePromptValue\n): Anthropic.Messages.MessageCreateParams {\n const messages = formattedPrompt.toChatMessages();\n const anthropicBody = _convertMessagesToAnthropicPayload(messages);\n if (anthropicBody.messages === undefined) {\n anthropicBody.messages = [];\n }\n return anthropicBody;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,yBACd,iBACwC;CACxC,MAAM,WAAW,gBAAgB,eAAe;CAChD,MAAM,gBAAgB,mCAAmC,QAAQ;CACjE,IAAI,cAAc,aAAa,KAAA,GAC7B,cAAc,WAAW,CAAC;CAE5B,OAAO;AACT"}
|
package/dist/utils/standard.cjs
CHANGED
|
@@ -96,16 +96,17 @@ function _formatStandardContent(message) {
|
|
|
96
96
|
const result = [];
|
|
97
97
|
const responseMetadata = message.response_metadata;
|
|
98
98
|
const isAnthropicMessage = "model_provider" in responseMetadata && responseMetadata?.model_provider === "anthropic";
|
|
99
|
-
for (const block of message.contentBlocks) if (block.type === "text")
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
99
|
+
for (const block of message.contentBlocks) if (block.type === "text") {
|
|
100
|
+
if (block.annotations) result.push({
|
|
101
|
+
type: "text",
|
|
102
|
+
text: block.text,
|
|
103
|
+
citations: _formatStandardCitations(block.annotations)
|
|
104
|
+
});
|
|
105
|
+
else result.push({
|
|
106
|
+
type: "text",
|
|
107
|
+
text: block.text
|
|
108
|
+
});
|
|
109
|
+
} else if (block.type === "tool_call") result.push({
|
|
109
110
|
type: "tool_use",
|
|
110
111
|
id: block.id ?? "",
|
|
111
112
|
name: block.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard.cjs","names":["iife"],"sources":["../../src/utils/standard.ts"],"sourcesContent":["import type Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n BaseMessage,\n ContentBlock,\n ResponseMetadata,\n} from \"@langchain/core/messages\";\nimport { iife } from \"./index.js\";\n\nfunction _isStandardAnnotation(\n annotation: unknown\n): annotation is ContentBlock.Citation {\n return (\n typeof annotation === \"object\" &&\n annotation !== null &&\n \"type\" in annotation &&\n annotation.type === \"citation\"\n );\n}\n\nfunction _formatStandardCitations(\n annotations: ContentBlock.Citation[]\n): Anthropic.Beta.BetaTextCitation[] {\n function* iterateAnnotations() {\n for (const annotation of annotations) {\n if (_isStandardAnnotation(annotation)) {\n if (annotation.source === \"char\") {\n yield {\n type: \"char_location\" as const,\n file_id: annotation.url ?? \"\",\n start_char_index: annotation.startIndex ?? 0,\n end_char_index: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"page\") {\n yield {\n type: \"page_location\" as const,\n file_id: annotation.url ?? \"\",\n start_page_number: annotation.startIndex ?? 0,\n end_page_number: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"block\") {\n yield {\n type: \"content_block_location\" as const,\n file_id: annotation.url ?? \"\",\n start_block_index: annotation.startIndex ?? 0,\n end_block_index: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"url\") {\n yield {\n type: \"web_search_result_location\" as const,\n url: annotation.url ?? \"\",\n title: annotation.title ?? null,\n encrypted_index: String(annotation.startIndex ?? 0),\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"search\") {\n yield {\n type: \"search_result_location\" as const,\n title: annotation.title ?? null,\n start_block_index: annotation.startIndex ?? 0,\n end_block_index: annotation.endIndex ?? 0,\n search_result_index: 0,\n source: annotation.source ?? \"\",\n cited_text: annotation.citedText ?? \"\",\n };\n }\n }\n }\n }\n return Array.from(iterateAnnotations());\n}\n\nfunction _formatBase64Data(data: string | Uint8Array): string {\n if (typeof data === \"string\") return data;\n else return _encodeUint8Array(data);\n}\n\nfunction _encodeUint8Array(data: Uint8Array): string {\n const output = [];\n for (let i = 0, { length } = data; i < length; i++) {\n output.push(String.fromCharCode(data[i]));\n }\n return btoa(output.join(\"\"));\n}\n\nfunction _normalizeMimeType(mimeType?: string | null): string {\n return (mimeType ?? \"\").split(\";\")[0].toLowerCase();\n}\n\nfunction _extractMetadataValue<T>(\n metadata: unknown,\n key: string\n): T | undefined {\n if (\n metadata !== undefined &&\n metadata !== null &&\n typeof metadata === \"object\" &&\n key in metadata\n ) {\n return (metadata as Record<string, unknown>)[key] as T;\n }\n return undefined;\n}\n\nfunction _applyDocumentMetadata(\n block: Anthropic.Beta.BetaRequestDocumentBlock,\n metadata: unknown\n): Anthropic.Beta.BetaRequestDocumentBlock {\n const cacheControl =\n _extractMetadataValue<Anthropic.Beta.BetaCacheControlEphemeral | null>(\n metadata,\n \"cache_control\"\n );\n if (cacheControl !== undefined) {\n block.cache_control = cacheControl;\n }\n const citations =\n _extractMetadataValue<Anthropic.Beta.BetaCitationsConfigParam | null>(\n metadata,\n \"citations\"\n );\n if (citations !== undefined) {\n block.citations = citations;\n }\n const context = _extractMetadataValue<string | null>(metadata, \"context\");\n if (context !== undefined) {\n block.context = context;\n }\n const title = _extractMetadataValue<string | null>(metadata, \"title\");\n if (title !== undefined) {\n block.title = title;\n }\n return block;\n}\n\nfunction _applyImageMetadata(\n block: Anthropic.Beta.BetaImageBlockParam,\n metadata: unknown\n): Anthropic.Beta.BetaImageBlockParam {\n const cacheControl =\n _extractMetadataValue<Anthropic.Beta.BetaCacheControlEphemeral | null>(\n metadata,\n \"cache_control\"\n );\n if (cacheControl !== undefined) {\n block.cache_control = cacheControl;\n }\n return block;\n}\n\nfunction _hasAllowedImageMimeType(\n mimeType: string\n): mimeType is \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\" {\n const ALLOWED_IMAGE_MIME_TYPES = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n ]);\n return ALLOWED_IMAGE_MIME_TYPES.has(mimeType);\n}\n\nexport function _formatStandardContent(\n message: BaseMessage\n): Anthropic.Beta.BetaContentBlockParam[] {\n const result: Anthropic.Beta.BetaContentBlockParam[] = [];\n const responseMetadata = message.response_metadata as ResponseMetadata;\n const isAnthropicMessage =\n \"model_provider\" in responseMetadata &&\n responseMetadata?.model_provider === \"anthropic\";\n for (const block of message.contentBlocks) {\n if (block.type === \"text\") {\n if (block.annotations) {\n result.push({\n type: \"text\",\n text: block.text,\n citations: _formatStandardCitations(\n block.annotations as ContentBlock.Citation[]\n ),\n });\n } else {\n result.push({\n type: \"text\",\n text: block.text,\n });\n }\n } else if (block.type === \"tool_call\") {\n result.push({\n type: \"tool_use\",\n id: block.id ?? \"\",\n name: block.name,\n input: block.args,\n });\n } else if (block.type === \"tool_call_chunk\") {\n const input = iife(() => {\n if (typeof block.args !== \"string\") {\n return block.args;\n }\n try {\n return JSON.parse(block.args);\n } catch {\n return {};\n }\n });\n result.push({\n type: \"tool_use\",\n id: block.id ?? \"\",\n name: block.name ?? \"\",\n input,\n });\n } else if (block.type === \"reasoning\" && isAnthropicMessage) {\n result.push({\n type: \"thinking\",\n thinking: block.reasoning,\n signature: String(block.signature),\n });\n } else if (block.type === \"server_tool_call\" && isAnthropicMessage) {\n if (block.name === \"web_search\") {\n result.push({\n type: \"server_tool_use\",\n name: block.name,\n id: block.id ?? \"\",\n input: block.args,\n });\n } else if (block.name === \"code_execution\") {\n result.push({\n type: \"server_tool_use\",\n name: block.name,\n id: block.id ?? \"\",\n input: block.args,\n });\n }\n } else if (block.type === \"server_tool_call_result\" && isAnthropicMessage) {\n if (block.name === \"web_search\" && Array.isArray(block.output.urls)) {\n const content = block.output.urls.map((url) => ({\n type: \"web_search_result\" as const,\n title: \"\",\n encrypted_content: \"\",\n url,\n }));\n result.push({\n type: \"web_search_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n content,\n });\n } else if (block.name === \"code_execution\") {\n result.push({\n type: \"code_execution_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: block.output as any,\n });\n } else if (block.name === \"mcp_tool_result\") {\n result.push({\n type: \"mcp_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: block.output as any,\n });\n }\n } else if (block.type === \"audio\") {\n throw new Error(\"Anthropic does not support audio content blocks.\");\n } else if (block.type === \"file\") {\n const metadata = block.metadata;\n if (block.fileId) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"file\",\n file_id: block.fileId,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.url) {\n const mimeType = _normalizeMimeType(block.mimeType);\n if (mimeType === \"application/pdf\" || mimeType === \"\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"url\",\n url: block.url,\n },\n },\n metadata\n )\n );\n continue;\n }\n }\n if (block.data) {\n const mimeType = _normalizeMimeType(block.mimeType);\n if (mimeType === \"\" || mimeType === \"application/pdf\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: \"application/pdf\",\n },\n },\n metadata\n )\n );\n } else if (mimeType === \"text/plain\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"text\",\n data: _formatBase64Data(block.data),\n media_type: \"text/plain\",\n },\n },\n metadata\n )\n );\n } else {\n if (_hasAllowedImageMimeType(mimeType)) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"content\",\n content: [\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: mimeType,\n },\n },\n ],\n },\n },\n metadata\n )\n );\n } else {\n throw new Error(\n `Unsupported file mime type for Anthropic base64 source: ${mimeType}`\n );\n }\n }\n continue;\n }\n throw new Error(\n \"File content block must include a fileId, url, or data property.\"\n );\n } else if (block.type === \"image\") {\n const metadata = block.metadata;\n if (block.fileId) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"file\",\n file_id: block.fileId,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.url) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"url\",\n url: block.url,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.data) {\n const mimeType = _normalizeMimeType(block.mimeType) || \"image/png\";\n if (_hasAllowedImageMimeType(mimeType)) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: mimeType,\n },\n },\n metadata\n )\n );\n }\n continue;\n }\n throw new Error(\n \"Image content block must include a fileId, url, or data property.\"\n );\n } else if (block.type === \"video\") {\n // no-op\n } else if (block.type === \"text-plain\") {\n if (block.data) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"text\",\n data: _formatBase64Data(block.data),\n media_type: \"text/plain\",\n },\n },\n block.metadata\n )\n );\n }\n } else if (block.type === \"non_standard\" && isAnthropicMessage) {\n result.push(block.value as Anthropic.Beta.BetaContentBlockParam);\n }\n }\n return result;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standard.cjs","names":["iife"],"sources":["../../src/utils/standard.ts"],"sourcesContent":["import type Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n BaseMessage,\n ContentBlock,\n ResponseMetadata,\n} from \"@langchain/core/messages\";\nimport { iife } from \"./index.js\";\n\nfunction _isStandardAnnotation(\n annotation: unknown\n): annotation is ContentBlock.Citation {\n return (\n typeof annotation === \"object\" &&\n annotation !== null &&\n \"type\" in annotation &&\n annotation.type === \"citation\"\n );\n}\n\nfunction _formatStandardCitations(\n annotations: ContentBlock.Citation[]\n): Anthropic.Beta.BetaTextCitation[] {\n function* iterateAnnotations() {\n for (const annotation of annotations) {\n if (_isStandardAnnotation(annotation)) {\n if (annotation.source === \"char\") {\n yield {\n type: \"char_location\" as const,\n file_id: annotation.url ?? \"\",\n start_char_index: annotation.startIndex ?? 0,\n end_char_index: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"page\") {\n yield {\n type: \"page_location\" as const,\n file_id: annotation.url ?? \"\",\n start_page_number: annotation.startIndex ?? 0,\n end_page_number: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"block\") {\n yield {\n type: \"content_block_location\" as const,\n file_id: annotation.url ?? \"\",\n start_block_index: annotation.startIndex ?? 0,\n end_block_index: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"url\") {\n yield {\n type: \"web_search_result_location\" as const,\n url: annotation.url ?? \"\",\n title: annotation.title ?? null,\n encrypted_index: String(annotation.startIndex ?? 0),\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"search\") {\n yield {\n type: \"search_result_location\" as const,\n title: annotation.title ?? null,\n start_block_index: annotation.startIndex ?? 0,\n end_block_index: annotation.endIndex ?? 0,\n search_result_index: 0,\n source: annotation.source ?? \"\",\n cited_text: annotation.citedText ?? \"\",\n };\n }\n }\n }\n }\n return Array.from(iterateAnnotations());\n}\n\nfunction _formatBase64Data(data: string | Uint8Array): string {\n if (typeof data === \"string\") return data;\n else return _encodeUint8Array(data);\n}\n\nfunction _encodeUint8Array(data: Uint8Array): string {\n const output = [];\n for (let i = 0, { length } = data; i < length; i++) {\n output.push(String.fromCharCode(data[i]));\n }\n return btoa(output.join(\"\"));\n}\n\nfunction _normalizeMimeType(mimeType?: string | null): string {\n return (mimeType ?? \"\").split(\";\")[0].toLowerCase();\n}\n\nfunction _extractMetadataValue<T>(\n metadata: unknown,\n key: string\n): T | undefined {\n if (\n metadata !== undefined &&\n metadata !== null &&\n typeof metadata === \"object\" &&\n key in metadata\n ) {\n return (metadata as Record<string, unknown>)[key] as T;\n }\n return undefined;\n}\n\nfunction _applyDocumentMetadata(\n block: Anthropic.Beta.BetaRequestDocumentBlock,\n metadata: unknown\n): Anthropic.Beta.BetaRequestDocumentBlock {\n const cacheControl =\n _extractMetadataValue<Anthropic.Beta.BetaCacheControlEphemeral | null>(\n metadata,\n \"cache_control\"\n );\n if (cacheControl !== undefined) {\n block.cache_control = cacheControl;\n }\n const citations =\n _extractMetadataValue<Anthropic.Beta.BetaCitationsConfigParam | null>(\n metadata,\n \"citations\"\n );\n if (citations !== undefined) {\n block.citations = citations;\n }\n const context = _extractMetadataValue<string | null>(metadata, \"context\");\n if (context !== undefined) {\n block.context = context;\n }\n const title = _extractMetadataValue<string | null>(metadata, \"title\");\n if (title !== undefined) {\n block.title = title;\n }\n return block;\n}\n\nfunction _applyImageMetadata(\n block: Anthropic.Beta.BetaImageBlockParam,\n metadata: unknown\n): Anthropic.Beta.BetaImageBlockParam {\n const cacheControl =\n _extractMetadataValue<Anthropic.Beta.BetaCacheControlEphemeral | null>(\n metadata,\n \"cache_control\"\n );\n if (cacheControl !== undefined) {\n block.cache_control = cacheControl;\n }\n return block;\n}\n\nfunction _hasAllowedImageMimeType(\n mimeType: string\n): mimeType is \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\" {\n const ALLOWED_IMAGE_MIME_TYPES = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n ]);\n return ALLOWED_IMAGE_MIME_TYPES.has(mimeType);\n}\n\nexport function _formatStandardContent(\n message: BaseMessage\n): Anthropic.Beta.BetaContentBlockParam[] {\n const result: Anthropic.Beta.BetaContentBlockParam[] = [];\n const responseMetadata = message.response_metadata as ResponseMetadata;\n const isAnthropicMessage =\n \"model_provider\" in responseMetadata &&\n responseMetadata?.model_provider === \"anthropic\";\n for (const block of message.contentBlocks) {\n if (block.type === \"text\") {\n if (block.annotations) {\n result.push({\n type: \"text\",\n text: block.text,\n citations: _formatStandardCitations(\n block.annotations as ContentBlock.Citation[]\n ),\n });\n } else {\n result.push({\n type: \"text\",\n text: block.text,\n });\n }\n } else if (block.type === \"tool_call\") {\n result.push({\n type: \"tool_use\",\n id: block.id ?? \"\",\n name: block.name,\n input: block.args,\n });\n } else if (block.type === \"tool_call_chunk\") {\n const input = iife(() => {\n if (typeof block.args !== \"string\") {\n return block.args;\n }\n try {\n return JSON.parse(block.args);\n } catch {\n return {};\n }\n });\n result.push({\n type: \"tool_use\",\n id: block.id ?? \"\",\n name: block.name ?? \"\",\n input,\n });\n } else if (block.type === \"reasoning\" && isAnthropicMessage) {\n result.push({\n type: \"thinking\",\n thinking: block.reasoning,\n signature: String(block.signature),\n });\n } else if (block.type === \"server_tool_call\" && isAnthropicMessage) {\n if (block.name === \"web_search\") {\n result.push({\n type: \"server_tool_use\",\n name: block.name,\n id: block.id ?? \"\",\n input: block.args,\n });\n } else if (block.name === \"code_execution\") {\n result.push({\n type: \"server_tool_use\",\n name: block.name,\n id: block.id ?? \"\",\n input: block.args,\n });\n }\n } else if (block.type === \"server_tool_call_result\" && isAnthropicMessage) {\n if (block.name === \"web_search\" && Array.isArray(block.output.urls)) {\n const content = block.output.urls.map((url) => ({\n type: \"web_search_result\" as const,\n title: \"\",\n encrypted_content: \"\",\n url,\n }));\n result.push({\n type: \"web_search_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n content,\n });\n } else if (block.name === \"code_execution\") {\n result.push({\n type: \"code_execution_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: block.output as any,\n });\n } else if (block.name === \"mcp_tool_result\") {\n result.push({\n type: \"mcp_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: block.output as any,\n });\n }\n } else if (block.type === \"audio\") {\n throw new Error(\"Anthropic does not support audio content blocks.\");\n } else if (block.type === \"file\") {\n const metadata = block.metadata;\n if (block.fileId) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"file\",\n file_id: block.fileId,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.url) {\n const mimeType = _normalizeMimeType(block.mimeType);\n if (mimeType === \"application/pdf\" || mimeType === \"\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"url\",\n url: block.url,\n },\n },\n metadata\n )\n );\n continue;\n }\n }\n if (block.data) {\n const mimeType = _normalizeMimeType(block.mimeType);\n if (mimeType === \"\" || mimeType === \"application/pdf\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: \"application/pdf\",\n },\n },\n metadata\n )\n );\n } else if (mimeType === \"text/plain\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"text\",\n data: _formatBase64Data(block.data),\n media_type: \"text/plain\",\n },\n },\n metadata\n )\n );\n } else {\n if (_hasAllowedImageMimeType(mimeType)) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"content\",\n content: [\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: mimeType,\n },\n },\n ],\n },\n },\n metadata\n )\n );\n } else {\n throw new Error(\n `Unsupported file mime type for Anthropic base64 source: ${mimeType}`\n );\n }\n }\n continue;\n }\n throw new Error(\n \"File content block must include a fileId, url, or data property.\"\n );\n } else if (block.type === \"image\") {\n const metadata = block.metadata;\n if (block.fileId) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"file\",\n file_id: block.fileId,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.url) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"url\",\n url: block.url,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.data) {\n const mimeType = _normalizeMimeType(block.mimeType) || \"image/png\";\n if (_hasAllowedImageMimeType(mimeType)) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: mimeType,\n },\n },\n metadata\n )\n );\n }\n continue;\n }\n throw new Error(\n \"Image content block must include a fileId, url, or data property.\"\n );\n } else if (block.type === \"video\") {\n // no-op\n } else if (block.type === \"text-plain\") {\n if (block.data) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"text\",\n data: _formatBase64Data(block.data),\n media_type: \"text/plain\",\n },\n },\n block.metadata\n )\n );\n }\n } else if (block.type === \"non_standard\" && isAnthropicMessage) {\n result.push(block.value as Anthropic.Beta.BetaContentBlockParam);\n }\n }\n return result;\n}\n"],"mappings":"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"}
|
package/dist/utils/standard.js
CHANGED
|
@@ -96,16 +96,17 @@ function _formatStandardContent(message) {
|
|
|
96
96
|
const result = [];
|
|
97
97
|
const responseMetadata = message.response_metadata;
|
|
98
98
|
const isAnthropicMessage = "model_provider" in responseMetadata && responseMetadata?.model_provider === "anthropic";
|
|
99
|
-
for (const block of message.contentBlocks) if (block.type === "text")
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
99
|
+
for (const block of message.contentBlocks) if (block.type === "text") {
|
|
100
|
+
if (block.annotations) result.push({
|
|
101
|
+
type: "text",
|
|
102
|
+
text: block.text,
|
|
103
|
+
citations: _formatStandardCitations(block.annotations)
|
|
104
|
+
});
|
|
105
|
+
else result.push({
|
|
106
|
+
type: "text",
|
|
107
|
+
text: block.text
|
|
108
|
+
});
|
|
109
|
+
} else if (block.type === "tool_call") result.push({
|
|
109
110
|
type: "tool_use",
|
|
110
111
|
id: block.id ?? "",
|
|
111
112
|
name: block.name,
|