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