作为一名有多年AI应用开发经验的工程师,我深知日志系统和成本控制对于生产级AI应用的重要性。在过去三年里,我经手过数十个大型语言模型项目,从最初的OpenAI官方API到各种中转服务,再到如今的HolySheep AI,踩过无数坑,也积累了大量实战经验。今天我将把这些经验系统性地整理成册,帮助你设计一套完整的AI日志追踪与成本分析系统。
为什么你的AI应用需要专门的日志系统
在我负责的第一个LLM项目中,由于缺乏完善的日志追踪,一个看似简单的API调用超时问题排查了整整两天。那次经历让我深刻认识到:AI应用的日志系统不仅是调试工具,更是成本控制的核心组件。根据我的统计,一个成熟的生产环境AI应用,60%以上的运营成本来自API调用,而其中至少30%可以通过优化日志分析来节省。
传统的日志方案存在三大痛点:第一,API响应时间波动大,官方API从国内访问延迟通常在200-500ms之间,极不稳定;第二,成本计算不透明,中转商的价格体系复杂,难以精确核算单次调用成本;第三,缺乏请求级别的追踪能力,当出现问题时无法快速定位是哪个请求、哪个用户、哪个模型版本导致的问题。
迁移到HolySheep的技术与商业逻辑
经过详细的技术评估和商业计算,我决定将项目迁移到HolySheep AI平台。这个决策基于以下核心数据支撑:
- 汇率优势:HolySheep的汇率是¥1=$1,而官方API实际成本约¥7.3=$1,节省幅度超过85%。对于月均$10,000调用的中型应用,这意味着每月可节省超过¥60,000的运营成本。
- 国内延迟:HolySheep采用国内直连架构,延迟稳定在50ms以内,相比官方API的300ms+平均延迟,性能提升超过80%。
- 价格透明:主流模型明码标价,GPT-4.1为$8/MTok,Claude Sonnet 4.5为$15/MTok,Gemini 2.5 Flash仅$2.50/MTok,DeepSeek V3.2更是低至$0.42/MTok。
- 充值便捷:支持微信、支付宝直接充值,秒级到账,解决了海外支付的双币卡难题。
系统架构设计
我的AI日志追踪系统采用三层架构设计:
- 采集层:统一封装API调用,在请求发起前和响应返回后分别记录关键指标
- 存储层:使用SQLite进行本地轻量级存储,重要数据异步同步到时序数据库
- 分析层:提供实时成本监控、异常检测和优化建议
核心代码实现
1. API调用封装器设计
import hashlib
import time
import json
import sqlite3
from datetime import datetime
from typing import Dict, Optional, Any
from dataclasses import dataclass, asdict
from threading import Lock
@dataclass
class APICallRecord:
"""API调用记录数据结构"""
request_id: str
timestamp: str
model: str
input_tokens: int
output_tokens: int
total_cost: float
latency_ms: float
status: str
error_message: Optional[str] = None
user_id: Optional[str] = None
session_id: Optional[str] = None
class HolySheepAPIClient:
"""HolySheep AI API客户端封装,包含完整日志追踪"""
BASE_URL = "https://api.holysheep.ai/v1"
# 模型定价表(单位:$/MTok)
MODEL_PRICING = {
"gpt-4.1": {"input": 2.0, "output": 8.0},
"claude-sonnet-4.5": {"input": 3.0, "output": 15.0},
"gemini-2.5-flash": {"input": 0.35, "output": 2.50},
"deepseek-v3.2": {"input": 0.14, "output": 0.42},
}
def __init__(self, api_key: str, db_path: str = "api_calls.db"):
self.api_key = api_key
self.db_path = db_path
self._lock = Lock()
self._init_database()
def _init_database(self):
"""初始化SQLite数据库"""
with sqlite3.connect(self.db_path) as conn:
conn.execute("""
CREATE TABLE IF NOT EXISTS api_calls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
request_id TEXT UNIQUE,
timestamp TEXT,
model TEXT,
input_tokens INTEGER,
output_tokens INTEGER,
total_cost REAL,
latency_ms REAL,
status TEXT,
error_message TEXT,
user_id TEXT,
session_id TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
conn.execute("""
CREATE INDEX IF NOT EXISTS idx_timestamp ON api_calls(timestamp)
""")
conn.execute("""
CREATE INDEX IF NOT EXISTS idx_model ON api_calls(model)
""")
def _generate_request_id(self) -> str:
"""生成唯一请求ID"""
timestamp = str(time.time())
random_suffix = hashlib.md5(str(time.time_ns()).encode()).hexdigest()[:8]
return f"req_{timestamp.replace('.', '')}_{random_suffix}"
def _calculate_cost(self, model: str, input_tokens: int, output_tokens: int) -> float:
"""精确计算单次调用成本(美元)"""
pricing = self.MODEL_PRICING.get(model, {"input": 0, "output": 0})
input_cost = (input_tokens / 1_000_000) * pricing["input"]
output_cost = (output_tokens / 1_000_000) * pricing["output"]
return round(input_cost + output_cost, 6)
def _log_call(self, record: APICallRecord):
"""线程安全地记录API调用"""
with self._lock:
with sqlite3.connect(self.db_path) as conn:
conn.execute("""
INSERT OR REPLACE INTO api_calls
(request_id, timestamp, model, input_tokens, output_tokens,
total_cost, latency_ms, status, error_message, user_id, session_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""", (
record.request_id, record.timestamp, record.model,
record.input_tokens, record.output_tokens, record.total_cost,
record.latency_ms, record.status, record.error_message,
record.user_id, record.session_id
))
async def chat_completion(
self,
model: str,
messages: list,
user_id: str = None,
session_id: str = None,
**kwargs
) -> Dict[str, Any]:
"""带日志追踪的聊天完成接口"""
request_id = self._generate_request_id()
start_time = time.perf_counter()
try:
# 构建请求
url = f"{self.BASE_URL}/chat/completions"
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": model,
"messages": messages,
**kwargs
}
# 发送请求(使用实际HTTP库)
import httpx
async with httpx.AsyncClient(timeout=60.0) as client:
response = await client.post(url, headers=headers, json=payload)
response.raise_for_status()
result = response.json()
# 计算成本
latency_ms = (time.perf_counter() - start_time) * 1000
input_tokens = result.get("usage", {}).get("prompt_tokens", 0)
output_tokens = result.get("usage", {}).get("completion_tokens", 0)
total_cost = self._calculate_cost(model, input_tokens, output_tokens)
# 记录成功调用
record = APICallRecord(
request_id=request_id,
timestamp=datetime.now().isoformat(),
model=model,
input_tokens=input_tokens,
output_tokens=output_tokens,
total_cost=total_cost,
latency_ms=round(latency_ms, 2),
status="success",
user_id=user_id,
session_id=session_id
)
self._log_call(record)
result["request_id"] = request_id
result["cost"] = total_cost
return result
except Exception as e:
# 记录失败调用
latency_ms = (time.perf_counter() - start_time) * 1000
record = APICallRecord(
request_id=request_id,
timestamp=datetime.now().isoformat(),
model=model,
input_tokens=0,
output_tokens=0,
total_cost=0,
latency_ms=round(latency_ms, 2),
status="error",
error_message=str(e),
user_id=user_id,
session_id=session_id
)
self._log_call(record)
raise
使用示例
api_client = HolySheepAPIClient(
api_key="YOUR_HOLYSHEEP_API_KEY",
db_path="ai_api_calls.db"
)
2. 成本分析与监控模块
import sqlite3
from typing import List, Dict, Any
from datetime import datetime, timedelta
from collections import defaultdict
class CostAnalyzer:
"""AI API成本分析器"""
def __init__(self, db_path: str = "ai_api_calls.db"):
self.db_path = db_path
def get_daily_summary(self, days: int = 7) -> List[Dict[str, Any]]:
"""获取每日成本汇总"""
with sqlite3.connect(self.db_path) as conn:
conn.row_factory = sqlite3.Row
cursor = conn.execute("""
SELECT
DATE(timestamp) as date,
model,
COUNT(*) as call_count,
SUM(input_tokens) as total_input_tokens,
SUM(output_tokens) as total_output_tokens,
SUM(total_cost) as total_cost,
AVG(latency_ms) as avg_latency,
SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END) as error_count
FROM api_calls
WHERE timestamp >= datetime('now', '-' || ? || ' days')
GROUP BY DATE(timestamp), model
ORDER BY date DESC, model
""", (days,))
return [dict(row) for row in cursor.fetchall()]
def get_user_cost_breakdown(self, days: int = 30) -> List[Dict[str, Any]]:
"""获取用户维度的成本分解"""
with sqlite3.connect(self.db_path) as conn:
conn.row_factory = sqlite3.Row
cursor = conn.execute("""
SELECT
user_id,
COUNT(*) as call_count,
SUM(total_cost) as total_cost,
SUM(input_tokens) as total_input,
SUM(output_tokens) as total_output,
AVG(latency_ms) as avg_latency
FROM api_calls
WHERE timestamp >= datetime('now', '-' || ? || ' days')
AND user_id IS NOT NULL
GROUP BY user_id
ORDER BY total_cost DESC
LIMIT 100
""", (days,))
return [dict(row) for row in cursor.fetchall()]
def get_model_comparison(self) -> Dict[str, Dict[str, Any]]:
"""各模型性能与成本对比"""
with sqlite3.connect(self.db_path) as conn:
conn.row_factory = sqlite3.Row
cursor = conn.execute("""
SELECT
model,
COUNT(*) as total_calls,
SUM(total_cost) as total_cost,
AVG(latency_ms) as avg_latency,
MIN(latency_ms) as min_latency,
MAX(latency_ms) as max_latency,
SUM(output_tokens) as total_output,
SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END) as error_count
FROM api_calls
GROUP BY model
""")
rows = cursor.fetchall()
comparison = {}
for row in rows:
model = row["model"]
comparison[model] = {
"calls": row["total_calls"],
"total_cost_usd": round(row["total_cost"], 4),
"total_cost_cny": round(row["total_cost"] * 7.3, 2), # 假设汇率
"avg_latency_ms": round(row["avg_latency"], 2),
"min_latency_ms": round(row["min_latency"], 2),
"max_latency_ms": round(row["max_latency"], 2),
"total_output_tokens": row["total_output"],
"error_rate": round(row["error_count"] / row["total_calls"] * 100, 2)
}
return comparison
def detect_anomalies(self, threshold_std: float = 2.0) -> List[Dict[str, Any]]:
"""检测异常调用(基于成本和延迟)"""
with sqlite3.connect(self.db_path) as conn:
conn.row_factory = sqlite3.Row
# 获取统计信息
stats = conn.execute("""
SELECT
AVG(total_cost) as avg_cost,
STDDEV(total_cost) as std_cost,
AVG(latency_ms) as avg_latency,
STDDEV(latency_ms) as std_latency
FROM api_calls
WHERE timestamp >= datetime('now', '-7 days')
""").fetchone()
if not stats or stats["avg_cost"] is None:
return []
avg_cost = stats["avg_cost"]
std_cost = stats["std_cost"] or 0
avg_latency = stats["avg_latency"]
std_latency = stats["std_latency"] or 0
cost_threshold = avg_cost + threshold_std * std_cost
latency_threshold = avg_latency + threshold_std * std_latency
cursor = conn.execute("""
SELECT * FROM api_calls
WHERE total_cost > ? OR latency_ms > ?
ORDER BY timestamp DESC
LIMIT 50
""", (cost_threshold, latency_threshold))
return [dict(row) for row in cursor.fetchall()]
def generate_report(self) -> str:
"""生成成本分析报告"""
summary = self.get_daily_summary(7)
comparison = self.get_model_comparison()
report = []
report.append("=" * 60)
report.append("AI API 成本分析报告")
report.append(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
report.append("=" * 60)
# 总体概览
total_cost = sum(d["total_cost"] for d in summary)
total_calls = sum(d["call_count"] for d in summary)
report.append(f"\n【总体概览】")
report.append(f" 总调用次数: {total_calls:,}")
report.append(f" 总成本: ${total_cost:.4f} (约 ¥{total_cost*7.3:.2f})")
report.append(f" 平均单次成本: ${total_cost/total_calls:.6f}" if total_calls else "N/A")
# 模型对比
report.append(f"\n【模型对比】")
report.append(f"{'模型':<25} {'调用量':>10} {'总成本':>12} {'平均延迟':>12} {'错误率':>8}")
report.append("-" * 70)
for model, data in sorted(comparison.items(), key=lambda x: -x[1]["total_cost_usd"]):
report.append(f"{model:<25} {data['calls']:>10,} ${data['total_cost_usd']:>10.4f} "
f"{data['avg_latency_ms']:>10.2f}ms {data['error_rate']:>7.2f}%")
# Top 5 高成本用户
top_users = self.get_user_cost_breakdown(7)[:5]
report.append(f"\n【Top 5 高成本用户】")
for i, user in enumerate(top_users, 1):
report.append(f" {i}. User {user['user_id']}: "
f"${user['total_cost']:.4f} ({user['call_count']:,}次调用)")
return "\n".join(report)
使用示例
analyzer = CostAnalyzer("ai_api_calls.db")
print(analyzer.generate_report())
导出CSV用于进一步分析
import csv
daily_data = analyzer.get_daily_summary(30)
with open("cost_analysis.csv", "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=daily_data[0].keys())
writer.writeheader()
writer.writerows(daily_data)
迁移步骤详解
根据我的实战经验,从现有API方案迁移到HolySheep需要遵循以下五个阶段:
第一阶段:环境准备与API对接验证(1-2天)
# 1. 安装依赖
pip install httpx aiofiles python-dotenv
2. 创建 .env 文件配置API密钥
.env
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
LOG_LEVEL=INFO
DB_PATH=./data/ai_calls.db
3. 创建基础的连接测试脚本
import os
from dotenv import load_dotenv
import httpx
load_dotenv()
async def test_connection():
"""测试HolySheep API连接和延迟"""
api_key = os.getenv("HOLYSHEEP_API_KEY")
test_cases = [
("gemini-2.5-flash", "国内直连测试,延迟应该在50ms以内"),
("deepseek-v3.2", "低成本模型测试"),
("gpt-4.1", "高端模型测试")
]
results = []
for model, description in test_cases:
url = "https://api.holysheep.ai/v1/chat/completions"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"model": model,
"messages": [{"role": "user", "content": "Hi"}],
"max_tokens": 10
}
import time
start = time.perf_counter()
async with httpx.AsyncClient() as client:
response = await client.post(url, headers=headers, json=payload, timeout=30.0)
elapsed = (time.perf_counter() - start) * 1000
results.append({
"model": model,
"description": description,
"status": "✓ 成功" if response.status_code == 200 else "✗ 失败",
"latency_ms": round(elapsed, 2),
"response_code": response.status_code
})
print(f"[{results[-1]['status']}] {model}: {results[-1]['latency_ms']}ms")
return results
if __name__ == "__main__":
import asyncio
results = asyncio.run(test_connection())
# 验证延迟是否在预期范围内
for r in results:
if "失败" in r["status"]:
print(f"⚠️ {r['model']} 连接失败,请检查API密钥和网络")
elif r["latency_ms"] > 100:
print(f"⚠️ {r['model']} 延迟过高: {r['latency_ms']}ms")
第二阶段:日志系统数据迁移(3-5天)
我需要将现有的API调用日志迁移到新的数据库结构中。这个阶段的关键是保持数据一致性,建议使用事务批量处理。
第三阶段:流量灰度切换(7天)
建议采用5%→20%→50%→100%的渐进式切换策略。我通常会在每个阶段观察24-48小时的数据变化,重点关注以下指标:延迟是否稳定、成本是否符合预期、错误率是否有异常波动。
第四阶段:监控告警配置(1-2天)
# 配置成本告警规则
COST_ALERT_RULES = {
"hourly_threshold": 100.0, # 每小时成本阈值(美元)
"daily_threshold": 1000.0, # 每日成本阈值
"per_request_max": 5.0, # 单次请求最大成本
"latency_p99_threshold": 2000, # P99延迟阈值(毫秒)
"error_rate_threshold": 5.0, # 错误率阈值(%)
}
告警通知配置
ALERT_CHANNELS = {
"email": ["[email protected]"],
"webhook": ["https://your-dashboard.com/webhook/alerts"],
"feishu": "https://open.feishu.cn/open-apis/bot/v2/hook/xxx"
}
async def check_and_alert():
"""定期检查并发送告警"""
analyzer = CostAnalyzer()
comparison = analyzer.get_model_comparison()
# 检查总成本
total_cost_hourly = sum(
m["total_cost"] for m in comparison.values()
) / 24 # 假设数据是24小时内的
if total_cost_hourly > COST_ALERT_RULES["hourly_threshold"]:
await send_alert(
level="HIGH",
title="API成本告警",
message=f"当前小时预估成本 ${total_cost_hourly:.2f},超过阈值 ${COST_ALERT_RULES['hourly_threshold']}"
)
# 检查延迟
for model, data in comparison.items():
if data["avg_latency_ms"] > COST_ALERT_RULES["latency_p99_threshold"]:
await send_alert(
level="MEDIUM",
title=f"{model}延迟告警",
message=f"平均延迟 {data['avg_latency_ms']}ms,超过阈值"
)
# 检查错误率
for model, data in comparison.items():
if data["error_rate"] > COST_ALERT_RULES["error_rate_threshold"]:
await send_alert(
level="CRITICAL",
title=f"{model}错误率告警",
message=f"错误率 {data['error_rate']}%,超过阈值 {COST_ALERT_RULES['error_rate_threshold']}%"
)
async def send_alert(level: str, title: str, message: str):
"""发送告警通知"""
import httpx
alert_data = {
"level": level,
"title": title,
"message": message,
"timestamp": datetime.now().isoformat()
}
# 发送到飞书
async with httpx.AsyncClient() as client:
await client.post(
ALERT_CHANNELS["feishu"],
json={"msg_type": "text", "content": {"text": f"【{level}】{title}\n{message}"}}
)
第五阶段:回滚方案验证(1天)
每次部署变更前,我都会验证回滚通道是否畅通。回滚时间目标(RTO)应控制在5分钟以内。
ROI估算与成本对比
让我用真实数据来展示迁移到HolySheep AI的ROI计算:
| 指标 | 官方API方案 | HolySheep方案 | 节省比例 |
|---|---|---|---|
| 月均调用量 | 1,000,000次 | ||
| 平均输入Token | 500 | ||
| 平均输出Token | 200 | ||
| 汇率 | ¥7.3/$1 | ¥1/$1 | 85%+ |
| Gemini 2.5 Flash成本 | ¥1,277/月 | ¥175/月 | 86% |
| DeepSeek V3.2成本 | ¥227/月 | ¥31/月 | 86% |
| 平均延迟 | 350ms | 45ms | 87% |
| 年度节省 | 约¥20,000+ | — | |
根据我的项目经验,一个中型SaaS应用迁移后,通常在3-6个月内即可完全收回迁移改造成本,并且获得更稳定的性能和更好的开发体验。
常见报错排查
在我使用HolySheep API的两年多时间里,遇到了不少问题,也总结出一套快速排查的方法。以下是三个最常见的问题及其解决方案:
报错1:401 Unauthorized - API密钥无效
# 错误信息
{"error": {"message": "Invalid authentication credentials", "type": "invalid_request_error", "code": "invalid_api_key"}}
排查步骤:
1. 检查API密钥是否正确配置
2. 确认密钥格式(应该是sk-开头的字符串)
3. 验证密钥是否已激活
import os
def verify_api_key():
"""验证API密钥格式和配置"""
api_key = os.getenv("HOLYSHEEP_API_KEY")
if not api_key:
print("❌ API密钥未设置")
return False
if not api_key.startswith("sk-"):
print("❌ API密钥格式错误,应该以 sk- 开头")
return False
if len(api_key) < 32:
print("❌ API密钥长度不足")
return False
print("✅ API密钥格式正确")
# 测试连接
import httpx
import asyncio
async def test():
try:
response = httpx.get(
"https://api.holysheep.ai/v1/models",
headers={"Authorization": f"Bearer {api_key}"},
timeout=10.0
)
if response.status_code == 200:
print("✅ API密钥验证成功")
models = response.json().get("data", [])
print(f"📦 可用模型数量: {len(models)}")
return True
else:
print(f"❌ API返回错误: {response.status_code}")
return False
except Exception as e:
print(f"❌ 连接失败: {e}")
return False
return asyncio.run(test())
if __name__ == "__main__":
verify_api_key()
报错2:429 Rate Limit Exceeded - 请求频率超限
# 错误信息
{"error": {"message": "Rate limit exceeded", "type": "rate_limit_error", "code": "too_many_requests"}}
解决方案:实现请求限流和自动重试
import asyncio
import time
from collections import deque
from typing import Optional
class RateLimitedClient:
"""带限流功能的API客户端"""
def __init__(self, max_requests_per_minute: int = 60):
self.max_rpm = max_requests_per_minute
self.request_times = deque()
self._lock = asyncio.Lock()
async def wait_if_needed(self):
"""检查并等待直到可以发送请求"""
async with self._lock:
now = time.time()
# 清理60秒外的请求记录
while self.request_times and self.request_times[0] < now - 60:
self.request_times.popleft()
# 如果已达到限流,等待
if len(self.request_times) >= self.max_rpm:
wait_time = 60 - (now - self.request_times[0])
if wait_time > 0:
print(f"⏳ 触发限流,等待 {wait_time:.1f} 秒...")
await asyncio.sleep(wait_time)
# 再次清理
now = time.time()
while self.request_times and self.request_times[0] < now - 60:
self.request_times.popleft()
self.request_times.append(time.time())
async def make_request(self, request_func):
"""带重试的请求"""
max_retries = 3
base_delay = 1
for attempt in range(max_retries):
try:
await self.wait_if_needed()
return await request_func()
except Exception as e:
if "429" in str(e) or "rate limit" in str(e).lower():
delay = base_delay * (2 ** attempt)
print(f"⚠️ 限流,{delay}秒后重试 ({attempt + 1}/{max_retries})")
await asyncio.sleep(delay)
else:
raise
raise Exception("达到最大重试次数")
使用示例
async def example_usage():
client = RateLimitedClient(max_requests_per_minute=60)
async def api_call():
import httpx
response = httpx.post(
"https://api.holysheep.ai/v1/chat/completions",
headers={"Authorization": f"Bearer {os.getenv('HOLYSHEEP_API_KEY')}"},
json={"model": "gemini-2.5-flash", "messages": [{"role": "user", "content": "test"}]}
)
return response.json()
result = await client.make_request(api_call)
return result
if __name__ == "__main__":
asyncio.run(example_usage())
报错3:504 Gateway Timeout - 网关超时
# 错误信息
{"error": {"message": "Gateway timeout", "type": "gateway_timeout", "code": "timeout"}}
原因分析:
1. 模型服务器响应慢
2. 网络连接不稳定
3. 请求体过大
解决方案:分片处理大请求 + 超时配置优化
import httpx
import asyncio
from typing import List, Dict, Any
async def robust_completion(
messages: List[Dict],
model: str = "gemini-2.5-flash",
timeout: float = 120.0,
max_retries: int = 3
) -> Dict[str, Any]:
"""健壮的API调用实现"""
# 1. 检查输入大小,超过限制则分片
total_chars = sum(len(m.get("content", "")) for m in messages)
if total_chars > 100000:
print(f"⚠️ 输入过大({total_chars}字符),建议拆分处理")
# 2. 配置合理的超时时间
# Gemini 2.5 Flash: 建议超时 60-120秒
# DeepSeek V3.2: 建议超时 30-60秒
# GPT-4.1: 建议超时 90-180秒
model_timeouts = {
"gemini-2.5-flash": 120.0,
"deepseek-v3.2": 60.0,
"gpt-4.1": 180.0,
}
effective_timeout = model_timeouts.get(model, timeout)
# 3. 实现指数退避重试
for attempt in range(max_retries):
try:
async with httpx.AsyncClient(timeout=effective_timeout) as http_client:
response = await http_client.post(
"https://api.holysheep.ai/v1/chat/completions",
headers={
"Authorization": f"Bearer {os.getenv('HOLYSHEEP_API_KEY')}",
"Content-Type": "application/json"
},
json={
"model": model,
"messages": messages,
"stream": False
}
)
response.raise_for_status()
return response.json()
except httpx.TimeoutException:
if attempt < max_retries - 1:
wait = (attempt + 1) * 5 # 5秒, 10秒, 15秒
print(f"⏳ 请求超时,{wait}秒后重试...")
await asyncio.sleep(wait)
else:
raise Exception(f"连续{max_retries}次超时,请检查网络或降低请求频率")
except httpx.HTTPStatusError as e:
if e.response.status_code == 429:
wait = 30 * (attempt + 1)
print(f"⏳ 触发限流,等待{wait}秒...")
await asyncio.sleep(wait)
else:
raise
使用示例
async def main():
messages = [{"role": "user", "content": "请分析以下代码的复杂度..."}]
result = await robust_completion(messages, model="gemini-2.5-flash")
print(result)
if __name__ == "__main__":
asyncio.run(main())
常见错误与解决方案
在两年的实际项目运营中,我整理了以下高频错误及其对应的解决代码,这些都是经过生产环境验证的方案:
错误案例1:JSON解析失败导致的静默失败
# 问题:API返回非JSON格式但HTTP状态码200的情况
解决:显式检查响应内容类型
async def safe_json_response(response: httpx.Response) -> Dict[str, Any]:
"""安全解析JSON响应"""
content_type = response.headers.get("content-type", "")
if "application/json" not in content_type:
# 尝试直接解析
try:
return response.json()
except Exception:
# 记录原始响应用于排查
raw_text = response.text[:500] # 截取前500字符
raise ValueError(
f"响应不是JSON格式 (content-type: {content_type}): {raw_text}"
)
return response.json()
在请求处理中使用
result = await safe_json_response(response)
if "error" in result:
raise APIError(result["error"])
错误案例2:Token计数不准确导致的成本偏差
# 问题