初始化提交

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

+97
View File
@@ -0,0 +1,97 @@
"""
元炁 · 魂镜本地推理引擎 — 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"])