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:
2026-05-23 13:25:21 +08:00
parent d77090aa5e
commit 89fc42819d
72 changed files with 4584 additions and 383 deletions
+62
View File
@@ -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':