Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
## 5.3.2 - 2026-07-30

Corrects the agent-crew deploy layout warning. No API or behaviour changes.

* **CLI** (`smallestai agent-crew deploy`): the pre-deploy check no longer claims a `src/`
layout or a `pyproject.toml` project fails the cloud build. Both build and run (verified end
to end). The check is now a short note: flat directory with `server.py` + `requirements.txt`
at the root is the simplest, best-tested path; if you use a `pyproject.toml` with no
`requirements.txt`, declare every runtime dependency in it.

## 5.3.1 - 2026-07-29

Billing read endpoints, a call-log type fix, and clearer agent-crew deploy warnings. Additive; no breaking changes.
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ dynamic = ["version"]

[tool.poetry]
name = "smallestai"
version = "5.3.1"
version = "5.3.2"
description = ""
readme = "README.md"
authors = []
Expand Down
36 changes: 13 additions & 23 deletions src/smallestai/cli/agent_crew.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,34 +175,24 @@ async def async_deploy(directory: str, entry_point: str):
console.print(f"[dim]Entry point: {entry_point}[/dim]")
console.print(f"[dim]Agent ID: {agent_id}[/dim]\n")

# Pre-flight layout check. The cloud build runs `pip install .` from a
# pyproject before copying your source, so a src/ layout (or a nested
# entry point) fails there. The supported path is a flat directory with a
# requirements.txt (what the cookbook examples ship). Warn early instead
# of letting the build fail opaquely.
# Pre-flight layout note. Both a flat directory (server.py +
# requirements.txt at the root) and a src/ layout with a pyproject.toml
# build and run in the cloud. Flat + requirements.txt is what the cookbook
# examples ship and the best-tested path, so nudge toward it without
# blocking anything. One gotcha for pyproject projects: all runtime deps
# must be declared there (smallestai already pulls in the crew server's
# deps, so this is usually covered).
has_pyproject = (dir_path / "pyproject.toml").exists()
has_requirements = (dir_path / "requirements.txt").exists()
has_src_dir = (dir_path / "src").is_dir()
nested_entry = ("/" in entry_point) or ("\\" in entry_point)
if (has_pyproject and not has_requirements) or has_src_dir or nested_entry:
console.print("[yellow]⚠ Project layout may not build in the cloud:[/yellow]")
if has_src_dir or nested_entry:
console.print(
" [yellow]• src/ layout / nested entry point detected. The cloud "
"build expects a flat directory with the entry file at the root "
"(e.g. server.py), not under src/.[/yellow]"
)
if has_pyproject and not has_requirements:
console.print(
" [yellow]• pyproject.toml with no requirements.txt. The builder "
"runs `pip install .` before your source is copied, which fails for "
"src/ layouts. Add a requirements.txt (the builder prefers it and "
"skips that step).[/yellow]"
)
if has_src_dir or nested_entry or (has_pyproject and not has_requirements):
console.print(
"[dim]Supported layout: a flat directory with server.py + a "
"requirements.txt at the root. See the cookbook getting_started "
"example.[/dim]\n"
"[dim]Note: src/ + pyproject.toml layouts deploy fine. The simplest, "
"best-tested path is a flat directory with server.py + a "
"requirements.txt at the root (what the cookbook getting_started "
"example ships). If you use a pyproject with no requirements.txt, make "
"sure every runtime dependency is declared in it.[/dim]\n"
)

# Scan user code for env var references and warn — the deploy pipeline
Expand Down
Loading