Skip to content

Commit 31007b9

Browse files
committed
backup
1 parent f7db538 commit 31007b9

File tree

5 files changed

+237
-14
lines changed

5 files changed

+237
-14
lines changed

backend/app/schemas/response.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,5 +106,10 @@ class WriterMessage(AgentMessage):
106106

107107
# 所有可能的消息类型
108108
MessageType = Union[
109-
SystemMessage, UserMessage, ModelerMessage, CoderMessage, WriterMessage
109+
SystemMessage,
110+
UserMessage,
111+
ModelerMessage,
112+
CoderMessage,
113+
WriterMessage,
114+
CoordinatorMessage,
110115
]

frontend/src/components/AgentEditor/ModelerEditor.vue

Lines changed: 173 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,180 @@
11
<script setup lang="ts">
2+
import { computed } from 'vue'
3+
import { useTaskStore } from '@/stores/task'
4+
import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'
5+
import { Separator } from '@/components/ui/separator'
26
7+
const taskStore = useTaskStore()
8+
9+
// 获取最新的CoordinatorMessage
10+
const latestCoordinatorMessage = computed(() => {
11+
const messages = taskStore.coordinatorMessages
12+
return messages.length > 0 ? messages[messages.length - 1] : null
13+
})
14+
15+
// 解析CoordinatorMessage的JSON内容
16+
const coordinatorData = computed(() => {
17+
if (!latestCoordinatorMessage.value?.content) return null
18+
19+
try {
20+
const content = latestCoordinatorMessage.value.content
21+
// 移除可能的```json标记
22+
const cleanContent = content.replace(/```json\n?/, '').replace(/```$/, '').trim()
23+
return JSON.parse(cleanContent)
24+
} catch (error) {
25+
console.error('解析CoordinatorMessage失败:', error)
26+
return null
27+
}
28+
})
29+
30+
// 获取最新的ModelerMessage
31+
const latestModelerMessage = computed(() => {
32+
const messages = taskStore.modelerMessages
33+
return messages.length > 0 ? messages[messages.length - 1] : null
34+
})
35+
36+
// 解析ModelerMessage的JSON内容
37+
const modelerData = computed(() => {
38+
if (!latestModelerMessage.value?.content) return null
39+
40+
try {
41+
const content = latestModelerMessage.value.content
42+
// 移除可能的```json标记
43+
const cleanContent = content.replace(/```json\n?/, '').replace(/```$/, '').trim()
44+
return JSON.parse(cleanContent)
45+
} catch (error) {
46+
console.error('解析ModelerMessage失败:', error)
47+
return null
48+
}
49+
})
50+
51+
// 生成问题列表
52+
const questionsList = computed(() => {
53+
if (!coordinatorData.value) return []
54+
55+
const questions = []
56+
for (let i = 1; i <= coordinatorData.value.ques_count; i++) {
57+
const quesKey = `ques${i}`
58+
if (coordinatorData.value[quesKey]) {
59+
questions.push({
60+
number: i,
61+
content: coordinatorData.value[quesKey]
62+
})
63+
}
64+
}
65+
return questions
66+
})
367
</script>
68+
469
<template>
5-
<div class="h-full min-w-0 pb-4">
6-
modeler editor
70+
<div class="h-full min-w-0 flex flex-col">
71+
<!-- 上半部分:CoordinatorMessage 结构化信息 -->
72+
<div class="flex-1 p-4 overflow-auto">
73+
<Card class="h-full">
74+
<CardHeader>
75+
<CardTitle class="text-lg font-semibold">题目信息</CardTitle>
76+
</CardHeader>
77+
<CardContent class="space-y-4">
78+
<div v-if="coordinatorData">
79+
<!-- 题目标题 -->
80+
<div class="space-y-2">
81+
<h3 class="text-base font-medium text-gray-700">题目标题</h3>
82+
<div class="text-lg font-semibold text-gray-900">
83+
{{ coordinatorData.title }}
84+
</div>
85+
</div>
86+
87+
<Separator />
88+
89+
<!-- 题目背景 -->
90+
<div class="space-y-2">
91+
<h3 class="text-base font-medium text-gray-700">题目背景</h3>
92+
<div class="text-sm text-gray-800 leading-relaxed whitespace-pre-wrap">
93+
{{ coordinatorData.background }}
94+
</div>
95+
</div>
96+
97+
<Separator />
98+
99+
<!-- 问题数量和问题列表 -->
100+
<div class="space-y-2">
101+
<div class="flex items-center gap-2">
102+
<h3 class="text-base font-medium text-gray-700">问题列表</h3>
103+
<span class="px-2 py-1 text-xs bg-gray-100 rounded">{{ coordinatorData.ques_count }} 个问题</span>
104+
</div>
105+
106+
<div class="space-y-3">
107+
<div v-for="question in questionsList" :key="question.number"
108+
class="border-l-4 border-blue-500 pl-4 py-2 bg-blue-50 rounded-r">
109+
<div class="text-sm font-medium text-blue-700 mb-1">
110+
问题 {{ question.number }}
111+
</div>
112+
<div class="text-sm text-gray-800 leading-relaxed">
113+
{{ question.content }}
114+
</div>
115+
</div>
116+
</div>
117+
</div>
118+
</div>
119+
120+
<div v-else class="text-center py-8 text-gray-500">
121+
暂无题目信息
122+
</div>
123+
</CardContent>
124+
</Card>
125+
</div>
126+
127+
<!-- 下半部分:ModelerMessage 建模手册 -->
128+
<div class="flex-1 p-4 pt-0 overflow-auto">
129+
<Card class="h-full">
130+
<CardHeader>
131+
<CardTitle class="text-lg font-semibold">建模手册</CardTitle>
132+
</CardHeader>
133+
<CardContent>
134+
<div v-if="modelerData" class="space-y-4">
135+
<!-- EDA部分 -->
136+
<div v-if="modelerData.eda" class="space-y-2">
137+
<h3 class="text-base font-medium text-gray-700 flex items-center gap-2">
138+
<span class="px-2 py-1 text-xs bg-gray-200 border rounded">EDA</span>
139+
探索性数据分析
140+
</h3>
141+
<div class="text-sm text-gray-800 leading-relaxed whitespace-pre-wrap bg-gray-50 p-3 rounded">
142+
{{ modelerData.eda }}
143+
</div>
144+
</div>
145+
146+
<!-- 问题解决方案 -->
147+
<div v-for="question in questionsList" :key="`solution-${question.number}`" class="space-y-2">
148+
<div v-if="modelerData[`ques${question.number}`]">
149+
<h3 class="text-base font-medium text-gray-700 flex items-center gap-2">
150+
<span class="px-2 py-1 text-xs bg-gray-200 border rounded">问题{{ question.number }}</span>
151+
解决方案
152+
</h3>
153+
<div
154+
class="text-sm text-gray-800 leading-relaxed whitespace-pre-wrap bg-green-50 p-3 rounded border-l-4 border-green-500">
155+
{{ modelerData[`ques${question.number}`] }}
156+
</div>
157+
</div>
158+
</div>
159+
160+
<!-- 敏感性分析 -->
161+
<div v-if="modelerData.sensitivity_analysis" class="space-y-2">
162+
<h3 class="text-base font-medium text-gray-700 flex items-center gap-2">
163+
<span class="px-2 py-1 text-xs bg-gray-200 border rounded">敏感性分析</span>
164+
</h3>
165+
<div
166+
class="text-sm text-gray-800 leading-relaxed whitespace-pre-wrap bg-orange-50 p-3 rounded border-l-4 border-orange-500">
167+
{{ modelerData.sensitivity_analysis }}
168+
</div>
169+
</div>
170+
</div>
171+
172+
<div v-else class="text-center py-8 text-gray-500">
173+
暂无建模手册信息
174+
</div>
175+
</CardContent>
176+
</Card>
177+
</div>
7178
</div>
8179
</template>
9180

