You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift调用OpenAI API解码异常及返回字段为空问题求助

问题分析与解决方案

问题背景

依照教程开发基于OpenAISwift的ChatGPT应用,此前运行正常,重新开发时先出现解码错误(找不到"object"键),更新OpenAISwift版本后,解码错误消失但返回的模型所有字段均为nil。

核心原因

  1. 旧版本库与API返回不兼容:最初的解码错误是因为旧版OpenAISwift的模型结构未匹配OpenAI API更新后的返回格式,导致无法找到"object"字段。
  2. 新版本库解码映射失效:更新库后字段全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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:22:05