File size: 2,093 Bytes
0c78e88 c60f0be 0c78e88 94ea10a c60f0be 94ea10a c60f0be 94ea10a c60f0be 94ea10a 0c78e88 94ea10a 0ddd1d3 94ea10a 0c78e88 94ea10a 0c78e88 94ea10a 0c78e88 94ea10a 0ddd1d3 94ea10a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | import os
import uvicorn
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from dotenv import load_dotenv
load_dotenv()
# ββ Observability bootstrap (must run before any service imports) βββββββββββββ
from langfuse import get_client
from openinference.instrumentation.groq import GroqInstrumentor
langfuse = get_client()
if not langfuse.auth_check():
print("WARNING: Langfuse auth failed - check your keys β")
GroqInstrumentor().instrument()
# ββ App setup βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
from services.observability import setup_logger
logger = setup_logger(__name__)
app = FastAPI(
title="Joule Dynamics Intelligence API",
description="Real Estate Rate Monitor + RAG Customer Support",
version="1.0.0",
)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["POST", "GET"],
allow_headers=["*"],
)
# ββ Startup: seed knowledge bases idempotently ββββββββββββββββββββββββββββββββ
import unified_ingest
unified_ingest.ensure_ingested()
# ββ Mount all versioned routers βββββββββββββββββββββββββββββββββββββββββββββββ
from routes import v1_router
app.include_router(v1_router)
# Backwards-compat redirect: old unversioned endpoint still works
# Remove after frontend has migrated to /api/v1/rag/chat
from routes.v1.rag import router as _rag_router
from fastapi import APIRouter
_compat = APIRouter(tags=["Deprecated β use /api/v1/rag/chat"])
from routes.v1.rag import rag_chat, RagChatRequest
@_compat.post("/api/rag/chat", deprecated=True, include_in_schema=False)
def rag_chat_compat(req: RagChatRequest):
"""Deprecated: forwards to /api/v1/rag/chat for backwards compat."""
return rag_chat(req)
app.include_router(_compat)
|