diff --git a/CHANGELOG.md b/CHANGELOG.md index aad0cb529..2f47c3ae3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -451,7 +451,7 @@ GenAI application developers need more than just an LLM - they need to integrate Llama Stack was created to provide developers with a comprehensive and coherent interface that simplifies AI application development and codifies best practices across the Llama ecosystem. Since our launch in September 2024, we have seen a huge uptick in interest in Llama Stack APIs by both AI developers and from partners building AI services with Llama models. Partners like Nvidia, Fireworks, and Ollama have collaborated with us to develop implementations across various APIs, including inference, memory, and safety. -With Llama Stack, you can easily build a RAG agent which can also search the web, do complex math, and custom tool calling. You can use telemetry to inspect those traces, and convert telemetry into evals datasets. And with Llama Stack’s plugin architecture and prepackage distributions, you choose to run your agent anywhere - in the cloud with our partners, deploy your own environment using virtualenv, conda, or Docker, operate locally with Ollama, or even run on mobile devices with our SDKs. Llama Stack offers unprecedented flexibility while also simplifying the developer experience. +With Llama Stack, you can easily build a RAG agent which can also search the web, do complex math, and custom tool calling. You can use telemetry to inspect those traces, and convert telemetry into evals datasets. And with Llama Stack’s plugin architecture and prepackage distributions, you choose to run your agent anywhere - in the cloud with our partners, deploy your own environment using virtualenv or Docker, operate locally with Ollama, or even run on mobile devices with our SDKs. Llama Stack offers unprecedented flexibility while also simplifying the developer experience. ## Release After iterating on the APIs for the last 3 months, today we’re launching a stable release (V1) of the Llama Stack APIs and the corresponding llama-stack server and client packages(v0.1.0). We now have automated tests for providers. These tests make sure that all provider implementations are verified. Developers can now easily and reliably select distributions or providers based on their specific requirements. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8d866328b..6f745af72 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -164,7 +164,7 @@ Some tips about common tasks you work on while contributing to Llama Stack: ### Using `llama stack build` -Building a stack image (conda / docker) will use the production version of the `llama-stack` and `llama-stack-client` packages. If you are developing with a llama-stack repository checked out and need your code to be reflected in the stack image, set `LLAMA_STACK_DIR` and `LLAMA_STACK_CLIENT_DIR` to the appropriate checked out directories when running any of the `llama` CLI commands. +Building a stack image will use the production version of the `llama-stack` and `llama-stack-client` packages. If you are developing with a llama-stack repository checked out and need your code to be reflected in the stack image, set `LLAMA_STACK_DIR` and `LLAMA_STACK_CLIENT_DIR` to the appropriate checked out directories when running any of the `llama` CLI commands. Example: ```bash diff --git a/docs/source/building_applications/playground/index.md b/docs/source/building_applications/playground/index.md index 399b41203..f57f1f052 100644 --- a/docs/source/building_applications/playground/index.md +++ b/docs/source/building_applications/playground/index.md @@ -97,7 +97,7 @@ To start the Llama Stack Playground, run the following commands: 1. Start up the Llama Stack API server ```bash -llama stack build --template together --image-type conda +llama stack build --template together --image-type venv llama stack run together ``` diff --git a/docs/source/distributions/building_distro.md b/docs/source/distributions/building_distro.md index fecfbac38..b5769f386 100644 --- a/docs/source/distributions/building_distro.md +++ b/docs/source/distributions/building_distro.md @@ -47,13 +47,13 @@ pip install -e . ``` Use the CLI to build your distribution. The main points to consider are: -1. **Image Type** - Do you want a Conda / venv environment or a Container (eg. Docker) +1. **Image Type** - Do you want a venv environment or a Container (eg. Docker) 2. **Template** - Do you want to use a template to build your distribution? or start from scratch ? 3. **Config** - Do you want to use a pre-existing config file to build your distribution? ``` llama stack build -h -usage: llama stack build [-h] [--config CONFIG] [--template TEMPLATE] [--list-templates] [--image-type {conda,container,venv}] [--image-name IMAGE_NAME] [--print-deps-only] [--run] +usage: llama stack build [-h] [--config CONFIG] [--template TEMPLATE] [--list-templates] [--image-type {container,venv}] [--image-name IMAGE_NAME] [--print-deps-only] [--run] Build a Llama stack container @@ -63,10 +63,10 @@ options: be prompted to enter information interactively (default: None) --template TEMPLATE Name of the example template config to use for build. You may use `llama stack build --list-templates` to check out the available templates (default: None) --list-templates Show the available templates for building a Llama Stack distribution (default: False) - --image-type {conda,container,venv} + --image-type {container,venv} Image Type to use for the build. If not specified, will use the image type from the template config. (default: None) --image-name IMAGE_NAME - [for image-type=conda|container|venv] Name of the conda or virtual environment to use for the build. If not specified, currently active environment will be used if + [for image-type=container|venv] Name of the virtual environment to use for the build. If not specified, currently active environment will be used if found. (default: None) --print-deps-only Print the dependencies for the stack only, without building the stack (default: False) --run Run the stack after building using the same image type, name, and other applicable arguments (default: False) @@ -159,7 +159,7 @@ It would be best to start with a template and understand the structure of the co llama stack build > Enter a name for your Llama Stack (e.g. my-local-stack): my-stack -> Enter the image type you want your Llama Stack to be built as (container or conda or venv): conda +> Enter the image type you want your Llama Stack to be built as (container or venv): venv Llama Stack is composed of several APIs working together. Let's select the provider types (implementations) you want to use for these APIs. @@ -312,7 +312,7 @@ Now, let's start the Llama Stack Distribution Server. You will need the YAML con ``` llama stack run -h usage: llama stack run [-h] [--port PORT] [--image-name IMAGE_NAME] [--env KEY=VALUE] - [--image-type {conda,venv}] [--enable-ui] + [--image-type {venv}] [--enable-ui] [config | template] Start the server for a Llama Stack Distribution. You should have already built (or downloaded) and configured the distribution. @@ -326,8 +326,8 @@ options: --image-name IMAGE_NAME Name of the image to run. Defaults to the current environment (default: None) --env KEY=VALUE Environment variables to pass to the server in KEY=VALUE format. Can be specified multiple times. (default: None) - --image-type {conda,venv} - Image Type used during the build. This can be either conda or venv. (default: None) + --image-type {venv} + Image Type used during the build. This should be venv. (default: None) --enable-ui Start the UI server (default: False) ``` @@ -342,9 +342,6 @@ llama stack run ~/.llama/distributions/llamastack-my-local-stack/my-local-stack- # Start using a venv llama stack run --image-type venv ~/.llama/distributions/llamastack-my-local-stack/my-local-stack-run.yaml - -# Start using a conda environment -llama stack run --image-type conda ~/.llama/distributions/llamastack-my-local-stack/my-local-stack-run.yaml ``` ``` diff --git a/docs/source/distributions/configuration.md b/docs/source/distributions/configuration.md index 775749dd6..335fa3a68 100644 --- a/docs/source/distributions/configuration.md +++ b/docs/source/distributions/configuration.md @@ -10,7 +10,6 @@ The default `run.yaml` files generated by templates are starting points for your ```yaml version: 2 -conda_env: ollama apis: - agents - inference diff --git a/docs/source/distributions/ondevice_distro/android_sdk.md b/docs/source/distributions/ondevice_distro/android_sdk.md index 1cddf1d1f..c3369f399 100644 --- a/docs/source/distributions/ondevice_distro/android_sdk.md +++ b/docs/source/distributions/ondevice_distro/android_sdk.md @@ -56,10 +56,10 @@ Breaking down the demo app, this section will show the core pieces that are used ### Setup Remote Inferencing Start a Llama Stack server on localhost. Here is an example of how you can do this using the firework.ai distribution: ``` -conda create -n stack-fireworks python=3.10 -conda activate stack-fireworks +python -m venv stack-fireworks +source stack-fireworks/bin/activate # On Windows: stack-fireworks\Scripts\activate pip install --no-cache llama-stack==0.2.2 -llama stack build --template fireworks --image-type conda +llama stack build --template fireworks --image-type venv export FIREWORKS_API_KEY= llama stack run fireworks --port 5050 ``` diff --git a/docs/source/distributions/remote_hosted_distro/watsonx.md b/docs/source/distributions/remote_hosted_distro/watsonx.md index ec1b98059..977af90dd 100644 --- a/docs/source/distributions/remote_hosted_distro/watsonx.md +++ b/docs/source/distributions/remote_hosted_distro/watsonx.md @@ -57,7 +57,7 @@ Make sure you have access to a watsonx API Key. You can get one by referring [wa ## Running Llama Stack with watsonx -You can do this via Conda (build code), venv or Docker which has a pre-built image. +You can do this via venv or Docker which has a pre-built image. ### Via Docker @@ -76,13 +76,3 @@ docker run \ --env WATSONX_PROJECT_ID=$WATSONX_PROJECT_ID \ --env WATSONX_BASE_URL=$WATSONX_BASE_URL ``` - -### Via Conda - -```bash -llama stack build --template watsonx --image-type conda -llama stack run ./run.yaml \ - --port $LLAMA_STACK_PORT \ - --env WATSONX_API_KEY=$WATSONX_API_KEY \ - --env WATSONX_PROJECT_ID=$WATSONX_PROJECT_ID -``` diff --git a/docs/source/distributions/self_hosted_distro/dell.md b/docs/source/distributions/self_hosted_distro/dell.md index eded3bdc4..c3fb1850c 100644 --- a/docs/source/distributions/self_hosted_distro/dell.md +++ b/docs/source/distributions/self_hosted_distro/dell.md @@ -114,7 +114,7 @@ podman run --rm -it \ ## Running Llama Stack -Now you are ready to run Llama Stack with TGI as the inference provider. You can do this via Conda (build code) or Docker which has a pre-built image. +Now you are ready to run Llama Stack with TGI as the inference provider. You can do this via venv or Docker which has a pre-built image. ### Via Docker @@ -164,12 +164,12 @@ docker run \ --env CHROMA_URL=$CHROMA_URL ``` -### Via Conda +### Via venv Make sure you have done `pip install llama-stack` and have the Llama Stack CLI available. ```bash -llama stack build --template dell --image-type conda +llama stack build --template dell --image-type venv llama stack run dell --port $LLAMA_STACK_PORT \ --env INFERENCE_MODEL=$INFERENCE_MODEL \ diff --git a/docs/source/distributions/self_hosted_distro/meta-reference-gpu.md b/docs/source/distributions/self_hosted_distro/meta-reference-gpu.md index 8b9dcec55..22e4c40cc 100644 --- a/docs/source/distributions/self_hosted_distro/meta-reference-gpu.md +++ b/docs/source/distributions/self_hosted_distro/meta-reference-gpu.md @@ -70,7 +70,7 @@ $ llama model list --downloaded ## Running the Distribution -You can do this via Conda (build code) or Docker which has a pre-built image. +You can do this via venv or Docker which has a pre-built image. ### Via Docker @@ -104,12 +104,12 @@ docker run \ --env SAFETY_MODEL=meta-llama/Llama-Guard-3-1B ``` -### Via Conda +### Via venv Make sure you have done `uv pip install llama-stack` and have the Llama Stack CLI available. ```bash -llama stack build --template meta-reference-gpu --image-type conda +llama stack build --template meta-reference-gpu --image-type venv llama stack run distributions/meta-reference-gpu/run.yaml \ --port 8321 \ --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct diff --git a/docs/source/distributions/self_hosted_distro/nvidia.md b/docs/source/distributions/self_hosted_distro/nvidia.md index aeb14e6a6..98a604f32 100644 --- a/docs/source/distributions/self_hosted_distro/nvidia.md +++ b/docs/source/distributions/self_hosted_distro/nvidia.md @@ -133,7 +133,7 @@ curl -X DELETE "$NEMO_URL/v1/deployment/model-deployments/meta/llama-3.1-8b-inst ## Running Llama Stack with NVIDIA -You can do this via Conda or venv (build code), or Docker which has a pre-built image. +You can do this via venv (build code), or Docker which has a pre-built image. ### Via Docker @@ -152,17 +152,6 @@ docker run \ --env NVIDIA_API_KEY=$NVIDIA_API_KEY ``` -### Via Conda - -```bash -INFERENCE_MODEL=meta-llama/Llama-3.1-8b-Instruct -llama stack build --template nvidia --image-type conda -llama stack run ./run.yaml \ - --port 8321 \ - --env NVIDIA_API_KEY=$NVIDIA_API_KEY \ - --env INFERENCE_MODEL=$INFERENCE_MODEL -``` - ### Via venv If you've set up your local development environment, you can also build the image using your local virtual environment. diff --git a/docs/source/distributions/self_hosted_distro/starter.md b/docs/source/distributions/self_hosted_distro/starter.md index 6f4759484..3a3d3081f 100644 --- a/docs/source/distributions/self_hosted_distro/starter.md +++ b/docs/source/distributions/self_hosted_distro/starter.md @@ -145,7 +145,7 @@ This distribution comes with a default "llama-guard" shield that can be enabled ## Running the Distribution -You can run the starter distribution via Docker, Conda, or venv. +You can run the starter distribution via Docker or venv. ### Via Docker @@ -164,12 +164,12 @@ docker run \ --port $LLAMA_STACK_PORT ``` -### Via Conda or venv +### Via venv Ensure you have configured the starter distribution using the environment variables explained above. ```bash -uv run --with llama-stack llama stack build --template starter --image-type --run +uv run --with llama-stack llama stack build --template starter --image-type venv --run ``` ## Example Usage diff --git a/docs/source/distributions/starting_llama_stack_server.md b/docs/source/distributions/starting_llama_stack_server.md index 91cb1fe88..1a26694a6 100644 --- a/docs/source/distributions/starting_llama_stack_server.md +++ b/docs/source/distributions/starting_llama_stack_server.md @@ -11,12 +11,6 @@ This is the simplest way to get started. Using Llama Stack as a library means yo Another simple way to start interacting with Llama Stack is to just spin up a container (via Docker or Podman) which is pre-built with all the providers you need. We provide a number of pre-built images so you can start a Llama Stack server instantly. You can also build your own custom container. Which distribution to choose depends on the hardware you have. See [Selection of a Distribution](selection) for more details. - -## Conda: - -If you have a custom or an advanced setup or you are developing on Llama Stack you can also build a custom Llama Stack server. Using `llama stack build` and `llama stack run` you can build/run a custom Llama Stack server containing the exact combination of providers you wish. We have also provided various templates to make getting started easier. See [Building a Custom Distribution](building_distro) for more details. - - ## Kubernetes: If you have built a container image and want to deploy it in a Kubernetes cluster instead of starting the Llama Stack server locally. See [Kubernetes Deployment Guide](kubernetes_deployment) for more details. diff --git a/docs/source/getting_started/detailed_tutorial.md b/docs/source/getting_started/detailed_tutorial.md index c6589e758..af93d1ed2 100644 --- a/docs/source/getting_started/detailed_tutorial.md +++ b/docs/source/getting_started/detailed_tutorial.md @@ -62,7 +62,7 @@ We use `starter` as template. By default all providers are disabled, this requir llama stack build --template starter --image-type venv --run ``` ::: -:::{tab-item} Using `conda` +:::{tab-item} Using `venv` You can use Python to build and run the Llama Stack server, which is useful for testing and development. Llama Stack uses a [YAML configuration file](../distributions/configuration.md) to specify the stack setup, @@ -70,7 +70,7 @@ which defines the providers and their settings. Now let's build and run the Llama Stack config for Ollama. ```bash -llama stack build --template starter --image-type conda --run +llama stack build --template starter --image-type venv --run ``` ::: :::{tab-item} Using a Container @@ -150,10 +150,10 @@ pip install llama-stack-client ``` ::: -:::{tab-item} Install with `conda` +:::{tab-item} Install with `venv` ```bash -yes | conda create -n stack-client python=3.12 -conda activate stack-client +python -m venv stack-client +source stack-client/bin/activate # On Windows: stack-client\Scripts\activate pip install llama-stack-client ``` ::: diff --git a/docs/source/references/llama_cli_reference/download_models.md b/docs/source/references/llama_cli_reference/download_models.md index ca470f8c2..c44ba7788 100644 --- a/docs/source/references/llama_cli_reference/download_models.md +++ b/docs/source/references/llama_cli_reference/download_models.md @@ -19,11 +19,11 @@ You have two ways to install Llama Stack: cd ~/local git clone git@github.com:meta-llama/llama-stack.git - conda create -n myenv python=3.10 - conda activate myenv + python -m venv myenv + source myenv/bin/activate # On Windows: myenv\Scripts\activate cd llama-stack - $CONDA_PREFIX/bin/pip install -e . + pip install -e . ## Downloading models via CLI diff --git a/docs/source/references/llama_cli_reference/index.md b/docs/source/references/llama_cli_reference/index.md index 7b7abdf88..fc7751ebf 100644 --- a/docs/source/references/llama_cli_reference/index.md +++ b/docs/source/references/llama_cli_reference/index.md @@ -19,11 +19,11 @@ You have two ways to install Llama Stack: cd ~/local git clone git@github.com:meta-llama/llama-stack.git - conda create -n myenv python=3.10 - conda activate myenv + python -m venv myenv + source myenv/bin/activate # On Windows: myenv\Scripts\activate cd llama-stack - $CONDA_PREFIX/bin/pip install -e . + pip install -e . ## `llama` subcommands diff --git a/docs/zero_to_hero_guide/README.md b/docs/zero_to_hero_guide/README.md index cc3adc706..6473c1211 100644 --- a/docs/zero_to_hero_guide/README.md +++ b/docs/zero_to_hero_guide/README.md @@ -47,20 +47,20 @@ If you're looking for more specific topics, we have a [Zero to Hero Guide](#next ## Install Dependencies and Set Up Environment -1. **Create a Conda Environment**: - Create a new Conda environment with Python 3.12: +1. **Install uv**: + Install [uv](https://docs.astral.sh/uv/) for managing dependencies: ```bash - conda create -n ollama python=3.12 - ``` - Activate the environment: - ```bash - conda activate ollama + # macOS and Linux + curl -LsSf https://astral.sh/uv/install.sh | sh + + # Windows + powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" ``` 2. **Install ChromaDB**: - Install `chromadb` using `pip`: + Install `chromadb` using `uv`: ```bash - pip install chromadb + uv pip install chromadb ``` 3. **Run ChromaDB**: @@ -69,28 +69,21 @@ If you're looking for more specific topics, we have a [Zero to Hero Guide](#next chroma run --host localhost --port 8000 --path ./my_chroma_data ``` -4. **Install Llama Stack**: - Open a new terminal and install `llama-stack`: - ```bash - conda activate ollama - pip install -U llama-stack - ``` - --- ## Build, Configure, and Run Llama Stack 1. **Build the Llama Stack**: - Build the Llama Stack using the `ollama` template: + Build the Llama Stack using the `starter` template: ```bash - llama stack build --template starter --image-type conda + uv run --with llama-stack llama stack build --template starter --image-type venv ``` **Expected Output:** ```bash ... Build Successful! - You can find the newly-built template here: ~/.llama/distributions/ollama/ollama-run.yaml - You can run the new Llama Stack Distro via: llama stack run ~/.llama/distributions/ollama/ollama-run.yaml --image-type conda + You can find the newly-built template here: ~/.llama/distributions/starter/starter-run.yaml + You can run the new Llama Stack Distro via: uv run --with llama-stack llama stack run starter --image-type venv ``` 3. **Set the ENV variables by exporting them to the terminal**: @@ -102,12 +95,13 @@ If you're looking for more specific topics, we have a [Zero to Hero Guide](#next ``` 3. **Run the Llama Stack**: - Run the stack with command shared by the API from earlier: + Run the stack using uv: ```bash - llama stack run ollama - --port $LLAMA_STACK_PORT - --env INFERENCE_MODEL=$INFERENCE_MODEL - --env SAFETY_MODEL=$SAFETY_MODEL + uv run --with llama-stack llama stack run starter \ + --image-type venv \ + --port $LLAMA_STACK_PORT \ + --env INFERENCE_MODEL=$INFERENCE_MODEL \ + --env SAFETY_MODEL=$SAFETY_MODEL \ --env OLLAMA_URL=$OLLAMA_URL ``` Note: Every time you run a new model with `ollama run`, you will need to restart the llama stack. Otherwise it won't see the new model. @@ -120,7 +114,7 @@ After setting up the server, open a new terminal window and configure the llama- 1. Configure the CLI to point to the llama-stack server. ```bash - llama-stack-client configure --endpoint http://localhost:8321 + uv run --with llama-stack-client llama-stack-client configure --endpoint http://localhost:8321 ``` **Expected Output:** ```bash @@ -128,7 +122,7 @@ After setting up the server, open a new terminal window and configure the llama- ``` 2. Test the CLI by running inference: ```bash - llama-stack-client inference chat-completion --message "Write me a 2-sentence poem about the moon" + uv run --with llama-stack-client llama-stack-client inference chat-completion --message "Write me a 2-sentence poem about the moon" ``` **Expected Output:** ```bash @@ -170,7 +164,7 @@ curl http://localhost:$LLAMA_STACK_PORT/alpha/inference/chat-completion EOF ``` -You can check the available models with the command `llama-stack-client models list`. +You can check the available models with the command `uv run --with llama-stack-client llama-stack-client models list`. **Expected Output:** ```json @@ -191,18 +185,12 @@ You can check the available models with the command `llama-stack-client models l You can also interact with the Llama Stack server using a simple Python script. Below is an example: -### 1. Activate Conda Environment - -```bash -conda activate ollama -``` - -### 2. Create Python Script (`test_llama_stack.py`) +### 1. Create Python Script (`test_llama_stack.py`) ```bash touch test_llama_stack.py ``` -### 3. Create a Chat Completion Request in Python +### 2. Create a Chat Completion Request in Python In `test_llama_stack.py`, write the following code: @@ -233,10 +221,10 @@ response = client.inference.chat_completion( print(response.completion_message.content) ``` -### 4. Run the Python Script +### 3. Run the Python Script ```bash -python test_llama_stack.py +uv run --with llama-stack-client python test_llama_stack.py ``` **Expected Output:** diff --git a/llama_stack/cli/stack/_build.py b/llama_stack/cli/stack/_build.py index ab3662f01..0b0a45641 100644 --- a/llama_stack/cli/stack/_build.py +++ b/llama_stack/cli/stack/_build.py @@ -69,9 +69,6 @@ def run_stack_build_command(args: argparse.Namespace) -> None: if args.image_type == ImageType.VENV.value: current_venv = os.environ.get("VIRTUAL_ENV") image_name = args.image_name or current_venv - elif args.image_type == ImageType.CONDA.value: - current_conda_env = os.environ.get("CONDA_DEFAULT_ENV") - image_name = args.image_name or current_conda_env else: image_name = args.image_name @@ -132,7 +129,7 @@ def run_stack_build_command(args: argparse.Namespace) -> None: ) if not args.image_type: cprint( - f"Please specify a image-type (container | conda | venv) for {args.template}", + f"Please specify a image-type (container | venv) for {args.template}", color="red", file=sys.stderr, ) @@ -158,22 +155,7 @@ def run_stack_build_command(args: argparse.Namespace) -> None: ), ) - if image_type == ImageType.CONDA.value: - if not image_name: - cprint( - f"No current conda environment detected or specified, will create a new conda environment with the name `llamastack-{name}`", - color="yellow", - file=sys.stderr, - ) - image_name = f"llamastack-{name}" - else: - cprint( - f"Using conda environment {image_name}", - color="green", - file=sys.stderr, - ) - else: - image_name = f"llamastack-{name}" + image_name = f"llamastack-{name}" cprint( textwrap.dedent( @@ -372,10 +354,7 @@ def _run_stack_build_command_from_build_config( else: if not image_name: raise ValueError("Please specify an image name when building a container image without a template") - elif build_config.image_type == LlamaStackImageType.CONDA.value: - if not image_name: - raise ValueError("Please specify an image name when building a conda image") - elif build_config.image_type == LlamaStackImageType.VENV.value: + else: if not image_name and os.environ.get("UV_SYSTEM_PYTHON"): image_name = "__system__" if not image_name: @@ -431,7 +410,6 @@ def _run_stack_build_command_from_build_config( return_code = build_image( build_config, - build_file_path, image_name, template_or_config=template_name or config_path or str(build_file_path), run_config=run_config_file.as_posix() if run_config_file else None, diff --git a/llama_stack/cli/stack/build.py b/llama_stack/cli/stack/build.py index 279806bdf..951670940 100644 --- a/llama_stack/cli/stack/build.py +++ b/llama_stack/cli/stack/build.py @@ -56,7 +56,7 @@ class StackBuild(Subcommand): "--image-name", type=str, help=textwrap.dedent( - f"""[for image-type={"|".join(e.value for e in ImageType)}] Name of the conda or virtual environment to use for + f"""[for image-type={"|".join(e.value for e in ImageType)}] Name of the virtual environment to use for the build. If not specified, currently active environment will be used if found. """ ), diff --git a/llama_stack/cli/stack/run.py b/llama_stack/cli/stack/run.py index 9a366a8b2..56672f177 100644 --- a/llama_stack/cli/stack/run.py +++ b/llama_stack/cli/stack/run.py @@ -47,7 +47,8 @@ class StackRun(Subcommand): self.parser.add_argument( "--image-name", type=str, - help="Name of the image to run.", + default=None, + help="Name of the image to run. Defaults to the current environment", ) self.parser.add_argument( "--env", @@ -58,7 +59,7 @@ class StackRun(Subcommand): self.parser.add_argument( "--image-type", type=str, - help="Image Type used during the build. This can be either conda or container or venv.", + help="Image Type used during the build. This can be only venv.", choices=[e.value for e in ImageType if e.value != ImageType.CONTAINER.value], ) self.parser.add_argument( @@ -67,20 +68,38 @@ class StackRun(Subcommand): help="Start the UI server", ) - # If neither image type nor image name is provided, but at the same time - # the current environment has conda breadcrumbs, then assume what the user - # wants to use conda mode and not the usual default mode (using - # pre-installed system packages). - # - # Note: yes, this is hacky. It's implemented this way to keep the existing - # conda users unaffected by the switch of the default behavior to using - # system packages. - def _get_image_type_and_name(self, args: argparse.Namespace) -> tuple[str, str]: - conda_env = os.environ.get("CONDA_DEFAULT_ENV") - if conda_env and args.image_name == conda_env: - logger.warning(f"Conda detected. Using conda environment {conda_env} for the run.") - return ImageType.CONDA.value, args.image_name - return args.image_type, args.image_name + def _resolve_config_and_template(self, args: argparse.Namespace) -> tuple[Path | None, str | None]: + """Resolve config file path and template name from args.config""" + from llama_stack.distribution.utils.config_dirs import DISTRIBS_BASE_DIR + + if not args.config: + return None, None + + config_file = Path(args.config) + has_yaml_suffix = args.config.endswith(".yaml") + template_name = None + + if not config_file.exists() and not has_yaml_suffix: + # check if this is a template + config_file = Path(REPO_ROOT) / "llama_stack" / "templates" / args.config / "run.yaml" + if config_file.exists(): + template_name = args.config + + if not config_file.exists() and not has_yaml_suffix: + # check if it's a build config saved to ~/.llama dir + config_file = Path(DISTRIBS_BASE_DIR / f"llamastack-{args.config}" / f"{args.config}-run.yaml") + + if not config_file.exists(): + self.parser.error( + f"File {str(config_file)} does not exist.\n\nPlease run `llama stack build` to generate (and optionally edit) a run.yaml file" + ) + + if not config_file.is_file(): + self.parser.error( + f"Config file must be a valid file path, '{config_file}' is not a file: type={type(config_file)}" + ) + + return config_file, template_name def _run_stack_run_cmd(self, args: argparse.Namespace) -> None: import yaml @@ -90,7 +109,7 @@ class StackRun(Subcommand): if args.enable_ui: self._start_ui_development_server(args.port) - image_type, image_name = self._get_image_type_and_name(args) + image_type, image_name = args.image_type, args.image_name if args.config: try: @@ -103,8 +122,8 @@ class StackRun(Subcommand): config_file = None # Check if config is required based on image type - if (image_type in [ImageType.CONDA.value, ImageType.VENV.value]) and not config_file: - self.parser.error("Config file is required for venv and conda environments") + if image_type == ImageType.VENV.value and not config_file: + self.parser.error("Config file is required for venv environment") if config_file: logger.info(f"Using run configuration: {config_file}") diff --git a/llama_stack/cli/stack/utils.py b/llama_stack/cli/stack/utils.py index 74a606b2b..fdf9e1761 100644 --- a/llama_stack/cli/stack/utils.py +++ b/llama_stack/cli/stack/utils.py @@ -8,7 +8,6 @@ from enum import Enum class ImageType(Enum): - CONDA = "conda" CONTAINER = "container" VENV = "venv" diff --git a/llama_stack/core/build.py b/llama_stack/core/build.py index a6544435f..b9adb421c 100644 --- a/llama_stack/core/build.py +++ b/llama_stack/core/build.py @@ -7,7 +7,6 @@ import importlib.resources import logging import sys -from pathlib import Path from pydantic import BaseModel from termcolor import cprint @@ -106,7 +105,6 @@ def print_pip_install_help(config: BuildConfig): def build_image( build_config: BuildConfig, - build_file_path: Path, image_name: str, template_or_config: str, run_config: str | None = None, @@ -138,18 +136,7 @@ def build_image( # build arguments if run_config is not None: args.extend(["--run-config", run_config]) - elif build_config.image_type == LlamaStackImageType.CONDA.value: - script = str(importlib.resources.files("llama_stack") / "core/build_conda_env.sh") - args = [ - script, - "--env-name", - str(image_name), - "--build-file-path", - str(build_file_path), - "--normal-deps", - " ".join(normal_deps), - ] - elif build_config.image_type == LlamaStackImageType.VENV.value: + else: script = str(importlib.resources.files("llama_stack") / "core/build_venv.sh") args = [ script, diff --git a/llama_stack/core/build_venv.sh b/llama_stack/core/build_venv.sh index 93db9ab28..a2838803f 100755 --- a/llama_stack/core/build_venv.sh +++ b/llama_stack/core/build_venv.sh @@ -6,9 +6,6 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -# TODO: combine this with build_conda_env.sh since it is almost identical -# the only difference is that we don't do any conda-specific setup - LLAMA_STACK_DIR=${LLAMA_STACK_DIR:-} LLAMA_STACK_CLIENT_DIR=${LLAMA_STACK_CLIENT_DIR:-} TEST_PYPI_VERSION=${TEST_PYPI_VERSION:-} @@ -95,6 +92,8 @@ if [ -n "$LLAMA_STACK_CLIENT_DIR" ]; then echo "Using llama-stack-client-dir=$LLAMA_STACK_CLIENT_DIR" fi +ENVNAME="" + # pre-run checks to make sure we can proceed with the installation pre_run_checks() { local env_name="$1" diff --git a/llama_stack/core/common.sh b/llama_stack/core/common.sh index 5f764bcca..021baaddc 100755 --- a/llama_stack/core/common.sh +++ b/llama_stack/core/common.sh @@ -7,12 +7,10 @@ # the root directory of this source tree. cleanup() { - envname="$1" - - set +x - echo "Cleaning up..." - conda deactivate - conda env remove --name "$envname" -y + # For venv environments, no special cleanup is needed + # This function exists to avoid "function not found" errors + local env_name="$1" + echo "Cleanup called for environment: $env_name" } handle_int() { @@ -31,19 +29,7 @@ handle_exit() { fi } -setup_cleanup_handlers() { - trap handle_int INT - trap handle_exit EXIT - if is_command_available conda; then - __conda_setup="$('conda' 'shell.bash' 'hook' 2>/dev/null)" - eval "$__conda_setup" - conda deactivate - else - echo "conda is not available" - exit 1 - fi -} # check if a command is present is_command_available() { diff --git a/llama_stack/core/datatypes.py b/llama_stack/core/datatypes.py index c66d510cc..a1b6ad32b 100644 --- a/llama_stack/core/datatypes.py +++ b/llama_stack/core/datatypes.py @@ -432,8 +432,8 @@ class BuildConfig(BaseModel): distribution_spec: DistributionSpec = Field(description="The distribution spec to build including API providers. ") image_type: str = Field( - default="conda", - description="Type of package to build (conda | container | venv)", + default="venv", + description="Type of package to build (container | venv)", ) image_name: str | None = Field( default=None, diff --git a/llama_stack/core/start_stack.sh b/llama_stack/core/start_stack.sh index ff8275aeb..a3fc83265 100755 --- a/llama_stack/core/start_stack.sh +++ b/llama_stack/core/start_stack.sh @@ -40,7 +40,6 @@ port="$1" shift SCRIPT_DIR=$(dirname "$(readlink -f "$0")") -source "$SCRIPT_DIR/common.sh" # Initialize variables yaml_config="" @@ -75,9 +74,9 @@ while [[ $# -gt 0 ]]; do esac done -# Check if yaml_config is required based on env_type -if [[ "$env_type" == "venv" || "$env_type" == "conda" ]] && [ -z "$yaml_config" ]; then - echo -e "${RED}Error: --config is required for venv and conda environments${NC}" >&2 +# Check if yaml_config is required +if [[ "$env_type" == "venv" ]] && [ -z "$yaml_config" ]; then + echo -e "${RED}Error: --config is required for venv environment${NC}" >&2 exit 1 fi @@ -101,19 +100,14 @@ case "$env_type" in source "$env_path_or_name/bin/activate" fi ;; - "conda") - if ! is_command_available conda; then - echo -e "${RED}Error: conda not found" >&2 - exit 1 - fi - eval "$(conda shell.bash hook)" - conda deactivate && conda activate "$env_path_or_name" - PYTHON_BINARY="$CONDA_PREFIX/bin/python" - ;; *) + # Handle unsupported env_types here + echo -e "${RED}Error: Unsupported environment type '$env_type'. Only 'venv' is supported.${NC}" >&2 + exit 1 + ;; esac -if [[ "$env_type" == "venv" || "$env_type" == "conda" ]]; then +if [[ "$env_type" == "venv" ]]; then set -x if [ -n "$yaml_config" ]; then diff --git a/llama_stack/core/ui/README.md b/llama_stack/core/ui/README.md index 5f4a9e250..62ec9b960 100644 --- a/llama_stack/core/ui/README.md +++ b/llama_stack/core/ui/README.md @@ -9,7 +9,7 @@ 1. Start up Llama Stack API server. More details [here](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html). ``` -llama stack build --template together --image-type conda +llama stack build --template together --image-type venv llama stack run together ``` diff --git a/llama_stack/core/utils/exec.py b/llama_stack/core/utils/exec.py index 4272db3b8..1b2b782fe 100644 --- a/llama_stack/core/utils/exec.py +++ b/llama_stack/core/utils/exec.py @@ -15,69 +15,21 @@ from termcolor import cprint log = logging.getLogger(__name__) import importlib -import json -from pathlib import Path - -from llama_stack.core.utils.image_types import LlamaStackImageType -def formulate_run_args(image_type: str, image_name: str) -> list[str]: - env_name = "" +def formulate_run_args(image_type: str, image_name: str) -> list: + # Only venv is supported now + current_venv = os.environ.get("VIRTUAL_ENV") + env_name = image_name or current_venv + if not env_name: + cprint( + "No current virtual environment detected, please specify a virtual environment name with --image-name", + color="red", + file=sys.stderr, + ) + return [] - if image_type == LlamaStackImageType.CONDA.value: - current_conda_env = os.environ.get("CONDA_DEFAULT_ENV") - env_name = image_name or current_conda_env - if not env_name: - cprint( - "No current conda environment detected, please specify a conda environment name with --image-name", - color="red", - file=sys.stderr, - ) - return - - def get_conda_prefix(env_name): - # Conda "base" environment does not end with "base" in the - # prefix, so should be handled separately. - if env_name == "base": - return os.environ.get("CONDA_PREFIX") - # Get conda environments info - conda_env_info = json.loads(subprocess.check_output(["conda", "info", "--envs", "--json"]).decode()) - envs = conda_env_info["envs"] - for envpath in envs: - if os.path.basename(envpath) == env_name: - return envpath - return None - - cprint(f"Using conda environment: {env_name}", color="green", file=sys.stderr) - conda_prefix = get_conda_prefix(env_name) - if not conda_prefix: - cprint( - f"Conda environment {env_name} does not exist.", - color="red", - file=sys.stderr, - ) - return - - build_file = Path(conda_prefix) / "llamastack-build.yaml" - if not build_file.exists(): - cprint( - f"Build file {build_file} does not exist.\n\nPlease run `llama stack build` or specify the correct conda environment name with --image-name", - color="red", - file=sys.stderr, - ) - return - else: - # else must be venv since that is the only valid option left. - current_venv = os.environ.get("VIRTUAL_ENV") - env_name = image_name or current_venv - if not env_name: - cprint( - "No current virtual environment detected, please specify a virtual environment name with --image-name", - color="red", - file=sys.stderr, - ) - return - cprint(f"Using virtual environment: {env_name}", file=sys.stderr) + cprint(f"Using virtual environment: {env_name}", file=sys.stderr) script = importlib.resources.files("llama_stack") / "core/start_stack.sh" run_args = [ @@ -93,7 +45,8 @@ def in_notebook(): try: from IPython import get_ipython - if "IPKernelApp" not in get_ipython().config: # pragma: no cover + ipython = get_ipython() + if ipython is None or "IPKernelApp" not in ipython.config: # pragma: no cover return False except ImportError: return False diff --git a/llama_stack/core/utils/image_types.py b/llama_stack/core/utils/image_types.py index 403c91ca6..9e140dc5c 100644 --- a/llama_stack/core/utils/image_types.py +++ b/llama_stack/core/utils/image_types.py @@ -9,5 +9,4 @@ import enum class LlamaStackImageType(enum.Enum): CONTAINER = "container" - CONDA = "conda" VENV = "venv" diff --git a/llama_stack/providers/remote/datasetio/nvidia/README.md b/llama_stack/providers/remote/datasetio/nvidia/README.md index 40f2922f2..f5478e731 100644 --- a/llama_stack/providers/remote/datasetio/nvidia/README.md +++ b/llama_stack/providers/remote/datasetio/nvidia/README.md @@ -20,7 +20,7 @@ This provider enables dataset management using NVIDIA's NeMo Customizer service. Build the NVIDIA environment: ```bash -llama stack build --template nvidia --image-type conda +llama stack build --template nvidia --image-type venv ``` ### Basic Usage using the LlamaStack Python Client diff --git a/llama_stack/providers/remote/inference/nvidia/NVIDIA.md b/llama_stack/providers/remote/inference/nvidia/NVIDIA.md index 0d1da0365..a401c0f00 100644 --- a/llama_stack/providers/remote/inference/nvidia/NVIDIA.md +++ b/llama_stack/providers/remote/inference/nvidia/NVIDIA.md @@ -18,7 +18,7 @@ This provider enables running inference using NVIDIA NIM. Build the NVIDIA environment: ```bash -llama stack build --template nvidia --image-type conda +llama stack build --template nvidia --image-type venv ``` ### Basic Usage using the LlamaStack Python Client diff --git a/llama_stack/providers/remote/post_training/nvidia/README.md b/llama_stack/providers/remote/post_training/nvidia/README.md index 1cce78c89..ecc17b4c6 100644 --- a/llama_stack/providers/remote/post_training/nvidia/README.md +++ b/llama_stack/providers/remote/post_training/nvidia/README.md @@ -22,7 +22,7 @@ This provider enables fine-tuning of LLMs using NVIDIA's NeMo Customizer service Build the NVIDIA environment: ```bash -llama stack build --template nvidia --image-type conda +llama stack build --template nvidia --image-type venv ``` ### Basic Usage using the LlamaStack Python Client diff --git a/llama_stack/providers/remote/safety/nvidia/README.md b/llama_stack/providers/remote/safety/nvidia/README.md index 218963e47..a1186db3f 100644 --- a/llama_stack/providers/remote/safety/nvidia/README.md +++ b/llama_stack/providers/remote/safety/nvidia/README.md @@ -19,7 +19,7 @@ This provider enables safety checks and guardrails for LLM interactions using NV Build the NVIDIA environment: ```bash -llama stack build --template nvidia --image-type conda +llama stack build --template nvidia --image-type venv ``` ### Basic Usage using the LlamaStack Python Client diff --git a/llama_stack/templates/ci-tests/build.yaml b/llama_stack/templates/ci-tests/build.yaml index b5df01923..2f9ae8682 100644 --- a/llama_stack/templates/ci-tests/build.yaml +++ b/llama_stack/templates/ci-tests/build.yaml @@ -47,8 +47,7 @@ distribution_spec: - provider_type: remote::tavily-search - provider_type: inline::rag-runtime - provider_type: remote::model-context-protocol -image_type: conda -image_name: ci-tests +image_type: venv additional_pip_packages: - aiosqlite - asyncpg diff --git a/llama_stack/templates/dell/build.yaml b/llama_stack/templates/dell/build.yaml index 4a4ecb37c..acd5d827c 100644 --- a/llama_stack/templates/dell/build.yaml +++ b/llama_stack/templates/dell/build.yaml @@ -29,8 +29,7 @@ distribution_spec: - provider_type: remote::brave-search - provider_type: remote::tavily-search - provider_type: inline::rag-runtime -image_type: conda -image_name: dell +image_type: venv additional_pip_packages: - aiosqlite - sqlalchemy[asyncio] diff --git a/llama_stack/templates/meta-reference-gpu/build.yaml b/llama_stack/templates/meta-reference-gpu/build.yaml index e929f1683..47e782c85 100644 --- a/llama_stack/templates/meta-reference-gpu/build.yaml +++ b/llama_stack/templates/meta-reference-gpu/build.yaml @@ -28,8 +28,7 @@ distribution_spec: - provider_type: remote::tavily-search - provider_type: inline::rag-runtime - provider_type: remote::model-context-protocol -image_type: conda -image_name: meta-reference-gpu +image_type: venv additional_pip_packages: - aiosqlite - sqlalchemy[asyncio] diff --git a/llama_stack/templates/meta-reference-gpu/doc_template.md b/llama_stack/templates/meta-reference-gpu/doc_template.md index 2ca6793d7..a9be5a5b0 100644 --- a/llama_stack/templates/meta-reference-gpu/doc_template.md +++ b/llama_stack/templates/meta-reference-gpu/doc_template.md @@ -58,7 +58,7 @@ $ llama model list --downloaded ## Running the Distribution -You can do this via Conda (build code) or Docker which has a pre-built image. +You can do this via venv or Docker which has a pre-built image. ### Via Docker @@ -92,12 +92,12 @@ docker run \ --env SAFETY_MODEL=meta-llama/Llama-Guard-3-1B ``` -### Via Conda +### Via venv Make sure you have done `uv pip install llama-stack` and have the Llama Stack CLI available. ```bash -llama stack build --template {{ name }} --image-type conda +llama stack build --template {{ name }} --image-type venv llama stack run distributions/{{ name }}/run.yaml \ --port 8321 \ --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct diff --git a/llama_stack/templates/nvidia/build.yaml b/llama_stack/templates/nvidia/build.yaml index 7d9a6140f..f3e73a2c1 100644 --- a/llama_stack/templates/nvidia/build.yaml +++ b/llama_stack/templates/nvidia/build.yaml @@ -23,8 +23,7 @@ distribution_spec: - provider_type: inline::basic tool_runtime: - provider_type: inline::rag-runtime -image_type: conda -image_name: nvidia +image_type: venv additional_pip_packages: - aiosqlite - sqlalchemy[asyncio] diff --git a/llama_stack/templates/nvidia/doc_template.md b/llama_stack/templates/nvidia/doc_template.md index 5a180d49f..0dca18225 100644 --- a/llama_stack/templates/nvidia/doc_template.md +++ b/llama_stack/templates/nvidia/doc_template.md @@ -105,7 +105,7 @@ curl -X DELETE "$NEMO_URL/v1/deployment/model-deployments/meta/llama-3.1-8b-inst ## Running Llama Stack with NVIDIA -You can do this via Conda or venv (build code), or Docker which has a pre-built image. +You can do this via venv (build code), or Docker which has a pre-built image. ### Via Docker @@ -124,17 +124,6 @@ docker run \ --env NVIDIA_API_KEY=$NVIDIA_API_KEY ``` -### Via Conda - -```bash -INFERENCE_MODEL=meta-llama/Llama-3.1-8b-Instruct -llama stack build --template nvidia --image-type conda -llama stack run ./run.yaml \ - --port 8321 \ - --env NVIDIA_API_KEY=$NVIDIA_API_KEY \ - --env INFERENCE_MODEL=$INFERENCE_MODEL -``` - ### Via venv If you've set up your local development environment, you can also build the image using your local virtual environment. diff --git a/llama_stack/templates/open-benchmark/build.yaml b/llama_stack/templates/open-benchmark/build.yaml index 1c7966cdd..6ff4155dc 100644 --- a/llama_stack/templates/open-benchmark/build.yaml +++ b/llama_stack/templates/open-benchmark/build.yaml @@ -32,8 +32,7 @@ distribution_spec: - provider_type: remote::tavily-search - provider_type: inline::rag-runtime - provider_type: remote::model-context-protocol -image_type: conda -image_name: open-benchmark +image_type: venv additional_pip_packages: - aiosqlite - sqlalchemy[asyncio] diff --git a/llama_stack/templates/postgres-demo/build.yaml b/llama_stack/templates/postgres-demo/build.yaml index 5a1c9129a..e5a5d3b83 100644 --- a/llama_stack/templates/postgres-demo/build.yaml +++ b/llama_stack/templates/postgres-demo/build.yaml @@ -18,8 +18,7 @@ distribution_spec: - provider_type: remote::tavily-search - provider_type: inline::rag-runtime - provider_type: remote::model-context-protocol -image_type: conda -image_name: postgres-demo +image_type: venv additional_pip_packages: - asyncpg - psycopg2-binary diff --git a/llama_stack/templates/starter/build.yaml b/llama_stack/templates/starter/build.yaml index 1c67c433e..f95a03a9e 100644 --- a/llama_stack/templates/starter/build.yaml +++ b/llama_stack/templates/starter/build.yaml @@ -47,8 +47,7 @@ distribution_spec: - provider_type: remote::tavily-search - provider_type: inline::rag-runtime - provider_type: remote::model-context-protocol -image_type: conda -image_name: starter +image_type: venv additional_pip_packages: - aiosqlite - asyncpg diff --git a/llama_stack/templates/template.py b/llama_stack/templates/template.py index 4e5e6051b..d564312dc 100644 --- a/llama_stack/templates/template.py +++ b/llama_stack/templates/template.py @@ -29,6 +29,7 @@ from llama_stack.core.datatypes import ( ) from llama_stack.core.distribution import get_provider_registry from llama_stack.core.utils.dynamic import instantiate_class_type +from llama_stack.core.utils.image_types import LlamaStackImageType from llama_stack.providers.utils.inference.model_registry import ProviderModelEntry from llama_stack.providers.utils.kvstore.config import SqliteKVStoreConfig from llama_stack.providers.utils.kvstore.config import get_pip_packages as get_kv_pip_packages @@ -314,8 +315,7 @@ class DistributionTemplate(BaseModel): container_image=self.container_image, providers=build_providers, ), - image_type="conda", - image_name=self.name, + image_type=LlamaStackImageType.VENV.value, # default to venv additional_pip_packages=sorted(set(additional_pip_packages)), ) diff --git a/llama_stack/templates/watsonx/build.yaml b/llama_stack/templates/watsonx/build.yaml index bc992f0c7..bf4be7eaf 100644 --- a/llama_stack/templates/watsonx/build.yaml +++ b/llama_stack/templates/watsonx/build.yaml @@ -35,16 +35,11 @@ distribution_spec: - provider_id: braintrust provider_type: inline::braintrust tool_runtime: - - provider_id: brave-search - provider_type: remote::brave-search - - provider_id: tavily-search - provider_type: remote::tavily-search - - provider_id: rag-runtime - provider_type: inline::rag-runtime - - provider_id: model-context-protocol - provider_type: remote::model-context-protocol -image_type: conda -image_name: watsonx + - provider_type: remote::brave-search + - provider_type: remote::tavily-search + - provider_type: inline::rag-runtime + - provider_type: remote::model-context-protocol +image_type: venv additional_pip_packages: - sqlalchemy[asyncio] - aiosqlite diff --git a/tests/unit/distribution/test_build_path.py b/tests/unit/distribution/test_build_path.py index f71dd77ec..0d245e818 100644 --- a/tests/unit/distribution/test_build_path.py +++ b/tests/unit/distribution/test_build_path.py @@ -16,7 +16,7 @@ from llama_stack.core.utils.image_types import LlamaStackImageType def test_container_build_passes_path(monkeypatch, tmp_path): called_with = {} - def spy_build_image(cfg, build_file_path, image_name, template_or_config, run_config=None): + def spy_build_image(build_config, image_name, template_or_config, run_config=None): called_with["path"] = template_or_config called_with["run_config"] = run_config return 0