""" config.py 报告模板管理模块的全局配置。可通过 .env 或环境变量覆盖。 """ from __future__ import annotations from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): # 应用基本信息 APP_TITLE: str = "报告模板管理模块 API" APP_VERSION: str = "0.1.0" APP_DESCRIPTION: str = "上传文档 → 远程解析为 Markdown → 拆解目录/章节 → 入库远程 MySQL" # 服务监听 HOST: str = "0.0.0.0" PORT: int = 8100 RELOAD: bool = False CORS_ORIGINS: list[str] = ["*"] # 日志 LOG_LEVEL: str = "INFO" # DEBUG / INFO / WARNING / ERROR LOG_DIR: str = "logs" # 日志目录(相对启动目录或绝对路径) LOG_TO_CONSOLE: bool = True # 是否同时输出到控制台 LOG_MAX_BYTES: int = 10 * 1024 * 1024 # 单文件最大字节数(轮转) LOG_BACKUP_COUNT: int = 7 # 轮转保留份数 LOG_HTTP_ACCESS: bool = True # 是否记录每个 HTTP 请求 # 远程 MySQL:mysql+pymysql://用户:密码@主机:端口/库名?charset=utf8mb4 DATABASE_URL: str = ( "mysql+pymysql://root:Beidas0ft@192.168.4.177:3306/eval_report?charset=utf8mb4" ) DB_POOL_SIZE: int = 10 DB_MAX_OVERFLOW: int = 20 DB_POOL_TIMEOUT: int = 60 DB_POOL_PRE_PING: bool = True # 启动时自动建表(仅创建本模块用到的表,已存在则跳过) DB_AUTO_CREATE_TABLES: bool = True # 远程文档解析服务:上传文件 → Markdown FILE_PARSE_API_URL: str = "http://192.168.4.194:8000/convert" FILE_PARSE_FIELD_NAME: str = "file" # 解析引擎(随 multipart 一起提交的表单字段 engine) FILE_PARSE_ENGINE: str = "auto" FILE_PARSE_HTTP_TIMEOUT_SEC: int = 600 FILE_PARSE_RETRY_COUNT: int = 3 FILE_PARSE_RETRY_BACKOFF_SEC: float = 15.0 # 章节正文:是否包含其下级小节内容(章/节聚合整棵子树正文,避免父章节正文为空) SECTION_CONTENT_INCLUDE_SUBSECTIONS: bool = True # 单章节正文入库字节上限(MySQL TEXT 列上限 65535 字节,留余量防止截断到半个字符) SECTION_CONTENT_MAX_BYTES: int = 60000 # 章节内容脱敏:入库前过滤精确数据(数字/金额/日期/百分比等) DESENSITIZE_ENABLED: bool = True DESENSITIZE_PLACEHOLDER: str = "X" # 数字脱敏后的占位符 # 是否把表格中的数字也脱敏(表格通常是精确数据,默认开启) DESENSITIZE_MASK_TABLE_NUMBERS: bool = True # LLM(可选):为每个目录生成"声明"。未配置时使用确定性兜底模板。 LLM_API_BASE: str = "" LLM_API_KEY: str = "" LLM_MODEL_NAME: str = "" LLM_HTTP_TIMEOUT_SEC: int = 120 # 关闭思考模型的思维链输出(vLLM/Qwen3 等:chat_template_kwargs.enable_thinking=false)。 # 既避免"思考过程"混入正文,又减少 token、降低截断与耗时。 LLM_DISABLE_THINKING: bool = True # 是否调用 LLM 生成章节声明(关闭则始终使用兜底模板) DECLARATION_USE_LLM: bool = True # 上传模版时:用 LLM 匹配默认提示词 / 为无匹配章节生成提示词(复刻 eval_report) TEMPLATE_UPLOAD_LLM_PROMPT_MAPPING: bool = True # LLM 提示词匹配并发:把未匹配章节分批并行调用,缩短整体耗时。 # 多卡 A100 + 连续批处理(vLLM/TGI,TP 或多副本)下,提高并发在飞请求数即可打满 GPU: # - 调小 BATCH_SIZE:请求更多更短,确保批次数 ≥ 线程数,单请求尾延迟更低 # - 调大 MAX_WORKERS:同时在飞的序列更多,填满推理服务的批,decode 吞吐接近峰值 # - 调小 MAX_TOKENS:每序列 KV 缓存预留更少,调度器可纳入更多并发序列 # 2×A100:并发目标约 16(较单卡的 8 翻倍);BATCH_SIZE=2 保证常见规模也能跑满 16 路。 TEMPLATE_UPLOAD_LLM_BATCH_SIZE: int = 2 # 每批未匹配章节数量 TEMPLATE_UPLOAD_LLM_MAX_WORKERS: int = 16 # 并行线程数上限(在飞请求数) TEMPLATE_UPLOAD_LLM_MAX_TOKENS: int = 2048 # 单批最大输出 token model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", extra="ignore", ) settings = Settings()