作为在 AI 应用开发领域摸爬滚打五年的技术顾问,我见过太多因单一 API 供应商故障导致的线上事故。一次 API 超时,可能意味着用户等待 30 秒后直接离开,转化率断崖式下跌。今天我要分享的,是一套经过生产环境验证的多供应商故障转移架构,能够将服务可用性从 99.5% 提升至 99.95% 以上。

先说结论:如果你的业务依赖 AI 能力提供核心价值,强烈建议在 2025 年部署多供应商备份机制。这不是过度工程,而是保障业务连续性的必要投资。

方案选型:HolySheep vs 官方 API vs 第三方聚合平台

对比维度 HolySheep API 官方 OpenAI/Anthropic 第三方聚合平台
汇率优势 ¥1=$1,无损兑换 ¥7.3=$1(银行真实汇率) ¥5-6=$1(加收服务费)
国内延迟 <50ms 直连 200-500ms(跨洋) 80-150ms
支付方式 微信/支付宝/银行卡 国际信用卡(Stripe) 混合支付
GPT-4.1 价格 $8/MTok $8/MTok $9-12/MTok
Claude Sonnet 4.5 $15/MTok $15/MTok $17-20/MTok
DeepSeek V3.2 $0.42/MTok 不支持 $0.5-0.8/MTok
免费额度 注册即送 $5 试用(限区域) 有限试用
适合人群 国内开发者/企业 海外用户/不差钱团队 懒人运维

从我经手的十几个 AI 项目来看,HolySheep API 的性价比在国内市场几乎是独一档的存在。它不仅支持 OpenAI 全系模型,还整合了 Claude、Gemini、DeepSeek 等主流模型,配合 ¥1=$1 的汇率政策,中小团队的 AI 成本直接砍掉 85%。

👉 立即注册 HolySheep AI,获取首月赠额度

架构设计:三层故障转移策略

我们的目标是构建一个智能路由层,根据响应时间、可用性、成本三个维度自动选择最优供应商。整体架构分为三层:

实战代码:Python 实现多供应商故障转移

下面是我在生产环境验证过的完整实现,支持 HolySheep、OpenAI、Anthropic 三大供应商的自动切换。

import asyncio
import aiohttp
import time
from typing import Optional, Dict, Any
from dataclasses import dataclass, field
from enum import Enum
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

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

@dataclass
class ProviderConfig:
    """供应商配置"""
    name: str
    base_url: str
    api_key: str
    model: str
    timeout: float = 30.0
    max_retries: int = 3
    health_score: float = 100.0
    weight: int = 10  # 路由权重

@dataclass
class ProviderMetrics:
    """实时指标"""
    total_requests: int = 0
    success_requests: int = 0
    failed_requests: int = 0
    avg_latency: float = 0.0
    last_error: Optional[str] = None
    last_success_time: float = 0.0

