Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
2059d97
feat(resources): Support for Serverless.type QB|LB
deanq Nov 7, 2025
f21bc82
feat(cli): add flash init project skeleton template
deanq Nov 10, 2025
b9db5fe
feat(cli): add flash init in-place with conflict warnings
deanq Nov 10, 2025
dce72e9
fix(cli): correct GPU and CPU types in skeleton README
deanq Nov 10, 2025
5d62eb3
chore(cli): lint and format fixes
deanq Nov 10, 2025
f34165c
fix(cli): correct API endpoints and request/response models in skelet…
deanq Nov 10, 2025
8479235
feat(cli): add parallel test block to skeleton interface endpoint
deanq Nov 10, 2025
6f0aaf7
Merge branch 'main' into deanq/ae-1249-improve-cli
deanq Nov 11, 2025
53795b9
perf: reduce the load footprint from runpod library
deanq Nov 14, 2025
b874154
refactor(cli): restore IDE functionality and fix command signatures
deanq Nov 14, 2025
aed00e3
build: pegged latest main branch of runpod-python for now
deanq Nov 14, 2025
8cbb166
test: fix test for lazy-loaded runpod
deanq Nov 14, 2025
c76a9cf
feat(client): add async function support to @remote decorator
deanq Nov 14, 2025
62715d8
fix: ruff format
deanq Nov 14, 2025
3517d0f
feat(client): add async function support to remote decorator
deanq Nov 14, 2025
698596c
Merge branch 'deanq/ae-1469-bug-support-async-and-non-for-remote-deco…
deanq Nov 14, 2025
b77bbec
fix(stubs): support async functions and decorator unwrapping
deanq Nov 14, 2025
37ecaa1
Merge branch 'deanq/ae-1469-bug-support-async-and-non-for-remote-deco…
deanq Nov 14, 2025
a089d42
chore: quality check
deanq Nov 14, 2025
590df46
refactor(cli): simplify skeleton template examples
deanq Nov 14, 2025
0648216
fix(cli): update flash init output to reflect new skeleton structure
deanq Nov 14, 2025
a4fccdb
refactor(cli): remove conda environment management from flash init
deanq Nov 14, 2025
7366956
docs(cli): update flash init documentation to remove conda references
deanq Nov 14, 2025
ea74f57
fix(cli): use recursive glob for worker dependency extraction
deanq Nov 14, 2025
2df184a
fix(cli): improve pip error reporting in flash build
deanq Nov 14, 2025
8f3ecd5
fix(cli): add uv pip fallback for flash build
deanq Nov 14, 2025
a4cfb6e
fix(cli): remove workers/interface and update outdated endpoint refer…
deanq Nov 14, 2025
1b54bfb
fix(cli): standardize default port to 8888 in skeleton template
deanq Nov 14, 2025
5a27411
feat(cli): limit flash CLI to init and run commands for this release
deanq Nov 14, 2025
8061b4c
Merge branch 'main' into deanq/ae-1249-improve-cli
deanq Nov 14, 2025
2f29c5e
Merge branch 'main' into deanq/ae-1249-improve-cli
deanq Nov 14, 2025
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
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,6 @@ module = [
"cloudpickle.*",
]
ignore_missing_imports = true

[tool.uv.sources]
runpod = { git = "https://github.com/runpod/runpod-python", rev = "main" }
2 changes: 0 additions & 2 deletions src/tetra_rp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
ResourceManager,
ServerlessEndpoint,
ServerlessType,
runpod,
NetworkVolume,
)

