Files
nextcraft/apps/ai-service/ai_service/api/deps.py
T
CIAgent b01de4be7d feat(P01): sandboxes lifecycle API + G-5 abuse control (Wave 3)
Task 1-3-01: /v1/sandboxes endpoints (create/list/get/snapshot/delete) over the manager
singleton via DI; lifespan boots the startup orphan reaper (a-1) + destroys all on shutdown.
Abuse control (G-5): learner allowlist (403 unknown id), per-learner active cap (429),
global create-rate cap (429). CORS gains DELETE. 174 full-suite tests green; manual probe
POST /v1/sandboxes -> 201 verified live; ruff clean.

---ci---
phase: 1
milestone: v0.3
status: execute
requirements: {covered: [REQ-3-001, REQ-3-002], partial: []}
---/ci---
2026-09-12 00:47:45 +00:00

36 lines
1.0 KiB
Python

"""FastAPI dependencies — provider, settings, sessions, agents via app.state (DI)."""
from fastapi import Request
from ..agents.registry import AgentRegistry
from ..agents.session import SessionStore
from ..config import Settings
from ..llm.base import LLMProvider
from ..sandbox.manager import SandboxManager
from ..sandbox.workdir import SandboxDir
def get_settings(request: Request) -> Settings:
return request.app.state.settings
def get_provider(request: Request) -> LLMProvider:
return request.app.state.provider
def get_session_store(request: Request) -> SessionStore:
return request.app.state.session_store
def get_agent_registry(request: Request) -> AgentRegistry:
return request.app.state.agent_registry
def get_sandbox_manager(request: Request) -> SandboxManager:
return request.app.state.sandbox_manager
def get_sandbox_test_layout(request: Request) -> SandboxDir | None:
"""Optional test seam (app.state.sandbox_test_layout); always None in prod."""
return getattr(request.app.state, "sandbox_test_layout", None)