98 lines
3.0 KiB
Python
98 lines
3.0 KiB
Python
"""
|
|
元炁 · 魂镜本地推理引擎 — 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"])
|