feat: 增强模型选择日志和验证

- 在 chatService 中添加模型选择详细日志
- 在 modelServiceManager 中添加请求/响应确认日志
- 创建模型选择验证指南文档
- 帮助用户确认所选模型是否被正确使用

新增日志:
- 🎯 用户选择的模型
-  找到匹配服务
- 🔍 最终选择确认
- 📋 请求体 model 字段
- �� 最终发送确认
-  API 响应模型确认

用户现在可以在控制台清晰看到:
- 选择了哪个模型
- 找到了哪个服务
- 实际发送了什么模型参数
- API 返回了什么模型
- 请求模型和响应模型是否一致
This commit is contained in:
douboer
2025-10-15 10:06:42 +08:00
parent 1a57696110
commit cb2f9ea76f
5 changed files with 501 additions and 11 deletions

View File

@@ -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

View File

@@ -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
// 处理普通内容