UNPKG

@langchain/anthropic

Version:
197 lines (195 loc) 6.74 kB
import { extractToolCalls } from "../output_parsers.js"; import { _isAnthropicCompactionBlock } from "./content.js"; import { AIMessage, AIMessageChunk } from "@langchain/core/messages"; //#region src/utils/message_outputs.ts function _makeMessageChunkFromAnthropicEvent(data, fields) { const response_metadata = { model_provider: "anthropic" }; if (data.type === "message_start") { const { content, usage, ...additionalKwargs } = data.message; const filteredAdditionalKwargs = {}; for (const [key, value] of Object.entries(additionalKwargs)) if (value !== void 0 && value !== null) filteredAdditionalKwargs[key] = value; const { input_tokens, output_tokens, ...rest } = usage ?? {}; const usageMetadata = buildUsageMetadata(usage); return { chunk: new AIMessageChunk({ content: fields.coerceContentToString ? "" : [], additional_kwargs: filteredAdditionalKwargs, usage_metadata: fields.streamUsage ? usageMetadata : void 0, response_metadata: { ...response_metadata, usage: { ...rest } }, id: data.message.id }) }; } else if (data.type === "message_delta") { const usageMetadata = { input_tokens: 0, output_tokens: data.usage.output_tokens, total_tokens: data.usage.output_tokens, input_token_details: { cache_creation: data.usage.cache_creation_input_tokens, cache_read: data.usage.cache_read_input_tokens } }; const responseMetadata = "context_management" in data.delta ? { context_management: data.delta.context_management } : void 0; return { chunk: new AIMessageChunk({ content: fields.coerceContentToString ? "" : [], response_metadata: responseMetadata, additional_kwargs: { ...data.delta }, usage_metadata: fields.streamUsage ? usageMetadata : void 0 }) }; } else if (data.type === "content_block_start" && [ "tool_use", "document", "server_tool_use", "web_search_tool_result" ].includes(data.content_block.type)) { const contentBlock = data.content_block; let toolCallChunks; if (contentBlock.type === "tool_use") toolCallChunks = [{ id: contentBlock.id, index: data.index, name: contentBlock.name, args: "" }]; else toolCallChunks = []; return { chunk: new AIMessageChunk({ content: fields.coerceContentToString ? "" : [{ index: data.index, ...data.content_block, input: contentBlock.type === "server_tool_use" || contentBlock.type === "tool_use" ? "" : void 0 }], response_metadata, additional_kwargs: {}, tool_call_chunks: toolCallChunks }) }; } else if (data.type === "content_block_delta" && [ "text_delta", "citations_delta", "thinking_delta", "signature_delta" ].includes(data.delta.type)) if (fields.coerceContentToString && "text" in data.delta) return { chunk: new AIMessageChunk({ content: data.delta.text }) }; else { const contentBlock = data.delta; if ("citation" in contentBlock) { contentBlock.citations = [contentBlock.citation]; delete contentBlock.citation; } if (contentBlock.type === "thinking_delta" || contentBlock.type === "signature_delta") return { chunk: new AIMessageChunk({ content: [{ index: data.index, ...contentBlock, type: "thinking" }], response_metadata }) }; return { chunk: new AIMessageChunk({ content: [{ index: data.index, ...contentBlock, type: "text" }], response_metadata }) }; } else if (data.type === "content_block_delta" && data.delta.type === "input_json_delta") return { chunk: new AIMessageChunk({ content: fields.coerceContentToString ? "" : [{ index: data.index, input: data.delta.partial_json, type: data.delta.type }], response_metadata, additional_kwargs: {}, tool_call_chunks: [{ index: data.index, args: data.delta.partial_json }] }) }; else if (data.type === "content_block_start" && data.content_block.type === "text") { const content = data.content_block?.text; if (content !== void 0) return { chunk: new AIMessageChunk({ content: fields.coerceContentToString ? content : [{ index: data.index, ...data.content_block }], response_metadata, additional_kwargs: {} }) }; } else if (data.type === "content_block_start" && data.content_block.type === "redacted_thinking") return { chunk: new AIMessageChunk({ content: fields.coerceContentToString ? "" : [{ index: data.index, ...data.content_block }], response_metadata }) }; else if (data.type === "content_block_start" && data.content_block.type === "thinking") { const content = data.content_block.thinking; return { chunk: new AIMessageChunk({ content: fields.coerceContentToString ? content : [{ index: data.index, ...data.content_block }], response_metadata }) }; } else if (data.type === "content_block_start" && _isAnthropicCompactionBlock(data.content_block)) return { chunk: new AIMessageChunk({ content: fields.coerceContentToString ? "" : [{ index: data.index, ...data.content_block }], response_metadata }) }; else if (data.type === "content_block_delta" && data.delta.type === "compaction_delta") return { chunk: new AIMessageChunk({ content: fields.coerceContentToString ? "" : [{ index: data.index, ...data.delta, type: "compaction" }], response_metadata }) }; return null; } function anthropicResponseToChatMessages(messages, additionalKwargs) { const response_metadata = { ...additionalKwargs, model_provider: "anthropic" }; const usage = additionalKwargs.usage; const usageMetadata = usage != null ? buildUsageMetadata(usage) : void 0; if (messages.length === 1 && messages[0].type === "text") return [{ text: messages[0].text, message: new AIMessage({ content: messages[0].text, additional_kwargs: additionalKwargs, usage_metadata: usageMetadata, response_metadata, id: additionalKwargs.id }) }]; else return [{ text: "", message: new AIMessage({ content: messages, additional_kwargs: additionalKwargs, tool_calls: extractToolCalls(messages), usage_metadata: usageMetadata, response_metadata, id: additionalKwargs.id }) }]; } function buildUsageMetadata(usage) { const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0; const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0; const totalInputTokens = usage.input_tokens + cacheCreationInputTokens + cacheReadInputTokens; return { input_tokens: totalInputTokens, output_tokens: usage.output_tokens, total_tokens: totalInputTokens + usage.output_tokens, input_token_details: { cache_creation: cacheCreationInputTokens, cache_read: cacheReadInputTokens } }; } //#endregion export { _makeMessageChunkFromAnthropicEvent, anthropicResponseToChatMessages }; //# sourceMappingURL=message_outputs.js.map