作为服务过200+企业的 AI 技术顾问,我见过太多团队因为没有做好限流、重试和降级策略,在流量高峰时系统崩溃、API 调用失败、账单暴增。今天这篇教程,我将用 8 年踩坑经验,帮你从零搭建一套完整的企业级高可用方案。

结论摘要

主流 AI API 服务商对比(2026年最新)

>$18/MTok
服务商GPT-4.1 Output价格Claude Sonnet 4.5Gemini 2.5 FlashDeepSeek V3.2延迟支付方式适合人群
HolySheep AI $8/MTok $15/MTok $2.50/MTok $0.42/MTok <50ms(国内) 微信/支付宝 国内开发者首选
OpenAI 官方 $15/MTok - - - 200-500ms 国际信用卡 海外企业
Anthropic 官方 - - - 180-400ms 国际信用卡 海外企业
其他中转 $10-12/MTok $16-18/MTok $3-4/MTok $0.5-0.8/MTok 80-200ms 参差不齐 价格敏感型

我在 2025 年帮助一家金融科技公司做架构升级时,原先用官方 API 月账单 $12,000,切换到 HolySheep AI 后,同样的调用量月账单降到约 $3,800,节省超过 68%。而且国内直连的低延迟让用户体验显著提升。

目录

一、限流策略:从令牌桶到滑动窗口

限流是保护系统的第一道防线。常见的限流算法有三种:计数器、令牌桶、滑动窗口。我推荐使用令牌桶算法,它允许一定程度的突发流量,同时保证长期速率稳定。

1.1 Python 实现令牌桶限流器

import time
import threading
from collections import deque
from typing import Optional

class TokenBucketRateLimiter:
    """
    令牌桶限流器
    capacity: 桶的最大容量
    refill_rate: 每秒补充的令牌数
    """
    
    def __init__(self, capacity: int, refill_rate: float):
        self.capacity = capacity
        self.refill_rate = refill_rate
        self.tokens = capacity
        self.last_refill_time = time.time()
        self.lock = threading.Lock()
    
    def _refill(self):
        """自动补充令牌"""
        now = time.time()
        elapsed = now - self.last_refill_time
        new_tokens = elapsed * self.refill_rate
        self.tokens = min(self.capacity, self.tokens + new_tokens)
        self.last_refill_time = now
    
    def acquire(self, tokens: int = 1, blocking: bool = True, timeout: Optional[float] = None) -> bool:
        """
        获取令牌
        tokens: 需要的令牌数
        blocking: 是否阻塞等待
        timeout: 超时时间(秒)
        返回: 是否获取成功
        """
        start_time = time.time()
        
        while True:
            with self.lock:
                self._refill()
                
                if self.tokens >= tokens:
                    self.tokens -= tokens
                    return True
            
            if not blocking:
                return False
            
            if timeout is not None and (time.time() - start_time) >= timeout:
                return False
            
            time.sleep(0.01)
    
    def get_available_tokens(self) -> float:
        """获取当前可用令牌数"""
        with self.lock:
            self._refill()
            return self.tokens


使用示例:限制每秒 10 次调用

rate_limiter = TokenBucketRateLimiter(capacity=100, refill_rate=10) def call_holysheep_api(): if rate_limiter.acquire(tokens=1, blocking=True, timeout=5.0): # 调用 HolySheep API # base_url: https://api.holysheep.ai/v1 print("API调用成功") return True else: print("限流:等待超时") return False

1.2 分布式限流:Redis + Lua 脚本

单机限流在微服务架构下不够用,我们需要分布式限流。以下是基于 Redis 的滑动窗口实现:

-- Redis Lua 脚本:滑动窗口限流
-- key: 限流key
-- window_size: 窗口大小(毫秒)
-- max_requests: 窗口内最大请求数

local key = KEYS[1]
local window_size = tonumber(ARGV[1])
local max_requests = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local request_id = ARGV[4]

-- 删除窗口外的旧数据
local window_start = now - window_size
redis.call('ZREMRANGEBYSCORE', key, '-inf', window_start)

