diff --git a/api.md b/api.md index 4056f4a6..2848d7da 100644 --- a/api.md +++ b/api.md @@ -489,6 +489,7 @@ Methods: - client.shields.retrieve(identifier) -> Shield - client.shields.list() -> ShieldListResponse - client.shields.register(\*\*params) -> Shield +- client.shields.unregister(identifier) -> None # SyntheticDataGeneration diff --git a/src/llama_stack_client/lib/cli/shields/shields.py b/src/llama_stack_client/lib/cli/shields/shields.py index 5a3177f9..ceab87ea 100644 --- a/src/llama_stack_client/lib/cli/shields/shields.py +++ b/src/llama_stack_client/lib/cli/shields/shields.py @@ -93,6 +93,19 @@ def register( click.echo(yaml.dump(response.dict())) +@shields.command() +@click.help_option("-h", "--help") +@click.argument("shield-id", required=True) +@click.pass_context +@handle_client_errors("unregister shield") +def unregister(ctx, shield_id: str): + """Unregister a shield""" + client = ctx.obj["client"] + client.shields.unregister(identifier=shield_id) + click.echo(f"Successfully unregistered shield {shield_id}") + + # Register subcommands shields.add_command(list) shields.add_command(register) +shields.add_command(unregister) diff --git a/src/llama_stack_client/resources/shields.py b/src/llama_stack_client/resources/shields.py index cf0c7678..9e6588fa 100644 --- a/src/llama_stack_client/resources/shields.py +++ b/src/llama_stack_client/resources/shields.py @@ -7,7 +7,7 @@ import httpx from ..types import shield_register_params -from .._types import NOT_GIVEN, Body, Query, Headers, NotGiven +from .._types import NOT_GIVEN, Body, Query, Headers, NoneType, NotGiven from .._utils import maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource @@ -151,6 +151,42 @@ def register( ), cast_to=Shield, ) + + def unregister( + self, + identifier: str, + *, + # 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: + """ + Unregister a shield. + + Args: + identifier: The identifier of the shield to unregister. + + 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 + """ + if not identifier: + raise ValueError(f"Expected a non-empty value for `identifier` but received {identifier!r}") + extra_headers = {"Accept": "*/*", **(extra_headers or {})} + return self._delete( + f"/v1/shields/{identifier}", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NoneType, + ) class AsyncShieldsResource(AsyncAPIResource): @@ -279,6 +315,42 @@ async def register( ), cast_to=Shield, ) + + async def unregister( + self, + identifier: str, + *, + # 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: + """ + Unregister a shield. + + Args: + identifier: The identifier of the shield to unregister. + + 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 + """ + if not identifier: + raise ValueError(f"Expected a non-empty value for `identifier` but received {identifier!r}") + extra_headers = {"Accept": "*/*", **(extra_headers or {})} + return await self._delete( + f"/v1/shields/{identifier}", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NoneType, + ) class ShieldsResourceWithRawResponse: @@ -295,6 +367,10 @@ def __init__(self, shields: ShieldsResource) -> None: shields.register, ) + self.unregister = to_raw_response_wrapper( + shields.unregister, + ) + class AsyncShieldsResourceWithRawResponse: def __init__(self, shields: AsyncShieldsResource) -> None: @@ -310,6 +386,10 @@ def __init__(self, shields: AsyncShieldsResource) -> None: shields.register, ) + self.unregister = async_to_raw_response_wrapper( + shields.unregister, + ) + class ShieldsResourceWithStreamingResponse: def __init__(self, shields: ShieldsResource) -> None: @@ -324,6 +404,9 @@ def __init__(self, shields: ShieldsResource) -> None: self.register = to_streamed_response_wrapper( shields.register, ) + self.unregister = to_streamed_response_wrapper( + shields.unregister, + ) class AsyncShieldsResourceWithStreamingResponse: @@ -339,3 +422,6 @@ def __init__(self, shields: AsyncShieldsResource) -> None: self.register = async_to_streamed_response_wrapper( shields.register, ) + self.unregister = async_to_streamed_response_wrapper( + shields.unregister, + ) \ No newline at end of file diff --git a/tests/api_resources/test_shields.py b/tests/api_resources/test_shields.py index 037a66d3..4f0ed670 100644 --- a/tests/api_resources/test_shields.py +++ b/tests/api_resources/test_shields.py @@ -121,6 +121,37 @@ def test_streaming_response_register(self, client: LlamaStackClient) -> None: assert cast(Any, response.is_closed) is True + @parametrize + def test_method_unregister(self, client: LlamaStackClient) -> None: + shield = client.shields.unregister( + identifier="identifier", + ) + assert shield is None + + @parametrize + def test_raw_response_unregister(self, client: LlamaStackClient) -> None: + response = client.shields.with_raw_response.unregister( + identifier="identifier", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + shield = response.parse() + assert shield is None + + @parametrize + def test_streaming_response_unregister(self, client: LlamaStackClient) -> None: + with client.shields.with_streaming_response.unregister( + identifier="identifier", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + shield = response.parse() + assert shield is None + + assert cast(Any, response.is_closed) is True + class TestAsyncShields: parametrize = pytest.mark.parametrize( @@ -230,3 +261,34 @@ async def test_streaming_response_register(self, async_client: AsyncLlamaStackCl assert_matches_type(Shield, shield, path=["response"]) assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_unregister(self, async_client: AsyncLlamaStackClient) -> None: + shield = await async_client.shields.unregister( + identifier="identifier", + ) + assert shield is None + + @parametrize + async def test_raw_response_unregister(self, async_client: AsyncLlamaStackClient) -> None: + response = await async_client.shields.with_raw_response.unregister( + identifier="identifier", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + shield = await response.parse() + assert shield is None + + @parametrize + async def test_streaming_response_unregister(self, async_client: AsyncLlamaStackClient) -> None: + async with async_client.shields.with_streaming_response.unregister( + identifier="identifier", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + shield = await response.parse() + assert shield is None + + assert cast(Any, response.is_closed) is True