Files
Aether/_deprecated_py_src/models/database_extensions.py
fawney19 1d9c77522a refactor: 移除 Python 后端源码,全面迁移至 Rust gateway 架构
- 删除全部 Python 源码 (src/) 及 Alembic 迁移脚本,归档至 _deprecated_py_src/
- 重构 Rust gateway ai_pipeline: 拆分 planner/finalize 模块,新增 contracts/adaptation 层
- 重组 handlers 模块为 admin/public/proxy/internal/shared 子模块结构
- 新增 executor 模块,引入 Rust 原生数据库迁移 (aether-data/migrations)
- 简化 CI/Docker 构建流程,移除 base image 二级构建,统一为单一 app image
- 移除 Python 相关基础设施文件 (entrypoint.sh, gunicorn_conf.py, Dockerfile.base)
2026-04-03 16:26:16 +08:00

119 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
数据库模型扩展 - 新增的提供商策略相关表
"""
import uuid
from datetime import datetime, timezone
from sqlalchemy import (
Boolean,
Column,
DateTime,
Float,
ForeignKey,
Index,
Integer,
String,
UniqueConstraint,
)
from sqlalchemy.orm import relationship
from .database import Base
class ApiKeyProviderMapping(Base):
"""
API Key 和 Provider 的关联映射表
用途:管理员为特定的 API Key 指定提供商
- 如果存在映射:该 API Key 只能使用指定的提供商(无负载均衡和故障转移)
- 如果不存在映射:该 API Key 使用所有可用提供商(系统默认优先级,有负载均衡和故障转移)
注意priority_adjustment 和 weight_multiplier 字段保留但在当前版本不使用
"""
__tablename__ = "api_key_provider_mappings"
id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()), index=True)
api_key_id = Column(
String(36), ForeignKey("api_keys.id", ondelete="CASCADE"), nullable=False, index=True
)
provider_id = Column(
String(36), ForeignKey("providers.id", ondelete="CASCADE"), nullable=False, index=True
)
# 管理员设置的优先级调整(非用户自己设置)
priority_adjustment = Column(Integer, default=0) # 优先级调整值(可正可负)
weight_multiplier = Column(Float, default=1.0) # 权重乘数(>0
# 是否启用
is_enabled = Column(Boolean, default=True, nullable=False)
# 时间戳
created_at = Column(
DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), nullable=False
)
updated_at = Column(
DateTime(timezone=True),
default=lambda: datetime.now(timezone.utc),
onupdate=lambda: datetime.now(timezone.utc),
nullable=False,
)
# 关系
api_key = relationship("ApiKey", back_populates="provider_mappings")
provider = relationship("Provider", back_populates="api_key_mappings")
# 唯一约束
__table_args__ = (
UniqueConstraint("api_key_id", "provider_id", name="uq_apikey_provider"),
Index("idx_apikey_provider_enabled", "api_key_id", "is_enabled"),
)
class ProviderUsageTracking(Base):
"""提供商使用追踪 (用于RPM限流和健康检测)"""
__tablename__ = "provider_usage_tracking"
id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()), index=True)
provider_id = Column(
String(36), ForeignKey("providers.id", ondelete="CASCADE"), nullable=False, index=True
)
# 时间窗口
window_start = Column(DateTime(timezone=True), nullable=False, index=True)
window_end = Column(DateTime(timezone=True), nullable=False)
# 统计数据
total_requests = Column(Integer, default=0)
successful_requests = Column(Integer, default=0)
failed_requests = Column(Integer, default=0)
# 性能数据
avg_response_time_ms = Column(Float, default=0.0)
total_response_time_ms = Column(Float, default=0.0) # 用于计算平均值
# 成本数据
total_cost_usd = Column(Float, default=0.0)
# 时间戳
created_at = Column(
DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), nullable=False
)
updated_at = Column(
DateTime(timezone=True),
default=lambda: datetime.now(timezone.utc),
onupdate=lambda: datetime.now(timezone.utc),
nullable=False,
)
# 关系
provider = relationship("Provider", back_populates="usage_tracking")
# 索引
__table_args__ = (
Index("idx_provider_window", "provider_id", "window_start"),
Index("idx_window_time", "window_start", "window_end"),
)