frontend/src/components/UserStepper.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ import { submitModelingTask } from '@/apis/submitModelingApi'
1616
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
1717
import { Rocket } from 'lucide-vue-next'
1818
import { useRouter } from 'vue-router'
19+
import { useTaskStore } from '@/stores/task'
20+
21+
const taskStore = useTaskStore()
1922
2023
const currentStep = ref(1)
2124
const fileUploaded = ref(true)
@@ -102,6 +105,7 @@ const handleSubmit = async () => {
102105
)
103106
104107
taskId.value = response?.data?.task_id ?? null
108+
taskStore.addUserMessage(question.value)
105109
106110
showSubmitSuccess.value = true
107111
setTimeout(() => {

frontend/src/stores/task.ts

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { defineStore } from 'pinia'
22
import { ref, computed } from 'vue'
33
import { TaskWebSocket } from '@/utils/websocket'
4-
import type { Message, CoderMessage, WriterMessage } from '@/utils/response'
4+
import type { Message, CoderMessage, WriterMessage, UserMessage, ModelerMessage, CoordinatorMessage } from '@/utils/response'
55
// import messageData from '@/test/20250524-115938-d4c84576.json'
66
import messageData from '@/test/20250524-133152-0f9d6be8.json'
7+
import { AgentType } from '@/utils/enum'
78

89
export const useTaskStore = defineStore('task', () => {
910
// 初始化时直接加载测试数据,确保页面首次渲染时有数据
@@ -30,6 +31,14 @@ export const useTaskStore = defineStore('task', () => {
3031
ws?.close()
3132
}
3233

34+
function addUserMessage(content: string) {
35+
messages.value.push({
36+
id: Date.now().toString(),
37+
msg_type: 'user',
38+
content: content,
39+
} as UserMessage)
40+
}
41+
3342
// 下载消息
3443
function downloadMessages() {
3544
const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(messages.value, null, 2))
@@ -45,31 +54,49 @@ export const useTaskStore = defineStore('task', () => {
4554
const chatMessages = computed(() =>
4655
messages.value.filter(
4756
(msg) => {
48-
if (msg.msg_type === 'agent' && msg.agent_type === 'CoderAgent' && msg.content == null) {
57+
if (msg.msg_type === 'agent' && msg.agent_type === AgentType.CODER && msg.content == null) {
4958
return false
5059
}
51-
if (msg.msg_type === 'agent' && msg.agent_type === 'WriterAgent') {
60+
if (msg.msg_type === 'agent' && msg.agent_type === AgentType.WRITER) {
5261
return false
5362
}
5463
return msg.msg_type === 'agent' && msg.content || msg.msg_type === 'system'
5564
}
5665
)
5766
)
5867

68+
const coordinatorMessages = computed(() =>
69+
messages.value.filter(
70+
(msg): msg is CoordinatorMessage =>
71+
msg.msg_type === 'agent' &&
72+
msg.agent_type === AgentType.COORDINATOR &&
73+
msg.content != null
74+
)
75+
)
76+
77+
const modelerMessages = computed(() =>
78+
messages.value.filter(
79+
(msg): msg is ModelerMessage =>
80+
msg.msg_type === 'agent' &&
81+
msg.agent_type === AgentType.MODELER &&
82+
msg.content != null
83+
)
84+
)
85+
5986
const coderMessages = computed(() =>
6087
messages.value.filter(
6188
(msg): msg is CoderMessage =>
6289
msg.msg_type === 'agent' &&
63-
msg.agent_type === 'CoderAgent' &&
64-
(msg.code != null || msg.code_results != null)
90+
msg.agent_type === AgentType.CODER &&
91+
msg.content != null
6592
)
6693
)
6794

6895
const writerMessages = computed(() =>
6996
messages.value.filter(
7097
(msg): msg is WriterMessage =>
7198
msg.msg_type === 'agent' &&
72-
msg.agent_type === 'WriterAgent' &&
99+
msg.agent_type === AgentType.WRITER &&
73100
msg.content != null
74101
)
75102
)
@@ -79,7 +106,7 @@ export const useTaskStore = defineStore('task', () => {
79106
// 反向遍历消息找到最新的文件列表
80107
for (let i = coderMessages.value.length - 1; i >= 0; i--) {
81108
const msg = coderMessages.value[i]
82-
if ('files' in msg && msg.files?.length) {
109+
if ('files' in msg && msg.files && Array.isArray(msg.files) && msg.files.length > 0) {
83110
console.log('找到文件列表:', msg.files)
84111
return msg.files
85112
}
@@ -96,11 +123,14 @@ export const useTaskStore = defineStore('task', () => {
96123
return {
97124
messages,
98125
chatMessages,
126+
coordinatorMessages,
127+
modelerMessages,
99128
coderMessages,
100129
writerMessages,
101130
files,
102131
connectWebSocket,
103132
closeWebSocket,
104-
downloadMessages
133+
downloadMessages,
134+
addUserMessage
105135
}
106136
})

frontend/src/utils/response.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export interface ToolMessage extends BaseMessage {
1515
msg_type: 'tool';
1616
tool_name: 'execute_code' | 'search_scholar';
1717
input: {};
18-
output: [];
18+
output: string[] | OutputItem[];
1919
}
2020

2121
export interface SystemMessage extends BaseMessage {
@@ -79,7 +79,20 @@ export interface ErrorExecution extends BaseCodeExecution {
7979
traceback: string;
8080
}
8181

82-
export type CodeExecutionResult = StdOutExecution | StdErrExecution | ResultExecution | ErrorExecution;
82+
export type OutputItem = StdOutExecution | StdErrExecution | ResultExecution | ErrorExecution;
83+
84+
export interface ScholarMessage extends ToolMessage {
85+
tool_name: 'search_scholar';
86+
input: {};
87+
output: string[];
88+
}
89+
90+
export interface InterpreterMessage extends ToolMessage {
91+
tool_name: 'execute_code';
92+
input: {};
93+
output: OutputItem[];
94+
}
95+
8396

8497
export interface CoderMessage extends AgentMessage {
8598
agent_type: AgentType.CODER;
@@ -90,4 +103,4 @@ export interface WriterMessage extends AgentMessage {
90103
sub_title?: string;
91104
}
92105

93-
export type Message = SystemMessage | UserMessage | CoderMessage | WriterMessage;
106+
export type Message = SystemMessage | UserMessage | CoderMessage | WriterMessage | ModelerMessage | CoordinatorMessage;

0 commit comments

Comments
 (0)