UNPKG

@langchain/core

Version:
123 lines (122 loc) • 4.19 kB
import { _isContentBlock, _isObject, _isString, iife } from "./utils.js"; // src/messages/block_translators/google.ts const GEMINI_REFUSAL_FINISH_REASONS = /* @__PURE__ */ new Set([ "SAFETY", "PROHIBITED_CONTENT", "BLOCKLIST" ]); /** * Builds a refusal block from a Gemini finish reason. * * A blocked prompt has no message: `@langchain/google` throws * `PromptBlockedError` for it instead. */ function refusalFromMetadata(message) { const metadata = message.response_metadata; const kwargs = message.additional_kwargs; const finishReason = metadata.finishReason ?? metadata.finish_reason ?? kwargs.finishReason; if (!_isString(finishReason) || !GEMINI_REFUSAL_FINISH_REASONS.has(finishReason)) return; const finishMessage = metadata.finishMessage ?? kwargs.finishMessage; return { type: "refusal", refusal: _isString(finishMessage) ? finishMessage : "", extras: { finishReason } }; } function convertToV1FromChatGoogleMessage(message) { function* iterateContent() { const content = iife(() => { if (typeof message.content === "string") { if (message.additional_kwargs.originalTextContentBlock) return [{ ...message.additional_kwargs.originalTextContentBlock, type: "text" }]; else return [{ type: "text", text: message.content }]; } else { const originalBlock = message.additional_kwargs?.originalTextContentBlock; if (originalBlock?.thoughtSignature) { if (!message.content.some((b) => "thoughtSignature" in b)) { const result = [...message.content]; for (let i = result.length - 1; i >= 0; i--) { const block = result[i]; if (block.type === "text" && !block.thought) { block.thoughtSignature = originalBlock.thoughtSignature; return result; } } } } return message.content; } }); for (const block of content) { const contentBlockBase = iife(() => { if (_isContentBlock(block, "text") && _isString(block.text)) return { type: "text", text: block.text }; else if (_isContentBlock(block, "inlineData") && _isObject(block.inlineData) && _isString(block.inlineData.mimeType) && _isString(block.inlineData.data)) return { type: "file", mimeType: block.inlineData.mimeType, data: block.inlineData.data }; else if (_isContentBlock(block, "functionCall") && _isObject(block.functionCall) && _isString(block.functionCall.name) && _isObject(block.functionCall.args)) return { type: "tool_call", id: message.id, name: block.functionCall.name, args: block.functionCall.args }; else if (_isContentBlock(block, "functionResponse")) return { type: "non_standard", value: block }; else if (_isContentBlock(block, "fileData") && _isObject(block.fileData) && _isString(block.fileData.mimeType) && _isString(block.fileData.fileUri)) return { type: "file", mimeType: block.fileData.mimeType, fileId: block.fileData.fileUri }; else if (_isContentBlock(block, "executableCode")) return { type: "non_standard", value: block }; else if (_isContentBlock(block, "codeExecutionResult")) return { type: "non_standard", value: block }; return { type: "non_standard", value: block }; }); const contentBlock = iife(() => { if ("thought" in block && block.thought) return { type: "reasoning", reasoning: contentBlockBase.type === "text" ? contentBlockBase.text : "", reasoningContentBlock: contentBlockBase }; else return contentBlockBase; }); const ret = { thought: block.thought, thoughtSignature: block.thoughtSignature, partMetadata: block.partMetadata, ...contentBlock }; for (const attribute in ret) if (ret[attribute] === void 0) delete ret[attribute]; yield ret; } } const blocks = Array.from(iterateContent()); const refusal = refusalFromMetadata(message); if (refusal) blocks.push(refusal); return blocks; } const ChatGoogleTranslator = { translateContent: convertToV1FromChatGoogleMessage, translateContentChunk: convertToV1FromChatGoogleMessage }; export { ChatGoogleTranslator }; //# sourceMappingURL=google.js.map