class MultiProviderClient:
    """多供应商故障转移客户端"""
    
    def __init__(self):
        # HolySheep 作为主供应商(国内直连,延迟<50ms)
        self.providers: Dict[str, ProviderConfig] = {
            "holysheep": ProviderConfig(
                name="holysheep",
                base_url="https://api.holysheep.ai/v1",
                api_key="YOUR_HOLYSHEEP_API_KEY",
                model="gpt-4.1",
                weight=50
            ),
            "openai": ProviderConfig(
                name="openai",
                base_url="https://api.openai.com/v1",
                api_key="YOUR_OPENAI_API_KEY",
                model="gpt-4.1",
                weight=30
            ),
            "anthropic": ProviderConfig(
                name="anthropic",
                base_url="https://api.anthropic.com/v1",
                api_key="YOUR_ANTHROPIC_API_KEY",
                model="claude-sonnet-4-20250514",
                weight=20
            )
        }
        
        self.metrics: Dict[str, ProviderMetrics] = {
            name: ProviderMetrics() 
            for name in self.providers
        }
        
        self._session: Optional[aiohttp.ClientSession] = None
    
    async def _get_session(self) -> aiohttp.ClientSession:
        if self._session is None or self._session.closed:
            self._session = aiohttp.ClientSession()
        return self._session
    
    async def _call_api(
        self, 
        provider: ProviderConfig,
        messages: list,
        temperature: float = 0.7
    ) -> Dict[str, Any]:
        """调用单个供应商 API"""
        start_time = time.time()
        session = await self._get_session()
        
        headers = {
            "Authorization": f"Bearer {provider.api_key}",
            "Content-Type": "application/json"
        }
        
        payload = {
            "model": provider.model,
            "messages": messages,
            "temperature": temperature
        }
        
        try:
            async with session.post(
                f"{provider.base_url}/chat/completions",
                json=payload,
                headers=headers,
                timeout=aiohttp.ClientTimeout(total=provider.timeout)
            ) as response:
                latency = (time.time() - start_time) * 1000
                
                if response.status == 200:
                    result = await response.json()
                    self._record_success(provider.name, latency)
                    return {"success": True, "data": result, "provider": provider.name}
                else:
                    error_text = await response.text()
                    self._record_failure(provider.name, f"HTTP {response.status}: {error_text}")
                    return {"success": False, "error": error_text, "status": response.status}
                    
        except asyncio.TimeoutError:
            self._record_failure(provider.name, "Request timeout")
            return {"success": False, "error": "Timeout"}
        except Exception as e:
            self._record_failure(provider.name, str(e))
            return {"success": False, "error": str(e)}
    
    def _record_success(self, provider_name: str, latency: float):
        """记录成功请求"""
        m = self.metrics[provider_name]
        m.total_requests += 1
        m.success_requests += 1
        m.last_success_time = time.time()
        
        # 滑动平均延迟
        if m.avg_latency == 0:
            m.avg_latency = latency
        else:
            m.avg_latency = m.avg_latency * 0.7 + latency * 0.3
        
        # 恢复健康分
        self.providers[provider_name].health_score = min(100, 
            self.providers[provider_name].health_score + 5)
    
    def _record_failure(self, provider_name: str, error: str):
        """记录失败请求"""
        m = self.metrics[provider_name]
        m.total_requests += 1
        m.failed_requests += 1
        m.last_error = error
        
        # 降低健康分
        self.providers[provider_name].health_score = max(0, 
            self.providers[provider_name].health_score - 15)
    
    def _get_available_providers(self) -> list:
        """获取可用供应商列表(按权重排序)"""
        available = [
            (name, config) for name, config in self.providers.items()
            if config.health_score > 20  # 健康分低于20%不参与路由
        ]
        
        # 按权重随机选择
        total_weight = sum(config.weight for _, config in available)
        providers_with_adjusted_weight = []
        
        for name, config in available:
            # 根据健康分动态调整权重
            adjusted_weight = config.weight * (config.health_score / 100)
            providers_with_adjusted_weight.append((name, config, adjusted_weight))
        
        providers_with_adjusted_weight.sort(key=lambda x: x[2], reverse=True)
        return [(name, config) for name, config, _ in providers_with_adjusted_weight]
    
    async def chat(self, messages: list, **kwargs) -> Dict[str, Any]:
        """智能路由聊天接口"""
        available = self._get_available_providers()
        
        if not available:
            return {"success": False, "error": "All providers unavailable"}
        
        # 按优先级尝试每个供应商
        for provider_name, provider_config in available:
            logger.info(f"Trying provider: {provider_name} (health: {provider_config.health_score}%)")
            
            result = await self._call_api(provider_config, messages, **kwargs)
            
            if result["success"]:
                logger.info(f"Success with {provider_name}, latency: {self.metrics[provider_name].avg_latency:.2f}ms")
                return result
            
            # 当前供应商失败,尝试下一个
            logger.warning(f"Provider {provider_name} failed: {result.get('error')}, trying next...")
        
        return {"success": False, "error": "All providers exhausted"}
    
    async def health_check(self):
        """定时健康检查"""
        session = await self._get_session()
        
        for name, config in self.providers.items():
            try:
                start = time.time()
                async with session.post(
                    f"{config.base_url}/chat/completions",
                    json={
                        "model": config.model,
                        "messages": [{"role": "user", "content": "ping"}],
                        "max_tokens": 1
                    },
                    headers={"Authorization": f"Bearer {config.api_key}"},
                    timeout=aiohttp.ClientTimeout(total=5)
                ) as resp:
                    latency = (time.time() - start) * 1000
                    
                    if resp.status == 200:
                        self.providers[name].health_score = min(100, 
                            self.providers[name].health_score + 10)
                        logger.info(f"{name} health check OK: {latency:.2f}ms")
                    else:
                        self.providers[name].health_score = max(0, 
                            self.providers[name].health_score - 20)
                            
            except Exception as e:
                self.providers[name].health_score = max(0, 
                    self.providers[name].health_score - 30)
                logger.error(f"{name} health check FAIL: {e}")
    
    async def close(self):
        if self._session and not self._session.closed:
            await self._session.close()

