Skip to content

对话模块调用链

全局概览

阶段一:请求发起与 SSE 建立

阶段二:流式生成与推送

分层详解

1. 前端发送消息

文件函数职责
app/pages/chat.vuehandleSendMessage()UI 入口,收集输入内容和附件
app/composables/useConversations.ts:516sendMessage()发起 POST 请求,不等待 AI 响应

2. API 路由处理

文件关键逻辑
server/api/conversations/[id]/messages.post.ts创建两条消息后立即返回,通过 setImmediate 异步启动流式任务

异步解耦

API 路由不等待 AI 生成完成,通过 setImmediate 将生成任务放入事件循环下一轮执行,前端通过 SSE 获取后续状态。

3. 流式生成核心

文件函数职责
server/services/streamingTask.ts:48startStreamingTask()流式生成主流程
server/services/streamingTask.ts:236processChunk()处理单个 chunk(content/thinking/toolUse/webSearch)
server/services/streamingCache.ts:40startStreamingSession()初始化内存缓存
server/services/providerConnection.ts:6resolveUpstreamConnection()解析 apiKey + 代理 + baseUrl

4. Provider 选择与服务创建

文件职责
server/services/chatProviders/index.tsProvider 聚合入口,按 apiFormat 查找
server/services/upstream.ts:180getApiKey() — keyName → 'default' → 第一个 key 三层 fallback
server/services/providerConnection.ts统一解析连接参数(apiKey + fetchFn + baseUrl)

5. 流式内容处理

6. MCP 工具调用循环

最大轮次限制

工具调用有 MCP_CLIENT_CONFIG.maxToolRounds 轮次上限,超出后强制结束并输出提示。

7. 双通道同步机制

前端通过两个独立的 SSE 通道接收数据:

通道端点传输内容前端处理
流式内容GET /api/messages/[id]/stream增量文本 chunksubscribeToMessageStream() 逐块追加
全局事件GET /api/events结构化事件global-events.client.ts 插件分发

8. 前端事件处理

文件职责
app/plugins/global-events.client.ts:73监听 chat.message.created,触发流式订阅
app/plugins/global-events.client.ts:126监听 chat.message.done,结束流式状态
app/composables/useConversations.ts:198subscribeToMessageStream() — 建立 SSE 连接读取增量内容

9. 停止生成

竞态条件处理

tryFinalizeSession() 通过 finalized 标志实现原子操作,确保停止时只有一方(流式循环或 stopStreamingTask)负责保存内容。

关键文件索引

层级文件核心函数
前端页面app/pages/chat.vuehandleSendMessage()
前端状态app/composables/useConversations.tssendMessage(), subscribeToMessageStream()
前端事件app/plugins/global-events.client.tson('chat.message.created'), on('chat.message.done')
API 路由server/api/conversations/[id]/messages.post.ts创建消息 + 异步启动任务
流式核心server/services/streamingTask.tsstartStreamingTask(), stopStreamingTask()
流式缓存server/services/streamingCache.tsappendStreamingContent(), tryFinalizeSession()
全局事件server/services/globalEvents.tsemitToUser()
Providerserver/services/chatProviders/index.tsgetChatProvider()
连接解析server/services/providerConnection.tsresolveUpstreamConnection()
Key 路由server/services/upstream.ts:180getApiKey(upstream, keyName)

MJ-Studio - 多模型 AI 工作台