💬 Commit message: Update 2026-02-15 17:55:57, 7 files, 47 lines
📁 Files changed: 7 📝 Lines changed: 47 • pyproject.toml • __init__.py • civitai_routes.py • db_routes.py • download_routes.py • gallery_routes.py • uv.lock
This commit is contained in:
+6
-1
@@ -13,7 +13,7 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
server = ["fastapi>=0.115", "uvicorn>=0.30"]
|
server = ["fastapi>=0.115", "uvicorn>=0.30", "scalar-fastapi>=1.6"]
|
||||||
|
|
||||||
[project.scripts]
|
[project.scripts]
|
||||||
tsr = "tensors:main"
|
tsr = "tensors:main"
|
||||||
@@ -36,6 +36,7 @@ dev = [
|
|||||||
"respx>=0.22.0",
|
"respx>=0.22.0",
|
||||||
"fastapi>=0.115",
|
"fastapi>=0.115",
|
||||||
"uvicorn>=0.30",
|
"uvicorn>=0.30",
|
||||||
|
"scalar-fastapi>=1.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.ruff]
|
[tool.ruff]
|
||||||
@@ -92,6 +93,10 @@ ignore_missing_imports = true
|
|||||||
module = ["uvicorn.*"]
|
module = ["uvicorn.*"]
|
||||||
ignore_missing_imports = true
|
ignore_missing_imports = true
|
||||||
|
|
||||||
|
[[tool.mypy.overrides]]
|
||||||
|
module = ["scalar_fastapi.*"]
|
||||||
|
ignore_missing_imports = true
|
||||||
|
|
||||||
[tool.pytest.ini_options]
|
[tool.pytest.ini_options]
|
||||||
testpaths = ["tests"]
|
testpaths = ["tests"]
|
||||||
addopts = "-v --cov=tensors --cov-report=term-missing"
|
addopts = "-v --cov=tensors --cov-report=term-missing"
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ from contextlib import asynccontextmanager
|
|||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
|
from scalar_fastapi import get_scalar_api_reference
|
||||||
|
|
||||||
from tensors.server.civitai_routes import create_civitai_router
|
from tensors.server.civitai_routes import create_civitai_router
|
||||||
from tensors.server.db_routes import create_db_router
|
from tensors.server.db_routes import create_db_router
|
||||||
@@ -16,6 +17,8 @@ from tensors.server.gallery_routes import create_gallery_router
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from collections.abc import AsyncIterator
|
from collections.abc import AsyncIterator
|
||||||
|
|
||||||
|
from fastapi.responses import HTMLResponse
|
||||||
|
|
||||||
__all__ = ["app", "create_app"]
|
__all__ = ["app", "create_app"]
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -29,12 +32,26 @@ def create_app() -> FastAPI:
|
|||||||
logger.info("Tensors server starting")
|
logger.info("Tensors server starting")
|
||||||
yield
|
yield
|
||||||
|
|
||||||
app = FastAPI(title="tensors", lifespan=lifespan)
|
app = FastAPI(
|
||||||
|
title="tensors",
|
||||||
|
description="API for CivitAI model management and image gallery",
|
||||||
|
version="0.1.16",
|
||||||
|
lifespan=lifespan,
|
||||||
|
docs_url=None,
|
||||||
|
redoc_url=None,
|
||||||
|
)
|
||||||
|
|
||||||
@app.get("/status")
|
@app.get("/status")
|
||||||
async def status() -> dict[str, str]:
|
async def status() -> dict[str, str]:
|
||||||
return {"status": "ok"}
|
return {"status": "ok"}
|
||||||
|
|
||||||
|
@app.get("/docs", include_in_schema=False)
|
||||||
|
async def scalar_docs() -> HTMLResponse:
|
||||||
|
return get_scalar_api_reference(
|
||||||
|
openapi_url=app.openapi_url or "/openapi.json",
|
||||||
|
title="tensors API",
|
||||||
|
)
|
||||||
|
|
||||||
app.include_router(create_civitai_router())
|
app.include_router(create_civitai_router())
|
||||||
app.include_router(create_db_router())
|
app.include_router(create_db_router())
|
||||||
app.include_router(create_gallery_router())
|
app.include_router(create_gallery_router())
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from tensors.db import Database
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/civitai", tags=["civitai"])
|
router = APIRouter(prefix="/api/civitai", tags=["CivitAI"])
|
||||||
|
|
||||||
|
|
||||||
def _get_headers(api_key: str | None) -> dict[str, str]:
|
def _get_headers(api_key: str | None) -> dict[str, str]:
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from tensors.db import Database
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/db", tags=["database"])
|
router = APIRouter(prefix="/api/db", tags=["Database"])
|
||||||
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from tensors.db import Database
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/download", tags=["download"])
|
router = APIRouter(prefix="/api/download", tags=["Download"])
|
||||||
|
|
||||||
# Track active downloads
|
# Track active downloads
|
||||||
_active_downloads: dict[str, dict[str, Any]] = {}
|
_active_downloads: dict[str, dict[str, Any]] = {}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from tensors.server.gallery import Gallery
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/images", tags=["gallery"])
|
router = APIRouter(prefix="/api/images", tags=["Gallery"])
|
||||||
|
|
||||||
# Shared gallery instance
|
# Shared gallery instance
|
||||||
_gallery: Gallery | None = None
|
_gallery: Gallery | None = None
|
||||||
|
|||||||
@@ -683,6 +683,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" },
|
{ url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "scalar-fastapi"
|
||||||
|
version = "1.6.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/69/27/4fefc485d6d3b32c59e48cc5d7ba20180dc15984b4b50cbc8a0da18670d6/scalar_fastapi-1.6.2.tar.gz", hash = "sha256:2aea052b8ebd585f8f4a71c2eeb4a7250f4dba1172aa056464ff0fe7ae49bdd5", size = 8069, upload-time = "2026-02-11T21:26:22.766Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/30/16/fafcc10900b1d330641444163adac525322628684d04dc24bd8d5ab7109a/scalar_fastapi-1.6.2-py3-none-any.whl", hash = "sha256:922ff1823a5bc5dc6b6df318a468e1a8401babc973e74ccbf79154f50de5e13f", size = 7443, upload-time = "2026-02-11T21:26:21.175Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "shellingham"
|
name = "shellingham"
|
||||||
version = "1.5.4"
|
version = "1.5.4"
|
||||||
@@ -720,6 +729,7 @@ dependencies = [
|
|||||||
[package.optional-dependencies]
|
[package.optional-dependencies]
|
||||||
server = [
|
server = [
|
||||||
{ name = "fastapi" },
|
{ name = "fastapi" },
|
||||||
|
{ name = "scalar-fastapi" },
|
||||||
{ name = "uvicorn" },
|
{ name = "uvicorn" },
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -733,6 +743,7 @@ dev = [
|
|||||||
{ name = "pytest-cov" },
|
{ name = "pytest-cov" },
|
||||||
{ name = "respx" },
|
{ name = "respx" },
|
||||||
{ name = "ruff" },
|
{ name = "ruff" },
|
||||||
|
{ name = "scalar-fastapi" },
|
||||||
{ name = "uvicorn" },
|
{ name = "uvicorn" },
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -742,6 +753,7 @@ requires-dist = [
|
|||||||
{ name = "httpx", specifier = ">=0.27.0" },
|
{ name = "httpx", specifier = ">=0.27.0" },
|
||||||
{ name = "rich", specifier = ">=13.0.0" },
|
{ name = "rich", specifier = ">=13.0.0" },
|
||||||
{ name = "safetensors", specifier = ">=0.4.0" },
|
{ name = "safetensors", specifier = ">=0.4.0" },
|
||||||
|
{ name = "scalar-fastapi", marker = "extra == 'server'", specifier = ">=1.6" },
|
||||||
{ name = "typer", specifier = ">=0.15.0" },
|
{ name = "typer", specifier = ">=0.15.0" },
|
||||||
{ name = "uvicorn", marker = "extra == 'server'", specifier = ">=0.30" },
|
{ name = "uvicorn", marker = "extra == 'server'", specifier = ">=0.30" },
|
||||||
{ name = "websocket-client", specifier = ">=1.9.0" },
|
{ name = "websocket-client", specifier = ">=1.9.0" },
|
||||||
@@ -758,6 +770,7 @@ dev = [
|
|||||||
{ name = "pytest-cov", specifier = ">=4.1" },
|
{ name = "pytest-cov", specifier = ">=4.1" },
|
||||||
{ name = "respx", specifier = ">=0.22.0" },
|
{ name = "respx", specifier = ">=0.22.0" },
|
||||||
{ name = "ruff", specifier = ">=0.9.0" },
|
{ name = "ruff", specifier = ">=0.9.0" },
|
||||||
|
{ name = "scalar-fastapi", specifier = ">=1.6" },
|
||||||
{ name = "uvicorn", specifier = ">=0.30" },
|
{ name = "uvicorn", specifier = ">=0.30" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user