A reproducible Python project records its required Python version, dependencies, and lockfile instead of relying on whatever happens to be installed globally. We will use uv to manage those pieces, isolate packages in .venv, and verify the toolchain before adding FastAPI or application code.
pyproject.toml declares intent. The lockfile records exact resolution. .venv contains installed packages for this project. Source files contain your code. Only the declaration, lockfile, and source belong in Git; the environment is recreated.
Use the official uv installation guide for your operating system, then verify:
Version numbers change; the successful imports and lockfile are the evidence. Do not copy a global pip install command into an unknown interpreter.
Inspect pyproject.toml. The dependency declaration should name FastAPI and Uvicorn; development dependencies should include test and quality tools.
Reproduce from the lockfile:
--frozen refuses to silently change dependency resolution. That behavior is valuable in CI.
Model SDKs and orchestration libraries change quickly. Unbounded dependencies create surprise behavior and security risk. Keep the integration surface small, wrap providers behind your own interfaces, review lockfile changes, and automate vulnerability updates without merging them blindly.
Clone or copy only the declarations and source into a new temporary directory, run uv sync --frozen, and execute the import verification.
Acceptance criteria: the second environment succeeds without copying .venv; its locked package versions match the first.