如何修复OpenAI API返回的CodingKeys('object')无关联值错误?
OpenAI API文本补全报错:
No value associated with key CodingKeys("object") 问题排查与修复 问题描述
调用OpenAI API做文本补全时触发解析错误,错误信息:
No value associated with key CodingKeys(stringValue: "object", intValue: nil) ("object")
已确认提示词有效,更换不同提示词后问题依然存在。
提供的代码
class NetworkManager{ static let shared = NetworkManager() @frozen enum Constants{ static let key = "" } private var client: OpenAISwift? private init() {} func setUp(){ self.client = OpenAISwift(authToken: Constants.key) } func getResponse(input: String, completion: @escaping (Result<String, Error>) -> Void) { let prompt = """ translate from English to Nigerian Pidgin: \(input) Output: """ client?.sendCompletion(with: prompt, model: .gpt3(.davinci), maxTokens: 60) { result in switch result { case .success(let response): let output = response.choices.first?.text ?? "" print(response) completion(.success(output)) case .failure(let error): completion(.failure(error)) print(error.localizedDescription) } } } networkManager.getResponse(input: inputText) { result in switch result { case .success(let outputText): DispatchQueue.main.async { self.secondTextField.text = outputText } case .failure(let error): print("Error translating text: \(error)") } }
问题成因
- API密钥未配置:代码中
Constants.key为空字符串,导致请求未通过OpenAI认证,API返回的错误响应结构和OpenAISwift库预期的成功响应结构不匹配,触发解析失败。 - 库版本与API响应不兼容:旧版本
OpenAISwift库的解析逻辑依赖object字段,但OpenAI API的响应结构已更新(尤其是davinci系列模型逐步淘汰后,新模型的响应格式有调整),导致库无法找到对应字段。 - 模型参数错误:使用的
.gpt3(.davinci)模型可能已被API弃用或库的枚举映射失效,返回的响应结构不符合库的解析预期。
修复方案
1. 配置有效API密钥
将Constants.key替换为你的真实OpenAI API密钥,确保密钥拥有调用文本补全接口的权限:
@frozen enum Constants{ static let key = "你的OpenAI API密钥" }
2. 更新OpenAISwift库
通过CocoaPods或Swift Package Manager将库更新到最新版本,新版本会适配OpenAI API的当前响应结构,避免字段解析错误。
3. 更换为可用模型
davinci系列模型已逐步停止服务,改用当前支持的gpt-3.5-turbo-instruct模型,可直接用字符串指定模型ID:
client?.sendCompletion(with: prompt, model: "gpt-3.5-turbo-instruct", maxTokens: 60) { result in // 回调逻辑不变 }
4. 调试响应结构
在回调中打印完整的API响应,确认返回数据是否符合库的解析要求,排查是否为响应格式问题:
case .failure(let error): print("原始错误信息:\(error)") // 若有能力,可打印网络请求的原始响应数据 completion(.failure(error))
内容的提问来源于stack exchange,提问作者alex paul
相关产品推荐
相关产品推荐