-- 获取当前窗口内的请求数
local current_count = redis.call('ZCARD', key)

if current_count < max_requests then
    -- 添加新请求
    redis.call('ZADD', key, now, request_id)
    redis.call('PEXPIRE', key, window_size)
    return 1  -- 允许通过
else
    return 0  -- 被限流
end
import redis
import uuid
import time

class RedisSlidingWindowRateLimiter:
    """基于 Redis 滑动窗口的分布式限流器"""
    
    def __init__(self, redis_client: redis.Redis, key_prefix: str = "rate_limit"):
        self.redis = redis_client
        self.key_prefix = key_prefix
    
    def is_allowed(self, identifier: str, max_requests: int, window_size_ms: int = 1000) -> bool:
        """
        检查是否允许请求
        identifier: 限流标识(用户ID、IP等)
        max_requests: 窗口内最大请求数
        window_size_ms: 窗口大小(毫秒)
        """
        key = f"{self.key_prefix}:{identifier}"
        now = int(time.time() * 1000)
        request_id = f"{now}:{uuid.uuid4()}"
        
        lua_script = """
        local key = KEYS[1]
        local window_size = tonumber(ARGV[1])
        local max_requests = tonumber(ARGV[2])
        local now = tonumber(ARGV[3])
        local request_id = ARGV[4]
        
        local window_start = now - window_size
        redis.call('ZREMRANGEBYSCORE', key, '-inf', window_start)
        
        local current_count = redis.call('ZCARD', key)
        
        if current_count < max_requests then
            redis.call('ZADD', key, now, request_id)
            redis.call('PEXPIRE', key, window_size)
            return 1
        else
            return 0
        end
        """
        
        result = self.redis.eval(
            lua_script, 1, key, window_size_ms, max_requests, now, request_id
        )
        return result == 1


使用示例

redis_client = redis.Redis(host='localhost', port=6379) limiter = RedisSlidingWindowRateLimiter(redis_client)

每个用户每秒最多10次调用

user_id = "user_12345" if limiter.is_allowed(user_id, max_requests=10, window_size_ms=1000): print("请求通过") else: print("被限流,请稍后重试")

1.3 各大平台限流配置对比

平台默认 QPS 限制可申请提升超出处理
HolyShehe AI 60 RPM 企业版可调至 1000+ RPM 返回 429,附带 retry_after
OpenAI 3-500 RPM(模型不同) Tier 1-5 等级提升 返回 429
Claude 50 RPM 需申请 返回 429

二、重试机制:指数退避与熔断器模式

我在 2024 年处理过一次线上事故:凌晨 3 点服务器网络抖动,所有 API 调用失败,但因为没有重试机制,整个系统宕机 2 小时。从那以后,我给每个项目都强制要求实现智能重试机制

2.1 带指数退避的重试装饰器

import time
import random
import functools
from typing import Callable, Type, Tuple, Optional
from enum import Enum

class RetryStrategy(Enum):
    """重试策略"""
    FIXED = "fixed"           # 固定间隔
    LINEAR = "linear"         # 线性递增
    EXPONENTIAL = "exponential"  # 指数退避
    EXPONENTIAL_WITH_JITTER = "exponential_with_jitter"  # 指数退避+抖动

class RetryableError(Exception):
    """可重试的错误基类"""
    pass

class RateLimitError(RetryableError):
    """限流错误(可重试)"""
    def __init__(self, message, retry_after: Optional[float] = None):
        super().__init__(message)
        self.retry_after = retry_after

class ServerError(RetryableError):
    """服务器错误(可重试)"""
    pass

class NetworkError(RetryableError):
    """网络错误(可重试)"""
    pass

