Swift调用OpenAI API解码异常及返回字段为空问题求助
问题分析与解决方案
问题背景
依照教程开发基于OpenAISwift的ChatGPT应用,此前运行正常,重新开发时先出现解码错误(找不到"object"键),更新OpenAISwift版本后,解码错误消失但返回的模型所有字段均为nil。
核心原因
- 旧版本库与API返回不兼容:最初的解码错误是因为旧版OpenAISwift的模型结构未匹配OpenAI API更新后的返回格式,导致无法找到"object"字段。
- 新版本库解码映射失效:更新库后字段全nil,大概率是库中模型的CodingKey与API实际返回的JSON键名不匹配(如大小写、键名变更),或请求的Endpoint/参数存在问题。
解决步骤
1. 打印原始API返回数据
在sendCompletion的makeRequest成功分支中,先打印原始返回数据,确认API返回的JSON结构:
case .success(let success): // 添加这行打印原始数据 if let jsonStr = String(data: success, encoding: .utf8) { print("API原始返回:\(jsonStr)") } do { let res = try JSONDecoder().decode(OpenAI<TextResult>.self, from: success) completionHandler(.success(res)) } catch { completionHandler(.failure(.decodingError(error: error))) }
通过打印结果对比OpenAISwift库中OpenAI<TextResult>、TextResult等模型的定义,检查键名是否完全对应。
2. 手动验证API请求
用curl直接调用OpenAI Completions API,确认请求参数和返回结构是否正常:
curl https://api.openai.com/v1/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 你的API密钥" \ -d '{ "model": "text-davinci-003", "prompt": "测试文本", "max_tokens": 500, "temperature": 1 }'
如果手动请求能正常返回数据,说明问题出在OpenAISwift库的解码逻辑或请求构造上。
3. 检查库的模型定义
查看OpenAISwift库中OpenAI、TextResult等模型的CodingKey设置,确保和API返回的JSON键名完全一致。例如:
- API返回的JSON包含
object、model、choices、usage字段,库中模型的对应属性是否正确绑定了这些键名? - 是否存在大小写不匹配(如API返回
Object而库中用object)?
如果发现不匹配,可以修改库中的模型定义,或者手动解析JSON替代库的解码逻辑:
// 示例手动解析 if let json = try JSONSerialization.jsonObject(with: success, options: []) as? [String: Any] { let object = json["object"] as? String let model = json["model"] as? String if let choices = json["choices"] as? [[String: Any]] { let text = choices.first?["text"] as? String ?? "" // 处理返回结果并回调 completionHandler(.success(/* 构造自定义模型实例 */)) } }
4. 确认请求参数与权限
- 检查
setup方法中API密钥是否正确,无拼写错误,且该密钥拥有调用Completions API的权限。 - 确认
model参数对应的模型名称正确,例如.gpt3(.davinci)对应的模型名是否为text-davinci-003(部分旧模型已弃用)。 - 检查OpenAISwift库中
Endpoint.completions对应的API路径是否为v1/completions,避免路径错误导致返回异常结构。
5. 替换为官方SDK(备选)
如果第三方库维护不及时,可以考虑直接使用OpenAI官方提供的Swift SDK,确保与API完全兼容。
内容的提问来源于stack exchange,提问作者Niels040
相关产品推荐
相关产品推荐