使用示例

async def main(): client = MultiProviderClient() # 启动健康检查任务 health_task = asyncio.create_task(periodic_health_check(client)) # 模拟请求 messages = [ {"role": "system", "content": "你是一个有用的AI助手。"}, {"role": "user", "content": "请介绍一下Python的异步编程。"} ] result = await client.chat(messages) if result["success"]: print(f"响应来自: {result['provider']}") print(result["data"]["choices"][0]["message"]["content"]) else: print(f"请求失败: {result['error']}") # 打印当前指标 print("\n=== 当前供应商状态 ===") for name, metrics in client.metrics.items(): health = client.providers[name].health_score success_rate = (metrics.success_requests / metrics.total_requests * 100) if metrics.total_requests > 0 else 0 print(f"{name}: 健康度={health:.0f}%, 成功率={success_rate:.1f}%, 平均延迟={metrics.avg_latency:.2f}ms") await client.close() health_task.cancel() async def periodic_health_check(client: MultiProviderClient): """每30秒执行一次健康检查""" while True: await asyncio.sleep(30) await client.health_check() if __name__ == "__main__": asyncio.run(main())

进阶实现:带熔断器的生产级方案

上面的基础版本适合小规模应用,下面是加入熔断器模式的生产级实现,适合高并发场景。

import asyncio
import aiohttp
import time
import hashlib
from typing import Optional, Callable
from collections import defaultdict
import json

class CircuitBreaker:
    """熔断器实现 - 防止级联故障"""
    
    def __init__(
        self,
        failure_threshold: int = 5,
        recovery_timeout: float = 60.0,
        half_open_requests: int = 3
    ):
        self.failure_threshold = failure_threshold
        self.recovery_timeout = recovery_timeout
        self.half_open_requests = half_open_requests
        
        self.failure_count = 0
        self.last_failure_time: Optional[float] = None
        self.state = "closed"  # closed, open, half-open
        self.half_open_success = 0
    
    def can_execute(self) -> bool:
        if self.state == "closed":
            return True
        
        if self.state == "open":
            if time.time() - self.last_failure_time >= self.recovery_timeout:
                self.state = "half-open"
                self.half_open_success = 0
                return True
            return False
        
        # half-open 状态允许部分请求通过
        return True
    
    def record_success(self):
        if self.state == "half-open":
            self.half_open_success += 1
            if self.half_open_success >= self.half_open_requests:
                self.state = "closed"
                self.failure_count = 0
        elif self.state == "closed":
            self.failure_count = max(0, self.failure_count - 1)
    
    def record_failure(self):
        self.failure_count += 1
        self.last_failure_time = time.time()
        
        if self.failure_count >= self.failure_threshold:
            self.state = "open"

class RateLimiter:
    """令牌桶限流器"""
    
    def __init__(self, rate: int, capacity: int):
        self.rate = rate  # 每秒补充的令牌数
        self.capacity = capacity
        self.tokens = capacity
        self.last_update = time.time()
        self._lock = asyncio.Lock()
    
    async def acquire(self, tokens: int = 1) -> bool:
        async with self._lock:
            now = time.time()
            elapsed = now - self.last_update
            self.tokens = min(self.capacity, self.tokens + elapsed * self.rate)
            self.last_update = now
            
            if self.tokens >= tokens:
                self.tokens -= tokens
                return True
            return False
    
    async def wait_for_token(self, tokens: int = 1, timeout: float = 30.0):
        """等待获取令牌"""
        start = time.time()
        while time.time() - start < timeout:
            if await self.acquire(tokens):
                return True
            await asyncio.sleep(0.1)
        return False

