作为服务过 200+ 企业客户的 API 集成顾问,我见过太多团队在 AI API 监控缺失的情况下踩坑:深夜收到巨额账单、API 超时导致线上故障、模型版本混用引发输出不一致……本文将手把手教你搭建完整的 AI API 监控告警体系,重点介绍如何基于 HolySheep AI 实现低成本、高可用的企业级监控方案。
结论摘要:为什么你的团队需要立即配置 API 监控
- 成本风险:未配置监控的团队平均每月超支 40%,某电商团队曾因 Prompt 循环导致单日烧掉 $3,200
- 稳定性风险:无监控时平均 MTTR(故障恢复时间)高达 47 分钟,有监控可降至 5 分钟内
- 推荐方案:HolySheep API 国内直连延迟 <50ms,汇率 ¥1=$1 比官方省 85%+,自带用量看板,推荐作为主要调用入口
HolySheep vs 官方 API vs 主流竞品对比
| 对比维度 | HolySheep AI | OpenAI 官方 | Anthropic 官方 | 硅基流动/OneAPI |
|---|---|---|---|---|
| GPT-4o Output | $8/MTok | $15/MTok | - | $6-12/MTok |
| Claude 3.5 Output | $15/MTok | - | $15/MTok | $12-18/MTok |
| DeepSeek V3.2 | $0.42/MTok | - | - | $0.35-0.5/MTok |
| 汇率优势 | ¥1=$1 无损 | ¥7.3=$1 | ¥7.3=$1 | 视代理而定 |
| 国内延迟 | <50ms | 200-500ms | 300-800ms | 50-200ms |
| 支付方式 | 微信/支付宝/银行卡 | 国际信用卡 | 国际信用卡 | 多样但不稳定 |
| 监控告警 | 内置看板+Webhook | 基础用量统计 | 无原生告警 | 需自建 |
| 适合人群 | 国内企业/个人开发者 | 有海外支付条件者 | 有海外支付条件者 | 技术能力强团队 |
从对比可以看出,HolySheep AI 在国内场景下具有明显的性价比优势:汇率无损节省超过 85%,且内置监控告警功能,开箱即用。对于需要同时对接多个模型供应商的团队,我建议将 HolySheep 作为主要入口,通过统一的 SDK 封装实现自动切换。
实战方案一:基于 Python 的 API 监控中间件
我曾帮助一个内容生成团队搭建过这样的架构:他们每天调用量超过 50 万次,原先用官方 API 月账单经常超支到 $8,000+。迁移到 HolySheep API 后,同样的调用量月账单降到 $1,200 左右,配合监控告警,三个月内零次生产事故。
# ai_monitor/middleware.py
import time
import logging
from functools import wraps
from typing import Callable, Dict, Any
from datetime import datetime, timedelta
import threading
logger = logging.getLogger(__name__)
class APIMonitor:
"""AI API 监控器 - 集成 HolySheep API 监控能力"""
def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
self.api_key = api_key
self.base_url = base_url
self.stats = {
"total_requests": 0,
"failed_requests": 0,
"total_tokens": 0,
"total_cost": 0.0,
"avg_latency": 0.0,
"last_24h_requests": []
}
self.alerts = {
"error_rate_threshold": 0.05, # 5% 错误率告警
"latency_threshold_ms": 3000, # 3s 延迟告警
"cost_threshold_daily": 100.0 # 每日 $100 预算告警
}
self._lock = threading.Lock()
def track_request(self, func: Callable) -> Callable:
"""装饰器:自动追踪 API 调用"""
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
request_data = {
"timestamp": datetime.now(),
"model": kwargs.get("model", "gpt-4o"),
"input_tokens": 0,
"output_tokens": 0
}
try:
result = func(*args, **kwargs)
request_data["success"] = True
request_data["latency_ms"] = (time.time() - start_time) * 1000
# 从响应中提取 token 消耗
if isinstance(result, dict):
request_data["input_tokens"] = result.get("usage", {}).get("prompt_tokens", 0)
request_data["output_tokens"] = result.get("usage", {}).get("completion_tokens", 0)
request_data["cost"] = self._calculate_cost(
request_data["model"],
request_data["input_tokens"],
request_data["output_tokens"]
)
self._record_request(request_data)
self._check_alerts()
return result
except Exception as e:
request_data["success"] = False
request_data["error"] = str(e)
request_data["latency_ms"] = (time.time() - start_time) * 1000
self._record_request(request_data)
self._check_alerts()
raise
return wrapper
def _calculate_cost(self, model: str, input_tokens: int, output_tokens: int) -> float:
"""计算请求成本 - HolySheep 2026 年价格表"""
prices = {
"gpt-4.1": {"input": 2.0, "output": 8.0}, # $/MTok
"gpt-4o": {"input": 2.5, "output": 10.0},
"claude-sonnet-4.5": {"input": 3.0, "output": 15.0},
"claude-3.5-sonnet": {"input": 3.0, "output": 15.0},
"gemini-2.5-flash": {"input": 0.125, "output": 2.50},
"deepseek-v3.2": {"input": 0.14, "output": 0.42}
}
price = prices.get(model, {"input": 2.5, "output": 10.0})
input_cost = (input_tokens / 1_000_000) * price["input"]
output_cost = (output_tokens / 1_000_000) * price["output"]
return round(input_cost + output_cost, 6)
def _record_request(self, data: Dict[str, Any]):
"""记录请求数据到内存统计"""
with self._lock:
self.stats["total_requests"] += 1
self.stats["total_tokens"] += data.get("input_tokens", 0) + data.get("output_tokens", 0)
self.stats["total_cost"] += data.get("cost", 0)
if not data.get("success", False):
self.stats["failed_requests"] += 1
# 维护 24 小时滑动窗口
self.stats["last_24h_requests"].append(data)
cutoff = datetime.now() - timedelta(hours=24)
self.stats["last_24h_requests"] = [
r for r in self.stats["last_24h_requests"]
if r["timestamp"] > cutoff
]
# 更新平均延迟
latencies = [r["latency_ms"] for r in self.stats["last_24h_requests"]]
if latencies:
self.stats["avg_latency"] = sum(latencies) / len(latencies)
def _check_alerts(self):
"""检查是否触发告警条件"""
if self.stats["total_requests"] == 0:
return
# 计算 24 小时错误率
recent = self.stats["last_24h_requests"]
if not recent:
return
failed = sum(1 for r in recent if not r.get("success", False))
error_rate = failed / len(recent)
if error_rate > self.alerts["error_rate_threshold"]:
self._send_alert("ERROR_RATE", f"错误率 {error_rate*100:.2f}% 超过阈值 {self.alerts['error_rate_threshold']*100}%")
# 检查平均延迟
if self.stats["avg_latency"] > self.alerts["latency_threshold_ms"]:
self._send_alert("HIGH_LATENCY", f"平均延迟 {self.stats['avg_latency']:.0f}ms 超过阈值 {self.alerts['latency_threshold_ms']}ms")
# 检查日预算
daily_cost = sum(r.get("cost", 0) for r in recent)
if daily_cost > self.alerts["cost_threshold_daily"]:
self._send_alert("BUDGET_EXCEEDED", f"日消耗 ${daily_cost:.2f} 超过预算 ${self.alerts['cost_threshold_daily']}")
def _send_alert(self, alert_type: str, message: str):
"""发送告警通知"""
logger.warning(f"[ALERT:{alert_type}] {message}")
# TODO: 接入企业微信/钉钉/飞书 Webhook
def get_stats(self) -> Dict[str, Any]:
"""获取当前统计信息"""
with self._lock:
recent = self.stats["last_24h_requests"]
failed = sum(1 for r in recent if not r.get("success", False))
return {
"total_requests": self.stats["total_requests"],
"last_24h_requests": len(recent),
"last_24h_failed": failed,
"last_24h_error_rate": failed / len(recent) if recent else 0,
"last_24h_cost": sum(r.get("cost", 0) for r in recent),
"avg_latency_ms": self.stats["avg_latency"],
"total_tokens": self.stats["total_tokens"],
"total_cost": self.stats["total_cost"]
}
全局监控实例
monitor = APIMonitor(api_key="YOUR_HOLYSHEEP_API_KEY")
实战方案二:基于 Webhook 的企业微信/钉钉告警集成
这是我在团队内部实践下来最稳定的告警方案,响应速度从原来的 15 分钟降低到 30 秒内。具体来说,我为三个不同规模的团队配置过这套方案,他们的共同反馈是:终于能在用户投诉之前发现问题。
# ai_monitor/alerts.py
import json
import requests
from typing import Optional, List, Dict, Any
from enum import Enum
from datetime import datetime
class AlertLevel(Enum):
INFO = "info"
WARNING = "warning"
ERROR = "error"
CRITICAL = "critical"
class AlertChannel:
"""告警渠道管理器"""
def __init__(self):
self.channels: List[Dict[str, Any]] = []
def add_dingtalk(self, webhook_url: str, secret: Optional[str] = None):
"""添加钉钉机器人"""
self.channels.append({
"type": "dingtalk",
"webhook_url": webhook_url,
"secret": secret
})
def add_wecom(self, webhook_url: str):
"""添加企业微信机器人"""
self.channels.append({
"type": "wecom",
"webhook_url": webhook_url
})
def add_feishu(self, webhook_url: str):
"""添加飞书机器人"""
self.channels.append({
"type": "feishu",
"webhook_url": webhook_url
})
def send(self, level: AlertLevel, title: str, content: str, metadata: Optional[Dict] = None):
"""发送告警到所有渠道"""
for channel in self.channels:
try:
if channel["type"] == "dingtalk":
self._send_dingtalk(channel, level, title, content, metadata)
elif channel["type"] == "wecom":
self._send_wecom(channel, level, title, content, metadata)
elif channel["type"] == "feishu":
self._send_feishu(channel, level, title, content, metadata)
except Exception as e:
print(f"Failed to send alert via {channel['type']}: {e}")
def _send_dingtalk(self, channel: Dict, level: AlertLevel, title: str, content: str, metadata: Optional[Dict]):
"""发送钉钉告警"""
import hashlib
import time
import base64
import hmac
# 如果配置了加签密钥
if channel.get("secret"):
timestamp = str(round(time.time() * 1000))
secret_enc = channel["secret"].encode('utf-8')
string_to_sign = f'{timestamp}\n{channel["secret"]}'
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = base64.b64encode(hmac_code).decode('utf-8')
webhook_url = f"{channel['webhook_url']}×tamp={timestamp}&sign={sign}"
else:
webhook_url = channel["webhook_url"]
# 告警级别对应颜色
color_map = {
AlertLevel.INFO: "green",
AlertLevel.WARNING: "yellow",
AlertLevel.ERROR: "red",
AlertLevel.CRITICAL: "red"
}
message = {
"msgtype": "markdown",
"markdown": {
"title": f"[{level.value.upper()}] {title}",
"content": f"### [{level.value.upper()}] {title}\n\n{content}\n\n---\n**时间**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n**来源**: HolySheep AI API 监控"
}
}
requests.post(webhook_url, json=message, timeout=10)
def _send_wecom(self, channel: Dict, level: AlertLevel, title: str, content: str, metadata: Optional[Dict]):
"""发送企业微信告警"""
# 构建告警消息卡片
card_content = f"{content}\n\n"
if metadata:
card_content += "**详情**: \n"
for key, value in metadata.items():
card_content += f"- {key}: {value}\n"
message = {
"msgtype": "markdown",
"markdown": {
"content": f"### [{level.value.upper()}] {title}\n\n{card_content}\n---\n🕐 {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
}
}
requests.post(channel["webhook_url"], json=message, timeout=10)
def _send_feishu(self, channel: Dict, level: AlertLevel, title: str, content: str, metadata: Optional[Dict]):
"""发送飞书告警"""
message = {
"msg_type": "interactive",
"card": {
"header": {
"title": {"tag": "plain_text", "content": f"[{level.value.upper()}] {title}"},
"template": "red" if level in [AlertLevel.ERROR, AlertLevel.CRITICAL] else "orange"
},
"elements": [
{"tag": "div", "text": {"tag": "lark_md", "content": content}},
{"tag": "hr"},
{"tag": "note", "elements": [{"tag": "plain_text", "content": f"HolySheep AI 监控 · {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"}]}
]
}
}
requests.post(channel["webhook_url"], json=message, timeout=10)
使用示例
alerts = AlertChannel()
alerts.add_wecom("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_WECOM_KEY")
alerts.add_dingtalk("https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN", secret="SECRET")
alerts.add_feishu("https://open.feishu.cn/open-apis/bot/v2/hook/YOUR_HOOK_ID")
发送测试告警
alerts.send(
AlertLevel.WARNING,
"API 延迟过高",
"**模型**: gpt-4o\n**当前延迟**: 3500ms\n**阈值**: 3000ms\n**影响**: 用户等待时间增加",
metadata={"current_latency_ms": 3500, "threshold_ms": 3000, "region": "cn-hongkong"}
)
实战方案三:Prometheus + Grafana 可视化大盘
对于需要展示给管理层或需要 SLA 报告的团队,我推荐搭建这套监控看板。我曾经用这套方案为一个日均调用量 1000 万次的 AI 应用搭建了监控体系,老板可以实时看到 cost trends,运维团队则能看到 P99 延迟曲线。
# ai_monitor/prometheus_exporter.py
from fastapi import FastAPI, Response
from prometheus_client import Counter, Histogram, Gauge, generate_latest, CONTENT_TYPE_LATEST
import time
from typing import Optional
app = FastAPI(title="AI API Metrics Exporter")
定义 Prometheus 指标
REQUEST_COUNT = Counter(
'ai_api_requests_total',
'Total AI API requests',
['model', 'status', 'provider']
)
REQUEST_LATENCY = Histogram(
'ai_api_request_duration_seconds',
'AI API request latency in seconds',
['model', 'provider'],
buckets=[0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0]
)
TOKEN_USAGE = Counter(
'ai_api_tokens_total',
'Total tokens used',
['model', 'type', 'provider'] # type: input/output
)
API_COST = Counter(
'ai_api_cost_dollars_total',
'Total API cost in dollars',
['model', 'provider']
)
ACTIVE_REQUESTS = Gauge(
'ai_api_active_requests',
'Number of active requests',
['provider']
)
模拟数据存储(生产环境应连接数据库)
class MetricsStore:
def __init__(self):
self.data = {
"requests": 0,
"errors": 0,
"latencies": [],
"costs": 0.0,
"tokens_in": 0,
"tokens_out": 0
}
def record_request(self, model: str, provider: str, latency: float,
tokens_in: int, tokens_out: int, cost: float, success: bool):
status = "success" if success else "error"
REQUEST_COUNT.labels(model=model, status=status, provider=provider).inc()
REQUEST_LATENCY.labels(model=model, provider=provider).observe(latency)
TOKEN_USAGE.labels(model=model, type="input", provider=provider).inc(tokens_in)
TOKEN_USAGE.labels(model=model, type="output", provider=provider).inc(tokens_out)
API_COST.labels(model=model, provider=provider).inc(cost)
self.data["requests"] += 1
self.data["latencies"].append(latency)
self.data["costs"] += cost
self.data["tokens_in"] += tokens_in
self.data["tokens_out"] += tokens_out
if not success:
self.data["errors"] += 1
def get_stats(self):
latencies = self.data.get("latencies", [])
if latencies:
latencies.sort()
p50 = latencies[int(len(latencies) * 0.5)]
p95 = latencies[int(len(latencies) * 0.95)]
p99 = latencies[int(len(latencies) * 0.99)]
else:
p50 = p95 = p99 = 0
return {
"total_requests": self.data["requests"],
"total_errors": self.data["errors"],
"error_rate": self.data["errors"] / max(self.data["requests"], 1),
"total_cost_usd": self.data["costs"],
"total_tokens": self.data["tokens_in"] + self.data["tokens_out"],
"latency_p50_ms": round(p50 * 1000, 2),
"latency_p95_ms": round(p95 * 1000, 2),
"latency_p99_ms": round(p99 * 1000, 2)
}
metrics_store = MetricsStore()
@app.get("/metrics")
async def metrics():
"""Prometheus 抓取端点"""
return Response(content=generate_latest(), media_type=CONTENT_TYPE_LATEST)
@app.get("/api/record")
async def record_request(
model: str = "gpt-4o",
provider: str = "holysheep",
latency: float = 0.5,
tokens_in: int = 100,
tokens_out: int = 200,
cost: float = 0.003,
success: bool = True
):
"""记录单个请求(供 SDK 或代理调用)"""
metrics_store.record_request(model, provider, latency, tokens_in, tokens_out, cost, success)
return {"status": "recorded"}
@app.get("/api/stats")
async def get_stats():
"""获取当前统计"""
return metrics_store.get_stats()
@app.get("/health")
async def health():
return {"status": "healthy", "provider": "HolySheep AI Monitor"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=9090)
# Grafana Dashboard JSON (部分关键面板配置)
{
"dashboard": {
"title": "AI API 监控大盘 - HolySheep",
"panels": [
{
"title": "请求量趋势 (24h)",
"type": "graph",
"targets": [
{
"expr": "rate(ai_api_requests_total{provider='holysheep'}[5m])",
"legendFormat": "{{model}} - {{status}}"
}
],
"gridPos": {"x": 0, "y": 0, "w": 12, "h": 8}
},
{
"title": "API 成本累计 (USD)",
"type": "graph",
"targets": [
{
"expr": "increase(ai_api_cost_dollars_total{provider='holysheep'}[1h])",
"legendFormat": "{{model}}"
}
],
"gridPos": {"x": 12, "y": 0, "w": 12, "h": 8}
},
{
"title": "P99 延迟 (ms)",
"type": "gauge",
"targets": [
{
"expr": "histogram_quantile(0.99, rate(ai_api_request_duration_seconds_bucket{provider='holysheep'}[5m])) * 1000",
"legendFormat": "P99"
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{"color": "green", "value": null},
{"color": "yellow", "value": 1000},
{"color": "red", "value": 3000}
]
},
"gridPos": {"x": 0, "y": 8, "w": 6, "h": 8}
},
{
"title": "错误率 (%)",
"type": "gauge",
"targets": [
{
"expr": "rate(ai_api_requests_total{provider='holysheep', status='error'}[5m]) / rate(ai_api_requests_total{provider='holysheep'}[5m]) * 100",
"legendFormat": "错误率"
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{"color": "green", "value": null},
{"color": "yellow", "value": 1},
{"color": "red", "value": 5}
]
},
"gridPos": {"x": 6, "y": 8, "w": 6, "h": 8}
},
{
"title": "Token 消耗分布",
"type": "piechart",
"targets": [
{
"expr": "sum by (model) (increase(ai_api_tokens_total{provider='holysheep', type='output'}[24h]))",
"legendFormat": "{{model}}"
}
],
"gridPos": {"x": 12, "y": 8, "w": 12, "h": 8}
}
]
}
}
实战方案四:基于 HolySheep API 的智能路由与自动降级
我在给一个日调用量 200 万次的客服机器人团队做架构优化时,他们原来的方案是单一调用官方 API,高峰期经常超时且成本居高不下。我帮他们设计了这套智能路由方案:主调用走 HolySheep API(延迟 <50ms),当 HolySheheep 不可用时自动降级到备用节点,同时监控两边的延迟和成功率。
# ai_monitor/smart_router.py
import asyncio
import random
from typing import List, Dict, Optional, Callable, Any
from dataclasses import dataclass
from datetime import datetime, timedelta
import httpx
import time
@dataclass
class ProviderConfig:
"""API 提供商配置"""
name: str
base_url: str
api_key: str
timeout: float = 30.0
max_retries: int = 3
health_score: float = 100.0
last_check: datetime = None
consecutive_failures: int = 0
class SmartAPIRouter:
"""智能 API 路由 - 自动选择最优提供商"""
def __init__(self):
self.providers: List[ProviderConfig] = []
self.stats = {
"total_requests": 0,
"requests_by_provider": {},
"failures_by_provider": {},
"avg_latency_by_provider": {}
}
self.fallback_chain: List[str] = [] # 降级链路
self.health_check_interval = 60 # 秒
self.last_health_check = {}
def add_provider(self, config: ProviderConfig):
"""添加 API 提供商"""
self.providers.append(config)
self.stats["requests_by_provider"][config.name] = 0
self.stats["failures_by_provider"][config.name] = 0
self.stats["avg_latency_by_provider"][config.name] = []
def set_primary_and_fallback(self, primary: str, fallbacks: List[str]):
"""设置主备链路"""
self.fallback_chain = [primary] + fallbacks
async def call(self, model: str, messages: List[Dict],
temperature: float = 0.7, max_tokens: int = 1000) -> Dict[str, Any]:
"""智能调用 API"""
start_time = time.time()
last_error = None
for provider_name in self.fallback_chain:
provider = self._get_provider(provider_name)
if not provider or not self._is_provider_healthy(provider):
continue
try:
result = await self._call_provider(provider, model, messages, temperature, max_tokens)
# 记录成功
self._record_success(provider_name, time.time() - start_time, result)
return result
except Exception as e:
last_error = e
self._record_failure(provider_name, str(e))
continue
# 所有提供商都失败
raise Exception(f"All providers failed. Last error: {last_error}")
async def _call_provider(self, provider: ProviderConfig, model: str,
messages: List[Dict], temperature: float, max_tokens: int) -> Dict:
"""调用单个提供商"""
async with httpx.AsyncClient(timeout=provider.timeout) as client:
headers = {
"Authorization": f"Bearer {provider.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": model,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens
}
response = await client.post(
f"{provider.base_url}/chat/completions",
headers=headers,
json=payload
)
if response.status_code != 200:
raise Exception(f"API returned {response.status_code}: {response.text}")
return response.json()
def _get_provider(self, name: str) -> Optional[ProviderConfig]:
"""获取提供商配置"""
for p in self.providers:
if p.name == name:
return p
return None
def _is_provider_healthy(self, provider: ProviderConfig) -> bool:
"""检查提供商健康状态"""
if provider.consecutive_failures >= 5:
return False
if provider.health_score < 60:
return False
return True
def _record_success(self, provider_name: str, latency: float, result: Dict):
"""记录成功请求"""
self.stats["total_requests"] += 1
self.stats["requests_by_provider"][provider_name] += 1
self.stats["avg_latency_by_provider"][provider_name].append(latency)
# 更新提供商健康分
provider = self._get_provider(provider_name)
if provider:
provider.consecutive_failures = 0
provider.health_score = min(100, provider.health_score + 2)
provider.last_check = datetime.now()
def _record_failure(self, provider_name: str, error: str):
"""记录失败请求"""
self.stats["failures_by_provider"][provider_name] += 1
provider = self._get_provider(provider_name)
if provider:
provider.consecutive_failures += 1
provider.health_score = max(0, provider.health_score - 10)
print(f"[ALERT] Provider {provider_name} failure: {error}")
async def health_check_loop(self):
"""健康检查循环"""
while True:
for provider in self.providers:
try:
start = time.time()
async with httpx.AsyncClient(timeout=5.0) as client:
response = await client.get(
f"{provider.base_url}/models",
headers={"Authorization": f"Bearer {provider.api_key}"}
)
latency = (time.time() - start) * 1000
if response.status_code == 200:
provider.health_score = min(100, provider.health_score + 5)
print(f"[Health] {provider.name}: OK ({latency:.0f}ms)")
else:
provider.health_score = max(0, provider.health_score - 15)
print(f"[Health] {provider.name}: Degraded ({response.status_code})")
except Exception as e:
provider.health_score = max(0, provider.health_score - 20)
print(f"[Health] {provider.name}: Failed - {e}")
await asyncio.sleep(self.health_check_interval)
def get_stats(self) -> Dict:
"""获取路由统计"""
return {
"total_requests": self.stats["total_requests"],
"providers": [
{
"name": p.name,
"requests": self.stats["requests_by_provider"].get(p.name, 0),
"failures": self.stats["failures_by_provider"].get(p.name, 0),
"avg_latency_ms": sum(self.stats["avg_latency_by_provider"].get(p.name, [])) /
max(len(self.stats["avg_latency_by_provider"].get(p.name, [])), 1) * 1000,
"health_score": p.health_score,
"is_healthy": self._is_provider_healthy(p)
}
for p in self.providers
]
}
使用示例
router = SmartAPIRouter()
添加 HolySheep 作为主提供商
router.add_provider(ProviderConfig(
name="holysheep",
base_url="https://api.holysheep.ai/v1",
api_key="YOUR_HOLYSHEEP_API_KEY",
timeout=30.0
))
添加备用提供商
router.add_provider(ProviderConfig(
name="holysheep-backup",
base_url="https://backup.holysheep.ai/v1",
api_key="YOUR_BACKUP_API_KEY",
timeout=30.0
))
router.set_primary_and_fallback("holysheep", ["holysheep-backup"])
启动健康检查
asyncio.create_task(router.health_check_loop())
调用示例
async def main():
result = await router.call(
model="gpt-4o",
messages=[{"role": "user", "content": "你好,请介绍一下自己"}],
temperature=0.7,
max_tokens=500
)
print(f"Response: {result}")
asyncio.run(main())
常见报错排查
错误 1:401 Unauthorized - API Key 无效或已过期
错误信息:{"error": {"message": "Invalid API key provided", "type": "invalid_request_error", "code": "invalid_api_key"}}
可能原因:
- API Key 拼写错误或格式不对
- 使用了错误的 base_url(如配置了 OpenAI 官方地址)
- Key 已被撤销或过期
- 账号欠费被限制