File size: 2,613 Bytes
b3f878b
 
4c341cd
 
b3f878b
 
4c341cd
 
b3f878b
 
 
 
 
 
4c341cd
 
 
 
 
 
 
b3f878b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4c341cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"""应用启动时的数据库初始化辅助函数"""

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()