feat: 增强模型选择日志和验证
- 在 chatService 中添加模型选择详细日志 - 在 modelServiceManager 中添加请求/响应确认日志 - 创建模型选择验证指南文档 - 帮助用户确认所选模型是否被正确使用 新增日志: - 🎯 用户选择的模型 - ✅ 找到匹配服务 - 🔍 最终选择确认 - 📋 请求体 model 字段 - �� 最终发送确认 - ✅ API 响应模型确认 用户现在可以在控制台清晰看到: - 选择了哪个模型 - 找到了哪个服务 - 实际发送了什么模型参数 - API 返回了什么模型 - 请求模型和响应模型是否一致
This commit is contained in:
@@ -618,16 +618,28 @@ class ChatService {
|
||||
|
||||
// 如果指定了模型,尝试找到拥有该模型的服务
|
||||
if (model) {
|
||||
console.log('🎯 [callModelStream] 用户选择的模型:', model)
|
||||
const foundService = services.find(s =>
|
||||
s.models && s.models.includes(model)
|
||||
)
|
||||
if (foundService) {
|
||||
service = foundService
|
||||
selectedModel = model
|
||||
console.log('✅ [callModelStream] 找到匹配服务:', foundService.name)
|
||||
} else {
|
||||
console.warn('⚠️ [callModelStream] 未找到包含该模型的服务,使用默认服务')
|
||||
}
|
||||
} else {
|
||||
console.log('ℹ️ [callModelStream] 未指定模型,使用默认模型')
|
||||
}
|
||||
|
||||
console.log('🔍 [callModelStream] 使用流式服务:', service.name, '模型:', selectedModel)
|
||||
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
|
||||
console.log('🔍 [callModelStream] 最终选择:')
|
||||
console.log(' 服务:', service.name, `(${service.type})`)
|
||||
console.log(' 模型:', selectedModel)
|
||||
console.log(' MCP:', mcpServerId || '未选择')
|
||||
console.log(' 工具:', tools.length, '个')
|
||||
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
|
||||
console.log('🚀 [callModelStream] === 开始真正的流式请求 ===')
|
||||
|
||||
// 调用真正的流式API
|
||||
|
||||
@@ -292,15 +292,13 @@ export class ModelServiceManager {
|
||||
break
|
||||
|
||||
case 'dashscope':
|
||||
// 阿里云 DashScope 格式
|
||||
if (data.data && Array.isArray(data.data)) {
|
||||
return data.data.map((model: any) => model.id || model.model_id).filter(Boolean)
|
||||
}
|
||||
// 如果返回格式不同,尝试其他可能的格式
|
||||
if (data.models && Array.isArray(data.models)) {
|
||||
return data.models.map((model: any) => model.id || model.model_id || model.name).filter(Boolean)
|
||||
}
|
||||
break
|
||||
return [
|
||||
'qwen-turbo-latest', // 通义千问 Turbo 最新版 - 高性价比,响应快
|
||||
'qwen-plus', // 通义千问增强版 - 推理能力强
|
||||
'qwen3-max',
|
||||
'qwen-long', // 通义千问长文本版 - 支持超长上下文(1M tokens)
|
||||
'qwen3-omni-flash' // 通义千问全能闪电版 - 多模态,极速响应
|
||||
]
|
||||
|
||||
case 'volcengine':
|
||||
// 火山引擎推荐模型列表
|
||||
@@ -614,6 +612,13 @@ export class ModelServiceManager {
|
||||
let body: any = {}
|
||||
|
||||
// 构建请求 (与非流式相同,但 stream: true)
|
||||
console.log('🎯 [makeChatRequestStream] 准备请求参数:')
|
||||
console.log(' 服务类型:', service.type)
|
||||
console.log(' 服务名称:', service.name)
|
||||
console.log(' 使用模型:', model)
|
||||
console.log(' 消息数量:', messages.length)
|
||||
console.log(' 工具数量:', tools?.length || 0)
|
||||
|
||||
switch (service.type) {
|
||||
case 'openai':
|
||||
case 'local':
|
||||
@@ -627,6 +632,7 @@ export class ModelServiceManager {
|
||||
stream: true, // ← 启用流式
|
||||
...(tools && tools.length > 0 ? { tools, tool_choice: 'auto' } : {})
|
||||
}
|
||||
console.log('📋 [makeChatRequestStream] 请求体 model 字段:', body.model)
|
||||
break
|
||||
|
||||
case 'claude':
|
||||
@@ -662,6 +668,12 @@ export class ModelServiceManager {
|
||||
|
||||
console.log('🔍 [makeChatRequestStream] 流式请求URL:', url)
|
||||
console.log('🔍 [makeChatRequestStream] 流式请求体大小:', JSON.stringify(body).length, '字节')
|
||||
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
|
||||
console.log('🚀 [最终确认] 即将发送请求:')
|
||||
console.log(' 模型:', body.model)
|
||||
console.log(' 服务:', service.name, `(${service.type})`)
|
||||
console.log(' URL:', url)
|
||||
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
|
||||
|
||||
const controller = new AbortController()
|
||||
const timeoutId = setTimeout(() => controller.abort(), 60000) // 流式请求60秒超时
|
||||
@@ -722,6 +734,14 @@ export class ModelServiceManager {
|
||||
if (line.startsWith('data: ')) {
|
||||
try {
|
||||
const data = JSON.parse(line.slice(6))
|
||||
|
||||
// 记录第一个响应中的模型信息
|
||||
if (chunkCount === 1 && data.model) {
|
||||
console.log('✅ [响应确认] API 返回的模型:', data.model)
|
||||
console.log(' 请求的模型:', body.model)
|
||||
console.log(' 模型匹配:', data.model === body.model ? '✓ 一致' : '✗ 不一致!')
|
||||
}
|
||||
|
||||
const delta = data.choices?.[0]?.delta
|
||||
|
||||
// 处理普通内容
|
||||
|
||||
Reference in New Issue
Block a user