新增 KeyRing 轮换环(src/data/key_ring.py): - 支持逗号/分号/换行分隔多个 key,单 key 场景零开销 - 遇到 429 自动标记当前 key 冷却(默认 60s)并立即切换到下一个 key - 全部 key 冷却时等待最早恢复的 key,避免无谓重试 - 热更新 key 列表(增删 key 无需重启) - 进程级单例,按 base URL 隔离 后端集成: - bzzoiro._fetch_json_async 接入 KeyRing,429 立即轮换(不等待) - 新增 /admin/keyring/status 端点展示 key 环状态 - 新增 /admin/keyring/cooldown/reset 紧急重置冷却 - BZZOIRO_KEY 配置描述提示多 key 支持 - mask_value 多 key 显示数量(如 "3 个 key(末段 …XXXX)") - 清理已移除 injuries 的 API_FOOTBALL_KEY 配置项 前端: - 数据源页新增 Key Ring 状态面板(每个 key 可用/冷却状态 + 重置按钮) - 配置项脱敏展示支持多 key 计数 测试: 新增 24 个 KeyRing 单元测试 + 2 个 bzzoiro 轮换集成测试,全部通过。 Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
74 lines
2.8 KiB
Python
74 lines
2.8 KiB
Python
"""pydantic-settings 配置。"""
|
|
from __future__ import annotations
|
|
|
|
from pydantic import Field
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
|
|
|
|
# --- app ---
|
|
APP_ENV: str = "development"
|
|
LOG_LEVEL: str = "INFO"
|
|
# 生产环境强制要求管理鉴权配置,即使 APP_ENV=production 也生效。
|
|
# True 时若 auth_configured() 为 False 则拒绝(503),development 保持 fail-open。
|
|
REQUIRE_ADMIN_AUTH: bool = False
|
|
|
|
# --- database ---
|
|
DATABASE_URL: str = "postgresql+asyncpg://football:football@localhost:5432/football"
|
|
|
|
# --- LLM (OpenAI-compatible) ---
|
|
LLM_PROVIDER: str = "openai"
|
|
LLM_API_KEY: str = ""
|
|
LLM_BASE_URL: str = "https://api.openai.com/v1"
|
|
LLM_MODEL: str = "gpt-4o"
|
|
LLM_TIMEOUT: int = 60
|
|
# multi-agent 分档: 专家用便宜快模型,终裁用强模型;空则回落 LLM_MODEL
|
|
LLM_SPECIALIST_MODEL: str = ""
|
|
LLM_AGGREGATOR_MODEL: str = ""
|
|
|
|
# --- data sources ---
|
|
BZZOIRO_KEY: str = ""
|
|
BZZOIRO_BASE: str = "https://sports.bzzoiro.com/api/v2"
|
|
|
|
# --- 代理头信任 ---
|
|
# 为 True 时才解析 X-Forwarded-For,否则只用 request.client.host。
|
|
# 公网部署时应设为 True,并确保仅 Nginx 等可信反代能访问 API,
|
|
# 且 Nginx 层已覆盖真实 IP(X-Real-IP / proxy_protocol)。
|
|
TRUST_PROXY_HEADERS: bool = False
|
|
|
|
# --- CORS ---
|
|
CORS_ORIGINS: str = "http://localhost:5173,http://localhost:3000"
|
|
CORS_METHODS: str = "GET,POST,PUT,DELETE,OPTIONS"
|
|
CORS_HEADERS: str = "Authorization,Content-Type,X-API-Key,Accept"
|
|
|
|
# --- HTTP ---
|
|
HTTP_DEFAULT_TIMEOUT: int = 30
|
|
|
|
# --- database pool ---
|
|
DB_POOL_SIZE: int = 5
|
|
DB_MAX_OVERFLOW: int = 10
|
|
DB_POOL_TIMEOUT: int = 30
|
|
DB_POOL_RECYCLE: int = 1800
|
|
|
|
# --- 管理接口鉴权 ---
|
|
# 管理后台登录密码(POST /api/v1/auth/login),登录后颁发 HttpOnly Cookie 会话。
|
|
# 采集 / 回测等高成本或写入型接口同样需要此密码或下方 API Key。
|
|
# 两者均留空表示「未启用鉴权」(本地开发默认),生产环境必须至少设置一项。
|
|
# 注意:.env 中的 ADMIN_PASSWORD 是初始值;后台修改密码后以数据库中的
|
|
# scrypt 哈希为准,建议随后删除此明文项。
|
|
ADMIN_PASSWORD: str = ""
|
|
ADMIN_API_KEY: str = ""
|
|
# 管理后台会话有效期(小时)
|
|
ADMIN_SESSION_TTL_HOURS: int = 168
|
|
|
|
# --- 加密主密钥 ---
|
|
# 敏感配置(数据源/LLM 的 API Key)入库加密、会话签名都由它派生。
|
|
# 只存于部署机 .env,切勿入库或提交代码。生成: openssl rand -base64 32
|
|
# 变更后已加密配置将无法解密(需在后台重新保存)。
|
|
SECRET_KEY: str = ""
|
|
|
|
|
|
settings = Settings()
|