fix: avoid failure when no special pip deps and better exit (#1228)

# What does this PR do?

When building providers in a virtual environment or containers, special
pip dependencies may not always be provided (e.g., for Ollama). The
check should only fail if the required number of arguments is missing.
Currently, two arguments are mandatory:

1. Environment name
2. Pip dependencies

Additionally, return statements were replaced with sys.exit(1) in error
conditions to ensure immediate termination on critical failures. Error
handling in the stack build process was also improved to guarantee the
program exits with status 1 when facing configuration issues or build
failures.

Signed-off-by: Sébastien Han <seb@redhat.com>

[//]: # (If resolving an issue, uncomment and update the line below)
[//]: # (Closes #[issue-number])

## Test Plan

This command shouldn't fail:

```
llama stack build --template ollama --image-type venv
```

[//]: # (## Documentation)

Signed-off-by: Sébastien Han <seb@redhat.com>
This commit is contained in:
Sébastien Han 2025-02-24 19:18:52 +01:00 committed by GitHub
parent d6356f822a
commit c4987bc349
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 13 additions and 12 deletions

View file

@ -9,6 +9,7 @@ import importlib.resources
import json
import os
import shutil
import sys
import textwrap
from functools import lru_cache
from pathlib import Path
@ -79,7 +80,7 @@ def run_stack_build_command(args: argparse.Namespace) -> None:
f"Could not find template {args.template}. Please run `llama stack build --list-templates` to check out the available templates",
color="red",
)
return
sys.exit(1)
build_config = available_templates[args.template]
if args.image_type:
build_config.image_type = args.image_type
@ -88,7 +89,7 @@ def run_stack_build_command(args: argparse.Namespace) -> None:
f"Please specify a image-type (container | conda | venv) for {args.template}",
color="red",
)
return
sys.exit(1)
elif not args.config and not args.template:
name = prompt(
"> Enter a name for your Llama Stack (e.g. my-local-stack): ",
@ -169,14 +170,14 @@ def run_stack_build_command(args: argparse.Namespace) -> None:
f"Could not parse config file {args.config}: {e}",
color="red",
)
return
sys.exit(1)
if build_config.image_type == ImageType.container.value and not args.image_name:
cprint(
"Please specify --image-name when building a container from a config file",
color="red",
)
return
sys.exit(1)
if args.print_deps_only:
print(f"# Dependencies for {args.template or args.config or image_name}")
@ -195,18 +196,18 @@ def run_stack_build_command(args: argparse.Namespace) -> None:
template_name=args.template,
)
except Exception as exc:
except (Exception, RuntimeError) as exc:
cprint(
f"Error building stack: {exc}",
color="red",
)
return
sys.exit(1)
if run_config is None:
cprint(
"Run config path is empty",
color="red",
)
return
sys.exit(1)
if args.run:
run_config = Path(run_config)
@ -312,7 +313,7 @@ def _run_stack_build_command_from_build_config(
template_or_config=template_name or config_path,
)
if return_code != 0:
return
raise RuntimeError(f"Failed to build image {image_name}")
if template_name:
# copy run.yaml from template to build_dir instead of generating it again

View file

@ -34,7 +34,7 @@ container_base="$3"
build_file_path="$4"
host_build_dir="$5"
pip_dependencies="$6"
special_pip_deps="$7"
special_pip_deps="${7:-}"
# Define color codes

View file

@ -25,7 +25,7 @@ if [ -n "$LLAMA_MODELS_DIR" ]; then
echo "Using llama-models-dir=$LLAMA_MODELS_DIR"
fi
if [ "$#" -lt 3 ]; then
if [ "$#" -lt 2 ]; then
echo "Usage: $0 <distribution_type> <env_name> <pip_dependencies> [<special_pip_deps>]" >&2
echo "Example: $0 <distribution_type> mybuild ./my-stack-build.yaml 'numpy pandas scipy'" >&2
exit 1
@ -74,8 +74,8 @@ run() {
local env_name="$1"
local pip_dependencies="$2"
local special_pip_deps="$3"
if [ -n "$UV_SYSTEM_PYTHON" ] || [ "$env_name" == "__system__" ]; then
if [ -n "$UV_SYSTEM_PYTHON" ] || [ "$env_name" == "__system__" ]; then
echo "Installing dependencies in system Python environment"
# if env == __system__, ensure we set UV_SYSTEM_PYTHON
export UV_SYSTEM_PYTHON=1