|
|
@@ -24,10 +24,12 @@ export const TopBar: FC<TopBarProps> = ({
|
|
|
const [title, setTitle] = useState("流程图可视化系统");
|
|
|
const [isModalVisible, setIsModalVisible] = useState(false);
|
|
|
const [isInsertModalVisible, setIsInsertModalVisible] = useState(false);
|
|
|
+ const [isReflectModalVisible, setIsReflectModalVisible] = useState(false);
|
|
|
const [isExperienceModalVisible, setIsExperienceModalVisible] = useState(false);
|
|
|
const [experienceContent, setExperienceContent] = useState("");
|
|
|
const formApiRef = useRef<{ getValues: () => { system_prompt: string; user_prompt: string } } | null>(null);
|
|
|
const insertFormApiRef = useRef<{ getValues: () => { insert_prompt: string } } | null>(null);
|
|
|
+ const reflectFormApiRef = useRef<{ getValues: () => { reflect_focus: string } } | null>(null);
|
|
|
|
|
|
const isMessageNode = (node: Goal | Message): node is Message =>
|
|
|
"message_id" in node || "role" in node || "content" in node || "goal_id" in node || "tokens" in node;
|
|
|
@@ -112,6 +114,10 @@ export const TopBar: FC<TopBarProps> = ({
|
|
|
Toast.warning("请选择插入节点");
|
|
|
return;
|
|
|
}
|
|
|
+ if (!selectedTraceId) {
|
|
|
+ Toast.warning("请先选择一个 Trace");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
if (!isMessageNode(node)) {
|
|
|
Toast.warning("插入位置错误");
|
|
|
@@ -132,12 +138,11 @@ export const TopBar: FC<TopBarProps> = ({
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
- const sequence = (node as Message & { sequence?: number }).sequence;
|
|
|
const payload = {
|
|
|
messages: [{ role: "user" as const, content: insertPrompt }],
|
|
|
- after_sequence: typeof sequence === "number" ? sequence : undefined,
|
|
|
+ after_message_id: messageId,
|
|
|
};
|
|
|
- await traceApi.runTrace(messageId, payload);
|
|
|
+ await traceApi.runTrace(selectedTraceId, payload);
|
|
|
Toast.success("插入成功");
|
|
|
setIsInsertModalVisible(false);
|
|
|
onMessageInserted?.();
|
|
|
@@ -172,9 +177,20 @@ export const TopBar: FC<TopBarProps> = ({
|
|
|
Toast.warning("请先选择一个 Trace");
|
|
|
return;
|
|
|
}
|
|
|
+ setIsReflectModalVisible(true);
|
|
|
+ };
|
|
|
+
|
|
|
+ const handleReflectConfirm = async () => {
|
|
|
+ if (!selectedTraceId) {
|
|
|
+ Toast.warning("请先选择一个 Trace");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const values = reflectFormApiRef.current?.getValues();
|
|
|
+ const focus = values?.reflect_focus?.trim();
|
|
|
try {
|
|
|
- await traceApi.reflectTrace(selectedTraceId);
|
|
|
+ await traceApi.reflectTrace(selectedTraceId, focus ? { focus } : undefined);
|
|
|
Toast.success("已触发反思");
|
|
|
+ setIsReflectModalVisible(false);
|
|
|
} catch (error) {
|
|
|
console.error("Failed to reflect trace:", error);
|
|
|
Toast.error("反思请求失败");
|
|
|
@@ -271,6 +287,24 @@ export const TopBar: FC<TopBarProps> = ({
|
|
|
/>
|
|
|
</Form>
|
|
|
</Modal>
|
|
|
+ <Modal
|
|
|
+ title="反思"
|
|
|
+ visible={isReflectModalVisible}
|
|
|
+ onOk={handleReflectConfirm}
|
|
|
+ onCancel={() => setIsReflectModalVisible(false)}
|
|
|
+ centered
|
|
|
+ style={{ width: 600 }}
|
|
|
+ >
|
|
|
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
|
+ <Form getFormApi={(api: any) => (reflectFormApiRef.current = api)}>
|
|
|
+ <Form.TextArea
|
|
|
+ field="reflect_focus"
|
|
|
+ label="反思重点"
|
|
|
+ placeholder="请输入反思重点(可选)"
|
|
|
+ autosize={{ minRows: 3, maxRows: 6 }}
|
|
|
+ />
|
|
|
+ </Form>
|
|
|
+ </Modal>
|
|
|
<Modal
|
|
|
title="经验列表"
|
|
|
visible={isExperienceModalVisible}
|