feat: 修改调用逻辑

This commit is contained in:
王天骄
2026-06-24 11:11:11 +08:00
parent 92eba5adc8
commit 1076bc5838
29 changed files with 69 additions and 81 deletions
+42 -53
View File
@@ -90,9 +90,9 @@
<view class="quick-row">
<button
class="quick-chip"
:class="{ disabled: sending }"
:class="{ active: selectedAssistantType === 'clinical-books', disabled: sending }"
:disabled="sending"
@click="handleClinicalBooks"
@click="selectClinicalBooksType"
>
临床思维训练书籍
</button>
@@ -196,8 +196,6 @@ const emit = defineEmits<{
const goHome = createHomeNavigator(emit)
const clinicalBooksAction = '临床思维训练书籍'
const pathwaySteps = [
{ index: '1', title: '早期识别', description: '10分钟内完成12导联心电图。' },
{ index: '2', title: '药物干预', description: '阿司匹林、氯吡格雷。' },
@@ -214,44 +212,15 @@ const toastVisible = ref(false)
const scrollTop = ref(0)
const assistantSession = ref<LearningAssistantSession | null>(null)
const sending = ref(false)
const selectedAssistantType = ref<'clinical-books' | ''>('')
let toastTimer: ReturnType<typeof setTimeout> | null = null
let streamAbortController: AbortController | null = null
let workflowAbortController: AbortController | null = null
async function handleClinicalBooks() {
function selectClinicalBooksType() {
if (sending.value) return
messages.value.push({
id: `user-${Date.now()}`,
role: 'user',
content: clinicalBooksAction
})
typingVisible.value = true
sending.value = true
scrollToBottom()
const assistantMessageIndex = messages.value.length
messages.value.push({
id: `assistant-${Date.now()}`,
role: 'assistant',
variant: 'simple',
content: ''
})
try {
workflowAbortController?.abort()
workflowAbortController = new AbortController()
const output = await runClinicalThinkingBooksWorkflow(workflowAbortController.signal)
messages.value[assistantMessageIndex].content = output
} catch (error) {
messages.value[assistantMessageIndex].content = error instanceof Error ? error.message : '临床思维训练书籍生成失败'
showToast(messages.value[assistantMessageIndex].content)
} finally {
typingVisible.value = false
sending.value = false
scrollToBottom()
}
selectedAssistantType.value = 'clinical-books'
}
async function handleSend() {
@@ -281,25 +250,35 @@ async function handleSend() {
})
try {
const session = await ensureAssistantSession(value)
streamAbortController?.abort()
streamAbortController = new AbortController()
await streamLearningAssistantChat(
session.assistant_session_id,
{ question: value },
{
onDelta: delta => {
messages.value[assistantMessageIndex].content += delta
scrollToBottom()
}
},
streamAbortController.signal
)
if (!messages.value[assistantMessageIndex].content.trim()) {
messages.value[assistantMessageIndex].content = '暂未生成回复,请稍后重试。'
if (selectedAssistantType.value === 'clinical-books') {
workflowAbortController?.abort()
workflowAbortController = new AbortController()
const output = await runClinicalThinkingBooksWorkflow(value, workflowAbortController.signal)
messages.value[assistantMessageIndex].content = output
} else {
const session = await ensureAssistantSession(value)
streamAbortController?.abort()
streamAbortController = new AbortController()
await streamLearningAssistantChat(
session.assistant_session_id,
{ question: value },
{
onDelta: delta => {
messages.value[assistantMessageIndex].content += delta
scrollToBottom()
}
},
streamAbortController.signal
)
if (!messages.value[assistantMessageIndex].content.trim()) {
messages.value[assistantMessageIndex].content = '暂未生成回复,请稍后重试。'
}
}
} catch (error) {
messages.value[assistantMessageIndex].content = error instanceof Error ? error.message : 'AI 学习助手回复失败'
const fallbackMessage = selectedAssistantType.value === 'clinical-books'
? '临床思维训练书籍生成失败'
: 'AI 学习助手回复失败'
messages.value[assistantMessageIndex].content = error instanceof Error ? error.message : fallbackMessage
showToast(messages.value[assistantMessageIndex].content)
} finally {
typingVisible.value = false
@@ -771,10 +750,20 @@ page {
opacity: 0.55;
}
.quick-chip.active {
border-color: #00478d;
background: #00478d;
color: #ffffff;
}
.quick-chip:active {
background: #dcecff;
}
.quick-chip.active:active {
background: #003a73;
}
.composer {
box-sizing: border-box;
padding: 8px;