You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Node.js调用OpenRouter(兼容OpenAI API)时,因max_tokens截断LLM响应导致JSON解析抛出SyntaxError的问题求助

Node.js调用OpenRouter(兼容OpenAI API)时,因max_tokens截断LLM响应导致JSON解析抛出SyntaxError的问题求助

最近在做Node.js项目,用Express通过OpenRouter调用LLM模型(和OpenAI API用法完全一致),要求模型返回结构化的JSON响应,但碰到了一个棘手的问题:当模型输出内容超过我设置的max_tokens上限时,响应会被中途截断,之后用JSON.parse()解析时直接抛出SyntaxError: Unexpected end of JSON input

这个问题还挺随机的——有时候返回的JSON是完整的,能正常解析;但有时候会在字符串中间、键名中途或者数组元素里被切断,完全看输出长度和token预算的匹配情况。

最小复现代码

下面是能复现问题的核心代码:

const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.OPENROUTER_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'openai/gpt-4o-mini',
    max_tokens: 600,
    messages: [
      { role: 'system', content: 'Return valid JSON only. No markdown.' },
      { role: 'user', content: 'Analyze this URL and return a JSON object with score, category_grades (object), and recommendations (array of 10 objects with title and description).' }
    ],
  }),
});

const data = await response.json();
const content = data.choices[0].message.content;

// 当max_tokens截断输出时,这行就会抛出错误
const parsed = JSON.parse(content);

截断的响应示例

被截断的原始内容字符串主要有这几种情况:

情况1:值被中途截断

{
  "score": 62,
  "category_grades": {
    "content": "B",
    "schema": "D",
    "headings": "C"
  },
  "recommendations": [
    {"title": "Add FAQ schema", "description": "Implement FAQPage structured data to improve ex

description的内容还没写完就被强制切断了)

情况2:键名被中途截断

{
  "score": 74,
  "category_grades": {"content": "B", "schema": "C", "headings": "B-", "meta

category_grades里的键只写了一半就没下文了)

另外还有个糟心的小问题:明明系统提示里反复要求只返回纯JSON、不带任何markdown,但有些模型还是会把JSON用代码块包裹起来,这也会直接导致解析失败。

想请教下各位大佬,有没有什么实用的解决办法?不管是从处理截断JSON的角度,还是从源头避免输出被截断的思路都可以,麻烦大家支支招!

火山引擎 最新活动