| """应用启动时的数据库初始化辅助函数""" |
|
|
| from pathlib import Path |
|
|
| from qa_annotate.config import settings |
| from qa_annotate.database.base import SessionLocal |
| from qa_annotate.database.crud import LlmAnalysisCacheCRUD, SystemConfigCRUD |
| from qa_annotate.database.models import ProjectModel |
|
|
| _LLM_CONFIG_SPECS = ( |
| ("llm_base_url", "LLM_BASE_URL", "LLM API Base URL"), |
| ("llm_model_name", "LLM_MODEL_NAME", "LLM Model Name"), |
| ) |
|
|
| _SEED_DIR = Path(__file__).resolve().parent.parent / "seed" |
| _DEMO_ANALYSIS_FILES = { |
| "zh": _SEED_DIR / "llm-analysis-2026-06-15_zh.md", |
| "en": _SEED_DIR / "llm-analysis-2026-06-15_en.md", |
| } |
| _DEMO_ANALYSIS_NOTES_COUNT = 4 |
|
|
|
|
| def ensure_llm_config() -> None: |
| """写入 LLM 默认配置;API Key 优先从环境变量同步。""" |
| db = SessionLocal() |
| try: |
| for key, setting_name, description in _LLM_CONFIG_SPECS: |
| if SystemConfigCRUD.get_by_key(db, key=key): |
| continue |
| value = getattr(settings, setting_name) |
| SystemConfigCRUD.set_value(db, key=key, value=value, description=description) |
| print(f"已初始化 LLM 配置: {key}={value}") |
|
|
| if settings.LLM_API_KEY: |
| SystemConfigCRUD.set_value( |
| db, |
| key="llm_api_key", |
| value=settings.LLM_API_KEY, |
| description="LLM API Key", |
| ) |
| print("已从环境变量同步 LLM API Key") |
| finally: |
| db.close() |
|
|
|
|
| def seed_demo_llm_analysis() -> None: |
| """从 seed 目录下的示例 Markdown 预置中英文 LLM 分析报告。""" |
| db = SessionLocal() |
| try: |
| project = db.query(ProjectModel).order_by(ProjectModel.id).first() |
| if not project: |
| print("无项目数据,跳过 Demo LLM 分析报告导入") |
| return |
|
|
| for language, path in _DEMO_ANALYSIS_FILES.items(): |
| if not path.exists(): |
| print(f"未找到 {path.name},跳过") |
| continue |
| if LlmAnalysisCacheCRUD.get_by_project( |
| db, project_id=project.id, language=language |
| ): |
| continue |
|
|
| LlmAnalysisCacheCRUD.save( |
| db=db, |
| project_id=project.id, |
| analysis_text=path.read_text(encoding="utf-8"), |
| model_name=settings.LLM_MODEL_NAME, |
| notes_count=_DEMO_ANALYSIS_NOTES_COUNT, |
| language=language, |
| ) |
| print(f"已导入 Demo LLM 分析报告: project={project.id} lang={language}") |
| finally: |
| db.close() |
|
|