From e6fdb9df29de6b1723404de355801e8ec455b8a1 Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 08:24:36 -0700 Subject: [PATCH 01/17] fix context retriever (#75) --- .../impls/meta_reference/agents/rag/context_retriever.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/llama_stack/providers/impls/meta_reference/agents/rag/context_retriever.py b/llama_stack/providers/impls/meta_reference/agents/rag/context_retriever.py index 5ebb94a31..57e5d0dee 100644 --- a/llama_stack/providers/impls/meta_reference/agents/rag/context_retriever.py +++ b/llama_stack/providers/impls/meta_reference/agents/rag/context_retriever.py @@ -63,11 +63,9 @@ async def llm_rag_query_generator( model = config.model message = UserMessage(content=content) response = inference_api.chat_completion( - ChatCompletionRequest( - model=model, - messages=[message], - stream=False, - ) + model=model, + messages=[message], + stream=False, ) async for chunk in response: From 6b21523c286fd0b3e3047fc50cffd74787df6c75 Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 11:41:56 -0700 Subject: [PATCH 02/17] CLI - add back build wizard, configure with name instead of build.yaml (#74) * add back wizard for build * conda build path move * polish message * run with name only * prompt for build * improve comments * update msgs * add new lines * move build.yaml * address comments * validator for providers * move imports * Please enter -> enter * comments, get started guide * nits * fix cprint import * fix imports --- docs/getting_started.md | 52 +++++++++++++------- llama_stack/cli/stack/build.py | 77 +++++++++++++++++++++++++++--- llama_stack/cli/stack/configure.py | 17 +++++-- llama_stack/cli/stack/run.py | 18 +++++-- 4 files changed, 134 insertions(+), 30 deletions(-) diff --git a/docs/getting_started.md b/docs/getting_started.md index cf761cce0..0ab3461dd 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -8,43 +8,61 @@ This guides allows you to quickly get started with building and running a Llama - Quick 3 line command to build and start a LlamaStack server using our Meta Reference implementation for all API endpoints with `conda` as build type. **`llama stack build`** +- You'll be prompted to enter build information interactively. ``` -llama stack build ./llama_stack/distribution/example_configs/conda/local-conda-example-build.yaml --name my-local-llama-stack -... -... -Build spec configuration saved at ~/.llama/distributions/conda/my-local-llama-stack-build.yaml +llama stack build + +> Enter an unique name for identifying your Llama Stack build distribution (e.g. my-local-stack): my-local-llama-stack +> Enter the image type you want your distribution to be built with (docker or conda): conda + + Llama Stack is composed of several APIs working together. Let's configure the providers (implementations) you want to use for these APIs. +> Enter the API provider for the inference API: (default=meta-reference): meta-reference +> Enter the API provider for the safety API: (default=meta-reference): meta-reference +> Enter the API provider for the agents API: (default=meta-reference): meta-reference +> Enter the API provider for the memory API: (default=meta-reference): meta-reference +> Enter the API provider for the telemetry API: (default=meta-reference): meta-reference + + > (Optional) Enter a short description for your Llama Stack distribution: + +Build spec configuration saved at ~/.conda/envs/llamastack-my-local-llama-stack/my-local-llama-stack-build.yaml ``` **`llama stack configure`** ``` -llama stack configure ~/.llama/distributions/conda/my-local-llama-stack-build.yaml +llama stack configure my-local-llama-stack -Configuring API: inference (meta-reference) +Configuring APIs to serve... +Enter comma-separated list of APIs to serve: + +Configuring API `inference`... + +Configuring provider `meta-reference`... Enter value for model (default: Meta-Llama3.1-8B-Instruct) (required): -Enter value for quantization (optional): +Do you want to configure quantization? (y/n): n Enter value for torch_seed (optional): Enter value for max_seq_len (required): 4096 Enter value for max_batch_size (default: 1) (required): +Configuring API `safety`... -Configuring API: memory (meta-reference-faiss) - -Configuring API: safety (meta-reference) +Configuring provider `meta-reference`... Do you want to configure llama_guard_shield? (y/n): n Do you want to configure prompt_guard_shield? (y/n): n +Configuring API `agents`... -Configuring API: agentic_system (meta-reference) -Enter value for brave_search_api_key (optional): -Enter value for bing_search_api_key (optional): -Enter value for wolfram_api_key (optional): +Configuring provider `meta-reference`... +Configuring API `memory`... -Configuring API: telemetry (console) +Configuring provider `meta-reference`... +Configuring API `telemetry`... -YAML configuration has been written to ~/.llama/builds/conda/my-local-llama-stack-run.yaml +Configuring provider `meta-reference`... +> YAML configuration has been written to /home/xiyan/.llama/builds/conda/my-local-llama-stack-run.yaml. +You can now run `llama stack run my-local-llama-stack --port PORT` or `llama stack run /home/xiyan/.llama/builds/conda/my-local-llama-stack-run.yaml --port PORT ``` **`llama stack run`** ``` -llama stack run ~/.llama/builds/conda/my-local-llama-stack-run.yaml +llama stack run my-local-llama-stack ... > initializing model parallel with size 1 diff --git a/llama_stack/cli/stack/build.py b/llama_stack/cli/stack/build.py index f6f79b621..e49da58f0 100644 --- a/llama_stack/cli/stack/build.py +++ b/llama_stack/cli/stack/build.py @@ -29,7 +29,9 @@ class StackBuild(Subcommand): self.parser.add_argument( "config", type=str, - help="Path to a config file to use for the build. You may find example configs in llama_stack/distribution/example_configs", + default=None, + nargs="*", + help="Path to a config file to use for the build. You can find example configs in llama_stack/distribution/example_configs. If this argument is not provided, you will be prompted to enter information interactively", ) self.parser.add_argument( @@ -44,9 +46,10 @@ class StackBuild(Subcommand): import json import os + from llama_stack.distribution.build import ApiInput, build_image, ImageType + from llama_stack.distribution.utils.config_dirs import DISTRIBS_BASE_DIR from llama_stack.distribution.utils.serialize import EnumEncoder - from llama_stack.distribution.build import ApiInput, build_image, ImageType from termcolor import cprint # save build.yaml spec for building same distribution again @@ -57,7 +60,10 @@ class StackBuild(Subcommand): llama_stack_path / "configs/distributions" / build_config.image_type ) else: - build_dir = DISTRIBS_BASE_DIR / build_config.image_type + build_dir = ( + Path(os.getenv("CONDA_PREFIX")).parent + / f"llamastack-{build_config.name}" + ) os.makedirs(build_dir, exist_ok=True) build_file_path = build_dir / f"{build_config.name}-build.yaml" @@ -70,17 +76,76 @@ class StackBuild(Subcommand): cprint( f"Build spec configuration saved at {str(build_file_path)}", + color="blue", + ) + cprint( + f"You may now run `llama stack configure {build_config.name}` or `llama stack configure {str(build_file_path)}`", color="green", ) def _run_stack_build_command(self, args: argparse.Namespace) -> None: - from llama_stack.distribution.utils.prompt_for_config import prompt_for_config + from llama_stack.distribution.distribution import Api, api_providers from llama_stack.distribution.utils.dynamic import instantiate_class_type + from prompt_toolkit import prompt + from prompt_toolkit.validation import Validator + from termcolor import cprint if not args.config: - self.parser.error( - "No config file specified. Please use `llama stack build /path/to/*-build.yaml`. Example config files can be found in llama_stack/distribution/example_configs" + name = prompt( + "> Enter a unique name for identifying your Llama Stack build (e.g. my-local-stack): " ) + image_type = prompt( + "> Enter the image type you want your Llama Stack to be built as (docker or conda): ", + validator=Validator.from_callable( + lambda x: x in ["docker", "conda"], + error_message="Invalid image type, please enter conda or docker", + ), + default="conda", + ) + + cprint( + f"\n Llama Stack is composed of several APIs working together. Let's configure the providers (implementations) you want to use for these APIs.", + color="green", + ) + + providers = dict() + for api in Api: + all_providers = api_providers() + providers_for_api = all_providers[api] + + api_provider = prompt( + "> Enter the API provider for the {} API: (default=meta-reference): ".format( + api.value + ), + validator=Validator.from_callable( + lambda x: x in providers_for_api, + error_message="Invalid provider, please enter one of the following: {}".format( + providers_for_api.keys() + ), + ), + default=( + "meta-reference" + if "meta-reference" in providers_for_api + else list(providers_for_api.keys())[0] + ), + ) + + providers[api.value] = api_provider + + description = prompt( + "\n > (Optional) Enter a short description for your Llama Stack: ", + default="", + ) + + distribution_spec = DistributionSpec( + providers=providers, + description=description, + ) + + build_config = BuildConfig( + name=name, image_type=image_type, distribution_spec=distribution_spec + ) + self._run_stack_build_command_from_build_config(build_config) return with open(args.config, "r") as f: diff --git a/llama_stack/cli/stack/configure.py b/llama_stack/cli/stack/configure.py index c184a1db5..6b3b53f3e 100644 --- a/llama_stack/cli/stack/configure.py +++ b/llama_stack/cli/stack/configure.py @@ -9,7 +9,6 @@ import json from pathlib import Path import yaml -from termcolor import cprint from llama_stack.cli.subcommand import Subcommand from llama_stack.distribution.utils.config_dirs import BUILDS_BASE_DIR @@ -50,9 +49,12 @@ class StackConfigure(Subcommand): import pkg_resources from llama_stack.distribution.build import ImageType + from termcolor import cprint docker_image = None - build_config_file = Path(args.config) + conda_dir = Path(os.getenv("CONDA_PREFIX")).parent / f"llamastack-{args.config}" + build_config_file = Path(conda_dir) / f"{args.config}-build.yaml" + if not build_config_file.exists(): cprint( f"Could not find {build_config_file}. Trying docker image name instead...", @@ -79,8 +81,9 @@ class StackConfigure(Subcommand): ) build_name = docker_image.removeprefix("llamastack-") + saved_file = str(builds_dir / f"{build_name}-run.yaml") cprint( - f"YAML configuration has been written to {builds_dir / f'{build_name}-run.yaml'}", + f"YAML configuration has been written to {saved_file}. You can now run `llama stack run {saved_file}`", color="green", ) return @@ -97,6 +100,7 @@ class StackConfigure(Subcommand): ): from llama_stack.distribution.configure import configure_api_providers from llama_stack.distribution.utils.serialize import EnumEncoder + from termcolor import cprint builds_dir = BUILDS_BASE_DIR / build_config.image_type if output_dir: @@ -132,6 +136,11 @@ class StackConfigure(Subcommand): f.write(yaml.dump(to_write, sort_keys=False)) cprint( - f"> YAML configuration has been written to {run_config_file}", + f"> YAML configuration has been written to {run_config_file}.", color="blue", ) + + cprint( + f"You can now run `llama stack run {image_name} --port PORT` or `llama stack run {run_config_file} --port PORT`", + color="green", + ) diff --git a/llama_stack/cli/stack/run.py b/llama_stack/cli/stack/run.py index 29fec608e..95d91aa05 100644 --- a/llama_stack/cli/stack/run.py +++ b/llama_stack/cli/stack/run.py @@ -47,6 +47,8 @@ class StackRun(Subcommand): def _run_stack_run_cmd(self, args: argparse.Namespace) -> None: import pkg_resources + from llama_stack.distribution.build import ImageType + from llama_stack.distribution.utils.config_dirs import BUILDS_BASE_DIR from llama_stack.distribution.utils.exec import run_with_pty @@ -54,12 +56,22 @@ class StackRun(Subcommand): self.parser.error("Must specify a config file to run") return - path = args.config - config_file = Path(path) + config_file = Path(args.config) + if not config_file.exists() and not args.config.endswith(".yaml"): + # check if it's a build config saved to conda dir + config_file = Path( + BUILDS_BASE_DIR / ImageType.conda.value / f"{args.config}-run.yaml" + ) + + if not config_file.exists() and not args.config.endswith(".yaml"): + # check if it's a build config saved to docker dir + config_file = Path( + BUILDS_BASE_DIR / ImageType.docker.value / f"{args.config}-run.yaml" + ) if not config_file.exists(): self.parser.error( - f"File {str(config_file)} does not exist. Did you run `llama stack build`?" + f"File {str(config_file)} does not exist. Please run `llama stack build` and `llama stack configure ` to generate a run.yaml file" ) return From 1128f69674d81b503f54a0993e5f87cee02c9e2d Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 14:25:53 -0700 Subject: [PATCH 03/17] CLI: add build templates support, move imports (#77) * list templates implementation * relative path * finalize templates * remove imports * remove templates from name, name templates * fix docker * fix docker --- llama_stack/cli/stack/build.py | 118 ++++++++++++++++-- llama_stack/cli/stack/configure.py | 22 ++-- llama_stack/cli/stack/run.py | 7 +- .../docker/local-docker-example-build.yaml | 10 -- .../local-build.yaml} | 2 +- .../local-fireworks-build.yaml} | 2 +- .../local-ollama-build.yaml} | 2 +- .../local-tgi-build.yaml} | 2 +- .../local-together-build.yaml} | 2 +- 9 files changed, 130 insertions(+), 37 deletions(-) delete mode 100644 llama_stack/distribution/example_configs/docker/local-docker-example-build.yaml rename llama_stack/distribution/{example_configs/conda/local-conda-example-build.yaml => templates/local-build.yaml} (91%) rename llama_stack/distribution/{example_configs/conda/local-fireworks-conda-example-build.yaml => templates/local-fireworks-build.yaml} (87%) rename llama_stack/distribution/{example_configs/conda/local-ollama-conda-example-build.yaml => templates/local-ollama-build.yaml} (88%) rename llama_stack/distribution/{example_configs/conda/local-tgi-conda-example-build.yaml => templates/local-tgi-build.yaml} (92%) rename llama_stack/distribution/{example_configs/conda/local-together-conda-example-build.yaml => templates/local-together-build.yaml} (89%) diff --git a/llama_stack/cli/stack/build.py b/llama_stack/cli/stack/build.py index e49da58f0..f35c6ceab 100644 --- a/llama_stack/cli/stack/build.py +++ b/llama_stack/cli/stack/build.py @@ -8,9 +8,26 @@ import argparse from llama_stack.cli.subcommand import Subcommand from llama_stack.distribution.datatypes import * # noqa: F403 +import os +from functools import lru_cache from pathlib import Path -import yaml +TEMPLATES_PATH = ( + Path(os.path.relpath(__file__)).parent.parent.parent / "distribution" / "templates" +) + + +@lru_cache() +def available_templates_specs() -> List[BuildConfig]: + import yaml + + template_specs = [] + for p in TEMPLATES_PATH.rglob("*.yaml"): + with open(p, "r") as f: + build_config = BuildConfig(**yaml.safe_load(f)) + template_specs.append(build_config) + + return template_specs class StackBuild(Subcommand): @@ -27,17 +44,38 @@ class StackBuild(Subcommand): def _add_arguments(self): self.parser.add_argument( - "config", + "--config", type=str, default=None, - nargs="*", help="Path to a config file to use for the build. You can find example configs in llama_stack/distribution/example_configs. If this argument is not provided, you will be prompted to enter information interactively", ) + self.parser.add_argument( + "--template", + type=str, + default=None, + help="Name of the example template config to use for build. You may use `llama stack build --list-templates` to check out the available templates", + ) + + self.parser.add_argument( + "--list-templates", + type=bool, + default=False, + action=argparse.BooleanOptionalAction, + help="Show the available templates for building a Llama Stack distribution", + ) + self.parser.add_argument( "--name", type=str, - help="Name of the llama stack build to override from template config", + help="Name of the Llama Stack build to override from template config. This name will be used as paths to store configuration files, build conda environments/docker images. If not specified, will use the name from the template config. ", + ) + + self.parser.add_argument( + "--image-type", + type=str, + help="Image Type to use for the build. This can be either conda or docker. If not specified, will use conda by default", + default="conda", ) def _run_stack_build_command_from_build_config( @@ -46,6 +84,8 @@ class StackBuild(Subcommand): import json import os + import yaml + from llama_stack.distribution.build import ApiInput, build_image, ImageType from llama_stack.distribution.utils.config_dirs import DISTRIBS_BASE_DIR @@ -78,22 +118,80 @@ class StackBuild(Subcommand): f"Build spec configuration saved at {str(build_file_path)}", color="blue", ) + + configure_name = ( + build_config.name + if build_config.image_type == "conda" + else (f"llamastack-{build_config.name}") + ) cprint( - f"You may now run `llama stack configure {build_config.name}` or `llama stack configure {str(build_file_path)}`", + f"You may now run `llama stack configure {configure_name}` or `llama stack configure {str(build_file_path)}`", color="green", ) + def _run_template_list_cmd(self, args: argparse.Namespace) -> None: + import json + + import yaml + + from llama_stack.cli.table import print_table + + # eventually, this should query a registry at llama.meta.com/llamastack/distributions + headers = [ + "Template Name", + "Providers", + "Description", + ] + + rows = [] + for spec in available_templates_specs(): + rows.append( + [ + spec.name, + json.dumps(spec.distribution_spec.providers, indent=2), + spec.distribution_spec.description, + ] + ) + print_table( + rows, + headers, + separate_rows=True, + ) + def _run_stack_build_command(self, args: argparse.Namespace) -> None: + import yaml from llama_stack.distribution.distribution import Api, api_providers from llama_stack.distribution.utils.dynamic import instantiate_class_type from prompt_toolkit import prompt from prompt_toolkit.validation import Validator from termcolor import cprint - if not args.config: - name = prompt( - "> Enter a unique name for identifying your Llama Stack build (e.g. my-local-stack): " - ) + if args.list_templates: + self._run_template_list_cmd(args) + return + + if args.template: + if not args.name: + self.parser.error( + "You must specify a name for the build using --name when using a template" + ) + return + build_path = TEMPLATES_PATH / f"{args.template}-build.yaml" + if not build_path.exists(): + self.parser.error( + f"Could not find template {args.template}. Please run `llama stack build --list-templates` to check out the available templates" + ) + return + with open(build_path, "r") as f: + build_config = BuildConfig(**yaml.safe_load(f)) + build_config.name = args.name + build_config.image_type = args.image_type + self._run_stack_build_command_from_build_config(build_config) + + return + + if not args.config and not args.template: + name = prompt("> Enter a name for your Llama Stack (e.g. my-local-stack): ") image_type = prompt( "> Enter the image type you want your Llama Stack to be built as (docker or conda): ", validator=Validator.from_callable( @@ -154,6 +252,4 @@ class StackBuild(Subcommand): except Exception as e: self.parser.error(f"Could not parse config file {args.config}: {e}") return - if args.name: - build_config.name = args.name self._run_stack_build_command_from_build_config(build_config) diff --git a/llama_stack/cli/stack/configure.py b/llama_stack/cli/stack/configure.py index 6b3b53f3e..b0aa1c3ab 100644 --- a/llama_stack/cli/stack/configure.py +++ b/llama_stack/cli/stack/configure.py @@ -5,17 +5,10 @@ # the root directory of this source tree. import argparse -import json -from pathlib import Path - -import yaml from llama_stack.cli.subcommand import Subcommand from llama_stack.distribution.utils.config_dirs import BUILDS_BASE_DIR - -from llama_stack.distribution.utils.exec import run_with_pty from llama_stack.distribution.datatypes import * # noqa: F403 -import os class StackConfigure(Subcommand): @@ -46,9 +39,17 @@ class StackConfigure(Subcommand): ) def _run_stack_configure_cmd(self, args: argparse.Namespace) -> None: + import json + import os + from pathlib import Path + import pkg_resources + import yaml + from llama_stack.distribution.build import ImageType + + from llama_stack.distribution.utils.exec import run_with_pty from termcolor import cprint docker_image = None @@ -98,7 +99,14 @@ class StackConfigure(Subcommand): build_config: BuildConfig, output_dir: Optional[str] = None, ): + import json + import os + from pathlib import Path + + import yaml from llama_stack.distribution.configure import configure_api_providers + + from llama_stack.distribution.utils.exec import run_with_pty from llama_stack.distribution.utils.serialize import EnumEncoder from termcolor import cprint diff --git a/llama_stack/cli/stack/run.py b/llama_stack/cli/stack/run.py index 95d91aa05..4e2009ee2 100644 --- a/llama_stack/cli/stack/run.py +++ b/llama_stack/cli/stack/run.py @@ -6,10 +6,6 @@ import argparse -from pathlib import Path - -import yaml - from llama_stack.cli.subcommand import Subcommand from llama_stack.distribution.datatypes import * # noqa: F403 @@ -46,7 +42,10 @@ class StackRun(Subcommand): ) def _run_stack_run_cmd(self, args: argparse.Namespace) -> None: + from pathlib import Path + import pkg_resources + import yaml from llama_stack.distribution.build import ImageType from llama_stack.distribution.utils.config_dirs import BUILDS_BASE_DIR diff --git a/llama_stack/distribution/example_configs/docker/local-docker-example-build.yaml b/llama_stack/distribution/example_configs/docker/local-docker-example-build.yaml deleted file mode 100644 index 885b6e58c..000000000 --- a/llama_stack/distribution/example_configs/docker/local-docker-example-build.yaml +++ /dev/null @@ -1,10 +0,0 @@ -name: local-docker-example -distribution_spec: - description: Use code from `llama_stack` itself to serve all llama stack APIs - providers: - inference: meta-reference - memory: meta-reference - safety: meta-reference - agents: meta-reference - telemetry: meta-reference -image_type: docker diff --git a/llama_stack/distribution/example_configs/conda/local-conda-example-build.yaml b/llama_stack/distribution/templates/local-build.yaml similarity index 91% rename from llama_stack/distribution/example_configs/conda/local-conda-example-build.yaml rename to llama_stack/distribution/templates/local-build.yaml index f98e48570..f10461256 100644 --- a/llama_stack/distribution/example_configs/conda/local-conda-example-build.yaml +++ b/llama_stack/distribution/templates/local-build.yaml @@ -1,4 +1,4 @@ -name: local-conda-example +name: local distribution_spec: description: Use code from `llama_stack` itself to serve all llama stack APIs providers: diff --git a/llama_stack/distribution/example_configs/conda/local-fireworks-conda-example-build.yaml b/llama_stack/distribution/templates/local-fireworks-build.yaml similarity index 87% rename from llama_stack/distribution/example_configs/conda/local-fireworks-conda-example-build.yaml rename to llama_stack/distribution/templates/local-fireworks-build.yaml index 5e17f83c0..33bdee3b5 100644 --- a/llama_stack/distribution/example_configs/conda/local-fireworks-conda-example-build.yaml +++ b/llama_stack/distribution/templates/local-fireworks-build.yaml @@ -1,4 +1,4 @@ -name: local-fireworks-conda-example +name: local-fireworks distribution_spec: description: Use Fireworks.ai for running LLM inference providers: diff --git a/llama_stack/distribution/example_configs/conda/local-ollama-conda-example-build.yaml b/llama_stack/distribution/templates/local-ollama-build.yaml similarity index 88% rename from llama_stack/distribution/example_configs/conda/local-ollama-conda-example-build.yaml rename to llama_stack/distribution/templates/local-ollama-build.yaml index 1c43e5998..d9116b4b1 100644 --- a/llama_stack/distribution/example_configs/conda/local-ollama-conda-example-build.yaml +++ b/llama_stack/distribution/templates/local-ollama-build.yaml @@ -1,4 +1,4 @@ -name: local-ollama-conda-example +name: local-ollama distribution_spec: description: Like local, but use ollama for running LLM inference providers: diff --git a/llama_stack/distribution/example_configs/conda/local-tgi-conda-example-build.yaml b/llama_stack/distribution/templates/local-tgi-build.yaml similarity index 92% rename from llama_stack/distribution/example_configs/conda/local-tgi-conda-example-build.yaml rename to llama_stack/distribution/templates/local-tgi-build.yaml index 07848b130..e764aef8c 100644 --- a/llama_stack/distribution/example_configs/conda/local-tgi-conda-example-build.yaml +++ b/llama_stack/distribution/templates/local-tgi-build.yaml @@ -1,4 +1,4 @@ -name: local-tgi-conda-example +name: local-tgi distribution_spec: description: Use TGI (local or with Hugging Face Inference Endpoints for running LLM inference. When using HF Inference Endpoints, you must provide the name of the endpoint). providers: diff --git a/llama_stack/distribution/example_configs/conda/local-together-conda-example-build.yaml b/llama_stack/distribution/templates/local-together-build.yaml similarity index 89% rename from llama_stack/distribution/example_configs/conda/local-together-conda-example-build.yaml rename to llama_stack/distribution/templates/local-together-build.yaml index df11bd0ed..1ab891518 100644 --- a/llama_stack/distribution/example_configs/conda/local-together-conda-example-build.yaml +++ b/llama_stack/distribution/templates/local-together-build.yaml @@ -1,4 +1,4 @@ -name: local-tgi-conda-example +name: local-together distribution_spec: description: Use Together.ai for running LLM inference providers: From 29ce73ff7aae78a79f763626c8b522d5f0b48084 Mon Sep 17 00:00:00 2001 From: Hardik Shah Date: Wed, 18 Sep 2024 15:21:45 -0700 Subject: [PATCH 04/17] update requirements, added prompt-toolkit --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 3741f048f..3ab265fb4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ fire httpx huggingface-hub llama-models>=0.0.18 +prompt-toolkit python-dotenv pydantic requests From 2f9e952813193c90f3a31ff80f9880c437aa1e84 Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 15:35:54 -0700 Subject: [PATCH 05/17] update getting started guide --- docs/getting_started.md | 117 ++++++++++++++++++++++------------------ docs/list-templates.png | Bin 0 -> 225290 bytes 2 files changed, 64 insertions(+), 53 deletions(-) create mode 100644 docs/list-templates.png diff --git a/docs/getting_started.md b/docs/getting_started.md index 0ab3461dd..c5bd75979 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -28,6 +28,7 @@ Build spec configuration saved at ~/.conda/envs/llamastack-my-local-llama-stack/ ``` **`llama stack configure`** +- Run `llama stack configure ` with the name you have previously defined in `build` step. ``` llama stack configure my-local-llama-stack @@ -61,6 +62,7 @@ You can now run `llama stack run my-local-llama-stack --port PORT` or `llama sta ``` **`llama stack run`** +- Run `llama stack run ` with the name you have previously defined. ``` llama stack run my-local-llama-stack @@ -110,74 +112,83 @@ In the following steps, imagine we'll be working with a `Meta-Llama3.1-8B-Instru - `providers`: specifies the underlying implementation for serving each API endpoint - `image_type`: `conda` | `docker` to specify whether to build the distribution in the form of Docker image or Conda environment. -#### Build a local distribution with conda -The following command and specifications allows you to get started with building. -``` -llama stack build -``` -- You will be required to pass in a file path to the build.config file (e.g. `./llama_stack/distribution/example_configs/conda/local-conda-example-build.yaml`). We provide some example build config files for configuring different types of distributions in the `./llama_stack/distribution/example_configs/` folder. -The file will be of the contents -``` -$ cat ./llama_stack/distribution/example_configs/conda/local-conda-example-build.yaml +At the end of build command, we will generate `-build.yaml` file storing the build configurations. -name: 8b-instruct +#### Building from scratch +- For a new user, we could start off with running `llama stack build` which will allow you to a interactively enter wizard where you will be prompted to enter build configurations. +``` +llama stack build +``` + +Running the command above will allow you to fill in the configuration to build your Llama Stack distribution, you will see the following outputs. + +``` +> Enter an unique name for identifying your Llama Stack build distribution (e.g. my-local-stack): my-local-llama-stack +> Enter the image type you want your distribution to be built with (docker or conda): conda + + Llama Stack is composed of several APIs working together. Let's configure the providers (implementations) you want to use for these APIs. +> Enter the API provider for the inference API: (default=meta-reference): meta-reference +> Enter the API provider for the safety API: (default=meta-reference): meta-reference +> Enter the API provider for the agents API: (default=meta-reference): meta-reference +> Enter the API provider for the memory API: (default=meta-reference): meta-reference +> Enter the API provider for the telemetry API: (default=meta-reference): meta-reference + + > (Optional) Enter a short description for your Llama Stack distribution: + +Build spec configuration saved at ~/.conda/envs/llamastack-my-local-llama-stack/my-local-llama-stack-build.yaml +``` + +#### Building from templates +- To build from alternative API providers, we provide distribution templates for users to get started building a distribution backed by different providers. + +The following command will allow you to see the available templates and their corresponding providers. +``` +llama stack build --list-templates +``` + +![alt text](list-templates.png) + +You may then pick a template to build your distribution with providers fitted to your liking. + +``` +llama stack build --template local-tgi --name my-tgi-stack +``` + +``` + +``` + +#### Building from config file +- In addition to templates, you may customize the build to your liking through editing config files and build from config files with the following command. + +- The config file will be of contents like the ones in `llama_stack/distributions/templates/`. + +``` +$ cat llama_stack/distribution/templates/local-ollama-build.yaml + +name: local-ollama distribution_spec: - distribution_type: local - description: Use code from `llama_stack` itself to serve all llama stack APIs - docker_image: null + description: Like local, but use ollama for running LLM inference providers: - inference: meta-reference - memory: meta-reference-faiss + inference: remote::ollama + memory: meta-reference safety: meta-reference - agentic_system: meta-reference - telemetry: console + agents: meta-reference + telemetry: meta-reference image_type: conda ``` -You may run the `llama stack build` command to generate your distribution with `--name` to override the name for your distribution. ``` -$ llama stack build ~/.llama/distributions/conda/8b-instruct-build.yaml --name 8b-instruct -... -... -Build spec configuration saved at ~/.llama/distributions/conda/8b-instruct-build.yaml +llama stack build --config llama_stack/distribution/templates/local-ollama-build.yaml ``` After this step is complete, a file named `8b-instruct-build.yaml` will be generated and saved at `~/.llama/distributions/conda/8b-instruct-build.yaml`. - -#### How to build distribution with different API providers using configs -To specify a different API provider, we can change the `distribution_spec` in our `-build.yaml` config. For example, the following build spec allows you to build a distribution using TGI as the inference API provider. - -``` -$ cat ./llama_stack/distribution/example_configs/conda/local-tgi-conda-example-build.yaml - -name: local-tgi-conda-example -distribution_spec: - description: Use TGI (local or with Hugging Face Inference Endpoints for running LLM inference. When using HF Inference Endpoints, you must provide the name of the endpoint). - docker_image: null - providers: - inference: remote::tgi - memory: meta-reference-faiss - safety: meta-reference - agentic_system: meta-reference - telemetry: console -image_type: conda -``` - -The following command allows you to build a distribution with TGI as the inference API provider, with the name `tgi`. -``` -llama stack build ./llama_stack/distribution/example_configs/conda/local-tgi-conda-example-build.yaml --name tgi -``` - -We provide some example build configs to help you get started with building with different API providers. - #### How to build distribution with Docker image To build a docker image, simply change the `image_type` to `docker` in our `-build.yaml` file, and run `llama stack build -build.yaml`. ``` -$ cat ./llama_stack/distribution/example_configs/docker/local-docker-example-build.yaml - name: local-docker-example distribution_spec: description: Use code from `llama_stack` itself to serve all llama stack APIs @@ -206,7 +217,7 @@ Build spec configuration saved at /home/xiyan/.llama/distributions/docker/docker ## Step 2. Configure After our distribution is built (either in form of docker or conda environment), we will run the following command to ``` -llama stack configure [ | ] +llama stack configure [ | | ] ``` - For `conda` environments: would be the generated build spec saved from Step 1. - For `docker` images downloaded from Dockerhub, you could also use as the argument. @@ -298,7 +309,7 @@ INFO: Uvicorn running on http://[::]:5000 (Press CTRL+C to quit) ``` > [!NOTE] -> Configuration is in `~/.llama/builds/local/conda/8b-instruct.yaml`. Feel free to increase `max_seq_len`. +> Configuration is in `~/.llama/builds/local/conda/8b-instruct-run.yaml`. Feel free to increase `max_seq_len`. > [!IMPORTANT] > The "local" distribution inference server currently only supports CUDA. It will not work on Apple Silicon machines. diff --git a/docs/list-templates.png b/docs/list-templates.png new file mode 100644 index 0000000000000000000000000000000000000000..5b17641ef8a0f187b5435187dd832a235e1eb594 GIT binary patch literal 225290 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
^X@FiY0GOj1 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 literal 0 HcmV?d00001 From 45e20ff4318eb09f92608c17e84be46d212e2fd0 Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 15:40:48 -0700 Subject: [PATCH 06/17] update getting started --- docs/getting_started.md | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/docs/getting_started.md b/docs/getting_started.md index c5bd75979..7a12e8867 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -115,6 +115,8 @@ In the following steps, imagine we'll be working with a `Meta-Llama3.1-8B-Instru At the end of build command, we will generate `-build.yaml` file storing the build configurations. +After this step is complete, a file named `-build.yaml` will be generated and saved at the output file path specified at the end of the command. + #### Building from scratch - For a new user, we could start off with running `llama stack build` which will allow you to a interactively enter wizard where you will be prompted to enter build configurations. ``` @@ -156,7 +158,11 @@ llama stack build --template local-tgi --name my-tgi-stack ``` ``` - +$ llama stack build --template local-tgi --name my-tgi-stack +... +... +Build spec configuration saved at /home/xiyan/.conda/envs/llamastack-my-tgi-stack/my-tgi-stack-build.yaml +You may now run `llama stack configure my-tgi-stack` or `llama stack configure /home/xiyan/.conda/envs/llamastack-my-tgi-stack/my-tgi-stack-build.yaml` ``` #### Building from config file @@ -183,10 +189,15 @@ image_type: conda llama stack build --config llama_stack/distribution/templates/local-ollama-build.yaml ``` -After this step is complete, a file named `8b-instruct-build.yaml` will be generated and saved at `~/.llama/distributions/conda/8b-instruct-build.yaml`. - #### How to build distribution with Docker image -To build a docker image, simply change the `image_type` to `docker` in our `-build.yaml` file, and run `llama stack build -build.yaml`. + +To build a docker image, you may start off from a template and use the `--image-type docker` flag to specify `docker` as the build image type. + +``` +llama stack build --template local --image-type docker --name docker-0 +``` + +Alternatively, you may use a config file and set `image_type` to `docker` in our `-build.yaml` file, and run `llama stack build -build.yaml`. The `-build.yaml` will be of contents like: ``` name: local-docker-example @@ -202,9 +213,9 @@ distribution_spec: image_type: docker ``` -The following command allows you to build a Docker image with the name `docker-local` +The following command allows you to build a Docker image with the name `` ``` -llama stack build ./llama_stack/distribution/example_configs/docker/local-docker-example-build.yaml --name docker-local +llama stack build --config -build.yaml Dockerfile created successfully in /tmp/tmp.I0ifS2c46A/DockerfileFROM python:3.10-slim WORKDIR /app @@ -214,6 +225,7 @@ You can run it with: podman run -p 8000:8000 llamastack-docker-local Build spec configuration saved at /home/xiyan/.llama/distributions/docker/docker-local-build.yaml ``` + ## Step 2. Configure After our distribution is built (either in form of docker or conda environment), we will run the following command to ``` From 21058be0c1d2e7ee28adeafa108cbbe7e8d30578 Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 15:48:38 -0700 Subject: [PATCH 07/17] Bump version to 0.0.19 --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 3ab265fb4..e339bd62c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ blobfile fire httpx huggingface-hub -llama-models>=0.0.18 +llama-models>=0.0.19 prompt-toolkit python-dotenv pydantic diff --git a/setup.py b/setup.py index 4c10cfbfc..9655d150b 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ def read_requirements(): setup( name="llama_stack", - version="0.0.18", + version="0.0.19", author="Meta Llama", author_email="llama-oss@meta.com", description="Llama Stack", From 2c1ad107107c94895a30787582fc8ee47e15181e Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 16:09:17 -0700 Subject: [PATCH 08/17] move openapi from rfcs->docs --- docs/getting_started.md | 2 +- docs/llama-stack-spec.html | 5842 +++++++++++++++++ docs/llama-stack-spec.yaml | 3689 +++++++++++ {rfcs => docs}/openapi_generator/README.md | 0 {rfcs => docs}/openapi_generator/generate.py | 0 .../openapi_generator/pyopenapi/README.md | 0 .../openapi_generator/pyopenapi/__init__.py | 0 .../openapi_generator/pyopenapi/generator.py | 0 .../openapi_generator/pyopenapi/operations.py | 0 .../openapi_generator/pyopenapi/options.py | 0 .../pyopenapi/specification.py | 0 .../openapi_generator/pyopenapi/template.html | 0 .../openapi_generator/pyopenapi/utility.py | 0 .../run_openapi_generator.sh | 0 docs/{ => resources}/list-templates.png | Bin 15 files changed, 9532 insertions(+), 1 deletion(-) create mode 100644 docs/llama-stack-spec.html create mode 100644 docs/llama-stack-spec.yaml rename {rfcs => docs}/openapi_generator/README.md (100%) rename {rfcs => docs}/openapi_generator/generate.py (100%) rename {rfcs => docs}/openapi_generator/pyopenapi/README.md (100%) rename {rfcs => docs}/openapi_generator/pyopenapi/__init__.py (100%) rename {rfcs => docs}/openapi_generator/pyopenapi/generator.py (100%) rename {rfcs => docs}/openapi_generator/pyopenapi/operations.py (100%) rename {rfcs => docs}/openapi_generator/pyopenapi/options.py (100%) rename {rfcs => docs}/openapi_generator/pyopenapi/specification.py (100%) rename {rfcs => docs}/openapi_generator/pyopenapi/template.html (100%) rename {rfcs => docs}/openapi_generator/pyopenapi/utility.py (100%) rename {rfcs => docs}/openapi_generator/run_openapi_generator.sh (100%) rename docs/{ => resources}/list-templates.png (100%) diff --git a/docs/getting_started.md b/docs/getting_started.md index 7a12e8867..997ee0a22 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -149,7 +149,7 @@ The following command will allow you to see the available templates and their co llama stack build --list-templates ``` -![alt text](list-templates.png) +![alt text](resources/list-templates.png) You may then pick a template to build your distribution with providers fitted to your liking. diff --git a/docs/llama-stack-spec.html b/docs/llama-stack-spec.html new file mode 100644 index 000000000..d3f6f593b --- /dev/null +++ b/docs/llama-stack-spec.html @@ -0,0 +1,5842 @@ + + + + + + + OpenAPI specification + + + + + + + +
+ + + diff --git a/docs/llama-stack-spec.yaml b/docs/llama-stack-spec.yaml new file mode 100644 index 000000000..e96142b00 --- /dev/null +++ b/docs/llama-stack-spec.yaml @@ -0,0 +1,3689 @@ +components: + responses: {} + schemas: + AgentConfig: + additionalProperties: false + properties: + input_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + instructions: + type: string + model: + type: string + output_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + sampling_params: + $ref: '#/components/schemas/SamplingParams' + tool_choice: + $ref: '#/components/schemas/ToolChoice' + tool_prompt_format: + $ref: '#/components/schemas/ToolPromptFormat' + tools: + items: + oneOf: + - $ref: '#/components/schemas/SearchToolDefinition' + - $ref: '#/components/schemas/WolframAlphaToolDefinition' + - $ref: '#/components/schemas/PhotogenToolDefinition' + - $ref: '#/components/schemas/CodeInterpreterToolDefinition' + - $ref: '#/components/schemas/FunctionCallToolDefinition' + - additionalProperties: false + properties: + input_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + max_chunks: + type: integer + max_tokens_in_context: + type: integer + memory_bank_configs: + items: + oneOf: + - additionalProperties: false + properties: + bank_id: + type: string + type: + const: vector + type: string + required: + - bank_id + - type + type: object + - additionalProperties: false + properties: + bank_id: + type: string + keys: + items: + type: string + type: array + type: + const: keyvalue + type: string + required: + - bank_id + - type + - keys + type: object + - additionalProperties: false + properties: + bank_id: + type: string + type: + const: keyword + type: string + required: + - bank_id + - type + type: object + - additionalProperties: false + properties: + bank_id: + type: string + entities: + items: + type: string + type: array + type: + const: graph + type: string + required: + - bank_id + - type + - entities + type: object + type: array + output_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + query_generator_config: + oneOf: + - additionalProperties: false + properties: + sep: + type: string + type: + const: default + type: string + required: + - type + - sep + type: object + - additionalProperties: false + properties: + model: + type: string + template: + type: string + type: + const: llm + type: string + required: + - type + - model + - template + type: object + - additionalProperties: false + properties: + type: + const: custom + type: string + required: + - type + type: object + type: + const: memory + type: string + required: + - type + - memory_bank_configs + - query_generator_config + - max_tokens_in_context + - max_chunks + type: object + type: array + required: + - model + - instructions + type: object + AgentCreateResponse: + additionalProperties: false + properties: + agent_id: + type: string + required: + - agent_id + type: object + AgentSessionCreateResponse: + additionalProperties: false + properties: + session_id: + type: string + required: + - session_id + type: object + AgentStepResponse: + additionalProperties: false + properties: + step: + oneOf: + - $ref: '#/components/schemas/InferenceStep' + - $ref: '#/components/schemas/ToolExecutionStep' + - $ref: '#/components/schemas/ShieldCallStep' + - $ref: '#/components/schemas/MemoryRetrievalStep' + required: + - step + type: object + AgentTurnResponseEvent: + additionalProperties: false + properties: + payload: + oneOf: + - $ref: '#/components/schemas/AgentTurnResponseStepStartPayload' + - $ref: '#/components/schemas/AgentTurnResponseStepProgressPayload' + - $ref: '#/components/schemas/AgentTurnResponseStepCompletePayload' + - $ref: '#/components/schemas/AgentTurnResponseTurnStartPayload' + - $ref: '#/components/schemas/AgentTurnResponseTurnCompletePayload' + required: + - payload + title: Streamed agent execution response. + type: object + AgentTurnResponseStepCompletePayload: + additionalProperties: false + properties: + event_type: + const: step_complete + type: string + step_details: + oneOf: + - $ref: '#/components/schemas/InferenceStep' + - $ref: '#/components/schemas/ToolExecutionStep' + - $ref: '#/components/schemas/ShieldCallStep' + - $ref: '#/components/schemas/MemoryRetrievalStep' + step_type: + enum: + - inference + - tool_execution + - shield_call + - memory_retrieval + type: string + required: + - event_type + - step_type + - step_details + type: object + AgentTurnResponseStepProgressPayload: + additionalProperties: false + properties: + event_type: + const: step_progress + type: string + model_response_text_delta: + type: string + step_id: + type: string + step_type: + enum: + - inference + - tool_execution + - shield_call + - memory_retrieval + type: string + tool_call_delta: + $ref: '#/components/schemas/ToolCallDelta' + tool_response_text_delta: + type: string + required: + - event_type + - step_type + - step_id + type: object + AgentTurnResponseStepStartPayload: + additionalProperties: false + properties: + event_type: + const: step_start + type: string + metadata: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + step_id: + type: string + step_type: + enum: + - inference + - tool_execution + - shield_call + - memory_retrieval + type: string + required: + - event_type + - step_type + - step_id + type: object + AgentTurnResponseStreamChunk: + additionalProperties: false + properties: + event: + $ref: '#/components/schemas/AgentTurnResponseEvent' + required: + - event + type: object + AgentTurnResponseTurnCompletePayload: + additionalProperties: false + properties: + event_type: + const: turn_complete + type: string + turn: + $ref: '#/components/schemas/Turn' + required: + - event_type + - turn + type: object + AgentTurnResponseTurnStartPayload: + additionalProperties: false + properties: + event_type: + const: turn_start + type: string + turn_id: + type: string + required: + - event_type + - turn_id + type: object + Attachment: + additionalProperties: false + properties: + content: + oneOf: + - type: string + - items: + type: string + type: array + - $ref: '#/components/schemas/URL' + mime_type: + type: string + required: + - content + - mime_type + type: object + BatchChatCompletionRequest: + additionalProperties: false + properties: + logprobs: + additionalProperties: false + properties: + top_k: + type: integer + type: object + messages_batch: + items: + items: + oneOf: + - $ref: '#/components/schemas/UserMessage' + - $ref: '#/components/schemas/SystemMessage' + - $ref: '#/components/schemas/ToolResponseMessage' + - $ref: '#/components/schemas/CompletionMessage' + type: array + type: array + model: + type: string + sampling_params: + $ref: '#/components/schemas/SamplingParams' + tool_choice: + $ref: '#/components/schemas/ToolChoice' + tool_prompt_format: + $ref: '#/components/schemas/ToolPromptFormat' + tools: + items: + $ref: '#/components/schemas/ToolDefinition' + type: array + required: + - model + - messages_batch + type: object + BatchChatCompletionResponse: + additionalProperties: false + properties: + completion_message_batch: + items: + $ref: '#/components/schemas/CompletionMessage' + type: array + required: + - completion_message_batch + type: object + BatchCompletionRequest: + additionalProperties: false + properties: + content_batch: + items: + oneOf: + - type: string + - items: + type: string + type: array + type: array + logprobs: + additionalProperties: false + properties: + top_k: + type: integer + type: object + model: + type: string + sampling_params: + $ref: '#/components/schemas/SamplingParams' + required: + - model + - content_batch + type: object + BatchCompletionResponse: + additionalProperties: false + properties: + completion_message_batch: + items: + $ref: '#/components/schemas/CompletionMessage' + type: array + required: + - completion_message_batch + type: object + BuiltinShield: + enum: + - llama_guard + - code_scanner_guard + - third_party_shield + - injection_shield + - jailbreak_shield + type: string + BuiltinTool: + enum: + - brave_search + - wolfram_alpha + - photogen + - code_interpreter + type: string + CancelEvaluationJobRequest: + additionalProperties: false + properties: + job_uuid: + type: string + required: + - job_uuid + type: object + CancelTrainingJobRequest: + additionalProperties: false + properties: + job_uuid: + type: string + required: + - job_uuid + type: object + ChatCompletionRequest: + additionalProperties: false + properties: + logprobs: + additionalProperties: false + properties: + top_k: + type: integer + type: object + messages: + items: + oneOf: + - $ref: '#/components/schemas/UserMessage' + - $ref: '#/components/schemas/SystemMessage' + - $ref: '#/components/schemas/ToolResponseMessage' + - $ref: '#/components/schemas/CompletionMessage' + type: array + model: + type: string + sampling_params: + $ref: '#/components/schemas/SamplingParams' + stream: + type: boolean + tool_choice: + $ref: '#/components/schemas/ToolChoice' + tool_prompt_format: + $ref: '#/components/schemas/ToolPromptFormat' + tools: + items: + $ref: '#/components/schemas/ToolDefinition' + type: array + required: + - model + - messages + type: object + ChatCompletionResponse: + additionalProperties: false + properties: + completion_message: + $ref: '#/components/schemas/CompletionMessage' + logprobs: + items: + $ref: '#/components/schemas/TokenLogProbs' + type: array + required: + - completion_message + title: Chat completion response. + type: object + ChatCompletionResponseEvent: + additionalProperties: false + properties: + delta: + oneOf: + - type: string + - $ref: '#/components/schemas/ToolCallDelta' + event_type: + $ref: '#/components/schemas/ChatCompletionResponseEventType' + logprobs: + items: + $ref: '#/components/schemas/TokenLogProbs' + type: array + stop_reason: + $ref: '#/components/schemas/StopReason' + required: + - event_type + - delta + title: Chat completion response event. + type: object + ChatCompletionResponseEventType: + enum: + - start + - complete + - progress + type: string + ChatCompletionResponseStreamChunk: + additionalProperties: false + properties: + event: + $ref: '#/components/schemas/ChatCompletionResponseEvent' + required: + - event + title: SSE-stream of these events. + type: object + Checkpoint: + description: Checkpoint created during training runs + CodeInterpreterToolDefinition: + additionalProperties: false + properties: + enable_inline_code_execution: + type: boolean + input_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + output_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + remote_execution: + $ref: '#/components/schemas/RestAPIExecutionConfig' + type: + const: code_interpreter + type: string + required: + - type + - enable_inline_code_execution + type: object + CompletionMessage: + additionalProperties: false + properties: + content: + oneOf: + - type: string + - items: + type: string + type: array + role: + const: assistant + type: string + stop_reason: + $ref: '#/components/schemas/StopReason' + tool_calls: + items: + $ref: '#/components/schemas/ToolCall' + type: array + required: + - role + - content + - stop_reason + - tool_calls + type: object + CompletionRequest: + additionalProperties: false + properties: + content: + oneOf: + - type: string + - items: + type: string + type: array + logprobs: + additionalProperties: false + properties: + top_k: + type: integer + type: object + model: + type: string + sampling_params: + $ref: '#/components/schemas/SamplingParams' + stream: + type: boolean + required: + - model + - content + type: object + CompletionResponse: + additionalProperties: false + properties: + completion_message: + $ref: '#/components/schemas/CompletionMessage' + logprobs: + items: + $ref: '#/components/schemas/TokenLogProbs' + type: array + required: + - completion_message + title: Completion response. + type: object + CompletionResponseStreamChunk: + additionalProperties: false + properties: + delta: + type: string + logprobs: + items: + $ref: '#/components/schemas/TokenLogProbs' + type: array + stop_reason: + $ref: '#/components/schemas/StopReason' + required: + - delta + title: streamed completion response. + type: object + CreateAgentRequest: + additionalProperties: false + properties: + agent_config: + $ref: '#/components/schemas/AgentConfig' + required: + - agent_config + type: object + CreateAgentSessionRequest: + additionalProperties: false + properties: + agent_id: + type: string + session_name: + type: string + required: + - agent_id + - session_name + type: object + CreateAgentTurnRequest: + additionalProperties: false + properties: + agent_id: + type: string + attachments: + items: + $ref: '#/components/schemas/Attachment' + type: array + messages: + items: + oneOf: + - $ref: '#/components/schemas/UserMessage' + - $ref: '#/components/schemas/ToolResponseMessage' + type: array + session_id: + type: string + stream: + type: boolean + required: + - agent_id + - session_id + - messages + type: object + CreateDatasetRequest: + additionalProperties: false + properties: + dataset: + $ref: '#/components/schemas/TrainEvalDataset' + uuid: + type: string + required: + - uuid + - dataset + type: object + CreateMemoryBankRequest: + additionalProperties: false + properties: + config: + oneOf: + - additionalProperties: false + properties: + chunk_size_in_tokens: + type: integer + embedding_model: + type: string + overlap_size_in_tokens: + type: integer + type: + const: vector + type: string + required: + - type + - embedding_model + - chunk_size_in_tokens + type: object + - additionalProperties: false + properties: + type: + const: keyvalue + type: string + required: + - type + type: object + - additionalProperties: false + properties: + type: + const: keyword + type: string + required: + - type + type: object + - additionalProperties: false + properties: + type: + const: graph + type: string + required: + - type + type: object + name: + type: string + url: + $ref: '#/components/schemas/URL' + required: + - name + - config + type: object + DPOAlignmentConfig: + additionalProperties: false + properties: + epsilon: + type: number + gamma: + type: number + reward_clip: + type: number + reward_scale: + type: number + required: + - reward_scale + - reward_clip + - epsilon + - gamma + type: object + DeleteAgentsRequest: + additionalProperties: false + properties: + agent_id: + type: string + required: + - agent_id + type: object + DeleteAgentsSessionRequest: + additionalProperties: false + properties: + agent_id: + type: string + session_id: + type: string + required: + - agent_id + - session_id + type: object + DeleteDatasetRequest: + additionalProperties: false + properties: + dataset_uuid: + type: string + required: + - dataset_uuid + type: object + DeleteDocumentsRequest: + additionalProperties: false + properties: + bank_id: + type: string + document_ids: + items: + type: string + type: array + required: + - bank_id + - document_ids + type: object + DialogGenerations: + additionalProperties: false + properties: + dialog: + items: + oneOf: + - $ref: '#/components/schemas/UserMessage' + - $ref: '#/components/schemas/SystemMessage' + - $ref: '#/components/schemas/ToolResponseMessage' + - $ref: '#/components/schemas/CompletionMessage' + type: array + sampled_generations: + items: + oneOf: + - $ref: '#/components/schemas/UserMessage' + - $ref: '#/components/schemas/SystemMessage' + - $ref: '#/components/schemas/ToolResponseMessage' + - $ref: '#/components/schemas/CompletionMessage' + type: array + required: + - dialog + - sampled_generations + type: object + DoraFinetuningConfig: + additionalProperties: false + properties: + alpha: + type: integer + apply_lora_to_mlp: + type: boolean + apply_lora_to_output: + type: boolean + lora_attn_modules: + items: + type: string + type: array + rank: + type: integer + required: + - lora_attn_modules + - apply_lora_to_mlp + - apply_lora_to_output + - rank + - alpha + type: object + DropMemoryBankRequest: + additionalProperties: false + properties: + bank_id: + type: string + required: + - bank_id + type: object + EmbeddingsRequest: + additionalProperties: false + properties: + contents: + items: + oneOf: + - type: string + - items: + type: string + type: array + type: array + model: + type: string + required: + - model + - contents + type: object + EmbeddingsResponse: + additionalProperties: false + properties: + embeddings: + items: + items: + type: number + type: array + type: array + required: + - embeddings + type: object + EvaluateQuestionAnsweringRequest: + additionalProperties: false + properties: + metrics: + items: + enum: + - em + - f1 + type: string + type: array + required: + - metrics + type: object + EvaluateSummarizationRequest: + additionalProperties: false + properties: + metrics: + items: + enum: + - rouge + - bleu + type: string + type: array + required: + - metrics + type: object + EvaluateTextGenerationRequest: + additionalProperties: false + properties: + metrics: + items: + enum: + - perplexity + - rouge + - bleu + type: string + type: array + required: + - metrics + type: object + EvaluationJob: + additionalProperties: false + properties: + job_uuid: + type: string + required: + - job_uuid + type: object + EvaluationJobArtifactsResponse: + additionalProperties: false + properties: + job_uuid: + type: string + required: + - job_uuid + title: Artifacts of a evaluation job. + type: object + EvaluationJobLogStream: + additionalProperties: false + properties: + job_uuid: + type: string + required: + - job_uuid + type: object + EvaluationJobStatusResponse: + additionalProperties: false + properties: + job_uuid: + type: string + required: + - job_uuid + type: object + FinetuningAlgorithm: + enum: + - full + - lora + - qlora + - dora + type: string + FunctionCallToolDefinition: + additionalProperties: false + properties: + description: + type: string + function_name: + type: string + input_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + output_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + parameters: + additionalProperties: + $ref: '#/components/schemas/ToolParamDefinition' + type: object + remote_execution: + $ref: '#/components/schemas/RestAPIExecutionConfig' + type: + const: function_call + type: string + required: + - type + - function_name + - description + - parameters + type: object + GetAgentsSessionRequest: + additionalProperties: false + properties: + turn_ids: + items: + type: string + type: array + type: object + GetDocumentsRequest: + additionalProperties: false + properties: + document_ids: + items: + type: string + type: array + required: + - document_ids + type: object + InferenceStep: + additionalProperties: false + properties: + completed_at: + format: date-time + type: string + model_response: + $ref: '#/components/schemas/CompletionMessage' + started_at: + format: date-time + type: string + step_id: + type: string + step_type: + const: inference + type: string + turn_id: + type: string + required: + - turn_id + - step_id + - step_type + - model_response + type: object + InsertDocumentsRequest: + additionalProperties: false + properties: + bank_id: + type: string + documents: + items: + $ref: '#/components/schemas/MemoryBankDocument' + type: array + ttl_seconds: + type: integer + required: + - bank_id + - documents + type: object + LogEventRequest: + additionalProperties: false + properties: + event: + oneOf: + - $ref: '#/components/schemas/UnstructuredLogEvent' + - $ref: '#/components/schemas/MetricEvent' + - $ref: '#/components/schemas/StructuredLogEvent' + required: + - event + type: object + LogSeverity: + enum: + - verbose + - debug + - info + - warn + - error + - critical + type: string + LoraFinetuningConfig: + additionalProperties: false + properties: + alpha: + type: integer + apply_lora_to_mlp: + type: boolean + apply_lora_to_output: + type: boolean + lora_attn_modules: + items: + type: string + type: array + rank: + type: integer + required: + - lora_attn_modules + - apply_lora_to_mlp + - apply_lora_to_output + - rank + - alpha + type: object + MemoryBank: + additionalProperties: false + properties: + bank_id: + type: string + config: + oneOf: + - additionalProperties: false + properties: + chunk_size_in_tokens: + type: integer + embedding_model: + type: string + overlap_size_in_tokens: + type: integer + type: + const: vector + type: string + required: + - type + - embedding_model + - chunk_size_in_tokens + type: object + - additionalProperties: false + properties: + type: + const: keyvalue + type: string + required: + - type + type: object + - additionalProperties: false + properties: + type: + const: keyword + type: string + required: + - type + type: object + - additionalProperties: false + properties: + type: + const: graph + type: string + required: + - type + type: object + name: + type: string + url: + $ref: '#/components/schemas/URL' + required: + - bank_id + - name + - config + type: object + MemoryBankDocument: + additionalProperties: false + properties: + content: + oneOf: + - type: string + - items: + type: string + type: array + - $ref: '#/components/schemas/URL' + document_id: + type: string + metadata: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + mime_type: + type: string + required: + - document_id + - content + - metadata + type: object + MemoryRetrievalStep: + additionalProperties: false + properties: + completed_at: + format: date-time + type: string + inserted_context: + oneOf: + - type: string + - items: + type: string + type: array + memory_bank_ids: + items: + type: string + type: array + started_at: + format: date-time + type: string + step_id: + type: string + step_type: + const: memory_retrieval + type: string + turn_id: + type: string + required: + - turn_id + - step_id + - step_type + - memory_bank_ids + - inserted_context + type: object + MetricEvent: + additionalProperties: false + properties: + attributes: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + metric: + type: string + span_id: + type: string + timestamp: + format: date-time + type: string + trace_id: + type: string + type: + const: metric + type: string + unit: + type: string + value: + oneOf: + - type: integer + - type: number + required: + - trace_id + - span_id + - timestamp + - type + - metric + - value + - unit + type: object + OnViolationAction: + enum: + - 0 + - 1 + - 2 + type: integer + OptimizerConfig: + additionalProperties: false + properties: + lr: + type: number + lr_min: + type: number + optimizer_type: + enum: + - adam + - adamw + - sgd + type: string + weight_decay: + type: number + required: + - optimizer_type + - lr + - lr_min + - weight_decay + type: object + PhotogenToolDefinition: + additionalProperties: false + properties: + input_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + output_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + remote_execution: + $ref: '#/components/schemas/RestAPIExecutionConfig' + type: + const: photogen + type: string + required: + - type + type: object + PostTrainingJob: + additionalProperties: false + properties: + job_uuid: + type: string + required: + - job_uuid + type: object + PostTrainingJobArtifactsResponse: + additionalProperties: false + properties: + checkpoints: + items: + $ref: '#/components/schemas/Checkpoint' + type: array + job_uuid: + type: string + required: + - job_uuid + - checkpoints + title: Artifacts of a finetuning job. + type: object + PostTrainingJobLogStream: + additionalProperties: false + properties: + job_uuid: + type: string + log_lines: + items: + type: string + type: array + required: + - job_uuid + - log_lines + title: Stream of logs from a finetuning job. + type: object + PostTrainingJobStatus: + enum: + - running + - completed + - failed + - scheduled + type: string + PostTrainingJobStatusResponse: + additionalProperties: false + properties: + checkpoints: + items: + $ref: '#/components/schemas/Checkpoint' + type: array + completed_at: + format: date-time + type: string + job_uuid: + type: string + resources_allocated: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + scheduled_at: + format: date-time + type: string + started_at: + format: date-time + type: string + status: + $ref: '#/components/schemas/PostTrainingJobStatus' + required: + - job_uuid + - status + - checkpoints + title: Status of a finetuning job. + type: object + PreferenceOptimizeRequest: + additionalProperties: false + properties: + algorithm: + $ref: '#/components/schemas/RLHFAlgorithm' + algorithm_config: + $ref: '#/components/schemas/DPOAlignmentConfig' + dataset: + $ref: '#/components/schemas/TrainEvalDataset' + finetuned_model: + $ref: '#/components/schemas/URL' + hyperparam_search_config: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + job_uuid: + type: string + logger_config: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + optimizer_config: + $ref: '#/components/schemas/OptimizerConfig' + training_config: + $ref: '#/components/schemas/TrainingConfig' + validation_dataset: + $ref: '#/components/schemas/TrainEvalDataset' + required: + - job_uuid + - finetuned_model + - dataset + - validation_dataset + - algorithm + - algorithm_config + - optimizer_config + - training_config + - hyperparam_search_config + - logger_config + type: object + QLoraFinetuningConfig: + additionalProperties: false + properties: + alpha: + type: integer + apply_lora_to_mlp: + type: boolean + apply_lora_to_output: + type: boolean + lora_attn_modules: + items: + type: string + type: array + rank: + type: integer + required: + - lora_attn_modules + - apply_lora_to_mlp + - apply_lora_to_output + - rank + - alpha + type: object + QueryDocumentsRequest: + additionalProperties: false + properties: + bank_id: + type: string + params: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + query: + oneOf: + - type: string + - items: + type: string + type: array + required: + - bank_id + - query + type: object + QueryDocumentsResponse: + additionalProperties: false + properties: + chunks: + items: + additionalProperties: false + properties: + content: + oneOf: + - type: string + - items: + type: string + type: array + document_id: + type: string + token_count: + type: integer + required: + - content + - token_count + - document_id + type: object + type: array + scores: + items: + type: number + type: array + required: + - chunks + - scores + type: object + RLHFAlgorithm: + enum: + - dpo + type: string + RestAPIExecutionConfig: + additionalProperties: false + properties: + body: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + headers: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + method: + $ref: '#/components/schemas/RestAPIMethod' + params: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + url: + $ref: '#/components/schemas/URL' + required: + - url + - method + type: object + RestAPIMethod: + enum: + - GET + - POST + - PUT + - DELETE + type: string + RewardScoreRequest: + additionalProperties: false + properties: + dialog_generations: + items: + $ref: '#/components/schemas/DialogGenerations' + type: array + model: + type: string + required: + - dialog_generations + - model + type: object + RewardScoringResponse: + additionalProperties: false + properties: + scored_generations: + items: + $ref: '#/components/schemas/ScoredDialogGenerations' + type: array + required: + - scored_generations + title: Response from the reward scoring. Batch of (prompt, response, score) + tuples that pass the threshold. + type: object + RunShieldResponse: + additionalProperties: false + properties: + responses: + items: + $ref: '#/components/schemas/ShieldResponse' + type: array + required: + - responses + type: object + RunShieldsRequest: + additionalProperties: false + properties: + messages: + items: + oneOf: + - $ref: '#/components/schemas/UserMessage' + - $ref: '#/components/schemas/SystemMessage' + - $ref: '#/components/schemas/ToolResponseMessage' + - $ref: '#/components/schemas/CompletionMessage' + type: array + shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + required: + - messages + - shields + type: object + SamplingParams: + additionalProperties: false + properties: + max_tokens: + type: integer + repetition_penalty: + type: number + strategy: + $ref: '#/components/schemas/SamplingStrategy' + temperature: + type: number + top_k: + type: integer + top_p: + type: number + required: + - strategy + type: object + SamplingStrategy: + enum: + - greedy + - top_p + - top_k + type: string + ScoredDialogGenerations: + additionalProperties: false + properties: + dialog: + items: + oneOf: + - $ref: '#/components/schemas/UserMessage' + - $ref: '#/components/schemas/SystemMessage' + - $ref: '#/components/schemas/ToolResponseMessage' + - $ref: '#/components/schemas/CompletionMessage' + type: array + scored_generations: + items: + $ref: '#/components/schemas/ScoredMessage' + type: array + required: + - dialog + - scored_generations + type: object + ScoredMessage: + additionalProperties: false + properties: + message: + oneOf: + - $ref: '#/components/schemas/UserMessage' + - $ref: '#/components/schemas/SystemMessage' + - $ref: '#/components/schemas/ToolResponseMessage' + - $ref: '#/components/schemas/CompletionMessage' + score: + type: number + required: + - message + - score + type: object + SearchToolDefinition: + additionalProperties: false + properties: + engine: + enum: + - bing + - brave + type: string + input_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + output_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + remote_execution: + $ref: '#/components/schemas/RestAPIExecutionConfig' + type: + const: brave_search + type: string + required: + - type + - engine + type: object + Session: + additionalProperties: false + properties: + memory_bank: + $ref: '#/components/schemas/MemoryBank' + session_id: + type: string + session_name: + type: string + started_at: + format: date-time + type: string + turns: + items: + $ref: '#/components/schemas/Turn' + type: array + required: + - session_id + - session_name + - turns + - started_at + title: A single session of an interaction with an Agentic System. + type: object + ShieldCallStep: + additionalProperties: false + properties: + completed_at: + format: date-time + type: string + response: + $ref: '#/components/schemas/ShieldResponse' + started_at: + format: date-time + type: string + step_id: + type: string + step_type: + const: shield_call + type: string + turn_id: + type: string + required: + - turn_id + - step_id + - step_type + - response + type: object + ShieldDefinition: + additionalProperties: false + properties: + description: + type: string + execution_config: + $ref: '#/components/schemas/RestAPIExecutionConfig' + on_violation_action: + $ref: '#/components/schemas/OnViolationAction' + parameters: + additionalProperties: + $ref: '#/components/schemas/ToolParamDefinition' + type: object + shield_type: + oneOf: + - $ref: '#/components/schemas/BuiltinShield' + - type: string + required: + - shield_type + - on_violation_action + type: object + ShieldResponse: + additionalProperties: false + properties: + is_violation: + type: boolean + shield_type: + oneOf: + - $ref: '#/components/schemas/BuiltinShield' + - type: string + violation_return_message: + type: string + violation_type: + type: string + required: + - shield_type + - is_violation + type: object + SpanEndPayload: + additionalProperties: false + properties: + status: + $ref: '#/components/schemas/SpanStatus' + type: + const: span_end + type: string + required: + - type + - status + type: object + SpanStartPayload: + additionalProperties: false + properties: + name: + type: string + parent_span_id: + type: string + type: + const: span_start + type: string + required: + - type + - name + type: object + SpanStatus: + enum: + - ok + - error + type: string + StopReason: + enum: + - end_of_turn + - end_of_message + - out_of_tokens + type: string + StructuredLogEvent: + additionalProperties: false + properties: + attributes: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + payload: + oneOf: + - $ref: '#/components/schemas/SpanStartPayload' + - $ref: '#/components/schemas/SpanEndPayload' + span_id: + type: string + timestamp: + format: date-time + type: string + trace_id: + type: string + type: + const: structured_log + type: string + required: + - trace_id + - span_id + - timestamp + - type + - payload + type: object + SupervisedFineTuneRequest: + additionalProperties: false + properties: + algorithm: + $ref: '#/components/schemas/FinetuningAlgorithm' + algorithm_config: + oneOf: + - $ref: '#/components/schemas/LoraFinetuningConfig' + - $ref: '#/components/schemas/QLoraFinetuningConfig' + - $ref: '#/components/schemas/DoraFinetuningConfig' + dataset: + $ref: '#/components/schemas/TrainEvalDataset' + hyperparam_search_config: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + job_uuid: + type: string + logger_config: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + model: + type: string + optimizer_config: + $ref: '#/components/schemas/OptimizerConfig' + training_config: + $ref: '#/components/schemas/TrainingConfig' + validation_dataset: + $ref: '#/components/schemas/TrainEvalDataset' + required: + - job_uuid + - model + - dataset + - validation_dataset + - algorithm + - algorithm_config + - optimizer_config + - training_config + - hyperparam_search_config + - logger_config + type: object + SyntheticDataGenerateRequest: + additionalProperties: false + properties: + dialogs: + items: + oneOf: + - $ref: '#/components/schemas/UserMessage' + - $ref: '#/components/schemas/SystemMessage' + - $ref: '#/components/schemas/ToolResponseMessage' + - $ref: '#/components/schemas/CompletionMessage' + type: array + filtering_function: + enum: + - none + - random + - top_k + - top_p + - top_k_top_p + - sigmoid + title: The type of filtering function. + type: string + model: + type: string + required: + - dialogs + - filtering_function + type: object + SyntheticDataGenerationResponse: + additionalProperties: false + properties: + statistics: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + synthetic_data: + items: + $ref: '#/components/schemas/ScoredDialogGenerations' + type: array + required: + - synthetic_data + title: Response from the synthetic data generation. Batch of (prompt, response, + score) tuples that pass the threshold. + type: object + SystemMessage: + additionalProperties: false + properties: + content: + oneOf: + - type: string + - items: + type: string + type: array + role: + const: system + type: string + required: + - role + - content + type: object + TokenLogProbs: + additionalProperties: false + properties: + logprobs_by_token: + additionalProperties: + type: number + type: object + required: + - logprobs_by_token + type: object + ToolCall: + additionalProperties: false + properties: + arguments: + additionalProperties: + oneOf: + - type: string + - type: integer + - type: number + - type: boolean + - type: 'null' + - items: + oneOf: + - type: string + - type: integer + - type: number + - type: boolean + - type: 'null' + type: array + - additionalProperties: + oneOf: + - type: string + - type: integer + - type: number + - type: boolean + - type: 'null' + type: object + type: object + call_id: + type: string + tool_name: + oneOf: + - $ref: '#/components/schemas/BuiltinTool' + - type: string + required: + - call_id + - tool_name + - arguments + type: object + ToolCallDelta: + additionalProperties: false + properties: + content: + oneOf: + - type: string + - $ref: '#/components/schemas/ToolCall' + parse_status: + $ref: '#/components/schemas/ToolCallParseStatus' + required: + - content + - parse_status + type: object + ToolCallParseStatus: + enum: + - started + - in_progress + - failure + - success + type: string + ToolChoice: + enum: + - auto + - required + type: string + ToolDefinition: + additionalProperties: false + properties: + description: + type: string + parameters: + additionalProperties: + $ref: '#/components/schemas/ToolParamDefinition' + type: object + tool_name: + oneOf: + - $ref: '#/components/schemas/BuiltinTool' + - type: string + required: + - tool_name + type: object + ToolExecutionStep: + additionalProperties: false + properties: + completed_at: + format: date-time + type: string + started_at: + format: date-time + type: string + step_id: + type: string + step_type: + const: tool_execution + type: string + tool_calls: + items: + $ref: '#/components/schemas/ToolCall' + type: array + tool_responses: + items: + $ref: '#/components/schemas/ToolResponse' + type: array + turn_id: + type: string + required: + - turn_id + - step_id + - step_type + - tool_calls + - tool_responses + type: object + ToolParamDefinition: + additionalProperties: false + properties: + description: + type: string + param_type: + type: string + required: + type: boolean + required: + - param_type + type: object + ToolPromptFormat: + description: "`json` --\n Refers to the json format for calling tools.\n\ + \ The json format takes the form like\n {\n \"type\": \"function\"\ + ,\n \"function\" : {\n \"name\": \"function_name\",\n \ + \ \"description\": \"function_description\",\n \"parameters\"\ + : {...}\n }\n }\n\n`function_tag` --\n This is an example of\ + \ how you could define\n your own user defined format for making tool calls.\n\ + \ The function_tag format looks like this,\n (parameters)\n\ + \nThe detailed prompts for each of these formats are added to llama cli" + enum: + - json + - function_tag + title: This Enum refers to the prompt format for calling custom / zero shot + tools + type: string + ToolResponse: + additionalProperties: false + properties: + call_id: + type: string + content: + oneOf: + - type: string + - items: + type: string + type: array + tool_name: + oneOf: + - $ref: '#/components/schemas/BuiltinTool' + - type: string + required: + - call_id + - tool_name + - content + type: object + ToolResponseMessage: + additionalProperties: false + properties: + call_id: + type: string + content: + oneOf: + - type: string + - items: + type: string + type: array + role: + const: ipython + type: string + tool_name: + oneOf: + - $ref: '#/components/schemas/BuiltinTool' + - type: string + required: + - role + - call_id + - tool_name + - content + type: object + Trace: + additionalProperties: false + properties: + end_time: + format: date-time + type: string + root_span_id: + type: string + start_time: + format: date-time + type: string + trace_id: + type: string + required: + - trace_id + - root_span_id + - start_time + type: object + TrainEvalDataset: + additionalProperties: false + properties: + columns: + additionalProperties: + $ref: '#/components/schemas/TrainEvalDatasetColumnType' + type: object + content_url: + $ref: '#/components/schemas/URL' + metadata: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + required: + - columns + - content_url + title: Dataset to be used for training or evaluating language models. + type: object + TrainEvalDatasetColumnType: + enum: + - dialog + - text + - media + - number + - json + type: string + TrainingConfig: + additionalProperties: false + properties: + batch_size: + type: integer + enable_activation_checkpointing: + type: boolean + fsdp_cpu_offload: + type: boolean + memory_efficient_fsdp_wrap: + type: boolean + n_epochs: + type: integer + n_iters: + type: integer + shuffle: + type: boolean + required: + - n_epochs + - batch_size + - shuffle + - n_iters + - enable_activation_checkpointing + - memory_efficient_fsdp_wrap + - fsdp_cpu_offload + type: object + Turn: + additionalProperties: false + properties: + completed_at: + format: date-time + type: string + input_messages: + items: + oneOf: + - $ref: '#/components/schemas/UserMessage' + - $ref: '#/components/schemas/ToolResponseMessage' + type: array + output_attachments: + items: + $ref: '#/components/schemas/Attachment' + type: array + output_message: + $ref: '#/components/schemas/CompletionMessage' + session_id: + type: string + started_at: + format: date-time + type: string + steps: + items: + oneOf: + - $ref: '#/components/schemas/InferenceStep' + - $ref: '#/components/schemas/ToolExecutionStep' + - $ref: '#/components/schemas/ShieldCallStep' + - $ref: '#/components/schemas/MemoryRetrievalStep' + type: array + turn_id: + type: string + required: + - turn_id + - session_id + - input_messages + - steps + - output_message + - output_attachments + - started_at + title: A single turn in an interaction with an Agentic System. + type: object + URL: + format: uri + pattern: ^(https?://|file://|data:) + type: string + UnstructuredLogEvent: + additionalProperties: false + properties: + attributes: + additionalProperties: + oneOf: + - type: 'null' + - type: boolean + - type: number + - type: string + - type: array + - type: object + type: object + message: + type: string + severity: + $ref: '#/components/schemas/LogSeverity' + span_id: + type: string + timestamp: + format: date-time + type: string + trace_id: + type: string + type: + const: unstructured_log + type: string + required: + - trace_id + - span_id + - timestamp + - type + - message + - severity + type: object + UpdateDocumentsRequest: + additionalProperties: false + properties: + bank_id: + type: string + documents: + items: + $ref: '#/components/schemas/MemoryBankDocument' + type: array + required: + - bank_id + - documents + type: object + UserMessage: + additionalProperties: false + properties: + content: + oneOf: + - type: string + - items: + type: string + type: array + context: + oneOf: + - type: string + - items: + type: string + type: array + role: + const: user + type: string + required: + - role + - content + type: object + WolframAlphaToolDefinition: + additionalProperties: false + properties: + input_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + output_shields: + items: + $ref: '#/components/schemas/ShieldDefinition' + type: array + remote_execution: + $ref: '#/components/schemas/RestAPIExecutionConfig' + type: + const: wolfram_alpha + type: string + required: + - type + type: object +info: + description: "This is the specification of the llama stack that provides\n \ + \ a set of endpoints and their corresponding interfaces that are tailored\ + \ to\n best leverage Llama Models. The specification is still in\ + \ draft and subject to change.\n Generated at 2024-09-17 12:55:45.538053" + title: '[DRAFT] Llama Stack Specification' + version: 0.0.1 +jsonSchemaDialect: https://json-schema.org/draft/2020-12/schema +openapi: 3.1.0 +paths: + /agents/create: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateAgentRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AgentCreateResponse' + description: OK + tags: + - Agents + /agents/delete: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteAgentsRequest' + required: true + responses: + '200': + description: OK + tags: + - Agents + /agents/session/create: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateAgentSessionRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AgentSessionCreateResponse' + description: OK + tags: + - Agents + /agents/session/delete: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteAgentsSessionRequest' + required: true + responses: + '200': + description: OK + tags: + - Agents + /agents/session/get: + post: + parameters: + - in: query + name: agent_id + required: true + schema: + type: string + - in: query + name: session_id + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetAgentsSessionRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Session' + description: OK + tags: + - Agents + /agents/step/get: + get: + parameters: + - in: query + name: agent_id + required: true + schema: + type: string + - in: query + name: turn_id + required: true + schema: + type: string + - in: query + name: step_id + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AgentStepResponse' + description: OK + tags: + - Agents + /agents/turn/create: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateAgentTurnRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AgentTurnResponseStreamChunk' + description: OK + tags: + - Agents + /agents/turn/get: + get: + parameters: + - in: query + name: agent_id + required: true + schema: + type: string + - in: query + name: turn_id + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Turn' + description: OK + tags: + - Agents + /batch_inference/chat_completion: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BatchChatCompletionRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BatchChatCompletionResponse' + description: OK + tags: + - BatchInference + /batch_inference/completion: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BatchCompletionRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/BatchCompletionResponse' + description: OK + tags: + - BatchInference + /datasets/create: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateDatasetRequest' + required: true + responses: + '200': + description: OK + tags: + - Datasets + /datasets/delete: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteDatasetRequest' + required: true + responses: + '200': + description: OK + tags: + - Datasets + /datasets/get: + get: + parameters: + - in: query + name: dataset_uuid + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TrainEvalDataset' + description: OK + tags: + - Datasets + /evaluate/job/artifacts: + get: + parameters: + - in: query + name: job_uuid + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluationJobArtifactsResponse' + description: OK + tags: + - Evaluations + /evaluate/job/cancel: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CancelEvaluationJobRequest' + required: true + responses: + '200': + description: OK + tags: + - Evaluations + /evaluate/job/logs: + get: + parameters: + - in: query + name: job_uuid + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluationJobLogStream' + description: OK + tags: + - Evaluations + /evaluate/job/status: + get: + parameters: + - in: query + name: job_uuid + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluationJobStatusResponse' + description: OK + tags: + - Evaluations + /evaluate/jobs: + get: + parameters: [] + responses: + '200': + content: + application/jsonl: + schema: + $ref: '#/components/schemas/EvaluationJob' + description: OK + tags: + - Evaluations + /evaluate/question_answering/: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluateQuestionAnsweringRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluationJob' + description: OK + tags: + - Evaluations + /evaluate/summarization/: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluateSummarizationRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluationJob' + description: OK + tags: + - Evaluations + /evaluate/text_generation/: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluateTextGenerationRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluationJob' + description: OK + tags: + - Evaluations + /inference/chat_completion: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ChatCompletionRequest' + required: true + responses: + '200': + content: + text/event-stream: + schema: + oneOf: + - $ref: '#/components/schemas/ChatCompletionResponse' + - $ref: '#/components/schemas/ChatCompletionResponseStreamChunk' + description: Chat completion response. **OR** SSE-stream of these events. + tags: + - Inference + /inference/completion: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CompletionRequest' + required: true + responses: + '200': + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/CompletionResponse' + - $ref: '#/components/schemas/CompletionResponseStreamChunk' + description: Completion response. **OR** streamed completion response. + tags: + - Inference + /inference/embeddings: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EmbeddingsRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/EmbeddingsResponse' + description: OK + tags: + - Inference + /memory_bank/documents/delete: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteDocumentsRequest' + required: true + responses: + '200': + description: OK + tags: + - Memory + /memory_bank/documents/get: + post: + parameters: + - in: query + name: bank_id + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDocumentsRequest' + required: true + responses: + '200': + content: + application/jsonl: + schema: + $ref: '#/components/schemas/MemoryBankDocument' + description: OK + tags: + - Memory + /memory_bank/insert: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InsertDocumentsRequest' + required: true + responses: + '200': + description: OK + tags: + - Memory + /memory_bank/query: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/QueryDocumentsRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/QueryDocumentsResponse' + description: OK + tags: + - Memory + /memory_bank/update: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateDocumentsRequest' + required: true + responses: + '200': + description: OK + tags: + - Memory + /memory_banks/create: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateMemoryBankRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MemoryBank' + description: OK + tags: + - Memory + /memory_banks/drop: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DropMemoryBankRequest' + required: true + responses: + '200': + content: + application/json: + schema: + type: string + description: OK + tags: + - Memory + /memory_banks/get: + get: + parameters: + - in: query + name: bank_id + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/MemoryBank' + - type: 'null' + description: OK + tags: + - Memory + /memory_banks/list: + get: + parameters: [] + responses: + '200': + content: + application/jsonl: + schema: + $ref: '#/components/schemas/MemoryBank' + description: OK + tags: + - Memory + /post_training/job/artifacts: + get: + parameters: + - in: query + name: job_uuid + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJobArtifactsResponse' + description: OK + tags: + - PostTraining + /post_training/job/cancel: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CancelTrainingJobRequest' + required: true + responses: + '200': + description: OK + tags: + - PostTraining + /post_training/job/logs: + get: + parameters: + - in: query + name: job_uuid + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJobLogStream' + description: OK + tags: + - PostTraining + /post_training/job/status: + get: + parameters: + - in: query + name: job_uuid + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJobStatusResponse' + description: OK + tags: + - PostTraining + /post_training/jobs: + get: + parameters: [] + responses: + '200': + content: + application/jsonl: + schema: + $ref: '#/components/schemas/PostTrainingJob' + description: OK + tags: + - PostTraining + /post_training/preference_optimize: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PreferenceOptimizeRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJob' + description: OK + tags: + - PostTraining + /post_training/supervised_fine_tune: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SupervisedFineTuneRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJob' + description: OK + tags: + - PostTraining + /reward_scoring/score: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RewardScoreRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RewardScoringResponse' + description: OK + tags: + - RewardScoring + /safety/run_shields: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RunShieldsRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RunShieldResponse' + description: OK + tags: + - Safety + /synthetic_data_generation/generate: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SyntheticDataGenerateRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/SyntheticDataGenerationResponse' + description: OK + tags: + - SyntheticDataGeneration + /telemetry/get_trace: + get: + parameters: + - in: query + name: trace_id + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Trace' + description: OK + tags: + - Telemetry + /telemetry/log_event: + post: + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LogEventRequest' + required: true + responses: + '200': + description: OK + tags: + - Telemetry +security: +- Default: [] +servers: +- url: http://any-hosted-llama-stack.com +tags: +- name: Agents +- name: Safety +- name: SyntheticDataGeneration +- name: Telemetry +- name: Datasets +- name: RewardScoring +- name: Evaluations +- name: PostTraining +- name: Inference +- name: BatchInference +- name: Memory +- description: + name: BuiltinTool +- description: + name: CompletionMessage +- description: + name: SamplingParams +- description: + name: SamplingStrategy +- description: + name: StopReason +- description: + name: SystemMessage +- description: + name: ToolCall +- description: + name: ToolChoice +- description: + name: ToolDefinition +- description: + name: ToolParamDefinition +- description: "This Enum refers to the prompt format for calling custom / zero shot\ + \ tools\n\n`json` --\n Refers to the json format for calling tools.\n The\ + \ json format takes the form like\n {\n \"type\": \"function\",\n \ + \ \"function\" : {\n \"name\": \"function_name\",\n \ + \ \"description\": \"function_description\",\n \"parameters\": {...}\n\ + \ }\n }\n\n`function_tag` --\n This is an example of how you could\ + \ define\n your own user defined format for making tool calls.\n The function_tag\ + \ format looks like this,\n (parameters)\n\ + \nThe detailed prompts for each of these formats are added to llama cli\n\n" + name: ToolPromptFormat +- description: + name: ToolResponseMessage +- description: + name: UserMessage +- description: + name: BatchChatCompletionRequest +- description: + name: BatchChatCompletionResponse +- description: + name: BatchCompletionRequest +- description: + name: BatchCompletionResponse +- description: + name: CancelEvaluationJobRequest +- description: + name: CancelTrainingJobRequest +- description: + name: ChatCompletionRequest +- description: 'Chat completion response. + + + ' + name: ChatCompletionResponse +- description: 'Chat completion response event. + + + ' + name: ChatCompletionResponseEvent +- description: + name: ChatCompletionResponseEventType +- description: 'SSE-stream of these events. + + + ' + name: ChatCompletionResponseStreamChunk +- description: + name: TokenLogProbs +- description: + name: ToolCallDelta +- description: + name: ToolCallParseStatus +- description: + name: CompletionRequest +- description: 'Completion response. + + + ' + name: CompletionResponse +- description: 'streamed completion response. + + + ' + name: CompletionResponseStreamChunk +- description: + name: AgentConfig +- description: + name: BuiltinShield +- description: + name: CodeInterpreterToolDefinition +- description: + name: FunctionCallToolDefinition +- description: + name: OnViolationAction +- description: + name: PhotogenToolDefinition +- description: + name: RestAPIExecutionConfig +- description: + name: RestAPIMethod +- description: + name: SearchToolDefinition +- description: + name: ShieldDefinition +- description: + name: URL +- description: + name: WolframAlphaToolDefinition +- description: + name: CreateAgentRequest +- description: + name: AgentCreateResponse +- description: + name: CreateAgentSessionRequest +- description: + name: AgentSessionCreateResponse +- description: + name: Attachment +- description: + name: CreateAgentTurnRequest +- description: 'Streamed agent execution response. + + + ' + name: AgentTurnResponseEvent +- description: + name: AgentTurnResponseStepCompletePayload +- description: + name: AgentTurnResponseStepProgressPayload +- description: + name: AgentTurnResponseStepStartPayload +- description: + name: AgentTurnResponseStreamChunk +- description: + name: AgentTurnResponseTurnCompletePayload +- description: + name: AgentTurnResponseTurnStartPayload +- description: + name: InferenceStep +- description: + name: MemoryRetrievalStep +- description: + name: ShieldCallStep +- description: + name: ShieldResponse +- description: + name: ToolExecutionStep +- description: + name: ToolResponse +- description: 'A single turn in an interaction with an Agentic System. + + + ' + name: Turn +- description: 'Dataset to be used for training or evaluating language models. + + + ' + name: TrainEvalDataset +- description: + name: TrainEvalDatasetColumnType +- description: + name: CreateDatasetRequest +- description: + name: CreateMemoryBankRequest +- description: + name: MemoryBank +- description: + name: DeleteAgentsRequest +- description: + name: DeleteAgentsSessionRequest +- description: + name: DeleteDatasetRequest +- description: + name: DeleteDocumentsRequest +- description: + name: DropMemoryBankRequest +- description: + name: EmbeddingsRequest +- description: + name: EmbeddingsResponse +- description: + name: EvaluateQuestionAnsweringRequest +- description: + name: EvaluationJob +- description: + name: EvaluateSummarizationRequest +- description: + name: EvaluateTextGenerationRequest +- description: + name: GetAgentsSessionRequest +- description: 'A single session of an interaction with an Agentic System. + + + ' + name: Session +- description: + name: AgentStepResponse +- description: + name: GetDocumentsRequest +- description: + name: MemoryBankDocument +- description: 'Artifacts of a evaluation job. + + + ' + name: EvaluationJobArtifactsResponse +- description: + name: EvaluationJobLogStream +- description: + name: EvaluationJobStatusResponse +- description: + name: Trace +- description: 'Checkpoint created during training runs + + + ' + name: Checkpoint +- description: 'Artifacts of a finetuning job. + + + ' + name: PostTrainingJobArtifactsResponse +- description: 'Stream of logs from a finetuning job. + + + ' + name: PostTrainingJobLogStream +- description: + name: PostTrainingJobStatus +- description: 'Status of a finetuning job. + + + ' + name: PostTrainingJobStatusResponse +- description: + name: PostTrainingJob +- description: + name: InsertDocumentsRequest +- description: + name: LogSeverity +- description: + name: MetricEvent +- description: + name: SpanEndPayload +- description: + name: SpanStartPayload +- description: + name: SpanStatus +- description: + name: StructuredLogEvent +- description: + name: UnstructuredLogEvent +- description: + name: LogEventRequest +- description: + name: DPOAlignmentConfig +- description: + name: OptimizerConfig +- description: + name: RLHFAlgorithm +- description: + name: TrainingConfig +- description: + name: PreferenceOptimizeRequest +- description: + name: QueryDocumentsRequest +- description: + name: QueryDocumentsResponse +- description: + name: DialogGenerations +- description: + name: RewardScoreRequest +- description: 'Response from the reward scoring. Batch of (prompt, response, score) + tuples that pass the threshold. + + + ' + name: RewardScoringResponse +- description: + name: ScoredDialogGenerations +- description: + name: ScoredMessage +- description: + name: RunShieldsRequest +- description: + name: RunShieldResponse +- description: + name: DoraFinetuningConfig +- description: + name: FinetuningAlgorithm +- description: + name: LoraFinetuningConfig +- description: + name: QLoraFinetuningConfig +- description: + name: SupervisedFineTuneRequest +- description: + name: SyntheticDataGenerateRequest +- description: 'Response from the synthetic data generation. Batch of (prompt, response, + score) tuples that pass the threshold. + + + ' + name: SyntheticDataGenerationResponse +- description: + name: UpdateDocumentsRequest +x-tagGroups: +- name: Operations + tags: + - Agents + - BatchInference + - Datasets + - Evaluations + - Inference + - Memory + - PostTraining + - RewardScoring + - Safety + - SyntheticDataGeneration + - Telemetry +- name: Types + tags: + - AgentConfig + - AgentCreateResponse + - AgentSessionCreateResponse + - AgentStepResponse + - AgentTurnResponseEvent + - AgentTurnResponseStepCompletePayload + - AgentTurnResponseStepProgressPayload + - AgentTurnResponseStepStartPayload + - AgentTurnResponseStreamChunk + - AgentTurnResponseTurnCompletePayload + - AgentTurnResponseTurnStartPayload + - Attachment + - BatchChatCompletionRequest + - BatchChatCompletionResponse + - BatchCompletionRequest + - BatchCompletionResponse + - BuiltinShield + - BuiltinTool + - CancelEvaluationJobRequest + - CancelTrainingJobRequest + - ChatCompletionRequest + - ChatCompletionResponse + - ChatCompletionResponseEvent + - ChatCompletionResponseEventType + - ChatCompletionResponseStreamChunk + - Checkpoint + - CodeInterpreterToolDefinition + - CompletionMessage + - CompletionRequest + - CompletionResponse + - CompletionResponseStreamChunk + - CreateAgentRequest + - CreateAgentSessionRequest + - CreateAgentTurnRequest + - CreateDatasetRequest + - CreateMemoryBankRequest + - DPOAlignmentConfig + - DeleteAgentsRequest + - DeleteAgentsSessionRequest + - DeleteDatasetRequest + - DeleteDocumentsRequest + - DialogGenerations + - DoraFinetuningConfig + - DropMemoryBankRequest + - EmbeddingsRequest + - EmbeddingsResponse + - EvaluateQuestionAnsweringRequest + - EvaluateSummarizationRequest + - EvaluateTextGenerationRequest + - EvaluationJob + - EvaluationJobArtifactsResponse + - EvaluationJobLogStream + - EvaluationJobStatusResponse + - FinetuningAlgorithm + - FunctionCallToolDefinition + - GetAgentsSessionRequest + - GetDocumentsRequest + - InferenceStep + - InsertDocumentsRequest + - LogEventRequest + - LogSeverity + - LoraFinetuningConfig + - MemoryBank + - MemoryBankDocument + - MemoryRetrievalStep + - MetricEvent + - OnViolationAction + - OptimizerConfig + - PhotogenToolDefinition + - PostTrainingJob + - PostTrainingJobArtifactsResponse + - PostTrainingJobLogStream + - PostTrainingJobStatus + - PostTrainingJobStatusResponse + - PreferenceOptimizeRequest + - QLoraFinetuningConfig + - QueryDocumentsRequest + - QueryDocumentsResponse + - RLHFAlgorithm + - RestAPIExecutionConfig + - RestAPIMethod + - RewardScoreRequest + - RewardScoringResponse + - RunShieldResponse + - RunShieldsRequest + - SamplingParams + - SamplingStrategy + - ScoredDialogGenerations + - ScoredMessage + - SearchToolDefinition + - Session + - ShieldCallStep + - ShieldDefinition + - ShieldResponse + - SpanEndPayload + - SpanStartPayload + - SpanStatus + - StopReason + - StructuredLogEvent + - SupervisedFineTuneRequest + - SyntheticDataGenerateRequest + - SyntheticDataGenerationResponse + - SystemMessage + - TokenLogProbs + - ToolCall + - ToolCallDelta + - ToolCallParseStatus + - ToolChoice + - ToolDefinition + - ToolExecutionStep + - ToolParamDefinition + - ToolPromptFormat + - ToolResponse + - ToolResponseMessage + - Trace + - TrainEvalDataset + - TrainEvalDatasetColumnType + - TrainingConfig + - Turn + - URL + - UnstructuredLogEvent + - UpdateDocumentsRequest + - UserMessage + - WolframAlphaToolDefinition diff --git a/rfcs/openapi_generator/README.md b/docs/openapi_generator/README.md similarity index 100% rename from rfcs/openapi_generator/README.md rename to docs/openapi_generator/README.md diff --git a/rfcs/openapi_generator/generate.py b/docs/openapi_generator/generate.py similarity index 100% rename from rfcs/openapi_generator/generate.py rename to docs/openapi_generator/generate.py diff --git a/rfcs/openapi_generator/pyopenapi/README.md b/docs/openapi_generator/pyopenapi/README.md similarity index 100% rename from rfcs/openapi_generator/pyopenapi/README.md rename to docs/openapi_generator/pyopenapi/README.md diff --git a/rfcs/openapi_generator/pyopenapi/__init__.py b/docs/openapi_generator/pyopenapi/__init__.py similarity index 100% rename from rfcs/openapi_generator/pyopenapi/__init__.py rename to docs/openapi_generator/pyopenapi/__init__.py diff --git a/rfcs/openapi_generator/pyopenapi/generator.py b/docs/openapi_generator/pyopenapi/generator.py similarity index 100% rename from rfcs/openapi_generator/pyopenapi/generator.py rename to docs/openapi_generator/pyopenapi/generator.py diff --git a/rfcs/openapi_generator/pyopenapi/operations.py b/docs/openapi_generator/pyopenapi/operations.py similarity index 100% rename from rfcs/openapi_generator/pyopenapi/operations.py rename to docs/openapi_generator/pyopenapi/operations.py diff --git a/rfcs/openapi_generator/pyopenapi/options.py b/docs/openapi_generator/pyopenapi/options.py similarity index 100% rename from rfcs/openapi_generator/pyopenapi/options.py rename to docs/openapi_generator/pyopenapi/options.py diff --git a/rfcs/openapi_generator/pyopenapi/specification.py b/docs/openapi_generator/pyopenapi/specification.py similarity index 100% rename from rfcs/openapi_generator/pyopenapi/specification.py rename to docs/openapi_generator/pyopenapi/specification.py diff --git a/rfcs/openapi_generator/pyopenapi/template.html b/docs/openapi_generator/pyopenapi/template.html similarity index 100% rename from rfcs/openapi_generator/pyopenapi/template.html rename to docs/openapi_generator/pyopenapi/template.html diff --git a/rfcs/openapi_generator/pyopenapi/utility.py b/docs/openapi_generator/pyopenapi/utility.py similarity index 100% rename from rfcs/openapi_generator/pyopenapi/utility.py rename to docs/openapi_generator/pyopenapi/utility.py diff --git a/rfcs/openapi_generator/run_openapi_generator.sh b/docs/openapi_generator/run_openapi_generator.sh similarity index 100% rename from rfcs/openapi_generator/run_openapi_generator.sh rename to docs/openapi_generator/run_openapi_generator.sh diff --git a/docs/list-templates.png b/docs/resources/list-templates.png similarity index 100% rename from docs/list-templates.png rename to docs/resources/list-templates.png From 5ec64ac68c3f63a31bf888544fd31fb9e758cfdd Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 16:54:24 -0700 Subject: [PATCH 09/17] moving rfc->docs --- .../resources}/agentic-system.png | Bin .../resources}/llama-stack-spec.html | 0 .../resources}/llama-stack-spec.yaml | 0 .../resources}/llama-stack.png | Bin .../resources}/model-lifecycle.png | Bin rfcs/RFC-0001-llama-stack.md | 8 ++++---- 6 files changed, 4 insertions(+), 4 deletions(-) rename {rfcs/RFC-0001-llama-stack-assets => docs/resources}/agentic-system.png (100%) rename {rfcs/RFC-0001-llama-stack-assets => docs/resources}/llama-stack-spec.html (100%) rename {rfcs/RFC-0001-llama-stack-assets => docs/resources}/llama-stack-spec.yaml (100%) rename {rfcs/RFC-0001-llama-stack-assets => docs/resources}/llama-stack.png (100%) rename {rfcs/RFC-0001-llama-stack-assets => docs/resources}/model-lifecycle.png (100%) diff --git a/rfcs/RFC-0001-llama-stack-assets/agentic-system.png b/docs/resources/agentic-system.png similarity index 100% rename from rfcs/RFC-0001-llama-stack-assets/agentic-system.png rename to docs/resources/agentic-system.png diff --git a/rfcs/RFC-0001-llama-stack-assets/llama-stack-spec.html b/docs/resources/llama-stack-spec.html similarity index 100% rename from rfcs/RFC-0001-llama-stack-assets/llama-stack-spec.html rename to docs/resources/llama-stack-spec.html diff --git a/rfcs/RFC-0001-llama-stack-assets/llama-stack-spec.yaml b/docs/resources/llama-stack-spec.yaml similarity index 100% rename from rfcs/RFC-0001-llama-stack-assets/llama-stack-spec.yaml rename to docs/resources/llama-stack-spec.yaml diff --git a/rfcs/RFC-0001-llama-stack-assets/llama-stack.png b/docs/resources/llama-stack.png similarity index 100% rename from rfcs/RFC-0001-llama-stack-assets/llama-stack.png rename to docs/resources/llama-stack.png diff --git a/rfcs/RFC-0001-llama-stack-assets/model-lifecycle.png b/docs/resources/model-lifecycle.png similarity index 100% rename from rfcs/RFC-0001-llama-stack-assets/model-lifecycle.png rename to docs/resources/model-lifecycle.png diff --git a/rfcs/RFC-0001-llama-stack.md b/rfcs/RFC-0001-llama-stack.md index 137b15d11..0968e1c64 100644 --- a/rfcs/RFC-0001-llama-stack.md +++ b/rfcs/RFC-0001-llama-stack.md @@ -21,7 +21,7 @@ Meta releases weights of both the pretrained and instruction fine-tuned Llama mo ### Model Lifecycle -![Figure 1: Model Life Cycle](RFC-0001-llama-stack-assets/model-lifecycle.png) +![Figure 1: Model Life Cycle](../docs/resources/model-lifecycle.png) For each of the operations that need to be performed (e.g. fine tuning, inference, evals etc) during the model life cycle, we identified the capabilities as toolchain APIs that are needed. Some of these capabilities are primitive operations like inference while other capabilities like synthetic data generation are composed of other capabilities. The list of APIs we have identified to support the lifecycle of Llama models is below: @@ -35,7 +35,7 @@ For each of the operations that need to be performed (e.g. fine tuning, inferenc ### Agentic System -![Figure 2: Agentic System](RFC-0001-llama-stack-assets/agentic-system.png) +![Figure 2: Agentic System](../docs/resources/agentic-system.png) In addition to the model lifecycle, we considered the different components involved in an agentic system. Specifically around tool calling and shields. Since the model may decide to call tools, a single model inference call is not enough. What’s needed is an agentic loop consisting of tool calls and inference. The model provides separate tokens representing end-of-message and end-of-turn. A message represents a possible stopping point for execution where the model can inform the execution environment that a tool call needs to be made. The execution environment, upon execution, adds back the result to the context window and makes another inference call. This process can get repeated until an end-of-turn token is generated. Note that as of today, in the OSS world, such a “loop” is often coded explicitly via elaborate prompt engineering using a ReAct pattern (typically) or preconstructed execution graph. Llama 3.1 (and future Llamas) attempts to absorb this multi-step reasoning loop inside the main model itself. @@ -60,12 +60,12 @@ The sequence diagram that details the steps is [here](https://github.com/meta-ll We define the Llama Stack as a layer cake shown below. -![Figure 3: Llama Stack](RFC-0001-llama-stack-assets/llama-stack.png) +![Figure 3: Llama Stack](../docs/resources/llama-stack.png) -The API is defined in the [YAML](RFC-0001-llama-stack-assets/llama-stack-spec.yaml) and [HTML](RFC-0001-llama-stack-assets/llama-stack-spec.html) files. These files were generated using the Pydantic definitions in (api/datatypes.py and api/endpoints.py) files that are in the llama-models, llama-stack, and llama-agentic-system repositories. +The API is defined in the [YAML](../docs/llama-stack-spec.yaml) and [HTML](../docs/llama-stack-spec.html) files. These files were generated using the Pydantic definitions in (api/datatypes.py and api/endpoints.py) files that are in the llama-models, llama-stack, and llama-agentic-system repositories. From f5d5e32d621aa42e7743282b19f09ff52b82f382 Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 17:23:37 -0700 Subject: [PATCH 10/17] fix docker configure --- llama_stack/cli/stack/configure.py | 74 ++++++++++++++++++------------ 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/llama_stack/cli/stack/configure.py b/llama_stack/cli/stack/configure.py index b0aa1c3ab..6def1133c 100644 --- a/llama_stack/cli/stack/configure.py +++ b/llama_stack/cli/stack/configure.py @@ -53,46 +53,62 @@ class StackConfigure(Subcommand): from termcolor import cprint docker_image = None + + build_config_file = Path(args.config) + + if build_config_file.exists(): + with open(build_config_file, "r") as f: + build_config = BuildConfig(**yaml.safe_load(f)) + self._configure_llama_distribution(build_config, args.output_dir) + return + + # if we get here, we need to try to find the conda build config file + cprint( + f"Could not find {build_config_file}. Trying conda build name instead...", + color="green", + ) conda_dir = Path(os.getenv("CONDA_PREFIX")).parent / f"llamastack-{args.config}" build_config_file = Path(conda_dir) / f"{args.config}-build.yaml" - if not build_config_file.exists(): - cprint( - f"Could not find {build_config_file}. Trying docker image name instead...", - color="green", - ) - docker_image = args.config + if build_config_file.exists(): + with open(build_config_file, "r") as f: + build_config = BuildConfig(**yaml.safe_load(f)) - builds_dir = BUILDS_BASE_DIR / ImageType.docker.value - if args.output_dir: - builds_dir = Path(output_dir) - os.makedirs(builds_dir, exist_ok=True) + self._configure_llama_distribution(build_config, args.output_dir) + return - script = pkg_resources.resource_filename( - "llama_stack", "distribution/configure_container.sh" - ) - script_args = [script, docker_image, str(builds_dir)] + # if we get here, we need to try to find the docker image + cprint( + f"Could not find {build_config_file}. Trying docker image name instead...", + color="green", + ) + docker_image = args.config + builds_dir = BUILDS_BASE_DIR / ImageType.docker.value + if args.output_dir: + builds_dir = Path(output_dir) + os.makedirs(builds_dir, exist_ok=True) - return_code = run_with_pty(script_args) + script = pkg_resources.resource_filename( + "llama_stack", "distribution/configure_container.sh" + ) + script_args = [script, docker_image, str(builds_dir)] - # we have regenerated the build config file with script, now check if it exists - if return_code != 0: - self.parser.error( - f"Can not find {build_config_file}. Please run llama stack build first or check if docker image exists" - ) + return_code = run_with_pty(script_args) - build_name = docker_image.removeprefix("llamastack-") - saved_file = str(builds_dir / f"{build_name}-run.yaml") - cprint( - f"YAML configuration has been written to {saved_file}. You can now run `llama stack run {saved_file}`", - color="green", + # we have regenerated the build config file with script, now check if it exists + if return_code != 0: + self.parser.error( + f"Failed to configure container {docker_image} with return code {return_code}. Please run `llama stack build first`. " ) return - with open(build_config_file, "r") as f: - build_config = BuildConfig(**yaml.safe_load(f)) - - self._configure_llama_distribution(build_config, args.output_dir) + build_name = docker_image.removeprefix("llamastack-") + saved_file = str(builds_dir / f"{build_name}-run.yaml") + cprint( + f"YAML configuration has been written to {saved_file}. You can now run `llama stack run {saved_file}`", + color="green", + ) + return def _configure_llama_distribution( self, From dff9eab48f0236fbe28286568b4142ddb43f542d Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Wed, 18 Sep 2024 18:26:26 -0700 Subject: [PATCH 11/17] Remove "APIs to serve" prompt --- llama_stack/distribution/configure.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/llama_stack/distribution/configure.py b/llama_stack/distribution/configure.py index c54bb27b6..ab1f31de6 100644 --- a/llama_stack/distribution/configure.py +++ b/llama_stack/distribution/configure.py @@ -30,12 +30,8 @@ def make_routing_entry_type(config_class: Any): def configure_api_providers( config: StackRunConfig, spec: DistributionSpec ) -> StackRunConfig: - cprint("Configuring APIs to serve...", "white", attrs=["bold"]) - print("Enter comma-separated list of APIs to serve:") - apis = config.apis_to_serve or list(spec.providers.keys()) config.apis_to_serve = [a for a in apis if a != "telemetry"] - print("") apis = [v.value for v in stack_apis()] all_providers = api_providers() From 455a6e4bb9dbcd80e9d16886f2de060d601ee9e2 Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 18:58:44 -0700 Subject: [PATCH 12/17] update MANIFEST --- MANIFEST.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index e7c63fffd..52ab42950 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,4 @@ include requirements.txt include llama_stack/distribution/*.sh include llama_stack/cli/scripts/*.sh -include llama_stack/distribution/example_configs/conda/*.yaml -include llama_stack/distribution/example_configs/docker/*.yaml +include llama_stack/distribution/templates/*.yaml From 9f1be108ce93bc2810b2e826b0358582918c61f6 Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 19:06:07 -0700 Subject: [PATCH 13/17] Bump version to 0.0.20 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9655d150b..dd72abcde 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ def read_requirements(): setup( name="llama_stack", - version="0.0.19", + version="0.0.20", author="Meta Llama", author_email="llama-oss@meta.com", description="Llama Stack", From f3f5873e9edb5c1a04f5cfb4cb2c77d1243e7f2d Mon Sep 17 00:00:00 2001 From: Xi Yan Date: Wed, 18 Sep 2024 19:28:05 -0700 Subject: [PATCH 14/17] regenerate openapi spec --- docs/llama-stack-spec.html | 52 +++++++++++-------- docs/llama-stack-spec.yaml | 24 +++++---- .../run_openapi_generator.sh | 2 +- 3 files changed, 46 insertions(+), 32 deletions(-) diff --git a/docs/llama-stack-spec.html b/docs/llama-stack-spec.html index d3f6f593b..a7ab57343 100644 --- a/docs/llama-stack-spec.html +++ b/docs/llama-stack-spec.html @@ -21,7 +21,7 @@ "info": { "title": "[DRAFT] Llama Stack Specification", "version": "0.0.1", - "description": "This is the specification of the llama stack that provides\n a set of endpoints and their corresponding interfaces that are tailored to\n best leverage Llama Models. The specification is still in draft and subject to change.\n Generated at 2024-09-17 12:55:45.538053" + "description": "This is the specification of the llama stack that provides\n a set of endpoints and their corresponding interfaces that are tailored to\n best leverage Llama Models. The specification is still in draft and subject to change.\n Generated at 2024-09-18 19:27:39.955190" }, "servers": [ { @@ -2587,6 +2587,9 @@ "type": "string", "const": "brave_search" }, + "api_key": { + "type": "string" + }, "engine": { "type": "string", "enum": [ @@ -2601,6 +2604,7 @@ "additionalProperties": false, "required": [ "type", + "api_key", "engine" ] }, @@ -2663,13 +2667,17 @@ "type": "string", "const": "wolfram_alpha" }, + "api_key": { + "type": "string" + }, "remote_execution": { "$ref": "#/components/schemas/RestAPIExecutionConfig" } }, "additionalProperties": false, "required": [ - "type" + "type", + "api_key" ] }, "CreateAgentRequest": { @@ -5141,25 +5149,7 @@ ], "tags": [ { - "name": "Agents" - }, - { - "name": "Safety" - }, - { - "name": "SyntheticDataGeneration" - }, - { - "name": "Telemetry" - }, - { - "name": "Datasets" - }, - { - "name": "RewardScoring" - }, - { - "name": "Evaluations" + "name": "BatchInference" }, { "name": "PostTraining" @@ -5168,11 +5158,29 @@ "name": "Inference" }, { - "name": "BatchInference" + "name": "Safety" + }, + { + "name": "RewardScoring" + }, + { + "name": "Telemetry" + }, + { + "name": "Evaluations" + }, + { + "name": "SyntheticDataGeneration" }, { "name": "Memory" }, + { + "name": "Agents" + }, + { + "name": "Datasets" + }, { "name": "BuiltinTool", "description": "" diff --git a/docs/llama-stack-spec.yaml b/docs/llama-stack-spec.yaml index e96142b00..33d7d9a3a 100644 --- a/docs/llama-stack-spec.yaml +++ b/docs/llama-stack-spec.yaml @@ -1651,6 +1651,8 @@ components: SearchToolDefinition: additionalProperties: false properties: + api_key: + type: string engine: enum: - bing @@ -1671,6 +1673,7 @@ components: type: string required: - type + - api_key - engine type: object Session: @@ -2336,6 +2339,8 @@ components: WolframAlphaToolDefinition: additionalProperties: false properties: + api_key: + type: string input_shields: items: $ref: '#/components/schemas/ShieldDefinition' @@ -2351,12 +2356,13 @@ components: type: string required: - type + - api_key type: object info: description: "This is the specification of the llama stack that provides\n \ \ a set of endpoints and their corresponding interfaces that are tailored\ \ to\n best leverage Llama Models. The specification is still in\ - \ draft and subject to change.\n Generated at 2024-09-17 12:55:45.538053" + \ draft and subject to change.\n Generated at 2024-09-18 19:27:39.955190" title: '[DRAFT] Llama Stack Specification' version: 0.0.1 jsonSchemaDialect: https://json-schema.org/draft/2020-12/schema @@ -3144,17 +3150,17 @@ security: servers: - url: http://any-hosted-llama-stack.com tags: -- name: Agents -- name: Safety -- name: SyntheticDataGeneration -- name: Telemetry -- name: Datasets -- name: RewardScoring -- name: Evaluations +- name: BatchInference - name: PostTraining - name: Inference -- name: BatchInference +- name: Safety +- name: RewardScoring +- name: Telemetry +- name: Evaluations +- name: SyntheticDataGeneration - name: Memory +- name: Agents +- name: Datasets - description: name: BuiltinTool - description: Date: Wed, 18 Sep 2024 20:38:21 -0700 Subject: [PATCH 15/17] No RunShieldRequest --- .../providers/impls/meta_reference/agents/safety.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/llama_stack/providers/impls/meta_reference/agents/safety.py b/llama_stack/providers/impls/meta_reference/agents/safety.py index f7148ddce..7363fa0b1 100644 --- a/llama_stack/providers/impls/meta_reference/agents/safety.py +++ b/llama_stack/providers/impls/meta_reference/agents/safety.py @@ -7,15 +7,14 @@ from typing import List from llama_models.llama3.api.datatypes import Message, Role, UserMessage +from termcolor import cprint from llama_stack.apis.safety import ( OnViolationAction, - RunShieldRequest, Safety, ShieldDefinition, ShieldResponse, ) -from termcolor import cprint class SafetyException(Exception): # noqa: N818 @@ -45,10 +44,8 @@ class ShieldRunnerMixin: messages[0] = UserMessage(content=messages[0].content) res = await self.safety_api.run_shields( - RunShieldRequest( - messages=messages, - shields=shields, - ) + messages=messages, + shields=shields, ) results = res.responses From 9ab27e852b28584abae0cec4512d47ed7ac02acd Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Wed, 18 Sep 2024 21:54:02 -0700 Subject: [PATCH 16/17] Bug fixes for memory --- llama_stack/apis/memory/client.py | 8 ++++---- llama_stack/cli/stack/build.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/llama_stack/apis/memory/client.py b/llama_stack/apis/memory/client.py index d2845326b..7b61cd830 100644 --- a/llama_stack/apis/memory/client.py +++ b/llama_stack/apis/memory/client.py @@ -13,12 +13,12 @@ from typing import Any, Dict, List, Optional import fire import httpx - -from llama_stack.distribution.datatypes import RemoteProviderConfig from termcolor import cprint -from .memory import * # noqa: F403 -from .common.file_utils import data_url_from_file +from llama_stack.distribution.datatypes import RemoteProviderConfig + +from llama_stack.apis.memory import * # noqa: F403 +from llama_stack.providers.utils.memory.file_utils import data_url_from_file async def get_client_impl(config: RemoteProviderConfig, _deps: Any) -> Memory: diff --git a/llama_stack/cli/stack/build.py b/llama_stack/cli/stack/build.py index f35c6ceab..0393fb708 100644 --- a/llama_stack/cli/stack/build.py +++ b/llama_stack/cli/stack/build.py @@ -212,7 +212,7 @@ class StackBuild(Subcommand): providers_for_api = all_providers[api] api_provider = prompt( - "> Enter the API provider for the {} API: (default=meta-reference): ".format( + "> Enter provider for the {} API: (default=meta-reference): ".format( api.value ), validator=Validator.from_callable( From f5eda1decf94927df573e9527953f5fa9429aaaa Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Wed, 18 Sep 2024 21:59:10 -0700 Subject: [PATCH 17/17] Add default for max_seq_len --- .../providers/impls/meta_reference/inference/config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/llama_stack/providers/impls/meta_reference/inference/config.py b/llama_stack/providers/impls/meta_reference/inference/config.py index 27943cb2c..8e3d3ed3c 100644 --- a/llama_stack/providers/impls/meta_reference/inference/config.py +++ b/llama_stack/providers/impls/meta_reference/inference/config.py @@ -11,10 +11,10 @@ from llama_models.datatypes import ModelFamily from llama_models.schema_utils import json_schema_type from llama_models.sku_list import all_registered_models, resolve_model -from llama_stack.apis.inference import QuantizationConfig - from pydantic import BaseModel, Field, field_validator +from llama_stack.apis.inference import QuantizationConfig + @json_schema_type class MetaReferenceImplConfig(BaseModel): @@ -24,7 +24,7 @@ class MetaReferenceImplConfig(BaseModel): ) quantization: Optional[QuantizationConfig] = None torch_seed: Optional[int] = None - max_seq_len: int + max_seq_len: int = 4096 max_batch_size: int = 1 @field_validator("model")