| 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 | |
| }; | |
| }; |