[build-system] requires = ["setuptools>=68", "wheel"] build-backend = "setuptools.build_meta" [project] name = "praxis-server" version = "0.1.0" description = "Praxis — voice-first AI apprenticeship platform (v0.1 foundation: minimal viable voice loop)" readme = "README.md" requires-python = ">=3.11" license = { text = "Proprietary" } authors = [{ name = "Praxis v0.1 (CIAgent)" }] dependencies = [ # Web framework — FastAPI serves /health + /pipecat/webrtc + StaticFiles (D-023) "fastapi>=0.110", # ASGI server — uvicorn runs the FastAPI app (used by server.__main__.main) "uvicorn>=0.30", # Orchestration — Pipecat (D-017) with the three native service extras + WebRTC transport "pipecat-ai[deepgram,cartesia,piper,webrtc]>=1.6.0", # LLM access — Ollama Cloud direct API (D-020). Pipecat's OLLamaLLMService uses the # OpenAI-compatible client; we point base_url at https://ollama.com/v1 + bearer key. "openai>=1.40", # Scenario format — YAML DSL → Pydantic (D-018) "pydantic>=2.7", "pyyaml>=6.0", # Learner state — SQLite (D-007), async access "aiosqlite>=0.20", # Config "python-dotenv>=1.0", # Latency probes — HTTP client for the integrated e2e probe "httpx>=0.27", "websockets>=12.0", # Audio probe fixture generation (synthesized PCM) for the ASR probe "numpy>=1.26", # VC issuer (SLICE-09) — Ed25519 sign/verify (libsodium), JCS canonicalization # (RFC 8785), base58-btc for Multikey proofValue encoding. "pynacl>=1.5", "canonicaljson>=2.0", "base58>=2.1", # v0.4 operator tier — Postgres pool (D-050), argon2id passwords (D-041), # slowapi rate limiting (D-041). RESEARCH-v0.4 §new-deps. "asyncpg>=0.29", "argon2-cffi>=23.1", "slowapi>=0.1", # SessionMiddleware uses itsdangerous for signed cookies (D-056). "itsdangerous>=2.1", ] [project.optional-dependencies] dev = [ "pytest>=8.0", "pytest-asyncio>=0.23", "pytest-cov>=5.0", ] [project.scripts] praxis-server = "server.__main__:main" [tool.setuptools.packages.find] where = ["."] include = ["server*", "db*", "scenarios*"] exclude = ["client*", "tests*", "scripts*"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] python_files = ["test_*.py"] addopts = "-ra -q" [tool.coverage.run] source = ["server", "db"]