Files
projectAIpopular/gateway/api.py
T

95 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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)