From 646a05f2546c7b9dcb261184445ac8c137a07827 Mon Sep 17 00:00:00 2001 From: Dinesh Yeduguru Date: Wed, 13 Nov 2024 20:51:56 -0800 Subject: [PATCH 1/2] model update and delete --- src/llama_stack_client/_client.py | 44 ++-- src/llama_stack_client/lib/.keep | 2 +- .../lib/cli/models/models.py | 39 ++++ src/llama_stack_client/resources/models.py | 197 +++++++++++++++++- src/llama_stack_client/types/__init__.py | 2 + .../types/model_delete_params.py | 15 ++ .../types/model_update_params.py | 22 ++ .../code_interpreter_tool_definition.py | 1 - .../shared/function_call_tool_definition.py | 3 +- .../types/shared/photogen_tool_definition.py | 1 - .../types/shared/search_tool_definition.py | 1 - .../shared/wolfram_alpha_tool_definition.py | 1 - 12 files changed, 298 insertions(+), 30 deletions(-) create mode 100644 src/llama_stack_client/types/model_delete_params.py create mode 100644 src/llama_stack_client/types/model_update_params.py diff --git a/src/llama_stack_client/_client.py b/src/llama_stack_client/_client.py index 53d28006..5eb51ead 100644 --- a/src/llama_stack_client/_client.py +++ b/src/llama_stack_client/_client.py @@ -2,22 +2,35 @@ from __future__ import annotations -import json - import os -from typing import Any, Mapping, Union +from typing import Any, Union, Mapping +from typing_extensions import Self, override import httpx -from typing_extensions import override, Self -from . import _exceptions, resources -from ._base_client import AsyncAPIClient, DEFAULT_MAX_RETRIES, SyncAPIClient -from ._exceptions import APIStatusError +from . import resources, _exceptions from ._qs import Querystring -from ._streaming import AsyncStream as AsyncStream, Stream as Stream -from ._types import NOT_GIVEN, NotGiven, Omit, ProxiesTypes, RequestOptions, Timeout, Transport -from ._utils import get_async_library, is_given +from ._types import ( + NOT_GIVEN, + Omit, + Timeout, + NotGiven, + Transport, + ProxiesTypes, + RequestOptions, +) +from ._utils import ( + is_given, + get_async_library, +) from ._version import __version__ +from ._streaming import Stream as Stream, AsyncStream as AsyncStream +from ._exceptions import APIStatusError +from ._base_client import ( + DEFAULT_MAX_RETRIES, + SyncAPIClient, + AsyncAPIClient, +) __all__ = [ "Timeout", @@ -79,17 +92,12 @@ def __init__( # outlining your use-case to help us decide if it should be # part of our public interface in the future. _strict_response_validation: bool = False, - provider_data: Mapping[str, Any] | None = None, ) -> None: """Construct a new synchronous llama-stack-client client instance.""" if base_url is None: base_url = os.environ.get("LLAMA_STACK_CLIENT_BASE_URL") if base_url is None: base_url = f"http://any-hosted-llama-stack.com" - if provider_data: - if default_headers is None: - default_headers = {} - default_headers["X-LlamaStack-ProviderData"] = json.dumps(provider_data) super().__init__( version=__version__, @@ -269,7 +277,6 @@ def __init__( # outlining your use-case to help us decide if it should be # part of our public interface in the future. _strict_response_validation: bool = False, - provider_data: Mapping[str, Any] | None = None, ) -> None: """Construct a new async llama-stack-client client instance.""" if base_url is None: @@ -277,11 +284,6 @@ def __init__( if base_url is None: base_url = f"http://any-hosted-llama-stack.com" - if provider_data: - if default_headers is None: - default_headers = {} - default_headers["X-LlamaStack-ProviderData"] = json.dumps(provider_data) - super().__init__( version=__version__, base_url=base_url, diff --git a/src/llama_stack_client/lib/.keep b/src/llama_stack_client/lib/.keep index 7554f8b2..5e2c99fd 100644 --- a/src/llama_stack_client/lib/.keep +++ b/src/llama_stack_client/lib/.keep @@ -1,4 +1,4 @@ File generated from our OpenAPI spec by Stainless. This directory can be used to store custom files to expand the SDK. -It is ignored by Stainless code generation and its content (other than this keep file) won't be touched. +It is ignored by Stainless code generation and its content (other than this keep file) won't be touched. \ No newline at end of file diff --git a/src/llama_stack_client/lib/cli/models/models.py b/src/llama_stack_client/lib/cli/models/models.py index b81a84dc..1e22795e 100644 --- a/src/llama_stack_client/lib/cli/models/models.py +++ b/src/llama_stack_client/lib/cli/models/models.py @@ -72,7 +72,46 @@ def register_model( click.echo(f"Failed to register model: {str(e)}") +@click.command(name="update", help="Update an existing model at distribution endpoint") +@click.argument("model_id") +@click.option("--provider-id", help="Provider ID for the model", default=None) +@click.option("--provider-model-id", help="Provider's model ID", default=None) +@click.option("--metadata", help="JSON metadata for the model", default=None) +@click.pass_context +def update_model( + ctx, model_id: str, provider_id: Optional[str], provider_model_id: Optional[str], metadata: Optional[str] +): + """Update an existing model at distribution endpoint""" + client = ctx.obj["client"] + + try: + response = client.models.update( + model_id=model_id, provider_id=provider_id, provider_model_id=provider_model_id, metadata=metadata + ) + if response: + click.echo(f"Successfully updated model {model_id}") + except Exception as e: + click.echo(f"Failed to update model: {str(e)}") + + +@click.command(name="delete", help="Delete a model from distribution endpoint") +@click.argument("model_id") +@click.pass_context +def delete_model(ctx, model_id: str): + """Delete a model from distribution endpoint""" + client = ctx.obj["client"] + + try: + response = client.models.delete(model_id=model_id) + if response: + click.echo(f"Successfully deleted model {model_id}") + except Exception as e: + click.echo(f"Failed to delete model: {str(e)}") + + # Register subcommands models.add_command(list_models) models.add_command(get_model) models.add_command(register_model) +models.add_command(update_model) +models.add_command(delete_model) diff --git a/src/llama_stack_client/resources/models.py b/src/llama_stack_client/resources/models.py index cb777183..7dcd9354 100644 --- a/src/llama_stack_client/resources/models.py +++ b/src/llama_stack_client/resources/models.py @@ -6,8 +6,13 @@ import httpx -from ..types import model_register_params, model_retrieve_params -from .._types import NOT_GIVEN, Body, Query, Headers, NotGiven +from ..types import ( + model_delete_params, + model_update_params, + model_register_params, + model_retrieve_params, +) +from .._types import NOT_GIVEN, Body, Query, Headers, NoneType, NotGiven from .._utils import ( maybe_transform, strip_not_given, @@ -85,6 +90,52 @@ def retrieve( cast_to=Model, ) + def update( + self, + *, + model_id: str, + metadata: Dict[str, Union[bool, float, str, Iterable[object], object, None]] | NotGiven = NOT_GIVEN, + provider_id: str | NotGiven = NOT_GIVEN, + provider_model_id: str | NotGiven = NOT_GIVEN, + x_llama_stack_provider_data: str | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Model: + """ + Args: + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + extra_headers = { + **strip_not_given({"X-LlamaStack-ProviderData": x_llama_stack_provider_data}), + **(extra_headers or {}), + } + return self._post( + "/models/update", + body=maybe_transform( + { + "model_id": model_id, + "metadata": metadata, + "provider_id": provider_id, + "provider_model_id": provider_model_id, + }, + model_update_params.ModelUpdateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Model, + ) + def list( self, *, @@ -119,6 +170,42 @@ def list( cast_to=Model, ) + def delete( + self, + *, + model_id: str, + x_llama_stack_provider_data: str | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> None: + """ + Args: + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + extra_headers = {"Accept": "*/*", **(extra_headers or {})} + extra_headers = { + **strip_not_given({"X-LlamaStack-ProviderData": x_llama_stack_provider_data}), + **(extra_headers or {}), + } + return self._post( + "/models/delete", + body=maybe_transform({"model_id": model_id}, model_delete_params.ModelDeleteParams), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NoneType, + ) + def register( self, *, @@ -226,6 +313,52 @@ async def retrieve( cast_to=Model, ) + async def update( + self, + *, + model_id: str, + metadata: Dict[str, Union[bool, float, str, Iterable[object], object, None]] | NotGiven = NOT_GIVEN, + provider_id: str | NotGiven = NOT_GIVEN, + provider_model_id: str | NotGiven = NOT_GIVEN, + x_llama_stack_provider_data: str | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Model: + """ + Args: + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + extra_headers = { + **strip_not_given({"X-LlamaStack-ProviderData": x_llama_stack_provider_data}), + **(extra_headers or {}), + } + return await self._post( + "/models/update", + body=await async_maybe_transform( + { + "model_id": model_id, + "metadata": metadata, + "provider_id": provider_id, + "provider_model_id": provider_model_id, + }, + model_update_params.ModelUpdateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Model, + ) + async def list( self, *, @@ -260,6 +393,42 @@ async def list( cast_to=Model, ) + async def delete( + self, + *, + model_id: str, + x_llama_stack_provider_data: str | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> None: + """ + Args: + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + extra_headers = {"Accept": "*/*", **(extra_headers or {})} + extra_headers = { + **strip_not_given({"X-LlamaStack-ProviderData": x_llama_stack_provider_data}), + **(extra_headers or {}), + } + return await self._post( + "/models/delete", + body=await async_maybe_transform({"model_id": model_id}, model_delete_params.ModelDeleteParams), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NoneType, + ) + async def register( self, *, @@ -314,9 +483,15 @@ def __init__(self, models: ModelsResource) -> None: self.retrieve = to_raw_response_wrapper( models.retrieve, ) + self.update = to_raw_response_wrapper( + models.update, + ) self.list = to_raw_response_wrapper( models.list, ) + self.delete = to_raw_response_wrapper( + models.delete, + ) self.register = to_raw_response_wrapper( models.register, ) @@ -329,9 +504,15 @@ def __init__(self, models: AsyncModelsResource) -> None: self.retrieve = async_to_raw_response_wrapper( models.retrieve, ) + self.update = async_to_raw_response_wrapper( + models.update, + ) self.list = async_to_raw_response_wrapper( models.list, ) + self.delete = async_to_raw_response_wrapper( + models.delete, + ) self.register = async_to_raw_response_wrapper( models.register, ) @@ -344,9 +525,15 @@ def __init__(self, models: ModelsResource) -> None: self.retrieve = to_streamed_response_wrapper( models.retrieve, ) + self.update = to_streamed_response_wrapper( + models.update, + ) self.list = to_streamed_response_wrapper( models.list, ) + self.delete = to_streamed_response_wrapper( + models.delete, + ) self.register = to_streamed_response_wrapper( models.register, ) @@ -359,9 +546,15 @@ def __init__(self, models: AsyncModelsResource) -> None: self.retrieve = async_to_streamed_response_wrapper( models.retrieve, ) + self.update = async_to_streamed_response_wrapper( + models.update, + ) self.list = async_to_streamed_response_wrapper( models.list, ) + self.delete = async_to_streamed_response_wrapper( + models.delete, + ) self.register = async_to_streamed_response_wrapper( models.register, ) diff --git a/src/llama_stack_client/types/__init__.py b/src/llama_stack_client/types/__init__.py index 85474981..d238a4d3 100644 --- a/src/llama_stack_client/types/__init__.py +++ b/src/llama_stack_client/types/__init__.py @@ -43,6 +43,8 @@ from .completion_response import CompletionResponse as CompletionResponse from .embeddings_response import EmbeddingsResponse as EmbeddingsResponse from .memory_query_params import MemoryQueryParams as MemoryQueryParams +from .model_delete_params import ModelDeleteParams as ModelDeleteParams +from .model_update_params import ModelUpdateParams as ModelUpdateParams from .route_list_response import RouteListResponse as RouteListResponse from .run_shield_response import RunShieldResponse as RunShieldResponse from .tool_execution_step import ToolExecutionStep as ToolExecutionStep diff --git a/src/llama_stack_client/types/model_delete_params.py b/src/llama_stack_client/types/model_delete_params.py new file mode 100644 index 00000000..1a19147c --- /dev/null +++ b/src/llama_stack_client/types/model_delete_params.py @@ -0,0 +1,15 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Required, Annotated, TypedDict + +from .._utils import PropertyInfo + +__all__ = ["ModelDeleteParams"] + + +class ModelDeleteParams(TypedDict, total=False): + model_id: Required[str] + + x_llama_stack_provider_data: Annotated[str, PropertyInfo(alias="X-LlamaStack-ProviderData")] diff --git a/src/llama_stack_client/types/model_update_params.py b/src/llama_stack_client/types/model_update_params.py new file mode 100644 index 00000000..2aa9e8a2 --- /dev/null +++ b/src/llama_stack_client/types/model_update_params.py @@ -0,0 +1,22 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Dict, Union, Iterable +from typing_extensions import Required, Annotated, TypedDict + +from .._utils import PropertyInfo + +__all__ = ["ModelUpdateParams"] + + +class ModelUpdateParams(TypedDict, total=False): + model_id: Required[str] + + metadata: Dict[str, Union[bool, float, str, Iterable[object], object, None]] + + provider_id: str + + provider_model_id: str + + x_llama_stack_provider_data: Annotated[str, PropertyInfo(alias="X-LlamaStack-ProviderData")] diff --git a/src/llama_stack_client/types/shared/code_interpreter_tool_definition.py b/src/llama_stack_client/types/shared/code_interpreter_tool_definition.py index e9031b9a..e6839537 100644 --- a/src/llama_stack_client/types/shared/code_interpreter_tool_definition.py +++ b/src/llama_stack_client/types/shared/code_interpreter_tool_definition.py @@ -1,7 +1,6 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional - from typing_extensions import Literal from ..._models import BaseModel diff --git a/src/llama_stack_client/types/shared/function_call_tool_definition.py b/src/llama_stack_client/types/shared/function_call_tool_definition.py index 6ebfa983..f25b762d 100644 --- a/src/llama_stack_client/types/shared/function_call_tool_definition.py +++ b/src/llama_stack_client/types/shared/function_call_tool_definition.py @@ -1,12 +1,11 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Dict, List, Optional - from typing_extensions import Literal from ..._models import BaseModel -from ..rest_api_execution_config_param import RestAPIExecutionConfigParam from .tool_param_definition import ToolParamDefinition +from ..rest_api_execution_config_param import RestAPIExecutionConfigParam __all__ = ["FunctionCallToolDefinition"] diff --git a/src/llama_stack_client/types/shared/photogen_tool_definition.py b/src/llama_stack_client/types/shared/photogen_tool_definition.py index 0b8b643d..80690a03 100644 --- a/src/llama_stack_client/types/shared/photogen_tool_definition.py +++ b/src/llama_stack_client/types/shared/photogen_tool_definition.py @@ -1,7 +1,6 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional - from typing_extensions import Literal from ..._models import BaseModel diff --git a/src/llama_stack_client/types/shared/search_tool_definition.py b/src/llama_stack_client/types/shared/search_tool_definition.py index 8186c324..7b32ce3f 100644 --- a/src/llama_stack_client/types/shared/search_tool_definition.py +++ b/src/llama_stack_client/types/shared/search_tool_definition.py @@ -1,7 +1,6 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional - from typing_extensions import Literal from ..._models import BaseModel diff --git a/src/llama_stack_client/types/shared/wolfram_alpha_tool_definition.py b/src/llama_stack_client/types/shared/wolfram_alpha_tool_definition.py index ccee3738..f214b9bb 100644 --- a/src/llama_stack_client/types/shared/wolfram_alpha_tool_definition.py +++ b/src/llama_stack_client/types/shared/wolfram_alpha_tool_definition.py @@ -1,7 +1,6 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional - from typing_extensions import Literal from ..._models import BaseModel From fff2d541cebe1c96bf0b2a183c3d8c1a4c808979 Mon Sep 17 00:00:00 2001 From: Dinesh Yeduguru Date: Wed, 13 Nov 2024 21:31:18 -0800 Subject: [PATCH 2/2] update docs --- docs/cli_reference.md | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/docs/cli_reference.md b/docs/cli_reference.md index 19e6a49e..0ccf6fcb 100644 --- a/docs/cli_reference.md +++ b/docs/cli_reference.md @@ -52,7 +52,7 @@ $ llama-stack-client providers list #### `llama-stack-client models list` ```bash -llama-stack-client models list +$ llama-stack-client models list ``` ``` +----------------------+----------------------+---------------+----------------------------------------------------------+ @@ -64,7 +64,7 @@ llama-stack-client models list #### `llama-stack-client models get` ```bash -llama-stack-client models get Llama3.1-8B-Instruct +$ llama-stack-client models get Llama3.1-8B-Instruct ``` ``` @@ -82,11 +82,27 @@ $ llama-stack-client models get Random-Model Model RandomModel is not found at distribution endpoint host:port. Please ensure endpoint is serving specified model. ``` +#### `llama-stack-client models register` +```bash +$ llama-stack-client models register [--provider-id ] [--provider-model-id ] [--metadata ] +``` + +#### `llama-stack-client models update` + +```bash +$ llama-stack-client models update [--provider-id ] [--provider-model-id ] [--metadata ] +``` + +#### `llama-stack-client models delete` + +```bash +$ llama-stack-client models delete +``` #### `llama-stack-client memory_banks list` ```bash -llama-stack-client memory_banks list +$ llama-stack-client memory_banks list ``` ``` +--------------+----------------+--------+-------------------+------------------------+--------------------------+ @@ -98,7 +114,7 @@ llama-stack-client memory_banks list #### `llama-stack-client shields list` ```bash -llama-stack-client shields list +$ llama-stack-client shields list ``` ``` @@ -107,4 +123,4 @@ llama-stack-client shields list +==============+==========+================+=============+ | llama_guard | {} | meta-reference | llama_guard | +--------------+----------+----------------+-------------+ -``` +``` \ No newline at end of file