初始化提交

This commit is contained in:
chenxin committed 2026-08-21 16:00:13 +08:00
commit 887c1f449e
963 files changed
+166869

No files matched your search

+92
View File
@@ -0,0 +1,92 @@
"""
元炁配置管理。
从环境变量加载配置,遵循魂镜统一配置规范(所有配置通过环境变量注入,不使用 .env 文件)。
模型文件统一存放在项目根目录 models/ 下,各引擎从对应子目录加载。
"""
from __future__ import annotations
from pathlib import Path
from pydantic_settings import BaseSettings, SettingsConfigDict
_PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent
_DEFAULT_MODELS_DIR = _PROJECT_ROOT / "models"
class Settings(BaseSettings):
"""元炁应用配置。"""
# 服务
host: str = "0.0.0.0"
port: int = 11434
# ── 模型文件路径 ────────────────────────────────────
models_dir: str = str(_DEFAULT_MODELS_DIR)
# 下载源:auto / huggingface / modelscope
# auto 表示优先 ModelScope(国内快),失败后切 HuggingFace。
model_source: str = "auto"
# LLM:GGUF 模型文件路径。默认扫描 $models_dir/gguf/ 下第一个 .gguf
llm_model_path: str = ""
# Embedding:HuggingFace 模型名称。首次调用自动下载到 models/FlagModel/<模型名>。
embedding_model: str = "BAAI/bge-m3"
# Reranker:HuggingFace 模型名称。首次调用自动下载到 models/transformers/<模型名>。
reranker_model: str = "BAAI/bge-reranker-v2-m3"
# Vision(多模态):GGUF 多模态模型路径。默认扫描含 vision / multimodal / llava 的 .gguf
vision_model_path: str = ""
# ASR(语音识别):FunASR 模型名称。自动下载到 models/funasr/<模型名>。
asr_model: str = "iic/SenseVoiceSmall"
# 推理设备:auto / cuda / mps / cpu。
# auto 表示自动检测最优可用加速器(CUDA > MPS > CPU)。
device: str = "auto"
# LLM 默认参数
llm_max_tokens: int = 2048
llm_temperature: float = 0.7
llm_ctx_size: int = 4096
# 日志级别
log_level: str = "info"
@property
def models_dir_resolved(self) -> Path:
return Path(self.models_dir).resolve()
@property
def llm_model_path_resolved(self) -> str:
if self.llm_model_path:
return str(Path(self.llm_model_path).resolve())
gguf_dir = self.models_dir_resolved / "gguf"
if gguf_dir.exists():
files = list(gguf_dir.glob("*.gguf"))
if files:
return str(files[0])
return ""
@property
def vision_model_path_resolved(self) -> str:
if self.vision_model_path:
return str(Path(self.vision_model_path).resolve())
gguf_dir = self.models_dir_resolved / "gguf"
if gguf_dir.exists():
for pat in ("*vision*", "*multimodal*", "*llava*", "*mmproj*"):
matches = list(gguf_dir.glob(pat))
if matches:
return str(matches[0])
return ""
model_config = SettingsConfigDict(
env_prefix="yuanqi_",
env_file=None,
)
settings = Settings()