Expand All @@ -40,6 +39,5 @@
"ResourceManager",
"ServerlessEndpoint",
"ServerlessType",
"runpod",
"NetworkVolume",
]
53 changes: 43 additions & 10 deletions src/tetra_rp/cli/commands/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,16 @@ def build_command(
flash build --keep-build # Keep temporary build directory
flash build -o my-app.tar.gz # Custom archive name
"""
console.print(
Panel(
"[yellow]The build command is coming soon.[/yellow]\n\n"
"This feature is under development and will be available in a future release.",
title="Coming Soon",
expand=False,
)
)
return

try:
# Validate project structure
project_dir, app_name = discover_flash_project()
Expand Down Expand Up @@ -313,7 +323,7 @@ def extract_remote_dependencies(workers_dir: Path) -> list[str]:
"""
dependencies = []

for py_file in workers_dir.glob("*.py"):
for py_file in workers_dir.glob("**/*.py"):
if py_file.name == "__init__.py":
continue

Expand Down Expand Up @@ -351,7 +361,7 @@ def install_dependencies(
build_dir: Path, requirements: list[str], no_deps: bool
) -> bool:
"""
Install dependencies to build directory using pip.
Install dependencies to build directory using pip or uv pip.

Args:
build_dir: Build directory (pip --target)
Expand All @@ -364,23 +374,46 @@ def install_dependencies(
if not requirements:
return True

# Use only sys.executable -m pip to ensure correct environment
# Try python -m pip first
pip_cmd = [sys.executable, "-m", "pip"]
pip_available = False

# Check if pip is available
try:
result = subprocess.run(
pip_cmd + ["--version"],
capture_output=True,
text=True,
timeout=5,
)
if result.returncode != 0:
console.print(
"[red]Error:[/red] pip not found in current Python environment"
)
return False
if result.returncode == 0:
pip_available = True
except (subprocess.SubprocessError, FileNotFoundError):
console.print("[red]Error:[/red] pip not found in current Python environment")
pass

# If pip not available, try uv pip
if not pip_available:
try:
result = subprocess.run(
["uv", "pip", "--version"],
capture_output=True,
text=True,
timeout=5,
)
if result.returncode == 0:
pip_cmd = ["uv", "pip"]
pip_available = True
console.print(
"[yellow]Note:[/yellow] Using 'uv pip' (pip not found in venv)"
)
except (subprocess.SubprocessError, FileNotFoundError):
pass

# If neither available, error out
if not pip_available:
console.print("[red]Error:[/red] Neither pip nor uv pip found")
console.print("\n[yellow]Install pip with one of:[/yellow]")
console.print(" • python -m ensurepip --upgrade")
console.print(" • uv pip install pip")
return False

cmd = pip_cmd + [
Expand Down
44 changes: 39 additions & 5 deletions src/tetra_rp/cli/commands/deploy.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,16 @@
def list_command():
"""Show available deployment environments."""

console.print(
Panel(
"[yellow]The deploy command is coming soon.[/yellow]\n\n"
"This feature is under development and will be available in a future release.",
title="Coming Soon",
expand=False,
)
)
return

environments = get_deployment_environments()

if not environments:
Expand Down Expand Up @@ -78,9 +88,23 @@ def list_command():
console.print(f"\n{summary}")


def new_command(name: str):
def new_command(
name: str = typer.Argument(
..., help="Name of the deployment environment to create"
),
):
"""Create a new deployment environment."""

console.print(
Panel(
"[yellow]The deploy command is coming soon.[/yellow]\n\n"
"This feature is under development and will be available in a future release.",
title="Coming Soon",
expand=False,
)
)
return

environments = get_deployment_environments()

if name in environments:
Expand Down Expand Up @@ -125,7 +149,9 @@ def new_command(name: str):
console.print(f"\nNext: [bold]flash deploy send {name}[/bold]")


def send_command(name: str):
def send_command(
name: str = typer.Argument(..., help="Name of the deployment environment"),
):
"""Deploy project to deployment environment."""

environments = get_deployment_environments()
Expand Down Expand Up @@ -157,7 +183,9 @@ def send_command(name: str):
raise typer.Exit(1)


def report_command(name: str):
def report_command(
name: str = typer.Argument(..., help="Name of the deployment environment"),
):
"""Show detailed environment status and metrics."""

environments = get_deployment_environments()
Expand Down Expand Up @@ -223,7 +251,9 @@ def report_command(name: str):
console.print(f" {metric}")


def rollback_command(name: str):
def rollback_command(
name: str = typer.Argument(..., help="Name of the deployment environment"),
):
"""Rollback deployment to previous version."""

environments = get_deployment_environments()
Expand Down Expand Up @@ -283,7 +313,11 @@ def rollback_command(name: str):
console.print(f"Environment '{name}' is now running the previous version.")


def remove_command(name: str):
def remove_command(
name: str = typer.Argument(
..., help="Name of the deployment environment to remove"
),
):
"""Remove deployment environment."""

environments = get_deployment_environments()
Expand Down
Loading
Loading