Files
2026-05-25 09:50:01 +08:00

169 lines
4.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Pydantic Settings 定义。
每个 Settings 类对应 app.toml 中的一个 [SECTION]。
字段名 = SECTION_KEYTOML 展平后的环境变量名)。
"""
from __future__ import annotations
from pydantic_settings import BaseSettings
class _Base(BaseSettings):
"""所有 Settings 的基类。"""
model_config = {"env_file": None, "extra": "ignore"}
class AppSettings(_Base):
"""应用基础配置 [APP]。"""
APP_NAME: str = "LeAudit Platform"
APP_HOST: str = "0.0.0.0"
APP_PORT: int = 8000
APP_REGION: str = "default"
APP_CORS_ORIGINS: str = "*"
class JwtSettings(_Base):
"""JWT 配置 [JWT]。"""
JWT_SECRET_KEY: str = ""
JWT_ACCESS_TOKEN_EXPIRE_HOURS: int = 24
JWT_ALGORITHM: str = "HS256"
class DbSettings(_Base):
"""数据库配置 [DB]。"""
DB_HOST: str = "localhost"
DB_PORT: int = 5432
DB_NAME: str = "leaudit"
DB_USER: str = "postgres"
DB_PASSWORD: str = ""
@property
def ASYNCPG_DATABASE_URL(self) -> str:
"""动态构建 asyncpg 连接 URL。"""
return (
f"postgresql+asyncpg://{self.DB_USER}:{self.DB_PASSWORD}"
f"@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}"
)
class RedisSettings(_Base):
"""Redis 配置 [REDIS]。"""
REDIS_HOST: str = "localhost"
REDIS_PORT: int = 6379
REDIS_DB: int = 0
REDIS_PASSWORD: str = ""
REDIS_KEY_PREFIX: str = "leaudit"
class OssSettings(_Base):
"""OSS 对象存储配置 [OSS]。"""
OSS_ENDPOINT: str = ""
OSS_BASE_URL: str = ""
OSS_ACCESS_KEY: str = ""
OSS_SECRET_KEY: str = ""
OSS_BUCKET: str = "leaudit"
OSS_REGION: str = ""
OSS_USE_SSL: bool = True
OSS_PRESIGN_EXPIRE_SECONDS: int = 3600
class LlmSettings(_Base):
"""LLM 配置 [LLM]。"""
LLM_BASE_URL: str = ""
LLM_MODEL: str = ""
LLM_API_KEY: str = ""
class VlmSettings(_Base):
"""VLM 配置 [VLM]。"""
VLM_BASE_URL: str = ""
VLM_MODEL: str = ""
VLM_API_KEY: str = ""
class EmbeddingSettings(_Base):
"""Embedding 配置 [EMBEDDING]。"""
EMBEDDING_BASE_URL: str = ""
EMBEDDING_MODEL: str = ""
EMBEDDING_API_KEY: str = ""
EMBEDDING_DIM: int = 1024
EMBEDDING_BATCH_SIZE: int = 10
class OcrSettings(_Base):
"""OCR 配置 [OCR]。"""
OCR_BASE_URL: str = ""
OCR_TIMEOUT: int = 300
class LeauditSettings(_Base):
"""LeAudit 引擎配置 [LEAUDIT]。"""
LEAUDIT_RULES_DIR: str = "rules"
LEAUDIT_RESCUE_MODE: str = "auto"
LEAUDIT_LLM_MAX_CONCURRENCY: int = 5
LEAUDIT_VLM_MAX_CONCURRENCY: int = 3
LEAUDIT_LLM_REQUEST_TIMEOUT: int = 120
LEAUDIT_LLM_RETRY_MAX_ATTEMPTS: int = 3
LEAUDIT_LLM_RETRY_BACKOFF_BASE_SECONDS: float = 1.0
LEAUDIT_VLM_REQUEST_TIMEOUT: int = 90
LEAUDIT_VLM_RETRY_MAX_ATTEMPTS: int = 2
LEAUDIT_VLM_RETRY_BACKOFF_BASE_SECONDS: float = 1.0
LEAUDIT_OCR_VLM_CONCURRENCY: int = 3
LEAUDIT_OCR_RETRY_MAX_ATTEMPTS: int = 3
LEAUDIT_OCR_RETRY_BACKOFF_BASE_SECONDS: float = 1.0
LEAUDIT_SIGNATURE_PROBE_CONCURRENCY: int = 2
LEAUDIT_SIGNATURE_PROBE_TIMEOUT: int = 20
LEAUDIT_SIGNATURE_PROBE_RETRY_MAX_ATTEMPTS: int = 2
LEAUDIT_SIGNATURE_PROBE_RETRY_BACKOFF_BASE_SECONDS: float = 0.5
LEAUDIT_WORKER_QUEUE_URGENT: str = "leaudit.urgent"
LEAUDIT_WORKER_QUEUE_NORMAL: str = "leaudit.normal"
LEAUDIT_WORKER_CONCURRENCY: int = 2
LEAUDIT_RUN_LOCK_SECONDS: int = 1800
LEAUDIT_STUCK_SCAN_CRON_MINUTES: int = 5
LEAUDIT_STUCK_TIMEOUT_MINUTES: int = 20
LEAUDIT_RULE_TENANT_MATERIALIZE_CRON_MINUTES: int = 30
LEAUDIT_TASK_SOFT_TIME_LIMIT: int = 3300
LEAUDIT_TASK_TIME_LIMIT: int = 3600
LEAUDIT_PAGE_QUALITY_ENABLED: bool = False
LEAUDIT_PAGE_QUALITY_QUEUE_NORMAL: str = "leaudit.page_quality.normal"
LEAUDIT_PAGE_QUALITY_QUEUE_URGENT: str = "leaudit.page_quality.urgent"
class QichachaSettings(_Base):
"""企查查配置 [QICHACHA]。"""
QICHACHA_APP_KEY: str = ""
QICHACHA_SECRET_KEY: str = ""
QICHACHA_BASE_URL: str = "https://api.qichacha.com"
QICHACHA_ENTERPRISE_PATH: str = "/ECIV4/GetBasicDetailsByName"
QICHACHA_DISHONESTY_PATH: str = "/ShixinCheck/GetList"
QICHACHA_TIMEOUT: int = 30
QICHACHA_MAX_RETRIES: int = 3
QICHACHA_RETRY_DELAY: float = 1.0
QICHACHA_CACHE_DAYS: int = 30
@property
def QICHACHA_ENTERPRISE_URL(self) -> str:
"""企查查工商信息接口完整 URL。"""
return f"{self.QICHACHA_BASE_URL.rstrip('/')}{self.QICHACHA_ENTERPRISE_PATH}"
@property
def QICHACHA_DISHONESTY_URL(self) -> str:
"""企查查失信核查接口完整 URL。"""
return f"{self.QICHACHA_BASE_URL.rstrip('/')}{self.QICHACHA_DISHONESTY_PATH}"
# 实例化所有 Settings
app = AppSettings()
jwt = JwtSettings()
db = DbSettings()
redis = RedisSettings()
oss = OssSettings()
llm = LlmSettings()
vlm = VlmSettings()
embedding = EmbeddingSettings()
ocr = OcrSettings()
leaudit = LeauditSettings()
qichacha = QichachaSettings()