import { memo, useState } from 'react'; import NodeShell from '../components/NodeShell.jsx'; import { useWorkflow } from '../context/WorkflowContext.jsx'; import { uploadContextFile } from '../lib/api.js'; import { getNodeAccent } from '../lib/nodeRegistry.js'; function arrayBufferToBase64(buffer) { const bytes = new Uint8Array(buffer); let binary = ''; bytes.forEach((byte) => { binary += String.fromCharCode(byte); }); return window.btoa(binary); } function KnowledgeAnswerFlowNode({ id, data, selected, type }) { const { backendUrl, getNodeHandles, patchNodeData } = useWorkflow(); const handles = getNodeHandles(type, data); const runtime = data.runtime || {}; const [isUploading, setIsUploading] = useState(false); const [uploadError, setUploadError] = useState(''); const handleUpload = async (event) => { const file = event.target.files?.[0]; event.target.value = ''; if (!file) { return; } setIsUploading(true); setUploadError(''); try { const contentBase64 = arrayBufferToBase64(await file.arrayBuffer()); const context = await uploadContextFile(backendUrl, file.name, contentBase64); patchNodeData(id, { source: 'uploaded', contextPath: context.context_path || '', originalPath: context.original_path || '', contextFilename: context.filename || file.name, contextCharacters: context.characters || 0, }); } catch (error) { console.error('Failed to upload knowledge context:', error); setUploadError(error instanceof Error ? error.message : 'Не удалось загрузить knowledge-файл'); } finally { setIsUploading(false); } }; return (
{data.source !== 'rag' ? ( ) : null}
{runtime.answer ? `Ответ: ${runtime.answer}` : 'Отвечает на последний вопрос пользователя по knowledge-файлу этой ноды или RAG-заглушке.'}
{isUploading ?
Загружаю и извлекаю текст...
: null} {uploadError ?
{uploadError}
: null} {runtime.error ?
{runtime.error}
: null}
); } export default memo(KnowledgeAnswerFlowNode);