[project] name = "orcarouter-lite" version = "0.1.0" description = "Self-hosted LLM router with a managed safety net. OpenAI-compatible, BYOK, single-workspace edition of OrcaRouter." readme = "README.md" requires-python = ">=3.11" license = "MIT" license-files = ["LICENSE"] authors = [{ name = "Continuum AI Corp" }] keywords = [ "llm", "router", "proxy", "gateway", "openai", "anthropic", "gemini", "litellm", "self-hosted", "byok", "fastapi", ] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: FastAPI", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Internet :: Proxy Servers", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Typing :: Typed", ] dependencies = [ "fastapi>=0.115.0", "uvicorn[standard]>=0.30.0", "sqlalchemy[asyncio]>=2.0.30", "aiosqlite>=0.19.0", "alembic>=1.13.0", "litellm>=1.40.0", "google-auth>=2.0.0", "pydantic>=2.7.0", "pydantic-settings>=2.3.0", "structlog>=24.1.0", "httpx>=0.27.0", "cryptography>=42.0.0", "passlib[bcrypt]>=1.7.4", "orjson>=3.10.0", ] [project.optional-dependencies] postgres = ["asyncpg>=0.29.0"] redis = ["redis[hiredis]>=5.0.0"] dev = [ "pytest>=8.2.0", "pytest-asyncio>=0.23.0,<2.0", "pytest-cov>=5.0.0", "httpx>=0.27.0", "ruff>=0.4.0", ] [project.scripts] orcarouter-lite = "app.cli:main" [project.urls] Homepage = "https://www.orcarouter.ai" Repository = "https://github.com/Continuum-AI-Corp/OrcaRouter-Lite" Issues = "https://github.com/Continuum-AI-Corp/OrcaRouter-Lite/issues" Changelog = "https://github.com/Continuum-AI-Corp/OrcaRouter-Lite/releases" [build-system] requires = ["hatchling>=1.27"] build-backend = "hatchling.build" # `app` and `packages` are the two importable roots; `design/` is the dashboard # SPA, which lives at the repo root for dev/Docker but has to travel inside the # wheel so `pip install orcarouter-lite` still serves the UI. force-include maps # it to `app/design/` at build time — no file move, no drift in the package list. [tool.hatch.build.targets.wheel] packages = ["app", "packages"] [tool.hatch.build.targets.wheel.force-include] "design" = "app/design" [tool.hatch.build.targets.sdist] include = ["app", "packages", "design", "scripts", "tests", "README.md", "LICENSE", "pyproject.toml"] exclude = ["**/__pycache__", "**/*.pyc", "design/test_i18n_unittest.py"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] filterwarnings = ["ignore::DeprecationWarning"] markers = [ "real_remote: opt out of the network-isolation autouse fixture (for tests of the real fetcher path)", ] [tool.ruff] target-version = "py311" line-length = 120 [tool.ruff.lint] select = ["E", "W", "F", "I", "B"] ignore = ["E501", "B008", "E402"]