def with_retry(
    max_attempts: int = 3,
    strategy: RetryStrategy = RetryStrategy.EXPONENTIAL_WITH_JITTER,
    base_delay: float = 1.0,
    max_delay: float = 60.0,
    retryable_exceptions: Tuple[Type[Exception], ...] = (
        RateLimitError, ServerError, NetworkError, TimeoutError
    ),
    non_retryable_exceptions: Tuple[Type[Exception], ...] = (
        ValueError, TypeError, KeyError
    )
):
    """
    重试装饰器
    
    Args:
        max_attempts: 最大尝试次数
        strategy: 重试策略
        base_delay: 基础延迟(秒)
        max_delay: 最大延迟(秒)
        retryable_exceptions: 可重试的异常类型
        non_retryable_exceptions: 不可重试的异常类型
    """
    def decorator(func: Callable):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            last_exception = None
            
            for attempt in range(1, max_attempts + 1):
                try:
                    return func(*args, **kwargs)
                
                except non_retryable_exceptions:
                    # 不可重试的错误,直接抛出
                    raise
                
                except retryable_exceptions as e:
                    last_exception = e
                    
                    # 检查是否有 retry_after 头
                    if isinstance(e, RateLimitError) and e.retry_after:
                        delay = e.retry_after
                    elif attempt == max_attempts:
                        # 最后一次尝试失败
                        raise
                    else:
                        delay = _calculate_delay(
                            attempt, strategy, base_delay, max_delay
                        )
                    
                    print(f"Attempt {attempt}/{max_attempts} failed: {e}")
                    print(f"Retrying in {delay:.2f} seconds...")
                    time.sleep(delay)
            
            raise last_exception
        
        return wrapper
    return decorator

def _calculate_delay(
    attempt: int,
    strategy: RetryStrategy,
    base_delay: float,
    max_delay: float
) -> float:
    """计算延迟时间"""
    
    if strategy == RetryStrategy.FIXED:
        delay = base_delay
    
    elif strategy == RetryStrategy.LINEAR:
        delay = base_delay * attempt
    
    elif strategy == RetryStrategy.EXPONENTIAL:
        delay = base_delay * (2 ** (attempt - 1))
    
    elif strategy == RetryStrategy.EXPONENTIAL_WITH_JITTER:
        # 指数退避 + 随机抖动(0.5-1.5倍)
        exponential_delay = base_delay * (2 ** (attempt - 1))
        jitter = random.uniform(0.5, 1.5)
        delay = exponential_delay * jitter
    
    else:
        delay = base_delay
    
    return min(delay, max_delay)


使用示例

@with_retry(max_attempts=3, strategy=RetryStrategy.EXPONENTIAL_WITH_JITTER, base_delay=1.0) def call_holysheep_api(prompt: str): """ 调用 HolyShehe AI API base_url: https://api.holysheep.ai/v1 """ import requests response = requests.post( "https://api.holysheep.ai/v1/chat/completions", headers={ "Authorization": f"Bearer {YOUR_HOLYSHEEP_API_KEY}", "Content-Type": "application/json" }, json={ "model": "gpt-4.1", "messages": [{"role": "user", "content": prompt}] }, timeout=30 ) if response.status_code == 429: # 限流错误,解析 retry_after retry_after = float(response.headers.get("retry-after", 60)) raise RateLimitError("Rate limit exceeded", retry_after=retry_after) if response.status_code >= 500: raise ServerError(f"Server error: {response.status_code}") if response.status_code != 200: raise Exception(f"API error: {response.status_code}") return response.json()

2.2 熔断器模式实现

熔断器模式是防止雪崩效应的关键。2025 年双十一期间,我负责的一个电商项目就是因为没熔断器,一个下游服务故障导致整个系统崩溃。以下是完整的熔断器实现:

import time
from enum import Enum
from threading import Lock
from typing import Callable, TypeVar, Generic
from dataclasses import dataclass, field
from collections import deque

T = TypeVar('T')

class CircuitState(Enum):
    """熔断器状态"""
    CLOSED = "closed"      # 关闭状态,正常调用
    OPEN = "open"          # 打开状态,快速失败
    HALF_OPEN = "half_open"  # 半开状态,尝试恢复

@dataclass
class CircuitBreakerConfig:
    """熔断器配置"""
    failure_threshold: int = 5      # 打开熔断的失败次数
    success_threshold: int = 3      # 半开状态下成功的次数
    timeout: float = 60.0           # 熔断打开的持续时间(秒)
    half_open_max_calls: int = 3    # 半开状态下的最大尝试次数

