引言:一个改变我职业生涯的错误

凌晨三点,我的生产环境突然全面崩溃。日志里充斥着可怕的红色警告:ConnectionError: timeout after 30 seconds。紧接着,用户开始抱怨接口响应超时,订单系统完全瘫痪。作为一名每天处理数百万次AI API调用的工程师,我意识到必须彻底重新思考我们的架构设计。

那次事故之后,我花了三个月时间深入研究AI API网关架构,终于构建出一套能够应对高并发、保证低延迟、同时大幅降低成本的系统。今天,我想把这些实战经验分享给你们。

在开始之前,如果你正在寻找一个稳定、高性价比的AI API中转服务,我强烈建议先了解一下HolySheep AI——他们的延迟低于50毫秒,支持微信和支付宝付款,还有免费赠送的积分。

一、为什么需要AI API网关?

在深入技术细节之前,让我们先理解为什么AI API网关如此重要。

1.1 直接调用的三大痛点

1.2 网关架构的核心价值

一个设计良好的AI API网关能够实现:

二、基础架构设计与实现

2.1 整体架构概览

典型的AI API网关包含以下核心组件:

┌─────────────────────────────────────────────────────────────┐
│                     客户端应用                               │
└─────────────────────┬───────────────────────────────────────┘
                      │ HTTPS
                      ▼
┌─────────────────────────────────────────────────────────────┐
│                    API 网关层                                │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐    │
│  │  限流器   │  │  认证器   │  │  路由表   │  │  监控器   │    │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘    │
└─────────────────────┬───────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────┐
│                    模型适配层                                │
│  ┌─────────────────────────────────────────────────────┐    │
│  │            OpenAI兼容接口适配器                       │    │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────┬───────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────────┐
│                   后端AI服务商                               │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐    │
│  │ HolySheep│  │ OpenAI   │  │Anthropic │  │  自建    │    │
│  │   AI     │  │          │  │          │  │  模型    │    │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘    │
└─────────────────────────────────────────────────────────────┘

2.2 核心Python实现

下面是使用Python构建的基础AI API网关示例。这个实现使用了Flask框架,支持流式响应和多种模型:

"""
AI API Gateway - 基础实现
核心功能:路由、限流、认证、流式响应
"""

from flask import Flask, request, Response, jsonify
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
import requests
import json
import time
from typing import Generator, Dict, Any

app = Flask(__name__)

全局限流器:每秒100请求

limiter = Limiter( app=app, key_func=get_remote_address, default_limits=["100 per minute"], storage_uri="memory://" )

模型路由配置

MODEL_ROUTES = { "gpt-4": {"provider": "holysheep", "model": "gpt-4.1"}, "gpt-3.5": {"provider": "holysheep", "model": "gpt-3.5-turbo"}, "claude": {"provider": "holysheep", "model": "claude-sonnet-4.5"}, "gemini": {"provider": "holysheep", "model": "gemini-2.5-flash"}, "deepseek": {"provider": "holysheep", "model": "deepseek-v3.2"} }

HolySheep API配置 - 请替换为你的API密钥

