d0ff504a5f
核心改动: - packages/shared/ai_config_version.py: Redis版本号通知机制 - packages/shared/ai_router.py: AIRouter统一路由层(DB→Redis缓存→SharedSettings fallback) - alembic/versions/099: 补齐缺失模型seed和capability配置 - apps/worker/worker_app/tasks/vision/*: VLM硬编码替换为ai_router动态配置 - packages/application/viral_video/reviewer.py: 审核走copy_review capability - packages/application/cosyvoice_service.py: TTS走tts capability - apps/worker/worker_app/tasks/viral_video.py: 意图解析/分镜/文案走DB配置 - packages/config/base.py: 移除doubao/dashscope/mediakit/cosyvoice硬编码默认值 - tests/unit/test_ai_router.py: 26个单元测试覆盖路由/缓存/fallback Admin侧: - app/utils/ai_config_notify.py: bump_ai_config_version()工具函数 - routers/ai_models.py + ai_capability_configs.py: CRUD后调用bump_version() 验收标准: - admin改模型后30s内生效(Redis版本号通知) - Redis故障fallback环境变量 - base.py零硬编码(api_key保留空串) - 26个单测全绿
61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
"""AI 配置版本号管理 — Redis 通知机制.
|
||
|
||
admin 后台修改 ai_models / ai_capability_configs 后调用 bump_version(),
|
||
SaaS 端 AIRouter 每次取配置前比对版本号,变了才重新查 DB。
|
||
|
||
Redis key: xiaoxia:ai_config:version = 时间戳字符串
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import logging
|
||
import time
|
||
from typing import Optional
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
_REDIS_KEY = "xiaoxia:ai_config:version"
|
||
|
||
|
||
def _get_redis_client():
|
||
"""获取 Redis 客户端(复用 Celery broker 连接)."""
|
||
try:
|
||
import redis as _redis
|
||
|
||
from packages.shared.config import get_shared_settings
|
||
|
||
settings = get_shared_settings()
|
||
redis_url = getattr(settings, "redis_url", None) or getattr(settings, "celery_broker_url", "redis://localhost:6379/0")
|
||
return _redis.Redis.from_url(redis_url, decode_responses=True, socket_timeout=2)
|
||
except Exception as e:
|
||
logger.warning("AI config version: Redis 客户端初始化失败: %s", e)
|
||
return None
|
||
|
||
|
||
def bump_version() -> str:
|
||
"""写入新版本号(当前时间戳),返回版本号字符串。失败返回空串。"""
|
||
r = _get_redis_client()
|
||
if r is None:
|
||
logger.warning("AI config bump_version: Redis 不可用,跳过版本号更新")
|
||
return ""
|
||
try:
|
||
ver = str(int(time.time() * 1000))
|
||
r.set(_REDIS_KEY, ver)
|
||
logger.info("AI config version bumped to %s", ver)
|
||
return ver
|
||
except Exception as e:
|
||
logger.warning("AI config bump_version 失败: %s", e)
|
||
return ""
|
||
|
||
|
||
def get_version() -> Optional[str]:
|
||
"""读取当前版本号。Redis 不可用或异常返回 None。"""
|
||
r = _get_redis_client()
|
||
if r is None:
|
||
return None
|
||
try:
|
||
return r.get(_REDIS_KEY)
|
||
except Exception as e:
|
||
logger.warning("AI config get_version 失败: %s", e)
|
||
return None
|