@dataclass
class CircuitBreakerMetrics:
    """熔断器指标"""
    total_calls: int = 0
    successful_calls: int = 0
    failed_calls: int = 0
    rejected_calls: int = 0
    last_failure_time: float = 0
    recent_results: deque = field(default_factory=lambda: deque(maxlen=100))
    
    def record_success(self):
        self.total_calls += 1
        self.successful_calls += 1
        self.recent_results.append(True)
    
    def record_failure(self):
        self.total_calls += 1
        self.failed_calls += 1
        self.recent_results.append(False)
        self.last_failure_time = time.time()
    
    def record_rejection(self):
        self.rejected_calls += 1
    
    def get_failure_rate(self) -> float:
        if self.total_calls == 0:
            return 0.0
        return self.failed_calls / self.total_calls

class CircuitBreakerOpen(Exception):
    """熔断器打开异常"""
    def __init__(self, remaining_timeout: float):
        self.remaining_timeout = remaining_timeout
        super().__init__(f"Circuit breaker is OPEN. Retry after {remaining_timeout:.2f}s")

class CircuitBreaker(Generic[T]):
    """
    熔断器实现
    
    状态转换:
    CLOSED -> OPEN: 连续失败达到阈值
    OPEN -> HALF_OPEN: 超过 timeout
    HALF_OPEN -> CLOSED: 连续成功达到阈值
    HALF_OPEN -> OPEN: 任何失败
    """
    
    def __init__(self, name: str, config: CircuitBreakerConfig = None):
        self.name = name
        self.config = config or CircuitBreakerConfig()
        self.state = CircuitState.CLOSED
        self.lock = Lock()
        self.metrics = CircuitBreakerMetrics()
        self.last_state_change_time = time.time()
        self.consecutive_successes = 0
        self.consecutive_failures = 0
        self.half_open_calls = 0
    
    def call(self, func: Callable[[], T], *args, **kwargs) -> T:
        """
        通过熔断器调用函数
        """
        with self.lock:
            # 检查是否应该转换状态
            self._check_state_transition()
            
            # 如果熔断器打开,直接拒绝
            if self.state == CircuitState.OPEN:
                self.metrics.record_rejection()
                remaining = self.config.timeout - (time.time() - self.last_state_change_time)
                raise CircuitBreakerOpen(max(0, remaining))
            
            # 半开状态下限制并发
            if self.state == CircuitState.HALF_OPEN:
                if self.half_open_calls >= self.config.half_open_max_calls:
                    self.metrics.record_rejection()
                    raise CircuitBreakerOpen(1.0)
                self.half_open_calls += 1
        
        # 执行调用
        try:
            result = func(*args, **kwargs)
            
            with self.lock:
                self.metrics.record_success()
                self._handle_success()
            
            return result
            
        except Exception as e:
            with self.lock:
                self.metrics.record_failure()
                self._handle_failure()
            raise
    
    def _check_state_transition(self):
        """检查并执行状态转换"""
        if self.state == CircuitState.OPEN:
            elapsed = time.time() - self.last_state_change_time
            if elapsed >= self.config.timeout:
                self._transition_to(CircuitState.HALF_OPEN)
    
    def _handle_success(self):
        """处理成功调用"""
        self.consecutive_successes += 1
        self.consecutive_failures = 0
        
        if self.state == CircuitState.HALF_OPEN:
            if self.consecutive_successes >= self.config.success_threshold:
                self._transition_to(CircuitState.CLOSED)
    
    def _handle_failure(self):
        """处理失败调用"""
        self.consecutive_failures += 1
        self.consecutive_successes = 0
        
        if self.state == CircuitState.HALF_OPEN:
            self._transition_to(CircuitState.OPEN)
        elif self.state == CircuitState.CLOSED:
            if self.consecutive_failures >= self.config.failure_threshold:
                self._transition_to(CircuitState.OPEN)
    
    def _transition_to(self, new_state: CircuitState):
        """状态转换"""
        if self.state == new_state:
            return
        
        print(f"[CircuitBreaker:{self.name}] State transition: {self.state.value} -> {new_state.value}")
        self.state = new_state
        self.last_state_change_time = time.time()
        
        if new_state == CircuitState.HALF_OPEN:
            self.half_open_calls = 0
        elif new_state == CircuitState.CLOSED:
            self.consecutive_successes = 0
            self.consecutive_failures = 0
    
    def get_status(self) -> dict:
        """获取熔断器状态"""
        return {
            "name": self.name,
            "state": self.state.value,
            "metrics": {
                "total_calls": self.metrics.total_calls,
                "success_rate": 1 - self.metrics.get_failure_rate(),
                "failure_rate": self.metrics.get_failure_rate(),
                "rejected_calls": self.metrics.rejected_calls
            }
        }


