MCPcopy Create free account
hub / github.com/aiprodcoder/MIXAPI / useApiRequest

Function useApiRequest

web/src/hooks/useApiRequest.js:16–410  ·  view source on GitHub ↗
(
  setMessage,
  setDebugData,
  setActiveDebugTab,
  sseSourceRef,
  saveMessages
)

Source from the content-addressed store, hash-verified

14} from '../helpers';
15
16export const useApiRequest = (
17 setMessage,
18 setDebugData,
19 setActiveDebugTab,
20 sseSourceRef,
21 saveMessages
22) => {
23 const { t } = useTranslation();
24
25 // 处理消息自动关闭逻辑的公共函数
26 const applyAutoCollapseLogic = useCallback((message, isThinkingComplete = true) => {
27 const shouldAutoCollapse = isThinkingComplete && !message.hasAutoCollapsed;
28 return {
29 isThinkingComplete,
30 hasAutoCollapsed: shouldAutoCollapse || message.hasAutoCollapsed,
31 isReasoningExpanded: shouldAutoCollapse ? false : message.isReasoningExpanded,
32 };
33 }, []);
34
35 // 流式消息更新
36 const streamMessageUpdate = useCallback((textChunk, type) => {
37 setMessage(prevMessage => {
38 const lastMessage = prevMessage[prevMessage.length - 1];
39 if (!lastMessage) return prevMessage;
40 if (lastMessage.role !== 'assistant') return prevMessage;
41 if (lastMessage.status === MESSAGE_STATUS.ERROR) {
42 return prevMessage;
43 }
44
45 if (lastMessage.status === MESSAGE_STATUS.LOADING ||
46 lastMessage.status === MESSAGE_STATUS.INCOMPLETE) {
47
48 let newMessage = { ...lastMessage };
49
50 if (type === 'reasoning') {
51 newMessage = {
52 ...newMessage,
53 reasoningContent: (lastMessage.reasoningContent || '') + textChunk,
54 status: MESSAGE_STATUS.INCOMPLETE,
55 isThinkingComplete: false,
56 };
57 } else if (type === 'content') {
58 const shouldCollapseReasoning = !lastMessage.content && lastMessage.reasoningContent;
59 const newContent = (lastMessage.content || '') + textChunk;
60
61 let shouldCollapseFromThinkTag = false;
62 let thinkingCompleteFromTags = lastMessage.isThinkingComplete;
63
64 if (lastMessage.isReasoningExpanded && newContent.includes('</think>')) {
65 const thinkMatches = newContent.match(/<think>/g);
66 const thinkCloseMatches = newContent.match(/<\/think>/g);
67 if (thinkMatches && thinkCloseMatches &&
68 thinkCloseMatches.length >= thinkMatches.length) {
69 shouldCollapseFromThinkTag = true;
70 thinkingCompleteFromTags = true; // think标签闭合也标记思考完成
71 }
72 }
73

Callers 1

index.jsFile · 0.90

Calls 6

handleApiErrorFunction · 0.90
processThinkTagsFunction · 0.90
saveMessagesFunction · 0.85
tFunction · 0.50

Tested by

no test coverage detected