File size: 1,740 Bytes
d91bbbb
088c0d9
d91bbbb
 
088c0d9
d91bbbb
 
088c0d9
d91bbbb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
088c0d9
 
 
 
 
 
 
 
 
 
 
 
d91bbbb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
088c0d9
 
 
 
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
59
60
61
62
63
64
65
import os
import traceback
from contextlib import asynccontextmanager

from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse, JSONResponse

from .database import engine, Base
from .routers import auth_router, proxy_config_router, proxy_endpoint_router


@asynccontextmanager
async def lifespan(app: FastAPI):
    Base.metadata.create_all(bind=engine)
    yield


app = FastAPI(
    title="Anthropic ↔ OpenAI Proxy",
    description="Converts Anthropic API calls to OpenAI-compatible backend calls via LiteLLM",
    version="1.0.0",
    lifespan=lifespan,
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Global exception handler — 500 errors ka actual reason dikhayega
@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
    return JSONResponse(
        status_code=500,
        content={
            "detail": str(exc),
            "type": type(exc).__name__,
            "trace": traceback.format_exc().splitlines()[-5:],  # last 5 lines
        },
    )

app.include_router(auth_router.router)
app.include_router(proxy_config_router.router)
app.include_router(proxy_endpoint_router.router)

_static_dir = os.path.join(os.path.dirname(__file__), "static")
app.mount("/static", StaticFiles(directory=_static_dir), name="static")


@app.get("/", include_in_schema=False)
def serve_ui():
    return FileResponse(os.path.join(_static_dir, "index.html"))


@app.get("/health")
def health():
    return {
        "status": "ok",
        "db": str(engine.url),
    }