配置前的环境检查

  • 应用月用量 ≥ $50(低于此单 key 一般够用)
  • 已有 provider 控制台(Anthropic console / OpenAI platform 或中转方面板)的多 key 创建权限
  • 应用已部署(轮询是基础功能,不是产品功能)

国内访问 provider 控制台不稳,先备一条独立开发者可用的 Claude / OpenAI API 中转,密钥管理与生产调用都能用同一条网络。

操作步骤:3 种轮询策略

策略 1:Round Robin(最简单)

import itertools

class RoundRobinPool:
    def __init__(self, keys: list[str]):
        self.iter = itertools.cycle(keys)

    def get(self) -> str:
        return next(self.iter)

pool = RoundRobinPool(["sk-1", "sk-2", "sk-3"])
key = pool.get()

公平、可预测。但单进程模式,多 worker 部署时各自轮询不协调(实际 key 1 可能被 worker A 和 B 同时高频用)。

策略 2:Random

import random
keys = ["sk-1", "sk-2", "sk-3"]
key = random.choice(keys)

天然适合集群——多个 worker 各自随机就分布均匀。比 RR 简单,对个体 key 长期使用率上偶有偏差,但量大后均衡。

策略 3:Weighted Round Robin

不同 key 容量不一样(如不同 Tier 账号 / 不同套餐):

import random

class WeightedPool:
    def __init__(self, keys_weights: list[tuple[str, int]]):
        # [("sk-1", 5), ("sk-2", 3), ("sk-3", 2)] → key 1 占 50%
        self.weights = [w for _, w in keys_weights]
        self.keys = [k for k, _ in keys_weights]

    def get(self) -> str:
        return random.choices(self.keys, self.weights)[0]

生产推荐这个策略 + 加上 Cooldown 隔离故障 key。

生产级:Redis 分布式 + 健康检查

import redis
import time

r = redis.Redis()

class HealthyKeyPool:
    KEYS_SET = "llm:keys:active"          # 当前可用 keys
    COOLDOWN_PREFIX = "llm:cooldown:"      # 冷却中的 key
    COOLDOWN_SECONDS = 600                 # 10 分钟

    def get(self) -> str:
        keys = list(r.smembers(self.KEYS_SET))
        if not keys:
            raise RuntimeError("No healthy keys")
        return random.choice(keys).decode()

    def mark_failed(self, key: str):
        r.srem(self.KEYS_SET, key)
        r.setex(self.COOLDOWN_PREFIX + key, self.COOLDOWN_SECONDS, "1")

    def restore_cooled_keys(self):
        """定时任务:把 cooldown 已结束的 key 加回 active 池"""
        all_known = {"sk-1", "sk-2", "sk-3"}  # 配置里读
        cooled_down = {
            k.decode().replace(self.COOLDOWN_PREFIX, "")
            for k in r.keys(self.COOLDOWN_PREFIX + "*")
        }
        active_now = r.smembers(self.KEYS_SET)
        active_now = {k.decode() for k in active_now}
        to_restore = all_known - cooled_down - active_now
        for key in to_restore:
            r.sadd(self.KEYS_SET, key)

调用:

pool = HealthyKeyPool()

def call_llm(prompt):
    for attempt in range(3):
        key = pool.get()
        try:
            client = OpenAI(api_key=key)
            return client.chat.completions.create(...)
        except (RateLimitError, AuthenticationError, APIError) as e:
            pool.mark_failed(key)
            continue
    raise RuntimeError("All keys failed")

Cron 跑 pool.restore_cooled_keys() 每分钟一次,自动把 cooldown 结束的 key 加回。

与中转方多子 key 协作

中转方一般支持「主账号 + 子 key」结构:

你的中转账号
  ├─ 子 key 1(应用 A 用)
  ├─ 子 key 2(应用 B 用)
  ├─ 子 key 3(轮询池备份)
  └─ 子 key 4(轮询池备份)

子 key 之间用量计入同一主账号余额。轮询设计:

  • 跨应用隔离:每个应用单独子 key,方便看每个应用花了多少
  • 同应用轮询:单应用内多 key 轮询用 Redis pool 模式
  • 故障隔离:单 key 异常时移出池,主账号其他 key 不受影响

密钥安全保管

单机部署

环境变量 + .env 文件(gitignore 排除):

# .env
OPENAI_API_KEY_1=sk-xxx
OPENAI_API_KEY_2=sk-yyy
OPENAI_API_KEY_3=sk-zzz
import os
keys = [
    os.environ[f"OPENAI_API_KEY_{i}"]
    for i in range(1, 4)
]

Kubernetes / 容器

K8s Secret:

apiVersion: v1
kind: Secret
metadata:
  name: llm-keys
type: Opaque
stringData:
  key1: sk-xxx
  key2: sk-yyy

挂载到 Pod 作为环境变量。

生产级:密钥管理器

AWS Secrets Manager / GCP Secret Manager / HashiCorp Vault:

import boto3
session = boto3.session.Session()
client = session.client("secretsmanager", region_name="us-east-1")
keys = client.get_secret_value(SecretId="llm-keys")

优势:审计 + 轮换 + 跨服务统一管理。

安全加固

  • 泄露应急 SOP:列写「key 泄露 5 分钟内必做的事」流程文档
  • 定期轮换:90 天主动 rotate(生成新 key 替换旧 key)
  • 监控告警:单 key RPM 异常飙升、单 IP 用多 key 等异常模式告警
  • 审计日志:每次 key 使用记 timestamp + IP + endpoint + status,留 90 天

运维备忘

轮询上线后记三件事:各 key 的创建时间和预计到期日、最近一次轮换时间、当前活跃 channel 数量。多人协作时把负责人和密钥管理器访问权限写进共享文档,换人时不会漏掉 key 的轮换周期。

LLM API key 轮询的准备材料

一个人运营时可以用表格压住复杂度:负责人、后台入口、到期日、费用来源和回滚动作各占一列,避免换服务商时才发现资料缺口。

涉及 Stripe、公司注册、税表或签证的内容,只能作为操作参考。当前页面没有覆盖你所在司法辖区的特殊规定时,不应把它当成法律或税务意见。

LLM API key 轮询最怕把法律主体、收款工具和产品代码混成一个问题。动手前看清税务资料、部署环境和客服成本,金额较大或涉及税务时应交给专业顾问处理。

相关阅读