作为在 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%。
架构设计:三层故障转移策略
我们的目标是构建一个智能路由层,根据响应时间、可用性、成本三个维度自动选择最优供应商。整体架构分为三层:
- 接入层:统一 SDK,对上层屏蔽 API 差异
- 路由层:健康检查 + 权重分配 + 降级策略
- 供应商层:多个 API 实例的连接池管理
实战代码: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": "可用供应商数"
}
]
}
]
}
}
成本优化:智能模型选择策略
在实际生产中,不同请求对模型能力的需求不同。我建议采用分层模型策略:
- 简单任务(翻译、纠错):DeepSeek V3.2 ($0.42/MTok) 或 Gemini 2.5 Flash ($2.50/MTok)
- 标准任务(文案生成、代码补全):GPT-4.1 ($8/MTok) 或 Claude Sonnet 4.5 ($15/MTok)
- 复杂任务(多步推理、长文档分析):Claude Sonnet 4.5 ($15/MTok)
通过 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