使用示例:结合重试机制

@with_retry(max_attempts=3) def call_api_with_circuit_breaker(prompt: str, circuit_breaker: CircuitBreaker): """带熔断器的 API 调用""" def _make_request(): import requests response = requests.post( "https://api.holysheep.ai/v1/chat/completions", headers={ "Authorization": f"Bearer {YOUR_HOLYSHEEP_API_KEY}", "Content-Type": "application/json" }, json={ "model": "gpt-4.1", "messages": [{"role": "user", "content": prompt}] }, timeout=30 ) if response.status_code >= 500: raise ServerError(f"Server error: {response.status_code}") if response.status_code == 429: retry_after = float(response.headers.get("retry-after", 60)) raise RateLimitError("Rate limit", retry_after=retry_after) if response.status_code != 200: raise Exception(f"API error: {response.status_code}") return response.json() return circuit_breaker.call(_make_request)

创建熔断器

circuit_breaker = CircuitBreaker( name="holysheep_api", config=CircuitBreakerConfig( failure_threshold=5, success_threshold=3, timeout=60.0 ) )

使用

try: result = call_api_with_circuit_breaker("你好,请介绍一下自己", circuit_breaker) print(result) except CircuitBreakerOpen as e: print(f"服务暂时不可用,请 {e.remaining_timeout:.0f} 秒后重试") except Exception as e: print(f"请求失败: {e}")

三、降级策略:多级降级与兜底方案

降级是系统的最后一道防线。2026年,我参与的一个政务系统项目,凌晨数据库故障,因为提前设计了多级降级策略,系统依然能提供基础查询服务,群众办事没有受影响。以下是完整的降级方案设计:

3.1 多级降级策略设计

from enum import Enum
from typing import Any, Optional, Callable, Dict, List
from dataclasses import dataclass
import json
import hashlib

class DegradeLevel(Enum):
    """降级级别"""
    LEVEL_0 = 0  # 正常服务
    LEVEL_1 = 1  # 启用缓存
    LEVEL_2 = 2  # 简化响应
    LEVEL_3 = 3  # 返回兜底数据
    LEVEL_4 = 4  # 完全不可用

@dataclass
class DegradeConfig:
    """降级配置"""
    enable_cache: bool = True
    cache_ttl: int = 3600  # 缓存 TTL(秒)
    fallback_enabled: bool = True
    simplified_response: bool = True

class FallbackResponse:
    """兜底响应"""
    
    # 通用兜底数据
    GENERIC_FALLBACK = {
        "status": "degraded",
        "message": "服务暂时降级,请稍后重试",
        "timestamp": None
    }
    
    # 分类兜底数据
    CATEGORY_RESPONSES = {
        "qa": "抱歉,服务暂时繁忙,请稍后重试或换个问题。",
        "summary": "内容摘要服务暂时不可用。",
        "translation": "翻译服务暂时不可用。",
        "code": "代码助手服务暂时不可用。",
        "analysis": "数据分析服务暂时不可用。"
    }
    
    @classmethod
    def get_fallback(cls, category: str = None) -> dict:
        """获取兜底响应"""
        from datetime import datetime
        return {
            "status": "fallback",
            "message": cls.CATEGORY_RESPONSES.get(category, cls.CATEGORY_RESPONSES["qa"]),
            "timestamp": datetime.now().isoformat(),
            "category": category
        }
    
    @classmethod
    def get_simplified_response(cls, original_response: dict) -> dict:
        """生成简化响应"""
        return {
            "status": "simplified",
            "content": original_response.get("choices", [{}])[0].get("message", {}).get("content", "")[:500],
            "model": original_response.get("model", "unknown"),
            "usage": {
                "total_tokens": original_response.get("usage", {}).get("total_tokens", 0)
            }
        }

