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

Excel VBA调用ChatGPT API报错:Unknown endpoint for this model 问题排查

Excel VBA调用ChatGPT API错误排查与修复

错误核心原因分析

返回的Unknown endpoint for this model错误主要由两个关键问题导致,同时代码还存在其他潜在隐患:

  • API端点错误
    原代码使用的https://api.openai.com/v1/engines/davinci/jobs是OpenAI用于创建微调训练任务的专用端点,不适用于普通文本生成请求。调用Davinci模型进行文本补全,必须使用文本补全接口端点:https://api.openai.com/v1/completions。

  • 请求体JSON格式非法
    原代码中request.send的内容是两个独立JSON对象用逗号拼接:{"prompt":""" & question & """},{"max_tokens":1000},不符合JSON语法规范,导致API无法解析请求参数。正确格式是将所有参数放在同一个JSON对象内。

  • 响应解析逻辑脆弱
    原代码通过简单字符串替换处理API响应,一旦OpenAI调整返回格式,解析会直接失效,且无法正确处理错误信息。


修复后的完整代码

Sub SendQuestionToGPT3()
    '声明变量
    Dim request As Object
    Dim responseText As String
    Dim APIKey As String
    Dim question As String
    Dim jsonPayload As String
    
    '读取API密钥和问题(指定工作表避免歧义)
    APIKey = ThisWorkbook.Worksheets("API").Range("A1").Value
    question = ThisWorkbook.ActiveSheet.Range("A3").Value
    
    '创建HTTP请求对象(使用6.0版本提升兼容性)
    Set request = CreateObject("MSXML2.XMLHTTP.6.0")
    
    '设置正确的API端点
    request.Open "POST", "https://api.openai.com/v1/completions", False
    request.setRequestHeader "Content-Type", "application/json"
    request.setRequestHeader "Authorization", "Bearer " & APIKey
    
    '构造合法JSON请求体:转义问题中的双引号,指定正确模型
    jsonPayload = "{""model"":""text-davinci-003"",""prompt"":""" & Replace(question, """", "\""") & """,""max_tokens"":1000}"
    
    '发送请求并捕获基础错误
    On Error Resume Next
    request.send jsonPayload
    If Err.Number <> 0 Then
        ThisWorkbook.ActiveSheet.Range("A6").Value = "请求失败:" & Err.Description
        Set request = Nothing
        Exit Sub
    End If
    On Error GoTo 0
    
    responseText = request.responseText
    
    '解析响应(此处使用VBA-JSON模块,需提前导入)
    Dim jsonObj As Object
    Set jsonObj = CreateObject("Scripting.Dictionary")
    Set jsonObj = JsonConverter.ParseJson(responseText)
    
    '处理响应结果或错误
    If jsonObj.Exists("choices") Then
        ThisWorkbook.ActiveSheet.Range("A6").Value = Trim(jsonObj("choices")(1)("text"))
    ElseIf jsonObj.Exists("error") Then
        ThisWorkbook.ActiveSheet.Range("A6").Value = "API错误:" & jsonObj("error")("message")
    End If
    
    '清理对象
    Set jsonObj = Nothing
    Set request = Nothing
End Sub

关键修复说明

  1. 端点修正:替换为v1/completions,适配文本生成场景
  2. JSON格式修复:将prompt、model、max_tokens整合到同一JSON对象中,同时转义问题文本中的双引号,避免破坏JSON结构
  3. 错误处理:添加基础请求错误捕获,同时通过JSON解析正确处理API返回的错误信息
  4. 兼容性优化:使用MSXML2.XMLHTTP.6.0替代旧版本对象
  5. 严谨解析:使用JSON解析库提取结果,而非脆弱的字符串替换

额外注意事项

  • 若使用代码中的JSON解析逻辑,需导入VBA-JSON模块(可通过VBA编辑器的"工具-引用"或导入模块文件实现);若不想依赖外部模块,可编写简单的字符串匹配逻辑提取choices中的text字段
  • 确保使用的模型名称正确,text-davinci-003是Davinci系列的文本生成模型,若切换其他模型需同步修改model参数
  • 确认API密钥权限正常,且账户有足够的调用额度

内容的提问来源于stack exchange,提问作者Jens W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:45:27