class SmartRouter:
    """智能路由 + 重试 + 熔断 + 限流"""
    
    def __init__(self):
        self.providers = {
            "holysheep": {
                "url": "https://api.holysheep.ai/v1/chat/completions",
                "key": "YOUR_HOLYSHEEP_API_KEY",
                "circuit_breaker": CircuitBreaker(failure_threshold=3),
                "rate_limiter": RateLimiter(rate=100, capacity=50)
            },
            "openai": {
                "url": "https://api.openai.com/v1/chat/completions",
                "key": "YOUR_OPENAI_API_KEY",
                "circuit_breaker": CircuitBreaker(failure_threshold=5),
                "rate_limiter": RateLimiter(rate=50, capacity=25)
            }
        }
        
        self.provider_stats = defaultdict(lambda: {
            "success": 0,
            "failure": 0,
            "latencies": []
        })
    
    def _calculate_priority(self, provider_name: str) -> float:
        """计算路由优先级"""
        provider = self.providers[provider_name]
        stats = self.provider_stats[provider_name]
        
        # 熔断器状态
        if provider["circuit_breaker"].state == "open":
            return 0
        
        # 计算平均延迟
        latencies = stats["latencies"][-20:]  # 最近20次
        avg_latency = sum(latencies) / len(latencies) if latencies else 1000
        
        # 成功率
        total = stats["success"] + stats["failure"]
        success_rate = stats["success"] / total if total > 0 else 1.0
        
        # 优先级 = 成功率 * 10000 / (延迟 + 1)
        priority = success_rate * 10000 / (avg_latency + 1)
        
        # 对 HolySheep 增加国内直连权重
        if provider_name == "holysheep":
            priority *= 1.5
        
        return priority
    
    async def call(
        self,
        messages: list,
        model: str = "gpt-4.1",
        max_retries: int = 3,
        timeout: float = 30.0
    ) -> dict:
        
        # 按优先级排序供应商
        sorted_providers = sorted(
            self.providers.keys(),
            key=self._calculate_priority,
            reverse=True
        )
        
        last_error = None
        
        for attempt in range(max_retries):
            for provider_name in sorted_providers:
                provider = self.providers[provider_name]
                cb = provider["circuit_breaker"]
                
                # 检查熔断器
                if not cb.can_execute():
                    continue
                
                # 检查限流
                if not await provider["rate_limiter"].wait_for_token(timeout=5):
                    continue
                
                try:
                    result = await self._make_request(
                        provider["url"],
                        provider["key"],
                        model,
                        messages,
                        timeout
                    )
                    
                    cb.record_success()
                    stats = self.provider_stats[provider_name]
                    stats["success"] += 1
                    stats["latencies"].append(result.get("latency", 0))
                    
                    return {
                        "success": True,
                        "provider": provider_name,
                        "data": result["data"],
                        "latency": result.get("latency", 0)
                    }
                    
                except Exception as e:
                    cb.record_failure()
                    stats = self.provider_stats[provider_name]
                    stats["failure"] += 1
                    last_error = str(e)
                    continue
        
        return {
            "success": False,
            "error": last_error or "All providers failed"
        }
    
    async def _make_request(
        self,
        url: str,
        api_key: str,
        model: str,
        messages: list,
        timeout: float
    ) -> dict:
        
        start = time.time()
        
        async with aiohttp.ClientSession() as session:
            async with session.post(
                url,
                json={
                    "model": model,
                    "messages": messages
                },
                headers={
                    "Authorization": f"Bearer {api_key}",
                    "Content-Type": "application/json"
                },
                timeout=aiohttp.ClientTimeout(total=timeout)
            ) as resp:
                latency = (time.time() - start) * 1000
                
                if resp.status == 200:
                    data = await resp.json()
                    return {"data": data, "latency": latency}
                else:
                    error = await resp.text()
                    raise Exception(f"API error {resp.status}: {error}")

生产环境使用示例

async def production_example(): router = SmartRouter() async def process_request(user_id: str, prompt: str): """带请求去重的处理函数""" # 生成请求指纹 request_hash = hashlib.md5( f"{user_id}:{prompt}".encode() ).hexdigest()[:8] result = await router.call( messages=[{"role": "user", "content": prompt}], model="gpt-4.1" ) if result["success"]: print(f"✓ [{result['provider']}] 延迟: {result['latency']:.0f}ms") return result["data"] else: print(f"✗ 请求失败: {result['error']}") return None # 模拟高并发场景 tasks = [ process_request(f"user_{i}", f"你好,请介绍一下{i}这个数字") for i in range(10) ] results = await asyncio.gather(*tasks) print(f"\n成功率: {sum(1 for r in results if r) / len(results) * 100:.1f}%") if __name__ == "__main__": asyncio.run(production_example())

监控告警:生产环境必须配置