class CacheManager:
    """缓存管理器"""
    
    def __init__(self):
        self._cache: Dict[str, tuple] = {}  # key: (value, expire_time)
    
    def get(self, key: str) -> Optional[Any]:
        """获取缓存"""
        if key in self._cache:
            value, expire_time = self._cache[key]
            if time.time() < expire_time:
                return value
            else:
                del self._cache[key]
        return None
    
    def set(self, key: str, value: Any, ttl: int):
        """设置缓存"""
        self._cache[key] = (value, time.time() + ttl)
    
    def generate_key(self, prompt: str, model: str = "gpt-4.1") -> str:
        """生成缓存 key"""
        content = f"{model}:{prompt}"
        return hashlib.md5(content.encode()).hexdigest()

class DegradeableService:
    """
    支持降级的服务封装
    实现多级降级策略
    """
    
    def __init__(
        self,
        api_key: str,
        config: DegradeConfig = None,
        rate_limiter: TokenBucketRateLimiter = None
    ):
        self.api_key = api_key
        self.config = config or DegradeConfig()
        self.rate_limiter = rate_limiter
        self.cache = CacheManager()
        self.current_level = DegradeLevel.LEVEL_0
        self.circuit_breaker = CircuitBreaker(name="main", config=CircuitBreakerConfig())
    
    def _check_degrade_level(self) -> DegradeLevel:
        """
        根据系统状态判断降级级别
        可扩展为从监控/配置中心获取
        """
        # 检查熔断器状态
        if self.circuit_breaker.state == CircuitState.OPEN:
            return DegradeLevel.LEVEL_3
        
        # 检查限流器
        if self.rate_limiter and self.rate_limiter.get_available_tokens() < 1:
            return DegradeLevel.LEVEL_1
        
        return DegradeLevel.LEVEL_0
    
    def call(
        self,
        prompt: str,
        category: str = "qa",
        use_cache: bool = True,
        **kwargs
    ) -> dict:
        """
        调用 AI 服务,支持多级降级
        
        Args:
            prompt: 用户输入
            category: 请求分类(用于兜底响应)
            use_cache: 是否使用缓存
            **kwargs: 其他 API 参数
        """
        # 检查降级级别
        degrade_level = self._check_degrade_level()
        self.current_level = degrade_level
        
        # LEVEL 4: 完全不可用
        if degrade_level == DegradeLevel.LEVEL_4:
            return FallbackResponse.get_fallback(category)
        
        # LEVEL 3: 返回兜底数据
        if degrade_level == DegradeLevel.LEVEL_3:
            return FallbackResponse.get_fallback(category)
        
        # LEVEL 2: 简化响应
        if degrade_level == DegradeLevel.LEVEL_2:
            return self._call_with_simplified_mode(prompt, category, **kwargs)
        
        # LEVEL 1: 启用缓存
        if degrade_level == DegradeLevel.LEVEL_1 and use_cache:
            cached = self.cache.get(self.cache.generate_key(prompt, kwargs.get("model", "gpt-4.1")))
            if cached:
                cached["from_cache"] = True
                return cached
        
        # LEVEL 0: 正常调用
        try:
            result = self._call_api(prompt, **kwargs)
            
            # 缓存结果
            if self.config.enable_cache and use_cache:
                self.cache.set(
                    self.cache.generate_key(prompt, kwargs.get("model", "gpt-4.1")),
                    result,
                    self.config.cache_ttl
                )
            
            # 重置降级级别
            self.current_level = DegradeLevel.LEVEL_0
            return result
            
        except (RateLimitError, ServerError, NetworkError) as e:
            # 调用失败,触发降级
            self.current_level = DegradeLevel.LEVEL_1
            
            # 尝试返回缓存
            if self.config.enable_cache and use_cache:
                cached = self.cache.get(self.cache.generate_key(prompt, kwargs.get("model", "gpt-4.1")))
                if cached:
                    cached["from_cache"] = True
                    cached["cache_warning"] = True
                    return cached
            
            # 降级到兜底响应
            if self.config.fallback_enabled:
                return FallbackResponse.get_fallback(category)
            
            raise
    
    def _call_api(self, prompt: str, **kwargs) -> dict:
        """实际调用 API"""
        import requests
        
        # 限流检查
        if self.rate_limiter and not self.rate_limiter.acquire(blocking=False):
            raise RateLimitError("Rate limit", retry_after=1.0)
        
        response = requests.post(
            "https://api.holysheep.ai/v1/chat/completions",
            headers={
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            },
            json={
                "model": kwargs.get("model", "gpt-4.1"),
                "messages": [{"role": "user", "content": prompt}],
                **kwargs
            },
            timeout=kwargs.get("timeout", 30)
        )
        
        if response.status_code == 429:
            raise RateLimitError("Rate limit", retry_after=float(response.headers.get("retry-after", 60)))
        
        if response.status_code >= 500:
            raise ServerError(f"Server error: {response.status_code}")
        
        if response.status_code != 200:
            raise Exception(f"API error: {response.status_code}")
        
        return response.json()
    
    def _call_with_simplified_mode(self, prompt: str, category: str, **kwargs) -> dict:
        """简化模式调用"""
        try:
            result = self._call_api(prompt, **kwargs)
            if self.config.simplified_response:
                return FallbackResponse.get_simplified_response(result)
            return result
        except Exception:
            return FallbackResponse.get_fallback(category)
    
    def get_service_status(self) -> dict:
        """获取服务状态"""
        return {
            "degrade_level": self.current_level.value,
            "degrade_level_name": self.current_level.name,
            "circuit_breaker": self.circuit_breaker.get_status(),
            "cache_size": len(self.cache._cache),
            "config": {
                "enable_cache": self.config.enable_cache,
                "cache_ttl": self.config.cache_ttl,
                "fallback_enabled": self.config.fallback_enabled
            }
        }


