import { useCallback, useRef } from 'react'; import { MESSAGE_ROLES } from '../constants/playground.constants'; export const useSyncMessageAndCustomBody = ( customRequestMode, customRequestBody, message, inputs, setCustomRequestBody, setMessage, debouncedSaveConfig ) => { const isUpdatingFromMessage = useRef(false); const isUpdatingFromCustomBody = useRef(false); const lastMessageHash = useRef(''); const lastCustomBodyHash = useRef(''); const getMessageHash = useCallback((messages) => { return JSON.stringify(messages.map(msg => ({ id: msg.id, role: msg.role, content: msg.content }))); }, []); const getCustomBodyHash = useCallback((customBody) => { try { const parsed = JSON.parse(customBody); return JSON.stringify(parsed.messages || []); } catch { return ''; } }, []); const syncMessageToCustomBody = useCallback(() => { if (!customRequestMode || isUpdatingFromCustomBody.current) return; const currentMessageHash = getMessageHash(message); if (currentMessageHash === lastMessageHash.current) return; try { isUpdatingFromMessage.current = true; let customPayload; try { customPayload = JSON.parse(customRequestBody || '{}'); } catch { customPayload = { model: inputs.model || 'gpt-4o', messages: [], temperature: inputs.temperature || 0.7, stream: inputs.stream !== false }; } customPayload.messages = message.map(msg => ({ role: msg.role, content: msg.content })); const newCustomBody = JSON.stringify(customPayload, null, 2); setCustomRequestBody(newCustomBody); lastMessageHash.current = currentMessageHash; lastCustomBodyHash.current = getCustomBodyHash(newCustomBody); setTimeout(() => { debouncedSaveConfig(); }, 0); } finally { isUpdatingFromMessage.current = false; } }, [customRequestMode, customRequestBody, message, inputs.model, inputs.temperature, inputs.stream, getMessageHash, getCustomBodyHash, setCustomRequestBody, debouncedSaveConfig]); const syncCustomBodyToMessage = useCallback(() => { if (!customRequestMode || isUpdatingFromMessage.current) return; const currentCustomBodyHash = getCustomBodyHash(customRequestBody); if (currentCustomBodyHash === lastCustomBodyHash.current) return; try { isUpdatingFromCustomBody.current = true; const customPayload = JSON.parse(customRequestBody || '{}'); if (customPayload.messages && Array.isArray(customPayload.messages)) { const newMessages = customPayload.messages.map((msg, index) => ({ id: msg.id || (index + 1).toString(), role: msg.role || MESSAGE_ROLES.USER, content: msg.content || '', createAt: Date.now(), ...(msg.role === MESSAGE_ROLES.ASSISTANT && { reasoningContent: msg.reasoningContent || '', isReasoningExpanded: false }) })); setMessage(newMessages); lastCustomBodyHash.current = currentCustomBodyHash; lastMessageHash.current = getMessageHash(newMessages); } } catch (error) { console.warn('同步自定义请求体到消息失败:', error); } finally { isUpdatingFromCustomBody.current = false; } }, [customRequestMode, customRequestBody, getCustomBodyHash, getMessageHash, setMessage]); return { syncMessageToCustomBody, syncCustomBodyToMessage }; };