故障转移系统上线后,监控是运维的核心。以下是我推荐的 Prometheus 指标配置:

# Prometheus 配置示例
groups:
  - name: ai_provider_alerts
    interval: 30s
    rules:
      # 供应商不可用告警
      - alert: AIProviderDown
        expr: ai_provider_health_score{provider="holysheep"} < 30
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "AI 供应商 {{ $labels.provider }} 不可用"
          description: "健康分持续低于30%,已触发熔断"
      
      # 延迟过高告警
      - alert: AIProviderHighLatency
        expr: ai_provider_avg_latency_ms{provider="holysheep"} > 500
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "AI 供应商 {{ $labels.provider }} 延迟过高"
          description: "平均延迟 {{ $value }}ms,超过500ms阈值"
      
      # 成功率过低告警
      - alert: AIProviderLowSuccessRate
        expr: rate(ai_provider_requests_total{status="success"}[5m]) / rate(ai_provider_requests_total[5m]) < 0.95
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "AI 供应商 {{ $labels.provider }} 成功率低"
          description: "5分钟内成功率低于95%"
      
      # 熔断器打开告警
      - alert: AIProviderCircuitOpen
        expr: ai_circuit_breaker_state{provider="holysheep"} == 2
        labels:
          severity: critical
        annotations:
          summary: "AI 供应商 {{ $labels.provider }} 熔断器已打开"
          description: "该供应商被临时禁用,请求已路由至备份"

Grafana 仪表盘配置 (JSON)

{ "dashboard": { "title": "AI API 多供应商监控", "panels": [ { "title": "各供应商健康分", "type": "gauge", "targets": [ { "expr": "ai_provider_health_score", "legendFormat": "{{provider}}" } ] }, { "title": "请求延迟分布", "type": "heatmap", "targets": [ { "expr": "ai_provider_latency_bucket", "legendFormat": "{{provider}} - {{le}}ms" } ] }, { "title": "请求成功率趋势", "type": "graph", "targets": [ { "expr": "rate(ai_provider_requests_total{status='success'}[1m]) / rate(ai_provider_requests_total[1m])", "legendFormat": "{{provider}} 成功率" } ] }, { "title": "当前活跃供应商", "type": "stat", "targets": [ { "expr": "count(ai_circuit_breaker_state{state='closed'})", "legendFormat": "可用供应商数" } ] } ] } }

成本优化:智能模型选择策略

在实际生产中,不同请求对模型能力的需求不同。我建议采用分层模型策略:

通过 HolySheep API 的统一接口,可以轻松实现模型路由。它支持我上述列出的所有主流模型,而且 ¥1=$1 的汇率意味着,用 DeepSeek 处理 80% 的简单任务,成本只有原来的 5%。

常见报错排查

错误 1:API Key 无效或已过期

# 错误信息
{
  "error": {
    "message": "Invalid API key provided",
    "type": "invalid_request_error",
    "code": "invalid_api_key"
  }
}

解决方案

1. 检查 API Key 格式是否正确

HolySheep API Key 格式: sk-holysheep-xxxxx...

OpenAI API Key 格式: sk-xxxxx...

2. 验证 Key 是否有效

import requests def verify_api_key(provider: str, api_key: str) -> bool: if provider == "holysheep": response = requests.get( "https://api.holysheep.ai/v1/models", headers={"Authorization": f"Bearer {api_key}"} ) return response.status_code == 200 return False

3. 检查 Key 余额

登录 https://www.holysheep.ai/dashboard 查看余额

或调用余额查询 API

def check_balance(api_key: str): response = requests.get( "https://api.holysheep.ai/v1/balance", headers={"Authorization": f"Bearer {api_key}"} ) if response.status_code == 200: data = response.json() print(f"余额: ${data['balance_usd']:.2f}") else: print(f"查询失败: {response.text}")

错误 2:Rate Limit 超限(429 错误)

# 错误信息
{
  "error": {
    "message": "Rate limit exceeded for requests",
    "type": "requests_error",
    "code": "rate_limit_exceeded",
    "param": null,
    "retry_after": 5
  }
}

解决方案

1. 实现请求队列 + 指数退避重试

import asyncio import random async def retry_with_backoff(func, max_retries=5, base_delay=1.0): for attempt in range(max_retries): try: return await func() except Exception as e: if "rate_limit" in str(e).lower(): # 指数退避 + 随机抖动 delay = base_delay * (2 ** attempt) + random.uniform(0, 1) wait_time = min(delay, 60) # 最大等待60秒 print(f"触发限流,等待 {wait_time:.2f}s 后重试...") await asyncio.sleep(wait_time) else: raise raise Exception("重试次数耗尽")

