72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
from __future__ import annotations
|
|
from contextlib import asynccontextmanager
|
|
from pathlib import Path
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.staticfiles import StaticFiles
|
|
|
|
from chat.config import load_settings
|
|
from chat.db.migrate import apply_migrations
|
|
from chat.services.background import BackgroundWorker
|
|
|
|
# Trigger handler registration:
|
|
import chat.state.entities # noqa: F401
|
|
import chat.state.edges # noqa: F401
|
|
import chat.state.memory # noqa: F401
|
|
import chat.state.world # noqa: F401
|
|
|
|
from chat.web.bots import router as bots_router
|
|
from chat.web.chat import router as chat_router
|
|
from chat.web.kickoff import router as kickoff_router
|
|
from chat.web.nav import router as nav_router
|
|
from chat.web.settings import router as settings_router
|
|
from chat.web.sse import router as sse_router
|
|
from chat.web.turns import router as turns_router
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
settings = load_settings()
|
|
settings.db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
apply_migrations(settings.db_path)
|
|
app.state.settings = settings
|
|
|
|
# Background worker for the async significance pass (T22). Each job
|
|
# constructs a fresh FeatherlessClient via the factory; tests can
|
|
# disable enqueue by toggling ``app.state.background_worker.enabled``.
|
|
def _factory():
|
|
from chat.llm.featherless import FeatherlessClient
|
|
|
|
return FeatherlessClient(
|
|
api_key=settings.featherless_api_key,
|
|
base_url=settings.featherless_base_url,
|
|
)
|
|
|
|
worker = BackgroundWorker(settings, llm_client_factory=_factory)
|
|
await worker.start()
|
|
app.state.background_worker = worker
|
|
|
|
try:
|
|
yield
|
|
finally:
|
|
await worker.stop()
|
|
|
|
|
|
app = FastAPI(title="chat", lifespan=lifespan)
|
|
|
|
STATIC_DIR = Path(__file__).resolve().parent / "static"
|
|
app.mount("/static", StaticFiles(directory=str(STATIC_DIR)), name="static")
|
|
|
|
app.include_router(bots_router)
|
|
app.include_router(kickoff_router)
|
|
app.include_router(settings_router)
|
|
app.include_router(nav_router)
|
|
app.include_router(chat_router)
|
|
app.include_router(sse_router)
|
|
app.include_router(turns_router)
|
|
|
|
|
|
@app.get("/health")
|
|
def health():
|
|
return {"status": "ok"}
|