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