95 lines
2.3 KiB
Python
95 lines
2.3 KiB
Python
"""FastAPI 网关:对外提供 /chat /health /metrics 接口。
|
||
|
||
启动:
|
||
uvicorn gateway.api:app --host 0.0.0.0 --port 8000
|
||
或:
|
||
python -m gateway.api
|
||
|
||
依赖:fastapi, uvicorn, pydantic(见 requirements.txt)
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
from typing import List, Optional
|
||
|
||
from pydantic import BaseModel, Field
|
||
|
||
from router_system.config import load_config
|
||
from router_system.router import Router, build_router
|
||
|
||
# ---- 全局单例 ----
|
||
_router: Optional[Router] = None
|
||
|
||
|
||
def get_router() -> Router:
|
||
global _router
|
||
if _router is None:
|
||
_router = build_router()
|
||
return _router
|
||
|
||
|
||
# ---- 请求/响应模型 ----
|
||
class QueryRequest(BaseModel):
|
||
query: str = Field(..., min_length=1, max_length=8000, description="用户查询")
|
||
|
||
|
||
class QueryResponse(BaseModel):
|
||
response: str
|
||
domain: str
|
||
difficulty: str
|
||
confidence: float
|
||
upgraded: bool
|
||
quality_score: float
|
||
model_used: str
|
||
route: List[str]
|
||
latency_ms: float
|
||
cache_hit: bool
|
||
cache_level: Optional[str]
|
||
cost_est: float
|
||
error: Optional[str] = None
|
||
|
||
|
||
class HealthResponse(BaseModel):
|
||
status: str
|
||
domains: List[str]
|
||
classifier: str
|
||
judge: str
|
||
fallback: str
|
||
|
||
|
||
# ---- FastAPI 应用 ----
|
||
try:
|
||
from fastapi import FastAPI
|
||
|
||
app = FastAPI(
|
||
title="Multi-Expert Router API",
|
||
description="多专业小模型 + 路由模型系统(MVP)",
|
||
version="0.1.0",
|
||
)
|
||
|
||
@app.get("/health", response_model=HealthResponse, tags=["system"])
|
||
async def health():
|
||
return get_router().health()
|
||
|
||
@app.post("/chat", response_model=QueryResponse, tags=["chat"])
|
||
async def chat(req: QueryRequest):
|
||
result = await get_router().route(req.query)
|
||
return QueryResponse(**result.to_dict())
|
||
|
||
@app.get("/metrics", tags=["system"])
|
||
async def metrics():
|
||
r = get_router()
|
||
return {
|
||
"router": r.stats.summary(),
|
||
"cache": r.cache.stats(),
|
||
}
|
||
|
||
except ImportError:
|
||
# fastapi 未安装时,提供 CLI 入口提示
|
||
app = None
|
||
print("[gateway] 未安装 fastapi,请执行: pip install -r requirements.txt")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
import uvicorn
|
||
uvicorn.run("gateway.api:app", host="0.0.0.0", port=8000, reload=False)
|
||
|