""" 元炁 · 魂镜本地推理引擎 — FastAPI 应用入口。 提供 OpenAI 兼容的 Chat Completions / Embeddings API,以及自定义 Reranker API。 所有模型由本地引擎直接加载推理,不依赖外部服务。 """ from __future__ import annotations import os # 抑制进程退出时 multiprocessing 信号量泄漏警告 os.environ.setdefault("PYTHONWARNINGS", "ignore::UserWarning") os.environ.setdefault("TOKENIZERS_PARALLELISM", "false") import gc import warnings warnings.filterwarnings("ignore", message="resource_tracker:") from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from src import __version__ from src.config import settings from src.engine.embedding import EmbeddingEngine from src.engine.llm import LlamaEngine from src.engine.reranker import RerankerEngine from src.engine.asr import SenseVoiceASREngine from src.endpoints import chat, embeddings, health, rerank, asr from src.utils.logging import logger, setup_logging setup_logging(settings.log_level) app = FastAPI( title="元炁 · 魂镜本地推理引擎", version=__version__, description="纯 Python 本地推理引擎 — LLM / Embedding / Reranker / ASR / Multimodal", ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 全局引擎实例 llm_engine = LlamaEngine() embedding_engine = EmbeddingEngine() reranker_engine = RerankerEngine() asr_engine = SenseVoiceASREngine() @app.on_event("startup") async def startup() -> None: logger.info( "元炁启动 | host={} port={} device={} models_dir={}", settings.host, settings.port, settings.device, settings.models_dir_resolved, ) # 注入引擎实例到端点模块 health.init(llm_engine, embedding_engine, reranker_engine, asr_engine) chat.init(llm_engine) embeddings.init(embedding_engine) rerank.init(reranker_engine) asr.init(asr_engine) # 尝试加载模型(不阻塞启动,失败仅告警) if settings.llm_model_path_resolved: await llm_engine.load() if settings.embedding_model or (settings.models_dir_resolved / "FlagModel").exists(): await embedding_engine.load() if settings.reranker_model or (settings.models_dir_resolved / "transformers").exists(): await reranker_engine.load() if settings.asr_model: await asr_engine.load() @app.on_event("shutdown") async def shutdown() -> None: await llm_engine.close() await embedding_engine.close() await reranker_engine.close() await asr_engine.close() gc.collect() logger.info("元炁停止") # 注册路由 app.include_router(health.router, tags=["health"]) app.include_router(chat.router, prefix="/v1", tags=["chat"]) app.include_router(embeddings.router, prefix="/v1", tags=["embeddings"]) app.include_router(rerank.router, prefix="/v1", tags=["rerank"]) app.include_router(asr.router, prefix="/v1", tags=["asr"])