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

OpenAI Completion接口两类问题咨询:返回截断与JSON解析失败

OpenAI Completion接口问题解决方案

问题1:Token长度限制导致请求失败或返回不完整

原因

text-davinci-001模型的最大上下文长度为2049个token,当传入的prompt(含"Fix grammar mistakes")加上待修正内容的总token数超过该限制时,会触发报错:OpenAI GPT-3 API error: "This model's maximum context length is 2049 tokens",同时可能返回不完整结果。

JavaScript解决方案

  1. 提前计算Token数:使用OpenAI官方的tiktoken库估算输入内容的token数量,避免超过模型限制
    import { encoding_for_model } from 'tiktoken';
    
    // 初始化对应模型的编码工具
    const encoding = encoding_for_model('text-davinci-001');
    const basePrompt = "Fix grammar mistakes:\n\n";
    const fullPrompt = basePrompt + contentText;
    const tokenCount = encoding.encode(fullPrompt).length;
    encoding.free(); // 释放资源
    
    // 超过限制时截断内容(可根据需求调整截断逻辑)
    if (tokenCount > 2049) {
      const baseTokenLength = encoding.encode(basePrompt).length;
      const availableTokens = 2049 - baseTokenLength;
      const truncatedContent = encoding.decode(encoding.encode(contentText).slice(0, availableTokens));
      fullPrompt = basePrompt + truncatedContent;
    }
    
  2. 更换大上下文模型:若内容较长,可改用gpt-3.5-turbo-instruct模型,其最大上下文长度为4096个token,能容纳更多内容。

问题2:特殊字符破坏JSON格式导致请求失败

原因

手动拼接JSON字符串时,内容中的单引号、双引号等特殊字符会破坏JSON结构,导致接口无法解析请求体,触发报错:"message": "We could not parse the JSON body of your request..."。删除引号会破坏原文语义,并非最优解。

JavaScript解决方案

使用JSON.stringify()自动转义特殊字符:无需手动拼接JSON,直接构造请求体对象,再用JSON.stringify()处理,该方法会自动转义所有特殊字符,确保JSON格式合法。

示例(使用fetch API):

const apiKey = '你的OpenAI API密钥';
const openAiPrompt = "Fix grammar mistakes";
const contentText = '包含"双引号"和\'单引号\'的待修正内容';

const requestBody = {
  model: "text-davinci-001",
  prompt: `${openAiPrompt}:\n\n${contentText}`,
  temperature: 0,
  top_p: 1.0,
  frequency_penalty: 0.0,
  presence_penalty: 0.0
};

fetch('https://api.openai.com/v1/completions', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${apiKey}`
  },
  body: JSON.stringify(requestBody) // 自动转义特殊字符
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('请求失败:', error));

示例(使用axios):

import axios from 'axios';

const apiKey = '你的OpenAI API密钥';
const openAiPrompt = "Fix grammar mistakes";
const contentText = '包含"双引号"和\'单引号\'的待修正内容';

axios.post('https://api.openai.com/v1/completions', {
  model: "text-davinci-001",
  prompt: `${openAiPrompt}:\n\n${contentText}`,
  temperature: 0,
  top_p: 1.0,
  frequency_penalty: 0.0,
  presence_penalty: 0.0
}, {
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${apiKey}`
  }
})
.then(response => console.log(response.data))
.catch(error => console.error('请求失败:', error));

内容的提问来源于stack exchange,提问作者Mostafa Ezzat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:40:59