fix(ux): 用户发送后即时显示 assistant 头部和等待提示
This commit is contained in:
parent
9a5a116fd6
commit
8814f963f5
@ -255,6 +255,16 @@ export const messageMethods = {
|
|||||||
// 标记任务进行中,直到任务完成或用户手动停止
|
// 标记任务进行中,直到任务完成或用户手动停止
|
||||||
this.taskInProgress = true;
|
this.taskInProgress = true;
|
||||||
this.chatAddUserMessage(message, images, videos);
|
this.chatAddUserMessage(message, images, videos);
|
||||||
|
// 关键体验修复:用户发送后立刻显示 assistant 头部 + 工作中计时 + 等待提示,
|
||||||
|
// 不等待 createTask / 轮询首事件返回。
|
||||||
|
this.chatStartAssistantMessage();
|
||||||
|
this.stopRequested = false;
|
||||||
|
if (typeof this.monitorShowPendingReply === 'function') {
|
||||||
|
this.monitorShowPendingReply();
|
||||||
|
}
|
||||||
|
if (this.autoScrollEnabled) {
|
||||||
|
this.scrollToBottom();
|
||||||
|
}
|
||||||
|
|
||||||
// 使用 REST API 创建任务(轮询模式)
|
// 使用 REST API 创建任务(轮询模式)
|
||||||
try {
|
try {
|
||||||
@ -278,13 +288,17 @@ export const messageMethods = {
|
|||||||
message: error.message || '创建任务失败,请重试',
|
message: error.message || '创建任务失败,请重试',
|
||||||
type: 'error'
|
type: 'error'
|
||||||
});
|
});
|
||||||
|
this.streamingMessage = false;
|
||||||
this.taskInProgress = false;
|
this.taskInProgress = false;
|
||||||
|
if (typeof this.cleanupTrailingEmptyAssistantPlaceholder === 'function') {
|
||||||
|
this.cleanupTrailingEmptyAssistantPlaceholder('create_task_failed');
|
||||||
|
}
|
||||||
|
if (typeof this.forceUnlockMonitor === 'function') {
|
||||||
|
this.forceUnlockMonitor('create_task_failed');
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof this.monitorShowPendingReply === 'function') {
|
|
||||||
this.monitorShowPendingReply();
|
|
||||||
}
|
|
||||||
this.inputClearMessage();
|
this.inputClearMessage();
|
||||||
this.inputClearSelectedImages();
|
this.inputClearSelectedImages();
|
||||||
this.inputClearSelectedVideos();
|
this.inputClearSelectedVideos();
|
||||||
@ -555,6 +569,11 @@ export const messageMethods = {
|
|||||||
}
|
}
|
||||||
this.taskInProgress = true;
|
this.taskInProgress = true;
|
||||||
this.chatAddUserMessage(message, []);
|
this.chatAddUserMessage(message, []);
|
||||||
|
this.chatStartAssistantMessage();
|
||||||
|
this.stopRequested = false;
|
||||||
|
if (typeof this.monitorShowPendingReply === 'function') {
|
||||||
|
this.monitorShowPendingReply();
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
const { useTaskStore } = await import('../../stores/task');
|
const { useTaskStore } = await import('../../stores/task');
|
||||||
const taskStore = useTaskStore();
|
const taskStore = useTaskStore();
|
||||||
@ -569,12 +588,16 @@ export const messageMethods = {
|
|||||||
message: error?.message || '创建任务失败,请重试',
|
message: error?.message || '创建任务失败,请重试',
|
||||||
type: 'error'
|
type: 'error'
|
||||||
});
|
});
|
||||||
|
this.streamingMessage = false;
|
||||||
this.taskInProgress = false;
|
this.taskInProgress = false;
|
||||||
|
if (typeof this.cleanupTrailingEmptyAssistantPlaceholder === 'function') {
|
||||||
|
this.cleanupTrailingEmptyAssistantPlaceholder('auto_create_task_failed');
|
||||||
|
}
|
||||||
|
if (typeof this.forceUnlockMonitor === 'function') {
|
||||||
|
this.forceUnlockMonitor('auto_create_task_failed');
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (typeof this.monitorShowPendingReply === 'function') {
|
|
||||||
this.monitorShowPendingReply();
|
|
||||||
}
|
|
||||||
if (this.autoScrollEnabled) {
|
if (this.autoScrollEnabled) {
|
||||||
this.scrollToBottom();
|
this.scrollToBottom();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -83,6 +83,24 @@ function isEmptyAssistantPlaceholderMessage(message: any): boolean {
|
|||||||
return actions.length === 0 && !!message.awaitingFirstContent;
|
return actions.length === 0 && !!message.awaitingFirstContent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getOptimisticUserEchoTarget(messages: any[]): any | null {
|
||||||
|
if (!Array.isArray(messages) || messages.length === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const lastIndex = messages.length - 1;
|
||||||
|
const last = messages[lastIndex];
|
||||||
|
if (last?.role === 'user') {
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
if (isEmptyAssistantPlaceholderMessage(last) && lastIndex > 0) {
|
||||||
|
const prev = messages[lastIndex - 1];
|
||||||
|
if (prev?.role === 'user') {
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 任务轮询事件处理器
|
* 任务轮询事件处理器
|
||||||
* 将从 REST API 轮询获取的事件转换为前端状态更新
|
* 将从 REST API 轮询获取的事件转换为前端状态更新
|
||||||
@ -1284,10 +1302,7 @@ export const taskPollingMethods = {
|
|||||||
: Array.isArray(data?.mediaRefs)
|
: Array.isArray(data?.mediaRefs)
|
||||||
? data.mediaRefs
|
? data.mediaRefs
|
||||||
: [];
|
: [];
|
||||||
const last =
|
const last = getOptimisticUserEchoTarget(this.messages || []);
|
||||||
Array.isArray(this.messages) && this.messages.length > 0
|
|
||||||
? this.messages[this.messages.length - 1]
|
|
||||||
: null;
|
|
||||||
const isLikelyOptimisticEcho = !!(
|
const isLikelyOptimisticEcho = !!(
|
||||||
last &&
|
last &&
|
||||||
last.role === 'user' &&
|
last.role === 'user' &&
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user