Doninha / api.py
0danielfonseca's picture
Upload 42 files
cf52a55 verified
"""
API REST do Modelo Híbrido de LLM.
==================================
FastAPI expondo /process, /chat e /agent. Usa config, pipeline e chat_session.
"""
from __future__ import annotations
import os
import sys
from pathlib import Path
from typing import Any, Dict, Optional
from uuid import uuid4
# Raiz do projeto
ROOT = Path(__file__).resolve().parent
if str(ROOT) not in sys.path:
sys.path.insert(0, str(ROOT))
try:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
except ImportError:
FastAPI = None # type: ignore
HTTPException = None # type: ignore
BaseModel = object # type: ignore
# -----------------------------------------------------------------------------
# Modelos de request/response
# -----------------------------------------------------------------------------
class ProcessRequest(BaseModel):
prompt: str
session_id: Optional[str] = None
use_agent: Optional[bool] = None
skip_l5: bool = False
class ChatRequest(BaseModel):
message: str
session_id: Optional[str] = None
class ProcessResponse(BaseModel):
response: str
truth_value: float
state: str
certainty: float
contradiction: float
confidence_label: str
session_id: Optional[str] = None
# -----------------------------------------------------------------------------
# Estado global (sessões de chat, pipeline, config)
# -----------------------------------------------------------------------------
def _load_app_state():
from config_loader import load_config
from pipeline import HybridLLMPipeline
from chat_session import ChatSession
config = load_config()
pipeline = HybridLLMPipeline(config=config, verbose=False)
sessions: Dict[str, ChatSession] = {}
max_turns = config.get("chat", {}).get("max_turns_in_context", 10)
return config, pipeline, sessions, max_turns
if FastAPI is None:
app = None
else:
app = FastAPI(title="Modelo Híbrido de LLM", version="1.0")
_config, _pipeline, _sessions, _max_turns = _load_app_state()
@app.get("/health")
def health():
return {"status": "ok", "model": "hybrid_llm"}
@app.post("/process", response_model=ProcessResponse)
def process(req: ProcessRequest):
session_id = req.session_id or str(uuid4())
session = _sessions.get(session_id)
if session:
session.add_user(req.prompt)
try:
result = _pipeline.process(
req.prompt,
chat_session=session,
use_agent=req.use_agent,
skip_l5=req.skip_l5,
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if session:
session.add_assistant(result.response)
return ProcessResponse(
response=result.response,
truth_value=result.truth_value,
state=result.state,
certainty=result.certainty,
contradiction=result.contradiction,
confidence_label=result.confidence_label,
session_id=session_id,
)
@app.post("/chat", response_model=ProcessResponse)
def chat(req: ChatRequest):
session_id = req.session_id or str(uuid4())
if session_id not in _sessions:
from chat_session import ChatSession
_sessions[session_id] = ChatSession(max_turns=_max_turns)
session = _sessions[session_id]
session.add_user(req.message)
try:
result = _pipeline.process(req.message, chat_session=session, use_agent=None, skip_l5=False)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
session.add_assistant(result.response)
return ProcessResponse(
response=result.response,
truth_value=result.truth_value,
state=result.state,
certainty=result.certainty,
contradiction=result.contradiction,
confidence_label=result.confidence_label,
session_id=session_id,
)
class AgentRequest(BaseModel):
query: str
@app.post("/agent")
def agent_search(req: AgentRequest):
"""Chama apenas o agente de pesquisa (busca local + internet)."""
try:
from agente_busca_web import run_search_for_context
text = run_search_for_context(req.query)
return {"answer": text, "query": req.query}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
def run_api():
if app is None:
print("Instale fastapi e uvicorn: pip install fastapi uvicorn", file=sys.stderr)
sys.exit(1)
import uvicorn
from config_loader import load_config
cfg = load_config()
api_cfg = cfg.get("api", {})
host = api_cfg.get("host", "0.0.0.0")
port = int(api_cfg.get("port", 8000))
uvicorn.run("api:app", host=host, port=port, reload=False)
if __name__ == "__main__":
run_api()