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的角度,还是从源头避免输出被截断的思路都可以,麻烦大家支支招!




