Explorar el Código

修复前端 TypeScript 构建阻塞问题

SamLee hace 2 días
padre
commit
00bc74d47f

+ 0 - 3
frontend/react-template/src/api/traceApi.ts

@@ -96,9 +96,6 @@ export const traceApi = {
     }>("/api/traces/upload", {
       method: "POST",
       data: formData,
-      headers: {
-        "Content-Type": "multipart/form-data",
-      },
     });
   },
   fetchKnowledgeLog(traceId: string) {

+ 2 - 3
frontend/react-template/src/components/DetailPanel/DetailPanel.tsx

@@ -200,7 +200,7 @@ export const DetailPanel = ({ node, edge, messages = [], onClose, traceId }: Det
       return {
         goalId: msg.goal_id,
         messageId: msg.message_id || msg.id,
-        sequence: msg.sequence,
+        sequence: msg.sequence ?? undefined,
       };
     }
   };
@@ -327,8 +327,7 @@ export const DetailPanel = ({ node, edge, messages = [], onClose, traceId }: Det
                 <div className={styles.section}>
                   <div className={styles.label}>内容</div>
                   <div className={styles.value}>
-                    {node.content &&
-                      renderMessageContent(node.content, isMessageNode(node) ? node.message_id || node.id : node.id)}
+                    {node.content && renderMessageContent(node.content, node.message_id || node.id)}
                   </div>
                 </div>
                 {node.goal_id && (

+ 4 - 3
frontend/react-template/src/components/FlowChart/FlowChart.tsx

@@ -22,6 +22,7 @@ export interface FlowChartRef {
 }
 
 export type SubTraceEntry = { id: string; mission?: string };
+type FlowMessage = Message & { _injectedGoalId?: string };
 
 const normalizeSubTraceEntries = (goal: Goal): SubTraceEntry[] =>
   (goal.sub_trace_ids ?? [])
@@ -174,7 +175,7 @@ const FlowChartComponent: ForwardRefRenderFunction<FlowChartRef, FlowChartProps>
       return false;
     };
 
-    let allMessages: (Message & { _injectedGoalId: string })[] = [];
+    let allMessages: FlowMessage[] = [];
     Object.entries(msgGroups).forEach(([goalId, msgs]) => {
       msgs.forEach((m) => {
         allMessages.push({ ...m, id: m.id || m.message_id, _injectedGoalId: goalId });
@@ -202,7 +203,7 @@ const FlowChartComponent: ForwardRefRenderFunction<FlowChartRef, FlowChartProps>
     const foldedNodeMap = new Map<string, LayoutNode>();
     const timelineNodes: LayoutNode[] = [];
 
-    const timelineItems: (Message | { _isFoldedNode: true, goalId: string, count: number })[] = [];
+    const timelineItems: (FlowMessage | { _isFoldedNode: true; goalId: string; count: number })[] = [];
     const foldedGoalsContent = new Map<string, number>();
 
     let currentFold: string | null = null;
@@ -256,7 +257,7 @@ const FlowChartComponent: ForwardRefRenderFunction<FlowChartRef, FlowChartProps>
           foldedNodeMap.set(item.goalId, node);
         }
       } else {
-        const msg = item as Message;
+        const msg = item as FlowMessage;
         let marker: LayoutNode["marker"] = undefined;
         const mc = typeof msg.content === "object" && msg.content ? msg.content : null;
 

+ 0 - 2
frontend/react-template/src/components/FlowChart/hooks/useFlowChartData.ts

@@ -41,8 +41,6 @@ const buildSubGoals = (flatGoals: Goal[]): Goal[] => {
   });
 };
 
-import { processRetryLogic } from "../utils/retryLogic";
-
 // FlowChart 专用数据 Hook:处理实时事件并聚合消息组
 export const useFlowChartData = (traceId: string | null, refreshTrigger?: number) => {
   const [goals, setGoals] = useState<Goal[]>([]);

+ 8 - 5
frontend/react-template/src/components/KnowledgeFeedbackModal/KnowledgeFeedbackModal.tsx

@@ -1,6 +1,7 @@
 import { useEffect, useState } from "react";
 import type { FC } from "react";
 import { Modal, RadioGroup, Radio, Select, Toast } from "@douyinfe/semi-ui";
+import type { RadioChangeEvent } from "@douyinfe/semi-ui/lib/es/radio";
 import { traceApi } from "../../api/traceApi";
 import type { KnowledgeLogEntry, FeedbackAction, KnowledgeFeedbackState } from "../../types/goal";
 import type { KnowledgeFeedbackListItem } from "../../api/traceApi";
@@ -252,7 +253,7 @@ export const KnowledgeFeedbackModal: FC<KnowledgeFeedbackModalProps> = ({
                     <span className={styles.feedbackLabel}>您的反馈:</span>
                     <RadioGroup
                       value={fb.action}
-                      onChange={(e) =>
+                      onChange={(e: RadioChangeEvent) =>
                         setFeedback(entry.knowledge_id, { action: e.target.value as FeedbackAction })
                       }
                       direction="horizontal"
@@ -270,11 +271,13 @@ export const KnowledgeFeedbackModal: FC<KnowledgeFeedbackModalProps> = ({
                     <div className={styles.overrideForm}>
                       <div className={styles.overrideRow}>
                         <span className={styles.overrideLabel}>评估结果:</span>
-                        <Select
+                        <Select<string>
                           value={fb.eval_status}
-                          onChange={(v) =>
-                            setFeedback(entry.knowledge_id, { eval_status: v as string })
-                          }
+                          onChange={(value) => {
+                            if (typeof value === "string") {
+                              setFeedback(entry.knowledge_id, { eval_status: value });
+                            }
+                          }}
                           optionList={EVAL_STATUS_OPTIONS}
                           style={{ width: 220 }}
                           placeholder="请选择评估结果"

+ 5 - 4
frontend/react-template/src/components/MainContent/MainContent.tsx

@@ -127,11 +127,12 @@ export const MainContent: FC<MainContentProps> = ({
           )}
         </div>
         <div className={styles.headerRight}>
-          <Select
-            value={traceId}
-            onChange={(value: unknown) => {
+          <Select<string>
+            value={traceId ?? undefined}
+            onChange={(value) => {
+              if (typeof value !== "string") return;
               const trace = traceList.find((t) => t.trace_id === value);
-              onTraceChange?.(value as string, trace?.task || trace?.trace_id);
+              onTraceChange?.(value, trace?.task || trace?.trace_id);
             }}
             style={{ width: 400 }}
             placeholder="选择 Trace"

+ 2 - 2
frontend/react-template/src/components/TopBar/TopBar.tsx

@@ -121,8 +121,8 @@ export const TopBar: FC<TopBarProps> = ({
     }
   };
 
-  const handleExampleChange = async (value: string) => {
-    if (!value) return;
+  const handleExampleChange = async (value: unknown) => {
+    if (typeof value !== "string" || !value) return;
 
     try {
       const promptData = await traceApi.fetchExamplePrompt(value);

+ 1 - 0
frontend/react-template/tsconfig.json

@@ -6,6 +6,7 @@
     "module": "ESNext",
     "skipLibCheck": true,
     "moduleResolution": "node",
+    "allowSyntheticDefaultImports": true,
     "allowImportingTsExtensions": true,
     "resolveJsonModule": true,
     "isolatedModules": true,