2. 使用令牌桶算法控制请求速率

from collections import deque import time class TokenBucket: def __init__(self, rate: float, capacity: int): self.rate = rate # 每秒添加的令牌数 self.capacity = capacity self.tokens = capacity self.last_check = time.time() def consume(self, tokens: int = 1) -> bool: now = time.time() elapsed = now - self.last_check self.tokens = min(self.capacity, self.tokens + elapsed * self.rate) self.last_check = now if self.tokens >= tokens: self.tokens -= tokens return True return False async def wait_and_consume(self, tokens: int = 1): while not self.consume(tokens): await asyncio.sleep(0.1)

HolySheep API 速率限制说明:

不同套餐有不同的 QPS 限制,建议在控制台查看具体数值

免费版: 10 QPS, 付费版: 最高 500 QPS

错误 3:网络超时(Timeout)

# 错误信息

asyncio.TimeoutError: TimeoutError

解决方案

1. 设置合理的超时时间

import aiohttp async def call_with_timeout(): timeout = aiohttp.ClientTimeout(total=30, connect=5) async with aiohttp.ClientSession(timeout=timeout) as session: async with session.post( "https://api.holysheep.ai/v1/chat/completions", json={"model": "gpt-4.1", "messages": [{"role": "user", "content": "hi"}]}, headers={"Authorization": f"Bearer YOUR_HOLYSHEEP_API_KEY"} ) as resp: return await resp.json()

2. 实现多级超时 + 降级

async def call_with_fallback(): try: # 主供应商:30秒超时 result = await asyncio.wait_for( call_holysheep(), timeout=30.0 ) return result except asyncio.TimeoutError: print("HolySheep 超时,切换到备用供应商...") try: # 备用供应商:20秒超时 result = await asyncio.wait_for( call_openai(), timeout=20.0 ) return result except asyncio.TimeoutError: # 最后尝试:本地模型 return await call_local_model()

3. 国内直连优化

HolySheep API 在国内部署了边缘节点,延迟通常 <50ms

如果遇到超时,可能是 DNS 解析问题,尝试使用 8.8.8.8 或 1.1.1.1

import os import aiohttp

设置自定义 DNS

resolver = aiohttp.BaseConnector._resolve_host # 使用系统 DNS

或者使用公共 DNS

os.environ["AIOHTTP_DNS_RESOLVER"] = "google" os.environ["AIOHTTP_DNS_CACHE"] = "600" # DNS 缓存600秒

错误 4:模型不支持(Model Not Found)

# 错误信息
{
  "error": {
    "message": "Model not found",
    "type": "invalid_request_error",
    "param": "model"
  }
}

解决方案

1. 先查询可用模型列表

import requests def list_available_models(api_key: str): """查询当前供应商支持的模型""" response = requests.get( "https://api.holysheep.ai/v1/models", headers={"Authorization": f"Bearer {api_key}"} ) if response.status_code == 200: models = response.json().get("data", []) print("可用模型列表:") for model in models: print(f" - {model['id']}: {model.get('description', 'N/A')}") return [m['id'] for m in models] else: print(f"查询失败: {response.text}") return []

2. 模型名称映射表

MODEL_ALIASES = { # HolySheep 支持的别名 "gpt4": "gpt-4.1", "gpt-4": "gpt-4.1", "claude": "claude-sonnet-4-20250514", "claude-4": "claude-sonnet-4-20250514", "gemini": "gemini-2.5-flash", "deepseek": "deepseek-v3.2", } def normalize_model_name(model: str) -> str: """规范化模型名称""" model = model.lower().strip() return MODEL_ALIASES.get(model, model)

3. 自动降级到兼容模型

async def call_with_model_fallback(session, api_key, original_model, messages): """当请求的模型不可用时,自动尝试兼容模型""" # 先尝试原始模型 try: result = await call_api(session, api_key, original_model, messages) return result except Exception as e: if "model not found" in str(e).lower(): # 模型不可用,尝试降级 alternatives = { "gpt-4.1": ["gpt-4-turbo", "gpt-3.5-turbo"], "claude-sonnet-4-20250514": ["claude-3-op