mirror of
https://github.com/snailyp/gemini-balance.git
synced 2026-05-13 06:29:49 +08:00
本次更新引入了对 Google Vertex AI Express API 的支持,允许用户配置和使用 Vertex AI 模型。 主要变更包括: 后端: - 新增 `VERTEX_API_KEYS` 和 `VERTEX_EXPRESS_BASE_URL` 至系统配置 ([`.env.example`](.env.example:13), [`app/config/config.py:62`](app/config/config.py:62), [`app/database/models.py`](app/database/models.py), [`app/database/services.py`](app/database/services.py))。 - 实现 `VertexExpressChatService` ([`app/service/chat/vertex_express_chat_service.py`](app/service/chat/vertex_express_chat_service.py)) 用于处理与 Vertex AI Express API 的交互。 - 添加 `vertex_express_routes` ([`app/router/vertex_express_routes.py`](app/router/vertex_express_routes.py)) 来暴露 Vertex AI 相关的 API 端点,并集成到主应用 ([`app/core/application.py:36`](app/core/application.py:36), [`app/router/routes.py:15`](app/router/routes.py:15))。 - 更新密钥管理器 ([`app/service/key/key_manager.py`](app/service/key/key_manager.py)) 以支持 Vertex API 密钥的获取、检查和轮换。 前端 (配置编辑器): - 在配置页面 ([`app/templates/config_editor.html:463`](app/templates/config_editor.html:463)) 添加了 Vertex API 密钥列表和 Vertex Express API 基础 URL 的表单字段。 - 实现了批量添加和删除 Vertex API 密钥的功能,包括相应的模态框和操作逻辑 ([`app/static/js/config_editor.js:550`](app/static/js/config_editor.js:550), [`app/static/js/config_editor.js:1097`](app/static/js/config_editor.js:1097), [`app/templates/config_editor.html:1657`](app/templates/config_editor.html:1657))。 - 确保新的配置项在初始化 ([`app/static/js/config_editor.js:598`](app/static/js/config_editor.js:598)) 和表单填充 ([`app/static/js/config_editor.js:671`](app/static/js/config_editor.js:671)) 时得到正确处理。 - 更新了数组项添加逻辑以识别 `VERTEX_API_KEYS` 为敏感字段 ([`app/static/js/config_editor.js:1235`](app/static/js/config_editor.js:1235))。 此功能扩展了应用支持的 AI 服务范围,为用户提供了更多模型选择。
71 lines
2.6 KiB
Python
71 lines
2.6 KiB
Python
"""
|
||
数据库连接池模块
|
||
"""
|
||
from pathlib import Path
|
||
from databases import Database
|
||
from sqlalchemy import create_engine, MetaData
|
||
from sqlalchemy.ext.declarative import declarative_base
|
||
|
||
from app.config.config import settings
|
||
from app.log.logger import get_database_logger
|
||
|
||
logger = get_database_logger()
|
||
|
||
# 数据库URL
|
||
if settings.DATABASE_TYPE == "sqlite":
|
||
# 确保 data 目录存在
|
||
data_dir = Path("data")
|
||
data_dir.mkdir(exist_ok=True)
|
||
db_path = data_dir / settings.SQLITE_DATABASE
|
||
DATABASE_URL = f"sqlite:///{db_path}"
|
||
elif settings.DATABASE_TYPE == "mysql":
|
||
if settings.MYSQL_SOCKET:
|
||
DATABASE_URL = f"mysql+pymysql://{settings.MYSQL_USER}:{settings.MYSQL_PASSWORD}@/{settings.MYSQL_DATABASE}?unix_socket={settings.MYSQL_SOCKET}"
|
||
else:
|
||
DATABASE_URL = f"mysql+pymysql://{settings.MYSQL_USER}:{settings.MYSQL_PASSWORD}@{settings.MYSQL_HOST}:{settings.MYSQL_PORT}/{settings.MYSQL_DATABASE}"
|
||
else:
|
||
raise ValueError("Unsupported database type. Please set DATABASE_TYPE to 'sqlite' or 'mysql'.")
|
||
|
||
# 创建数据库引擎
|
||
# pool_pre_ping=True: 在从连接池获取连接前执行简单的 "ping" 测试,确保连接有效
|
||
engine = create_engine(DATABASE_URL, pool_pre_ping=True)
|
||
|
||
# 创建元数据对象
|
||
metadata = MetaData()
|
||
|
||
# 创建基类
|
||
Base = declarative_base(metadata=metadata)
|
||
|
||
# 创建数据库连接池,并配置连接池参数,在sqlite中不使用连接池
|
||
# min_size/max_size: 连接池的最小/最大连接数
|
||
# pool_recycle=3600: 连接在池中允许存在的最大秒数(生命周期)。
|
||
# 设置为 3600 秒(1小时),确保在 MySQL 默认的 wait_timeout (通常8小时) 或其他网络超时之前回收连接。
|
||
# 如果遇到连接失效问题,可以尝试调低此值,使其小于实际的 wait_timeout 或网络超时时间。
|
||
# databases 库会自动处理连接失效后的重连尝试。
|
||
if settings.DATABASE_TYPE == "sqlite":
|
||
database = Database(DATABASE_URL)
|
||
else:
|
||
database = Database(DATABASE_URL, min_size=5, max_size=20, pool_recycle=1800)
|
||
|
||
async def connect_to_db():
|
||
"""
|
||
连接到数据库
|
||
"""
|
||
try:
|
||
await database.connect()
|
||
logger.info(f"Connected to {settings.DATABASE_TYPE}")
|
||
except Exception as e:
|
||
logger.error(f"Failed to connect to database: {str(e)}")
|
||
raise
|
||
|
||
|
||
async def disconnect_from_db():
|
||
"""
|
||
断开数据库连接
|
||
"""
|
||
try:
|
||
await database.disconnect()
|
||
logger.info(f"Disconnected from {settings.DATABASE_TYPE}")
|
||
except Exception as e:
|
||
logger.error(f"Failed to disconnect from database: {str(e)}")
|