Flutter调用GPT-3.5-Turbo API无预期输出,请求技术排查
GPT-3.5-Turbo API调用输出异常排查
核心问题定位与修复方案
1. API请求参数错误
在ApiService.sendMessage的请求体中,参数名写错了:
body: jsonEncode({ "model": "gpt-3.5-turbo", "message": // 此处应为复数形式"messages" [{"role": "user", "content": prompt}] })
OpenAI Chat Completions API要求的对话参数是**messages**(复数),单数message会导致API返回无效响应,无法正确解析内容。
2. 字符串处理无效
解析响应时,content.trim()未赋值回变量,原代码仅调用方法但未保存结果:
final String content = jsonDecode(response.body)["choices"][0]["message"]["content"]; content.trim(); // 需改为 return content.trim();
该问题虽不会导致完全无输出,但可能返回带首尾空格的内容,影响展示效果。
3. 错误处理缺失
当前代码仅判断statusCode == 200,未处理其他状态码(如401密钥无效、429请求超限、500服务器错误等),无法定位具体错误。建议添加日志打印:
if(response.statusCode == 200){ // 原解析逻辑 } else { print("API请求失败: 状态码${response.statusCode},响应内容${response.body}"); return "请求失败,请查看控制台日志"; }
通过打印响应内容,可直接获取OpenAI返回的错误详情,快速定位问题。
4. 聊天列表ID重复风险
sendTextMessage中使用DateTime.now().toString()作为消息ID,可能出现重复ID导致UI更新异常。建议改用唯一ID生成方式:
import 'package:uuid/uuid.dart'; // 生成唯一ID final id = const Uuid().v4();
修复后完整代码示例
ApiService类
import 'package:http/http.dart' as http; import 'dart:convert'; import '../constants/api_constant.dart'; class ApiService{ static Future<String> sendMessage ({required String prompt}) async { var response = await http.post(Uri.parse("https://api.openai.com/v1/chat/completions"), headers: { 'Authorization': 'Bearer $API_KEY', "Content-Type": "application/json"}, body: jsonEncode({ "model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": prompt}] }) ); if(response.statusCode == 200){ final String content = jsonDecode(response.body)["choices"][0]["message"]["content"]; return content.trim(); } else { print("API Error: ${response.statusCode} - ${response.body}"); return "请求失败,请查看控制台日志"; } } }
消息发送与列表更新方法
import 'package:uuid/uuid.dart'; void sendTextMessage(String prompt) async { final userMessageId = const Uuid().v4(); addToChatList(prompt, true, userMessageId); final response = await ApiService.sendMessage(prompt: prompt); final aiMessageId = const Uuid().v4(); addToChatList(response , false, aiMessageId); } void addToChatList(String prompt, bool isMe, String id) { final chats = ref.read(chatsProvider.notifier); chats.add(ChatModel( id: id, prompt: prompt, isMe: isMe, )); }
内容的提问来源于stack exchange,提问作者Furqan Saify
相关产品推荐
相关产品推荐

