[project] name = "multi-agent-land" version = "0.1.0" description = "Small-model multi-agent Gradio experience for Thousand Token Wood." requires-python = ">=3.10" dependencies = [ # The HF Spaces builder installs gradio[oauth,mcp]; carrying the same extras here makes # our lockfile resolve under the same constraints (notably the mcp extra's pydantic ceiling), # so requirements.txt can't drift into a version the Space rejects. "gradio[oauth,mcp]>=4.44.0", "pydantic>=2.8.0", "python-dotenv>=1.0.1", "openai>=1.40.0", "pyyaml>=6.0", # gradio's queueing layer (`_get_df`) is written against pandas 2.x APIs (the `copy=` # keyword on `infer_objects`, the `future.no_silent_downcasting` option). pandas 3.0 # deprecates both, so running pandas 3 makes gradio emit Pandas4Warnings on every queue # poll. Cap at <3 to keep gradio on its supported pandas set until upstream updates it; # our own pandas use is a trivial version-agnostic DataFrame constructor. "pandas>=2.0,<3", "modal>=1.4.3", "opentelemetry-api>=1.20.0", "opentelemetry-sdk>=1.20.0", "opentelemetry-semantic-conventions>=0.41b0", # The app requires real infrastructure — a DB and live inference — and refuses to # run without it; there is no offline/stub product mode. Everything the live path # touches is therefore a core dependency rather than an opt-in extra: # - sqlalchemy + psycopg : durable event store backend (ADR-0014); psycopg is the Neon driver. # - litellm : model gateway to the OpenAI-compatible endpoints (ADR-0015). # - instructor : validated, schema-constrained structured output (ADR-0016). # - mcp : Model Context Protocol tool transport (ADR-0017). # - mem0ai + sentence-transformers : semantic memory index over the ledger (ADR-0018). # These are still imported lazily at their call sites, but they always ship. "sqlalchemy>=2.0", "psycopg[binary]>=3", "litellm>=1.40", "instructor>=1.5", "mcp>=1.0", "mem0ai>=0.1", "sentence-transformers>=3.0", # torch ships transitively via sentence-transformers; pin it into the ZeroGPU-supported # range (HF ZeroGPU accepts 2.8.0–2.11.0) so the HF Space build doesn't try to install # an unsupported wheel. Upper bound, not exact, so the resolver can still pick per-Python. "torch>=2.8,<2.12", # HF ZeroGPU hardware refuses to start unless it detects at least one `@spaces.GPU` # function at launch ("No @spaces.GPU function detected during startup"). The `spaces` # package provides that decorator; it is effect-free off ZeroGPU, so it ships always # without touching the offline/local path. See src/ui/fishbowl/app.py (gpu_selftest). "spaces>=0.50.4", # transformers 5.x requires `accelerate` to load a model straight onto a device via # `device_map`. The local backend (ADR-0033) needs that supported path: a bare # `from_pretrained(...).to("cuda")` can leave meta tensors and crash ("Cannot copy out of # meta tensor"). Only used on the live local-GPU path; the offline stub never imports it. "accelerate>=1.14.0", "pillow>=12.2.0", ] [project.optional-dependencies] dev = [ "pytest>=8.2.0", "ruff>=0.5.0", ] [tool.ruff] line-length = 120 target-version = "py310" [tool.pytest.ini_options] pythonpath = ["."] [tool.uv.workspace] members = [ "modal", ]