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