- POST /v1/messages endpoint with full quota enforcement and auth - Accepts x-api-key and anthropic-auth-token headers (for Claude Code) - Transforms Anthropic request/response format ↔ Ollama /api/chat - Streaming support via Anthropic SSE format - Tool use support (request and response transformation) - ANTHROPIC_DEFAULT_MODEL env var for model selection without admin UI - BACKEND_API_KEY env var for forwarding auth to upstream proxies - Fix SQLite path always resolved relative to database.py location - start.sh and start_claude.sh load .env relative to script location
32 lines
1.0 KiB
Python
32 lines
1.0 KiB
Python
import os
|
|
from pathlib import Path
|
|
from dotenv import load_dotenv
|
|
from sqlalchemy import create_engine
|
|
|
|
load_dotenv(dotenv_path=Path(__file__).resolve().parent.parent / ".env")
|
|
from sqlalchemy.orm import sessionmaker, declarative_base
|
|
|
|
DATABASE_URL = os.environ.get("DATABASE_URL", "sqlite:///./test.db")
|
|
|
|
# Relative SQLite-Pfade immer relativ zu dieser Datei auflösen, nicht zum cwd
|
|
if DATABASE_URL.startswith("sqlite:///") and not DATABASE_URL.startswith("sqlite:////"):
|
|
db_path = DATABASE_URL[len("sqlite:///"):]
|
|
if not os.path.isabs(db_path):
|
|
db_path = str(Path(__file__).resolve().parent / db_path)
|
|
DATABASE_URL = f"sqlite:///{db_path}"
|
|
|
|
if "sqlite" in DATABASE_URL:
|
|
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
|
|
else:
|
|
engine = create_engine(DATABASE_URL)
|
|
|
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
Base = declarative_base()
|
|
|
|
def get_db():
|
|
db = SessionLocal()
|
|
try:
|
|
yield db
|
|
finally:
|
|
db.close()
|