diff --git a/packages/application/viral_video/prompt_loader.py b/packages/application/viral_video/prompt_loader.py index 32af8898c..611f5f709 100644 --- a/packages/application/viral_video/prompt_loader.py +++ b/packages/application/viral_video/prompt_loader.py @@ -50,12 +50,39 @@ def _fallback(prompt_type: str) -> Optional[PromptTemplate]: return None -def _load_from_db(prompt_type: str) -> Optional[PromptTemplate]: - if _session_mod.SessionLocal is None: +_lazy_session = None + + +def _get_session(): + """优先用全局 SessionLocal(worker);否则按应用配置懒建同步引擎(api)。""" + global _lazy_session + if _session_mod.SessionLocal is not None: + return _session_mod.SessionLocal() + if _lazy_session is not None: + return _lazy_session() + try: + from packages.config import get_shared_settings + + url = str(get_shared_settings().database_url) + except Exception: # noqa: BLE001 return None + if not url: + return None + url = url.replace("postgresql+asyncpg://", "postgresql+psycopg://") + url = url.replace("postgresql://", "postgresql+psycopg://") if url.startswith("postgresql://") else url + engine = sa.create_engine(url, pool_pre_ping=True, pool_size=2, max_overflow=2) + from sqlalchemy.orm import sessionmaker + + _lazy_session = sessionmaker(bind=engine) + return _lazy_session() + + +def _load_from_db(prompt_type: str) -> Optional[PromptTemplate]: session = None try: - session = _session_mod.SessionLocal() + session = _get_session() + if session is None: + return None sql = sa.text(""" SELECT name, prompt_type, version, system_prompt, user_prompt_template, COALESCE(example_output, '') AS example_output,