Flutter集成gpt-3.5-turbo时如何给Prompt添加System消息
解决Flutter集成gpt-3.5-turbo添加System消息时的400错误
核心问题分析
400 Bad Request错误几乎都是因为请求格式不符合OpenAI的API规范。gpt-3.5-turbo对messages数组的格式有严格要求:
- 每条消息必须包含
role(取值为system/user/assistant)和content字段 - System消息必须放在
messages数组的最开头,不能与用户、助手消息交错 - 所有消息的
content字段不能为空
正确的消息转换实现
假设你用ChatMessage类存储聊天记录,修改convertToJSON函数时,要先插入System消息,再拼接历史聊天内容:
List<Map<String, dynamic>> convertToJSON(List<ChatMessage> chatHistory, String systemPrompt) { // 初始化消息列表,先加入System消息 final messages = <Map<String, dynamic>>[ { "role": "system", "content": systemPrompt, // 必须保证该内容非空 }, ]; // 遍历历史聊天记录,添加用户和助手消息 for (final msg in chatHistory) { messages.add({ "role": msg.isUser ? "user" : "assistant", "content": msg.text, // 确保消息文本不为空 }); } return messages; }
完整API请求示例
确保请求体结构正确,并且用jsonEncode正确序列化:
// 构建请求体 final requestBody = { "model": "gpt-3.5-turbo", "messages": convertToJSON(chatHistory, "你的系统提示词内容"), "temperature": 0.7, // 可选参数,按需调整 }; // 发起API请求 final response = await http.post( Uri.parse("https://api.openai.com/v1/chat/completions"), headers: { "Authorization": "Bearer 你的OpenAI API密钥", "Content-Type": "application/json", }, body: jsonEncode(requestBody), );
额外排查点
- 检查API密钥是否有效、是否有剩余额度
- 打印
jsonEncode(requestBody)的结果,确认生成的JSON格式合法,没有语法错误 - 检查聊天记录中是否存在空内容的消息(比如用户未输入就发送),这类消息会导致API报错
内容的提问来源于stack exchange,提问作者Hammad Nasir
相关产品推荐
相关产品推荐

