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