feat(web): AI 工作台多 task 串行推进与会话适配

- useWorkbenchAiApplicationPreviewFlow/useWorkbenchAiActionRouter/useWorkbenchAiCommandIntents 支持 task1 完成后自动推进 task2,确认按钮直接拉起申请预览,草稿/提交成功后继续推进下一 task
- workbenchAiIntentPlannerModel/workbenchAiMessageModel/workbenchAiCommandIntentModel 适配多 task 意图规划与消息结构
- aiApplicationPreviewActions/aiApplicationPrecheckModel/aiExpenseDraftModel/aiWorkbenchConversationStore 草稿与会话存储适配
- PersonalWorkbenchAiMode 与样式适配,更新 preview-actions/expense-draft/conversation-store/fast-preview/action-router/command-intent/intent-planner 测试
This commit is contained in:
caoxiaozhu
2026-06-26 22:42:23 +08:00
parent 5753899eb3
commit c4b5fcc067
22 changed files with 1171 additions and 144 deletions

View File

@@ -85,7 +85,8 @@ export function useWorkbenchAiApplicationPreviewFlow({
resolveLatestInlineUserPrompt,
scrollInlineConversationToBottom,
sending,
toast
toast,
onApplicationActionCompleted = null
}) {
function isApplicationPreviewEstimatePending(message = {}) {
return Boolean(message?.applicationPreview && isApplicationPreviewEstimatePendingPreview(message.applicationPreview))
@@ -345,6 +346,9 @@ export function useWorkbenchAiApplicationPreviewFlow({
const flowId = isApplication ? 'travel_application' : 'travel_reimbursement'
const taskLabel = isApplication ? '出差申请' : '费用报销'
const ontologyFields = nextTask.ontology_fields || nextTask.ontologyFields || {}
// 透传去掉当前 nextTask 之后的剩余 task 列表,保证 task2 完成后 task3 也能继续推进,
// 避免 3+ task 场景在 task2 处断链。
const furtherRemainingTasks = remainingTasks.slice(1)
return {
label: `继续处理${taskLabel}`,
description: `接下来处理${taskLabel}${String(nextTask.summary || nextTask.title || '').slice(0, 40)}`,
@@ -357,7 +361,8 @@ export function useWorkbenchAiApplicationPreviewFlow({
expense_type: String(ontologyFields.expense_type || 'travel').trim() || 'travel',
expense_type_label: String(ontologyFields.expense_type_label || '差旅费').trim() || '差旅费',
ontology_fields: ontologyFields,
original_message: String(nextTask.summary || nextTask.title || `继续处理${taskLabel}`).trim()
original_message: String(nextTask.summary || nextTask.title || `继续处理${taskLabel}`).trim(),
steward_remaining_tasks: furtherRemainingTasks
}
}
}
@@ -458,6 +463,12 @@ export function useWorkbenchAiApplicationPreviewFlow({
targetMessage.suggestedActions = []
const detailActions = buildInlineApplicationDetailAction(draftPayload)
const nextTaskAction = buildApplicationPreviewNextTaskAction(targetMessage)
const shouldAutoContinueNextTask = Boolean(
nextTaskAction &&
typeof onApplicationActionCompleted === 'function' &&
Array.isArray(targetMessage.stewardRemainingTasks) &&
targetMessage.stewardRemainingTasks.length
)
replaceInlineMessage(
pendingMessage.id,
createInlineMessage('assistant', buildInlineApplicationPreviewActionResultText(actionType, payload), {
@@ -466,11 +477,16 @@ export function useWorkbenchAiApplicationPreviewFlow({
streamStatus: 'completed',
thinkingEvents: completeInlineThinkingEvents(resolveInlineThinkingEvents(pendingMessage))
},
suggestedActions: nextTaskAction ? [...detailActions, nextTaskAction] : detailActions
suggestedActions: shouldAutoContinueNextTask
? detailActions
: (nextTaskAction ? [...detailActions, nextTaskAction] : detailActions)
})
)
persistCurrentConversation()
scrollInlineConversationToBottom({ force: inlineConversationAutoScrollPinned.value })
if (shouldAutoContinueNextTask) {
onApplicationActionCompleted(targetMessage.stewardRemainingTasks, targetMessage)
}
return true
} catch (error) {
replaceInlineMessage(
@@ -599,6 +615,12 @@ export function useWorkbenchAiApplicationPreviewFlow({
skipUserMessage: true,
userText: options.userMessage || '保存草稿'
})
} else if (
typeof options.onPreviewReadyForNextTask === 'function' &&
Array.isArray(previewMessage.stewardRemainingTasks) &&
previewMessage.stewardRemainingTasks.length
) {
options.onPreviewReadyForNextTask(previewMessage.stewardRemainingTasks, previewMessage)
}
} catch (error) {
replaceInlineMessage(pendingMessage.id, createInlineMessage('assistant', error?.message || '申请核对表生成失败,请稍后重试。', {