HOLYSHEEP_CONFIG = { "base_url": "https://api.holysheep.ai/v1", "api_key": "YOUR_HOLYSHEEP_API_KEY", # 替换为你的密钥 "timeout": 30, "max_retries": 3 } class AIClient: """统一的AI客户端封装""" def __init__(self, config: Dict[str, Any]): self.base_url = config["base_url"] self.api_key = config["api_key"] self.timeout = config["timeout"] self.max_retries = config["max_retries"] def chat_completions( self, model: str, messages: list, stream: bool = False, temperature: float = 0.7, max_tokens: int = 2048 ) -> Dict | Generator: """发送聊天完成请求""" endpoint = f"{self.base_url}/chat/completions" headers = { "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" } payload = { "model": model, "messages": messages, "stream": stream, "temperature": temperature, "max_tokens": max_tokens } if stream: return self._stream_request(endpoint, headers, payload) else: return self._sync_request(endpoint, headers, payload) def _sync_request( self, endpoint: str, headers: dict, payload: dict ) -> Dict: """同步请求""" for attempt in range(self.max_retries): try: response = requests.post( endpoint, headers=headers, json=payload, timeout=self.timeout ) response.raise_for_status() return response.json() except requests.exceptions.Timeout: if attempt == self.max_retries - 1: raise Exception("请求超时,请稍后重试") except requests.exceptions.RequestException as e: if attempt == self.max_retries - 1: raise Exception(f"请求失败: {str(e)}") return None def _stream_request( self, endpoint: str, headers: dict, payload: dict ) -> Generator: """流式请求""" try: response = requests.post( endpoint, headers=headers, json=payload, stream=True, timeout=self.timeout ) response.raise_for_status() for line in response.iter_lines(): if line: line_text = line.decode('utf-8') if line_text.startswith('data: '): data = line_text[6:] if data.strip() == '[DONE]': break yield f"data: {data}\n\n" except Exception as e: yield f"data: {json.dumps({'error': str(e)})}\n\n"

初始化客户端

ai_client = AIClient(HOLYSHEEP_CONFIG) @app.route('/v1/chat/completions', methods=['POST']) @limiter.limit("60 per minute") def chat_completions(): """ 主接口:聊天完成 完全兼容OpenAI API格式 """ try: data = request.get_json() # 参数验证 if not data or 'messages' not in data: return jsonify({"error": "缺少messages参数"}), 400 model = data.get('model', 'gpt-3.5') messages = data['messages'] stream = data.get('stream', False) # 调用AI服务 result = ai_client.chat_completions( model=model, messages=messages, stream=stream, temperature=data.get('temperature', 0.7), max_tokens=data.get('max_tokens', 2048) ) if stream: return Response( result, mimetype='text/event-stream', headers={ 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'X-Accel-Buffering': 'no' } ) else: return jsonify(result) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/v1/models', methods=['GET']) def list_models(): """列出可用模型""" return jsonify({ "models": list(MODEL_ROUTES.keys()) }) @app.route('/health', methods=['GET']) def health_check(): """健康检查""" return jsonify({ "status": "healthy", "timestamp": time.time() }) if __name__ == '__main__': print("🚀 AI API Gateway 启动中...") print(f"📍 主端口: http://localhost:5000") print(f"📍 健康检查: http://localhost:5000/health") app.run(host='0.0.0.0', port=5000, debug=False)

三、高级优化策略

3.1 智能路由与故障转移

在生产环境中,单一的后端服务是不够的。我实现了一个智能路由系统,能够自动在多个服务商之间切换:

"""
高级路由系统:智能路由 + 自动故障转移
"""

import asyncio
import aiohttp
from dataclasses import dataclass
from typing import List, Optional, Dict
from enum import Enum
import time
import random

class ProviderStatus(Enum):
    HEALTHY = "healthy"
    DEGRADED = "degraded"
    DOWN = "down"

@dataclass
class Provider:
    """服务商配置"""
    name: str
    base_url: str
    api_key: str
    priority: int  # 1-10, 越高越优先
    status: ProviderStatus = ProviderStatus.HEALTHY
    latency_avg: float = 100.0
    request_count: int = 0
    error_count: int = 0
    
    @property
    def success_rate(self) -> float:
        if self.request_count == 0:
            return 1.0
        return (self.request_count - self.error_count) / self.request_count
    
    @property
    def score(self) -> float:
        """计算综合得分"""
        if self.status == ProviderStatus.DOWN:
            return 0
        success_weight = self.success_rate * 0.4
        latency_weight = max(0, 1 - self.latency_avg / 1000) * 0.3
        priority_weight = self.priority / 10 * 0.3
        return success_weight + latency_weight + priority_weight

class SmartRouter:
    """智能路由系统"""
    
    def __init__(self):
        self.providers: List[Provider] = []
        self.health_check_interval = 30  # 秒
        self.last_health_check = 0
    
    def add_provider(self, provider: Provider):
        """添加服务商"""
        self.providers.append(provider)
    
    def get_best_provider(self) -> Optional[Provider]:
        """获取最佳服务商"""
        available = [p for p in self.providers if p.status != ProviderStatus.DOWN]
        if not available:
            return None
        
        # 按得分排序
        sorted_providers = sorted(available, key=lambda p: p.score, reverse=True)
        return sorted_providers[0]
    
    async def route_request(
        self, 
        model: str, 
        messages: list,
        stream: bool = False
    ) -> Dict:
        """智能路由请求"""
        
        # 获取最佳服务商
        provider = self.get_best_provider()
        if not provider:
            return {"error": "所有服务商均不可用"}
        
        # 尝试请求
        for attempt in range(3):
            try:
                result = await self._make_request(provider, model, messages, stream)
                return result
            except Exception as e:
                provider.error_count += 1
                print(f"⚠️ 提供商 {provider.name} 请求失败: {e}")
                
                # 尝试备用提供商
                provider = self._get_fallback_provider(provider)
                if not provider:
                    break
        
        return {"error": "请求失败,请稍后重试"}
    
    async def _make_request(
        self, 
        provider: Provider,
        model: str, 
        messages: list,
        stream: bool
    ) -> Dict:
        """发起请求"""
        
        start_time = time.time()
        provider.request_count += 1
        
        url = f"{provider.base_url}/chat/completions"
        headers = {
            "Authorization": f"Bearer {provider.api_key}",
            "Content-Type": "application/json"
        }
        payload = {
            "model": model,
            "messages": messages,
            "stream": stream
        }
        
        timeout = aiohttp.ClientTimeout(total=30)
        
        async with aiohttp.ClientSession(timeout=timeout) as session:
            async with session.post(url, json=payload, headers=headers) as response:
                if response.status == 200:
                    data = await response.json()
                    latency = time.time() - start_time
                    
                    # 更新延迟统计
                    provider.latency_avg = (provider.latency_avg * 0.7 + latency * 0.3)
                    
                    return data
                else:
                    provider.error_count += 1
                    error_text = await response.text()
                    raise Exception(f"HTTP {response.status}: {error_text}")
    
    def _get_fallback_provider(self, failed_provider: Provider) -> Optional[Provider]:
        """获取备用提供商"""
        available = [
            p for p in self.providers 
            if p.name != failed_provider.name and p.status != ProviderStatus.DOWN
        ]
        if available:
            return max(available, key=lambda p: p.score)
        return None
    
    async def health_check(self):
        """健康检查"""
        while True:
            await asyncio.sleep(self.health_check_interval)
            
            for provider in self.providers:
                try:
                    start = time.time()
                    # 简单的健康检查请求
                    url = f"{provider.base_url}/models"
                    headers = {"Authorization": f"Bearer {provider.api_key}"}
                    
                    async with aiohttp.ClientSession() as session:
                        async with session.get(url, headers=headers, timeout=5) as response:
                            if response.status == 200:
                                provider.status = ProviderStatus.HEALTHY
                            else:
                                provider.status = ProviderStatus.DEGRADED
                except:
                    provider.status = ProviderStatus.DOWN
                
                latency = (time.time() - start) * 1000
                print(f"🏥 {provider.name}: {provider.status.value} ({latency:.0f}ms)")


使用示例

async def main(): router = SmartRouter() # 添加HolySheep作为主服务商 router.add_provider(Provider( name="holysheep-primary", base_url="https://api.holysheep.ai/v1", api_key="YOUR_HOLYSHEEP_API_KEY", priority=10, latency_avg=45.0 # HolySheep实测延迟 <50ms )) # 添加备用服务商 router.add_provider(Provider( name="backup-provider", base_url="https://backup-api.example.com/v1", api_key="BACKUP_KEY", priority=5, latency_avg=200.0 )) # 启动健康检查 asyncio.create_task(router.health_check()) # 测试请求 result = await router.route_request( model="gpt-4", messages=[{"role": "user", "content": "你好"}], stream=False ) print(result) if __name__ == "__main__": asyncio.run(main())

3.2 请求合并与批处理优化

对于需要处理大量短请求的场景,我实现了请求合并机制:

"""
请求合并器 - 将多个小请求合并为一个批处理请求
显著降低API调用成本和延迟
"""

import asyncio
import time
from dataclasses import dataclass, field
from typing import List, Dict, Callable, Any
from collections import defaultdict
import hashlib

@dataclass
class QueuedRequest:
    """队列中的请求"""
    id: str
    model: str
    messages: List[Dict]
    future: asyncio.Future
    created_at: float = field(default_factory=time.time)

class RequestBatcher:
    """请求批处理器"""
    
    def __init__(
        self, 
        batch_size: int = 10,
        max_wait_ms: int = 100,  # 最大等待时间(毫秒)
        ai_client: Any = None
    ):
        self.batch_size = batch_size
        self.max_wait_ms = max_wait_ms / 1000  # 转换为秒
        self.ai_client = ai_client
        self.queue: List[QueuedRequest] = []
        self.lock = asyncio.Lock()
        self.batch_task: Optional[asyncio.Task] = None
    
    async def add_request(
        self,
        model: str,
        messages: List[Dict]
    ) -> Dict:
        """添加请求到批处理队列"""
        
        # 生成唯一ID
        content_hash = hashlib.md5(
            str(messages).encode()
        ).hexdigest()[:8]
        request_id = f"{model}_{content_hash}_{time.time()}"
        
        # 创建Future
        future = asyncio.Future()
        
        request = QueuedRequest(
            id=request_id,
            model=model,
            messages=messages,
            future=future
        )
        
        async with self.lock:
            self.queue.append(request)
            
            # 启动批处理任务(如果尚未运行)
            if self.batch_task is None or self.batch_task.done():
                self.batch_task = asyncio.create_task(self._process_batch())
        
        # 等待结果
        return await future
    
    async def _process_batch(self):
        """处理批次请求"""
        await asyncio.sleep(self.max_wait_ms)  # 等待更多请求
        
        async with self.lock:
            if not self.queue:
                return
            
            # 获取当前批次
            batch = self.queue[:self.batch_size]
            self.queue = self.queue[self.batch_size:]
        
        # 准备批量请求
        requests_data = [
            {
                "custom_id": req.id,
                "model": req.model,
                "messages": req.messages
            }
            for req in batch
        ]
        
        try:
            # 发送到批处理端点
            result = await self._send_batch(requests_data)
            
            # 解析结果并唤醒等待的Future
            result_map = {item["custom_id"]: item for item in result}
            
            for req in batch:
                if req.id in result_map:
                    req.future.set_result(result_map[req.id])
                else:
                    req.future.set_result({"error": "请求未在响应中返回"})
        
        except Exception as e:
            # 所有请求失败
            for req in batch:
                req.future.set_result({"error": str(e)})
    
    async def _send_batch(self, requests: List[Dict]) -> List[Dict]:
        """发送批量请求"""
        
        if not self.ai_client:
            raise Exception("未配置AI客户端")
        
        # 构建批量请求
        batch_payload = {
            "requests": requests
        }
        
        response = await self.ai_client.post(
            "/v1/batch/chat",
            json=batch_payload
        )
        
        return response.get("results", [])
    
    async def flush(self):
        """强制刷新所有待处理请求"""
        async with self.lock:
            pending = self.queue.copy()
            self.queue.clear()
        
        for req in pending:
            req.future.set_result({"error": "请求已取消"}) 


使用示例

async def example_usage(): batcher = RequestBatcher( batch_size=5, max_wait_ms=50, # 50毫秒内合并请求 ai_client=None # 传入实际客户端 ) # 模拟并发请求 tasks = [] for i in range(20): task = asyncio.create_task( batcher.add_request( model="gpt-3.5-turbo", messages=[{"role": "user", "content": f"请求 {i}"}] ) ) tasks.append(task) # 并发执行所有请求 results = await asyncio.gather(*tasks) print(f"✅ 处理了 {len(results)} 个请求") print(f"📊 实际API调用次数: {len(results) // 5 + 1}") # 批处理大幅减少调用次数 if __name__ == "__main__": asyncio.run(example_usage())

四、成本优化实战

4.1 2026年主流模型价格对比

在选择AI服务商时,成本是一个关键因素。以下是2026年主流模型的价格对比(每百万Token):

通过使用HolySheep AI这样的优质中转服务,你可以以官方价格的15%甚至更低获得相同质量的API访问。这对于日均调用量超过100万次的企业来说,每年可以节省数百万美元。

4.2 成本监控与告警

"""
成本监控系统 - 实时追踪API使用成本
"""

import asyncio
from datetime import datetime, timedelta
from dataclasses import dataclass, field
from typing import Dict, List
from collections import defaultdict
import aiohttp

@dataclass
class CostRecord:
    """成本记录"""
    timestamp: datetime
    model: str
    input_tokens: int
    output_tokens: int
    cost: float

class CostMonitor:
    """成本监控器"""
    
    # 2026年参考价格(每百万Token)
    PRICING = {
        "gpt-4.1": {"input": 8.0, "output": 24.0},
        "gpt-3.5-turbo": {"input": 0.5, "output": 1.5},
        "claude-sonnet-4.5": {"input": 15.0, "output": 75.0},
        "gemini-2.5-flash": {"input": 2.50, "output": 10.0},
        "deepseek-v3.2": {"input": 0.42, "output": 2.78}
    }
    
    def __init__(self, alert_threshold_daily: float = 100.0):
        self.records: List[CostRecord] = []
        self.alert_threshold_daily = alert_threshold_daily
        self.alert_callbacks: List[callable] = []
    
    def add_cost(self, model: str, input_tokens: int, output_tokens: int):
        """添加成本记录"""
        
        pricing = self.PRICING.get(model, {"input": 1.0, "output": 3.0})
        
        input_cost = (input_tokens / 1_000_000) * pricing["input"]
        output_cost = (output_tokens / 1_000_000) * pricing["output"]
        total_cost = input_cost + output_cost
        
        record = CostRecord(
            timestamp=datetime.now(),
            model=model,
            input_tokens=input_tokens,
            output_tokens=output_tokens,
            cost=total_cost
        )
        
        self.records.append(record)
        
        # 检查是否需要告警
        self._check_alerts()
    
    def get_daily_cost(self, days: int = 1) -> float:
        """获取每日成本"""
        
        cutoff = datetime.now() - timedelta(days=days)
        relevant_records = [r for r in self.records if r.timestamp >= cutoff]
        
        return sum(r.cost for r in relevant_records)
    
    def get_cost_by_model(self, days: int = 7) -> Dict[str, float]:
        """按模型分类的成本"""
        
        cutoff = datetime.now() - timedelta(days=days)
        relevant_records = [r for r in self.records if r.timestamp >= cutoff]
        
        cost_by_model = defaultdict(float)
        for record in relevant_records:
            cost_by_model[record.model] += record.cost
        
        return dict(cost_by_model)
    
    def get_usage_stats(self, days: int = 7) -> Dict:
        """获取使用统计"""
        
        cutoff = datetime.now() - timedelta(days=days)
        relevant_records = [r for r in self.records if r.timestamp >= cutoff]
        
        total_input = sum(r.input_tokens for r in relevant_records)
        total_output = sum(r.output_tokens for r in relevant_records)
        total_cost = sum(r.cost for r in relevant_records)
        
        return {
            "period_days": days,
            "total_requests": len(relevant_records),
            "total_input_tokens": total_input,
            "total_output_tokens": total_output,
            "total_cost": round(total_cost, 4),
            "avg_cost_per_request": round(total_cost / len(relevant_records), 6) if relevant_records else 0,
            "cost_by_model": self.get_cost_by_model(days)
        }
    
    def _check_alerts(self):
        """检查是否触发告警"""
        
        daily_cost = self.get_daily_cost(days=1)
        
        if daily_cost >= self.alert_threshold_daily:
            for callback in self.alert_callbacks:
                try:
                    callback(daily_cost)
                except Exception as e:
                    print(f"告警回调失败: {e}")
    
    def register_alert_callback(self, callback: callable):
        """注册告警回调"""
        self.alert_callbacks.append(callback)
    
    def generate_report(self) -> str:
        """生成成本报告"""
        
        stats = self.get_usage_stats(days=7)
        
        report = f"""
╔══════════════════════════════════════════════════════════╗
║                    AI API 成本周报                         ║
╠══════════════════════════════════════════════════════════╣
║ 统计周期: {stats['period_days']}天                                              ║
║ 总请求数: {stats['total_requests']:,}                                          ║
║ 输入Token: {stats['total_input_tokens']:,}                                      ║
║ 输出Token: {stats['total_output_tokens']:,}                                      ║
║ 总成本: ${stats['total_cost']:.4f}                                           ║
║ 单请求平均成本: ${stats['avg_cost_per_request']:.6f}                          ║
╠══════════════════════════════════════════════════════════╣
║ 按模型成本分布:                                            ║
"""
        
        for model, cost in sorted(stats['cost_by_model'].items(), key=lambda x: x[1], reverse=True):
            percentage = (cost / stats['total_cost'] * 100) if stats['total_cost'] > 0 else 0
            report += f"║   {model}: ${cost:.4f} ({percentage:.1f}%)                          ║\n"
        
        report += "╚══════════════════════════════════════════════════════════╝"
        
        return report


使用示例

async def example(): monitor = CostMonitor(alert_threshold_daily=50.0) # 注册告警回调 def alert_handler(daily_cost): print(f"🚨 告警:日成本已达 ${daily_cost:.2f}") monitor.register_alert_callback(alert_handler) # 模拟一些请求 monitor.add_cost("gpt-4.1", input_tokens=1000, output_tokens=500) monitor.add_cost("deepseek-v3.2", input_tokens=2000, output_tokens=1000) monitor.add_cost("claude-sonnet-4.5", input_tokens=500, output_tokens=300) # 打印报告 print(monitor.generate_report()) if __name__ == "__main__": asyncio.run(example())

五、性能监控与指标

在我的生产环境中部署这套系统后,性能有了显著提升:

六、Erreurs courantes et solutions

6.1 错误1:ConnectionError超时

# 问题代码
response = requests.post(url, json=payload, timeout=30)

解决方案:添加重试机制和超时配置

from tenacity import retry, stop_after_attempt, wait_exponential @retry( stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10) ) def make_request_with_retry(url, payload, api_key): """带重试的请求函数""" headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } try: response = requests.post( url, headers=headers, json=payload, timeout=(10, 30) # (连接超时, 读取超时) ) response.raise_for_status() return response.json() except requests.exceptions.Timeout: # 重试时增加超时时间 raise ConnectionError("请求超时,请检查网络或增加超时时间") except requests.exceptions.ConnectionError as e: # 网络问题,添加适当的错误处理 if "Connection aborted" in str(e): raise ConnectionError("连接被拒绝,可能是API地址错误或服务不可用") raise

6.2 错误2:401 Unauthorized认证失败

# 问题:API密钥配置错误

解决方案:完善错误处理和密钥验证

import os from functools import wraps def validate_api_key(f): """API密钥验证装饰器""" @wraps(f) def decorated_function(*args, **kwargs): api_key = kwargs.get('api_key') or os.environ.get('HOLYSHEEP_API_KEY') if not api_key: return {"error": "API密钥未配置", "code": "MISSING_API_KEY"}, 401 if api_key == "YOUR_HOLYSHEEP_API_KEY": return {"error": "请替换为真实的API密钥", "code": "INVALID_API_KEY"}, 401 if len(api_key) < 20: return {"error": "API密钥格式不正确", "code": "INVALID_API_KEY_FORMAT"}, 401 return f(*args, **kwargs) return decorated_function @validate_api_key def test_connection(api_key: str): """测试API连接""" base_url = "https://api.holysheep.ai/v1" try: response = requests.get( f"{base_url}/models", headers={"Authorization": f"Bearer {api_key}"}, timeout=10 ) if response.status_code == 401: return {"error": "API密钥无效或已过期", "solution": "请到 HolySheep AI 重新获取密钥"}, 401 response.raise_for_status() return {"status": "连接成功", "models": response.json()} except requests.exceptions.RequestException as e: return {"error": f"连接失败: {str(e)}"}, 500

使用示例

result = test_connection("YOUR_HOLYSHEEP_API_KEY")

print(result)

6.3 错误3:流式响应中断

# 问题:流式响应时不完整的数据或连接中断

解决方案:完善流式处理逻辑

import json import sseclient from typing import Generator def stream_response_generator(response: requests.Response) -> Generator[str, None, None]: """完善的流式响应处理""" if response.status_code != 200: error_body = response.text yield f"data: {json.dumps({'error': f'HTTP {response.status_code}', 'detail': error_body})}\n\n" yield "data: [DONE]\n\n" return try: client = sseclient.SSEClient(response) buffer = "" for event in client.events(): if event.data == "[DONE]": break try: # 解析SSE数据 data = json.loads(event.data) # 验证数据格式 if 'choices' in data: buffer += event.data + "\n\n" yield f"data: {event.data}\n\n" else: yield f"data: {json.dumps({'error': '无效的响应格式'})}\n\n" except json.JSONDecodeError: # 部分数据,可能需要合并 buffer += event.data try: data = json.loads(buffer) yield f"data