Model stream ended without a finish reason.]

2026年06月19日 20:06 14.92 秒 success

错误信息

[API Error: Model stream ended without a finish reason.]

AI 解决方案

1. 🌐 错误翻译

原文:Model stream ended without a finish reason.
译文:模型流式响应在没有完成原因的情况下结束。

2. 🎯 原因分析

这个错误发生在流式(Streaming)API调用过程中,表示模型的响应流异常中断,没有返回正常的终止标记。

常见根本原因:

原因说明
网络中断客户端与API服务器之间的连接不稳定
超时响应时间过长,触发了服务端或客户端的超时限制
Token限制输出内容过长,达到最大token限制后被截断
服务端异常API服务端内部错误导致响应中止
客户端提前关闭请求被取消或组件提前销毁

3. 💡 解决方案

// 1. 添加错误处理和重试机制
async function streamWithRetry(apiCall, maxRetries = 3) {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const stream = await apiCall();
      let fullResponse = '';
      let finishReason = null;
      
      for await (const chunk of stream) {
        fullResponse += chunk.content;
        finishReason = chunk.finishReason;
      }
      
      // 检查是否有正常的完成原因
      if (!finishReason && attempt < maxRetries) {
        console.warn(`流未正常结束,第 ${attempt} 次重试...`);
        continue;
      }
      
      return fullResponse;
    } catch (error) {
      if (attempt === maxRetries) throw error;
    }
  }
}

// 2. 设置合理的超时和max_tokens
const response = await openai.chat.completions.create({
  model: "gpt-4",
  messages: messages,
  stream: true,
  max_tokens: 2000,      // 限制输出长度
  timeout: 60000         // 设置超时时间
});

// 3. 完整的流式处理示例
try {
  const stream = await api.createChatCompletion(config);
  let content = '';
  
  for await (const part of stream) {
    const delta = part.choices[0]?.delta?.content || '';
    content += delta;
  }
  
  // 验证响应完整性
  const finishReason = stream.choices[0]?.finish_reason;
  if (!finishReason) {
    console.warn('警告:流可能未正常结束');
  }
} catch (error) {
  if (error.message.includes('stream ended')) {
    // 已获取部分内容,可选择使用或重试
    console.log('已获取部分内容,长度:', content.length);
  }
}

4. 🛡️ 预防措施

  • 🔄 实现断点续传:记录已接收的内容,断开后可从断点继续请求剩余部分

  • ⏱️ 合理设置参数:根据场景设置合适的 max_tokens 和超时时间,避免过长响应