# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations from typing import Union, Mapping, cast from typing_extensions import Literal import httpx from ... import _legacy_response from ...types import skill_list_params, skill_create_params, skill_update_params from .content import ( Content, AsyncContent, ContentWithRawResponse, AsyncContentWithRawResponse, ContentWithStreamingResponse, AsyncContentWithStreamingResponse, ) from ..._types import ( Body, Omit, Query, Headers, NotGiven, FileTypes, SequenceNotStr, omit, not_given, ) from ..._utils import extract_files, maybe_transform, deepcopy_minimal, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper from ...pagination import SyncCursorPage, AsyncCursorPage from ...types.skill import Skill from ..._base_client import AsyncPaginator, make_request_options from .versions.versions import ( Versions, AsyncVersions, VersionsWithRawResponse, AsyncVersionsWithRawResponse, VersionsWithStreamingResponse, AsyncVersionsWithStreamingResponse, ) from ...types.deleted_skill import DeletedSkill __all__ = ["Skills", "AsyncSkills"] class Skills(SyncAPIResource): @cached_property def content(self) -> Content: return Content(self._client) @cached_property def versions(self) -> Versions: return Versions(self._client) @cached_property def with_raw_response(self) -> SkillsWithRawResponse: """ This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. For more information, see https://www.github.com/openai/openai-python#accessing-raw-response-data-eg-headers """ return SkillsWithRawResponse(self) @cached_property def with_streaming_response(self) -> SkillsWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. For more information, see https://www.github.com/openai/openai-python#with_streaming_response """ return SkillsWithStreamingResponse(self) def create( self, *, files: Union[SequenceNotStr[FileTypes], FileTypes] | Omit = omit, # 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, ) -> Skill: """ Create a new skill. Args: files: Skill files to upload (directory upload) or a single zip file. 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 """ body = deepcopy_minimal({"files": files}) extracted_files = extract_files(cast(Mapping[str, object], body), paths=[["files", ""], ["files"]]) if extracted_files: # It should be noted that the actual Content-Type header that will be # sent to the server will contain a `boundary` parameter, e.g. # multipart/form-data; boundary=---abc-- extra_headers = {"Content-Type": "multipart/form-data", **(extra_headers or {})} return self._post( "/skills", body=maybe_transform(body, skill_create_params.SkillCreateParams), files=extracted_files, options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=Skill, ) def retrieve( self, skill_id: 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, ) -> Skill: """ Get a skill by its ID. 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 """ if not skill_id: raise ValueError(f"Expected a non-empty value for `skill_id` but received {skill_id!r}") return self._get( f"/skills/{skill_id}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=Skill, ) def update( self, skill_id: str, *, default_version: 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, ) -> Skill: """ Update the default version pointer for a skill. Args: default_version: The skill version number to set as default. 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 skill_id: raise ValueError(f"Expected a non-empty value for `skill_id` but received {skill_id!r}") return self._post( f"/skills/{skill_id}", body=maybe_transform({"default_version": default_version}, skill_update_params.SkillUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=Skill, ) def list( self, *, after: str | Omit = omit, limit: int | Omit = omit, order: Literal["asc", "desc"] | Omit = omit, # 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, ) -> SyncCursorPage[Skill]: """ List all skills for the current project. Args: after: Identifier for the last item from the previous pagination request limit: Number of items to retrieve order: Sort order of results by timestamp. Use `asc` for ascending order or `desc` for descending order. 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 """ return self._get_api_list( "/skills", page=SyncCursorPage[Skill], options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout, query=maybe_transform( { "after": after, "limit": limit, "order": order, }, skill_list_params.SkillListParams, ), ), model=Skill, ) def delete( self, skill_id: 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, ) -> DeletedSkill: """ Delete a skill by its ID. 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 """ if not skill_id: raise ValueError(f"Expected a non-empty value for `skill_id` but received {skill_id!r}") return self._delete( f"/skills/{skill_id}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=DeletedSkill, ) class AsyncSkills(AsyncAPIResource): @cached_property def content(self) -> AsyncContent: return AsyncContent(self._client) @cached_property def versions(self) -> AsyncVersions: return AsyncVersions(self._client) @cached_property def with_raw_response(self) -> AsyncSkillsWithRawResponse: """ This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. For more information, see https://www.github.com/openai/openai-python#accessing-raw-response-data-eg-headers """ return AsyncSkillsWithRawResponse(self) @cached_property def with_streaming_response(self) -> AsyncSkillsWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. For more information, see https://www.github.com/openai/openai-python#with_streaming_response """ return AsyncSkillsWithStreamingResponse(self) async def create( self, *, files: Union[SequenceNotStr[FileTypes], FileTypes] | Omit = omit, # 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, ) -> Skill: """ Create a new skill. Args: files: Skill files to upload (directory upload) or a single zip file. 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 """ body = deepcopy_minimal({"files": files}) extracted_files = extract_files(cast(Mapping[str, object], body), paths=[["files", ""], ["files"]]) if extracted_files: # It should be noted that the actual Content-Type header that will be # sent to the server will contain a `boundary` parameter, e.g. # multipart/form-data; boundary=---abc-- extra_headers = {"Content-Type": "multipart/form-data", **(extra_headers or {})} return await self._post( "/skills", body=await async_maybe_transform(body, skill_create_params.SkillCreateParams), files=extracted_files, options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=Skill, ) async def retrieve( self, skill_id: 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, ) -> Skill: """ Get a skill by its ID. 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 """ if not skill_id: raise ValueError(f"Expected a non-empty value for `skill_id` but received {skill_id!r}") return await self._get( f"/skills/{skill_id}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=Skill, ) async def update( self, skill_id: str, *, default_version: 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, ) -> Skill: """ Update the default version pointer for a skill. Args: default_version: The skill version number to set as default. 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 skill_id: raise ValueError(f"Expected a non-empty value for `skill_id` but received {skill_id!r}") return await self._post( f"/skills/{skill_id}", body=await async_maybe_transform( {"default_version": default_version}, skill_update_params.SkillUpdateParams ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=Skill, ) def list( self, *, after: str | Omit = omit, limit: int | Omit = omit, order: Literal["asc", "desc"] | Omit = omit, # 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, ) -> AsyncPaginator[Skill, AsyncCursorPage[Skill]]: """ List all skills for the current project. Args: after: Identifier for the last item from the previous pagination request limit: Number of items to retrieve order: Sort order of results by timestamp. Use `asc` for ascending order or `desc` for descending order. 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 """ return self._get_api_list( "/skills", page=AsyncCursorPage[Skill], options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout, query=maybe_transform( { "after": after, "limit": limit, "order": order, }, skill_list_params.SkillListParams, ), ), model=Skill, ) async def delete( self, skill_id: 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, ) -> DeletedSkill: """ Delete a skill by its ID. 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 """ if not skill_id: raise ValueError(f"Expected a non-empty value for `skill_id` but received {skill_id!r}") return await self._delete( f"/skills/{skill_id}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=DeletedSkill, ) class SkillsWithRawResponse: def __init__(self, skills: Skills) -> None: self._skills = skills self.create = _legacy_response.to_raw_response_wrapper( skills.create, ) self.retrieve = _legacy_response.to_raw_response_wrapper( skills.retrieve, ) self.update = _legacy_response.to_raw_response_wrapper( skills.update, ) self.list = _legacy_response.to_raw_response_wrapper( skills.list, ) self.delete = _legacy_response.to_raw_response_wrapper( skills.delete, ) @cached_property def content(self) -> ContentWithRawResponse: return ContentWithRawResponse(self._skills.content) @cached_property def versions(self) -> VersionsWithRawResponse: return VersionsWithRawResponse(self._skills.versions) class AsyncSkillsWithRawResponse: def __init__(self, skills: AsyncSkills) -> None: self._skills = skills self.create = _legacy_response.async_to_raw_response_wrapper( skills.create, ) self.retrieve = _legacy_response.async_to_raw_response_wrapper( skills.retrieve, ) self.update = _legacy_response.async_to_raw_response_wrapper( skills.update, ) self.list = _legacy_response.async_to_raw_response_wrapper( skills.list, ) self.delete = _legacy_response.async_to_raw_response_wrapper( skills.delete, ) @cached_property def content(self) -> AsyncContentWithRawResponse: return AsyncContentWithRawResponse(self._skills.content) @cached_property def versions(self) -> AsyncVersionsWithRawResponse: return AsyncVersionsWithRawResponse(self._skills.versions) class SkillsWithStreamingResponse: def __init__(self, skills: Skills) -> None: self._skills = skills self.create = to_streamed_response_wrapper( skills.create, ) self.retrieve = to_streamed_response_wrapper( skills.retrieve, ) self.update = to_streamed_response_wrapper( skills.update, ) self.list = to_streamed_response_wrapper( skills.list, ) self.delete = to_streamed_response_wrapper( skills.delete, ) @cached_property def content(self) -> ContentWithStreamingResponse: return ContentWithStreamingResponse(self._skills.content) @cached_property def versions(self) -> VersionsWithStreamingResponse: return VersionsWithStreamingResponse(self._skills.versions) class AsyncSkillsWithStreamingResponse: def __init__(self, skills: AsyncSkills) -> None: self._skills = skills self.create = async_to_streamed_response_wrapper( skills.create, ) self.retrieve = async_to_streamed_response_wrapper( skills.retrieve, ) self.update = async_to_streamed_response_wrapper( skills.update, ) self.list = async_to_streamed_response_wrapper( skills.list, ) self.delete = async_to_streamed_response_wrapper( skills.delete, ) @cached_property def content(self) -> AsyncContentWithStreamingResponse: return AsyncContentWithStreamingResponse(self._skills.content) @cached_property def versions(self) -> AsyncVersionsWithStreamingResponse: return AsyncVersionsWithStreamingResponse(self._skills.versions)