使用示例

import time

初始化服务(使用 HolyShehe AI)

service = DegradeableService( api_key=YOUR_HOLYSHEEP_API_KEY, config=DegradeConfig( enable_cache=True, cache_ttl=3600, fallback_enabled=True ), rate_limiter=TokenBucketRateLimiter(capacity=100, refill_rate=60) )

正常调用

result = service.call("请介绍一下人工智能的发展历史", category="qa") print(f"响应级别: {service.current_level.name}") print(f"结果: {result}")

获取服务状态

status = service.get_service_status() print(f"服务状态: {json.dumps(status, indent=2, ensure_ascii=False)}")

四、常见报错排查

在实际项目中,我整理了 50+ 个常见错误。以下是最高频的 10 个问题及其解决方案:

4.1 HTTP 429 Too Many Requests(最高频)

"""
错误信息:
HTTP 429 Too Many Requests
Retry-After: 60
{"error": {"message": "Rate limit exceeded", "type": "rate_limit_error"}}
"""

"""
原因分析:
1. 短时间内请求数超过 API 的 RPM(Requests Per Minute)限制
2. HolyShehe AI 默认 60 RPM,超出后返回 429

解决方案:
"""

方案1:使用请求队列 + 限流器

from queue import Queue import threading class RequestQueue: """请求队列 + 自动限流""" def __init__(self, rpm: int = 60): self.rpm = rpm self.interval = 60.0 / rpm # 请求间隔 self.queue = Queue() self.last_request_time = 0 self.lock = threading.Lock() self.running = False self.thread = None def start(self): """启动