feat: AI 场景路由、ASR 服务及前后端全链路同步
- 新增 AI 场景路由控制器和管理接口 - 新增 ASR 语音识别服务及前后端集成 - 同步 AI Runtime 客户端到 Web/小程序/Life-Script - 完善 AI 配置测试修复和管理后台路由配置 - 新增数据库迁移脚本 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -469,6 +469,60 @@ export const useChatStore = defineStore('chat', () => {
|
||||
await processMessageQueue()
|
||||
}
|
||||
|
||||
const ensureStreamingAiMessage = async (wsMessage: WebSocketMessage) => {
|
||||
const messageId = wsMessage.messageId || `ai-stream-${Date.now()}`
|
||||
let message = messages.value.find(m => m.id === messageId)
|
||||
if (!message) {
|
||||
await processMessageQueue()
|
||||
message = messages.value.find(m => m.id === messageId)
|
||||
}
|
||||
if (!message) {
|
||||
addMessage({
|
||||
id: messageId,
|
||||
content: '',
|
||||
type: 'ai',
|
||||
conversationId: wsMessage.conversationId || currentSession.value?.id,
|
||||
timestamp: wsMessage.createTime || new Date().toISOString()
|
||||
})
|
||||
await processMessageQueue()
|
||||
message = messages.value.find(m => m.id === messageId)
|
||||
}
|
||||
return message
|
||||
}
|
||||
|
||||
const handleAiStreamMessage = async (wsMessage: WebSocketMessage) => {
|
||||
const message = await ensureStreamingAiMessage(wsMessage)
|
||||
if (!message) return
|
||||
|
||||
if (wsMessage.type === 'AI_STREAM_START') {
|
||||
isTyping.value = true
|
||||
message.status = 'sending'
|
||||
return
|
||||
}
|
||||
|
||||
if (wsMessage.type === 'AI_STREAM_DELTA') {
|
||||
isTyping.value = false
|
||||
message.content += wsMessage.content || ''
|
||||
message.status = 'sending'
|
||||
return
|
||||
}
|
||||
|
||||
if (wsMessage.type === 'AI_STREAM_DONE') {
|
||||
isTyping.value = false
|
||||
message.status = 'sent'
|
||||
return
|
||||
}
|
||||
|
||||
if (wsMessage.type === 'AI_STREAM_ERROR') {
|
||||
isTyping.value = false
|
||||
message.status = 'failed'
|
||||
message.error = wsMessage.data?.message || wsMessage.content || 'AI服务暂时不可用'
|
||||
if (!message.content) {
|
||||
message.content = message.error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// WebSocket消息处理 - 使用队列处理所有消息
|
||||
let handleWebSocketMessage = async (wsMessage: WebSocketMessage) => {
|
||||
console.log('收到WebSocket消息:', wsMessage.type, wsMessage.senderType, '消息ID:', wsMessage.messageId)
|
||||
@@ -484,6 +538,14 @@ export const useChatStore = defineStore('chat', () => {
|
||||
case 'AI_THINKING':
|
||||
// AI正在思考 - 不修改响应式数据,避免竞态
|
||||
console.log('⏳ AI正在思考中...')
|
||||
isTyping.value = true
|
||||
break
|
||||
|
||||
case 'AI_STREAM_START':
|
||||
case 'AI_STREAM_DELTA':
|
||||
case 'AI_STREAM_DONE':
|
||||
case 'AI_STREAM_ERROR':
|
||||
await handleAiStreamMessage(wsMessage)
|
||||
break
|
||||
|
||||
case 'CONNECTION':
|
||||
|
||||
Reference in New Issue
Block a user