diff --git a/.stats.yml b/.stats.yml index d5223fe9..96d65ef5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1 +1 @@ -configured_endpoints: 214 +configured_endpoints: 199 diff --git a/api.md b/api.md index a8bd5c63..c078f6b0 100644 --- a/api.md +++ b/api.md @@ -1,19 +1,5 @@ # Agent -## Skills - -### Namespaces - -Methods: - -- client.agent.skills.namespaces.create(\*\*params) -> None -- client.agent.skills.namespaces.retrieve(id) -> None -- client.agent.skills.namespaces.list() -> None -- client.agent.skills.namespaces.delete(id) -> None -- client.agent.skills.namespaces.publish(id, \*\*params) -> None -- client.agent.skills.namespaces.pull(id) -> None -- client.agent.skills.namespaces.rotate_token(id) -> None - ## V1 ### Agents @@ -78,43 +64,6 @@ Methods: - client.agent.v1.execute.create(\*\*params) -> ExecuteCreateResponse -### Chat - -Types: - -```python -from casedev.types.agent.v1 import ( - ChatCreateResponse, - ChatDeleteResponse, - ChatCancelResponse, - ChatRespondResponse, - ChatStreamResponse, -) -``` - -Methods: - -- client.agent.v1.chat.create(\*\*params) -> ChatCreateResponse -- client.agent.v1.chat.delete(id) -> ChatDeleteResponse -- client.agent.v1.chat.cancel(id) -> ChatCancelResponse -- client.agent.v1.chat.reply_to_question(request_id, \*, id, \*\*params) -> None -- client.agent.v1.chat.respond(id, \*\*params) -> str -- client.agent.v1.chat.send_message(id, \*\*params) -> None -- client.agent.v1.chat.stream(id, \*\*params) -> str - -#### Files - -Types: - -```python -from casedev.types.agent.v1.chat import FileListResponse -``` - -Methods: - -- client.agent.v1.chat.files.list(id) -> FileListResponse -- client.agent.v1.chat.files.download(file_path, \*, id) -> BinaryAPIResponse - # System Types: @@ -557,6 +506,7 @@ from casedev.types import ( SkillCreateResponse, SkillUpdateResponse, SkillDeleteResponse, + SkillExportResponse, SkillReadResponse, SkillResolveResponse, ) @@ -567,6 +517,7 @@ Methods: - client.skills.create(\*\*params) -> SkillCreateResponse - client.skills.update(path_slug, \*\*params) -> SkillUpdateResponse - client.skills.delete(slug) -> SkillDeleteResponse +- client.skills.export(slug, \*\*params) -> SkillExportResponse - client.skills.read(slug) -> SkillReadResponse - client.skills.resolve(\*\*params) -> SkillResolveResponse diff --git a/release-please-config.json b/release-please-config.json index 74283049..4546e512 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -5,8 +5,6 @@ "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", "include-v-in-tag": true, "include-component-in-tag": false, - "versioning": "prerelease", - "prerelease": true, "bump-minor-pre-major": true, "bump-patch-for-minor-pre-major": false, "pull-request-header": "Automated Release PR", @@ -63,4 +61,4 @@ "extra-files": [ "src/casedev/_version.py" ] -} \ No newline at end of file +} diff --git a/scripts/mock b/scripts/mock index bd1b66be..a905c234 100755 --- a/scripts/mock +++ b/scripts/mock @@ -11,7 +11,7 @@ elif [ -n "$STAINLESS_OPENAPI_SPEC_URL" ]; then URL="$STAINLESS_OPENAPI_SPEC_URL" else # Embedded OpenAPI spec (base64-encoded, gzipped) - EMBEDDED_SPEC="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" + EMBEDDED_SPEC="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" SPEC_TMPFILE="$(mktemp)" trap 'rm -f "$SPEC_TMPFILE"' EXIT echo "$EMBEDDED_SPEC" | base64 --decode | gunzip > "$SPEC_TMPFILE" diff --git a/src/casedev/resources/agent/__init__.py b/src/casedev/resources/agent/__init__.py index 6d4664b1..1c506f86 100644 --- a/src/casedev/resources/agent/__init__.py +++ b/src/casedev/resources/agent/__init__.py @@ -16,22 +16,8 @@ AgentResourceWithStreamingResponse, AsyncAgentResourceWithStreamingResponse, ) -from .skills import ( - SkillsResource, - AsyncSkillsResource, - SkillsResourceWithRawResponse, - AsyncSkillsResourceWithRawResponse, - SkillsResourceWithStreamingResponse, - AsyncSkillsResourceWithStreamingResponse, -) __all__ = [ - "SkillsResource", - "AsyncSkillsResource", - "SkillsResourceWithRawResponse", - "AsyncSkillsResourceWithRawResponse", - "SkillsResourceWithStreamingResponse", - "AsyncSkillsResourceWithStreamingResponse", "V1Resource", "AsyncV1Resource", "V1ResourceWithRawResponse", diff --git a/src/casedev/resources/agent/agent.py b/src/casedev/resources/agent/agent.py index e8d4573d..4da17b0d 100644 --- a/src/casedev/resources/agent/agent.py +++ b/src/casedev/resources/agent/agent.py @@ -12,23 +12,11 @@ ) from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource -from .skills.skills import ( - SkillsResource, - AsyncSkillsResource, - SkillsResourceWithRawResponse, - AsyncSkillsResourceWithRawResponse, - SkillsResourceWithStreamingResponse, - AsyncSkillsResourceWithStreamingResponse, -) __all__ = ["AgentResource", "AsyncAgentResource"] class AgentResource(SyncAPIResource): - @cached_property - def skills(self) -> SkillsResource: - return SkillsResource(self._client) - @cached_property def v1(self) -> V1Resource: return V1Resource(self._client) @@ -54,10 +42,6 @@ def with_streaming_response(self) -> AgentResourceWithStreamingResponse: class AsyncAgentResource(AsyncAPIResource): - @cached_property - def skills(self) -> AsyncSkillsResource: - return AsyncSkillsResource(self._client) - @cached_property def v1(self) -> AsyncV1Resource: return AsyncV1Resource(self._client) @@ -86,10 +70,6 @@ class AgentResourceWithRawResponse: def __init__(self, agent: AgentResource) -> None: self._agent = agent - @cached_property - def skills(self) -> SkillsResourceWithRawResponse: - return SkillsResourceWithRawResponse(self._agent.skills) - @cached_property def v1(self) -> V1ResourceWithRawResponse: return V1ResourceWithRawResponse(self._agent.v1) @@ -99,10 +79,6 @@ class AsyncAgentResourceWithRawResponse: def __init__(self, agent: AsyncAgentResource) -> None: self._agent = agent - @cached_property - def skills(self) -> AsyncSkillsResourceWithRawResponse: - return AsyncSkillsResourceWithRawResponse(self._agent.skills) - @cached_property def v1(self) -> AsyncV1ResourceWithRawResponse: return AsyncV1ResourceWithRawResponse(self._agent.v1) @@ -112,10 +88,6 @@ class AgentResourceWithStreamingResponse: def __init__(self, agent: AgentResource) -> None: self._agent = agent - @cached_property - def skills(self) -> SkillsResourceWithStreamingResponse: - return SkillsResourceWithStreamingResponse(self._agent.skills) - @cached_property def v1(self) -> V1ResourceWithStreamingResponse: return V1ResourceWithStreamingResponse(self._agent.v1) @@ -125,10 +97,6 @@ class AsyncAgentResourceWithStreamingResponse: def __init__(self, agent: AsyncAgentResource) -> None: self._agent = agent - @cached_property - def skills(self) -> AsyncSkillsResourceWithStreamingResponse: - return AsyncSkillsResourceWithStreamingResponse(self._agent.skills) - @cached_property def v1(self) -> AsyncV1ResourceWithStreamingResponse: return AsyncV1ResourceWithStreamingResponse(self._agent.v1) diff --git a/src/casedev/resources/agent/skills/__init__.py b/src/casedev/resources/agent/skills/__init__.py deleted file mode 100644 index 856da65d..00000000 --- a/src/casedev/resources/agent/skills/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from .skills import ( - SkillsResource, - AsyncSkillsResource, - SkillsResourceWithRawResponse, - AsyncSkillsResourceWithRawResponse, - SkillsResourceWithStreamingResponse, - AsyncSkillsResourceWithStreamingResponse, -) -from .namespaces import ( - NamespacesResource, - AsyncNamespacesResource, - NamespacesResourceWithRawResponse, - AsyncNamespacesResourceWithRawResponse, - NamespacesResourceWithStreamingResponse, - AsyncNamespacesResourceWithStreamingResponse, -) - -__all__ = [ - "NamespacesResource", - "AsyncNamespacesResource", - "NamespacesResourceWithRawResponse", - "AsyncNamespacesResourceWithRawResponse", - "NamespacesResourceWithStreamingResponse", - "AsyncNamespacesResourceWithStreamingResponse", - "SkillsResource", - "AsyncSkillsResource", - "SkillsResourceWithRawResponse", - "AsyncSkillsResourceWithRawResponse", - "SkillsResourceWithStreamingResponse", - "AsyncSkillsResourceWithStreamingResponse", -] diff --git a/src/casedev/resources/agent/skills/namespaces.py b/src/casedev/resources/agent/skills/namespaces.py deleted file mode 100644 index 9fb30fd3..00000000 --- a/src/casedev/resources/agent/skills/namespaces.py +++ /dev/null @@ -1,670 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Iterable, Optional - -import httpx - -from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import path_template, maybe_transform, async_maybe_transform -from ...._compat import cached_property -from ...._resource import SyncAPIResource, AsyncAPIResource -from ...._response import ( - to_raw_response_wrapper, - to_streamed_response_wrapper, - async_to_raw_response_wrapper, - async_to_streamed_response_wrapper, -) -from ...._base_client import make_request_options -from ....types.agent.skills import namespace_create_params, namespace_publish_params - -__all__ = ["NamespacesResource", "AsyncNamespacesResource"] - - -class NamespacesResource(SyncAPIResource): - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - - @cached_property - def with_raw_response(self) -> NamespacesResourceWithRawResponse: - """ - 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/CaseMark/casedev-python#accessing-raw-response-data-eg-headers - """ - return NamespacesResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> NamespacesResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/CaseMark/casedev-python#with_streaming_response - """ - return NamespacesResourceWithStreamingResponse(self) - - def create( - self, - *, - namespace_id: str, - description: Optional[str] | Omit = omit, - label: Optional[str] | Omit = omit, - metadata: Optional[object] | 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, - ) -> None: - """ - Create a private skill namespace owned by the authenticated org and receive a - one-time bearer token used by the case-skills publisher. - - Args: - namespace_id: URL-safe slug, e.g. "curi" or "client-firm-abc". Lowercase alphanumeric with - single hyphens, 2-64 chars. - - 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 {})} - return self._post( - "/agent/skills/namespaces", - body=maybe_transform( - { - "namespace_id": namespace_id, - "description": description, - "label": label, - "metadata": metadata, - }, - namespace_create_params.NamespaceCreateParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - def retrieve( - self, - 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, - ) -> None: - """ - Read skill namespace - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._get( - path_template("/agent/skills/namespaces/{id}", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - def list( - self, - *, - # 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: - """List all active skill namespaces owned by the authenticated organization.""" - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._get( - "/agent/skills/namespaces", - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - def delete( - self, - 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, - ) -> None: - """ - Delete skill namespace - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._delete( - path_template("/agent/skills/namespaces/{id}", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - def publish( - self, - id: str, - *, - files: Iterable[namespace_publish_params.File], - # 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: - """Upload a tree of skill files for the namespace. - - Authenticated by the namespace - bearer token. Atomic at the version-bump level: a partial upload leaves the - namespace pinned to the previous version. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._post( - path_template("/agent/skills/namespaces/{id}/publish", id=id), - body=maybe_transform({"files": files}, namespace_publish_params.NamespacePublishParams), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - def pull( - self, - 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, - ) -> None: - """ - Returns the active version's file manifest with short-lived presigned S3 URLs. - Sandboxes use this to materialize the tree at /workspace/.agents/skills/ before - opencode boots. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._get( - path_template("/agent/skills/namespaces/{id}/pull", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - def rotate_token( - self, - 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, - ) -> None: - """ - Rotate skill namespace token - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._post( - path_template("/agent/skills/namespaces/{id}/rotate-token", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - -class AsyncNamespacesResource(AsyncAPIResource): - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - - @cached_property - def with_raw_response(self) -> AsyncNamespacesResourceWithRawResponse: - """ - 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/CaseMark/casedev-python#accessing-raw-response-data-eg-headers - """ - return AsyncNamespacesResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> AsyncNamespacesResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/CaseMark/casedev-python#with_streaming_response - """ - return AsyncNamespacesResourceWithStreamingResponse(self) - - async def create( - self, - *, - namespace_id: str, - description: Optional[str] | Omit = omit, - label: Optional[str] | Omit = omit, - metadata: Optional[object] | 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, - ) -> None: - """ - Create a private skill namespace owned by the authenticated org and receive a - one-time bearer token used by the case-skills publisher. - - Args: - namespace_id: URL-safe slug, e.g. "curi" or "client-firm-abc". Lowercase alphanumeric with - single hyphens, 2-64 chars. - - 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 {})} - return await self._post( - "/agent/skills/namespaces", - body=await async_maybe_transform( - { - "namespace_id": namespace_id, - "description": description, - "label": label, - "metadata": metadata, - }, - namespace_create_params.NamespaceCreateParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - async def retrieve( - self, - 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, - ) -> None: - """ - Read skill namespace - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._get( - path_template("/agent/skills/namespaces/{id}", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - async def list( - self, - *, - # 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: - """List all active skill namespaces owned by the authenticated organization.""" - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._get( - "/agent/skills/namespaces", - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - async def delete( - self, - 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, - ) -> None: - """ - Delete skill namespace - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._delete( - path_template("/agent/skills/namespaces/{id}", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - async def publish( - self, - id: str, - *, - files: Iterable[namespace_publish_params.File], - # 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: - """Upload a tree of skill files for the namespace. - - Authenticated by the namespace - bearer token. Atomic at the version-bump level: a partial upload leaves the - namespace pinned to the previous version. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._post( - path_template("/agent/skills/namespaces/{id}/publish", id=id), - body=await async_maybe_transform({"files": files}, namespace_publish_params.NamespacePublishParams), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - async def pull( - self, - 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, - ) -> None: - """ - Returns the active version's file manifest with short-lived presigned S3 URLs. - Sandboxes use this to materialize the tree at /workspace/.agents/skills/ before - opencode boots. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._get( - path_template("/agent/skills/namespaces/{id}/pull", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - async def rotate_token( - self, - 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, - ) -> None: - """ - Rotate skill namespace token - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._post( - path_template("/agent/skills/namespaces/{id}/rotate-token", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - -class NamespacesResourceWithRawResponse: - def __init__(self, namespaces: NamespacesResource) -> None: - self._namespaces = namespaces - - self.create = to_raw_response_wrapper( - namespaces.create, - ) - self.retrieve = to_raw_response_wrapper( - namespaces.retrieve, - ) - self.list = to_raw_response_wrapper( - namespaces.list, - ) - self.delete = to_raw_response_wrapper( - namespaces.delete, - ) - self.publish = to_raw_response_wrapper( - namespaces.publish, - ) - self.pull = to_raw_response_wrapper( - namespaces.pull, - ) - self.rotate_token = to_raw_response_wrapper( - namespaces.rotate_token, - ) - - -class AsyncNamespacesResourceWithRawResponse: - def __init__(self, namespaces: AsyncNamespacesResource) -> None: - self._namespaces = namespaces - - self.create = async_to_raw_response_wrapper( - namespaces.create, - ) - self.retrieve = async_to_raw_response_wrapper( - namespaces.retrieve, - ) - self.list = async_to_raw_response_wrapper( - namespaces.list, - ) - self.delete = async_to_raw_response_wrapper( - namespaces.delete, - ) - self.publish = async_to_raw_response_wrapper( - namespaces.publish, - ) - self.pull = async_to_raw_response_wrapper( - namespaces.pull, - ) - self.rotate_token = async_to_raw_response_wrapper( - namespaces.rotate_token, - ) - - -class NamespacesResourceWithStreamingResponse: - def __init__(self, namespaces: NamespacesResource) -> None: - self._namespaces = namespaces - - self.create = to_streamed_response_wrapper( - namespaces.create, - ) - self.retrieve = to_streamed_response_wrapper( - namespaces.retrieve, - ) - self.list = to_streamed_response_wrapper( - namespaces.list, - ) - self.delete = to_streamed_response_wrapper( - namespaces.delete, - ) - self.publish = to_streamed_response_wrapper( - namespaces.publish, - ) - self.pull = to_streamed_response_wrapper( - namespaces.pull, - ) - self.rotate_token = to_streamed_response_wrapper( - namespaces.rotate_token, - ) - - -class AsyncNamespacesResourceWithStreamingResponse: - def __init__(self, namespaces: AsyncNamespacesResource) -> None: - self._namespaces = namespaces - - self.create = async_to_streamed_response_wrapper( - namespaces.create, - ) - self.retrieve = async_to_streamed_response_wrapper( - namespaces.retrieve, - ) - self.list = async_to_streamed_response_wrapper( - namespaces.list, - ) - self.delete = async_to_streamed_response_wrapper( - namespaces.delete, - ) - self.publish = async_to_streamed_response_wrapper( - namespaces.publish, - ) - self.pull = async_to_streamed_response_wrapper( - namespaces.pull, - ) - self.rotate_token = async_to_streamed_response_wrapper( - namespaces.rotate_token, - ) diff --git a/src/casedev/resources/agent/skills/skills.py b/src/casedev/resources/agent/skills/skills.py deleted file mode 100644 index 419c300f..00000000 --- a/src/casedev/resources/agent/skills/skills.py +++ /dev/null @@ -1,120 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from ...._compat import cached_property -from .namespaces import ( - NamespacesResource, - AsyncNamespacesResource, - NamespacesResourceWithRawResponse, - AsyncNamespacesResourceWithRawResponse, - NamespacesResourceWithStreamingResponse, - AsyncNamespacesResourceWithStreamingResponse, -) -from ...._resource import SyncAPIResource, AsyncAPIResource - -__all__ = ["SkillsResource", "AsyncSkillsResource"] - - -class SkillsResource(SyncAPIResource): - @cached_property - def namespaces(self) -> NamespacesResource: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return NamespacesResource(self._client) - - @cached_property - def with_raw_response(self) -> SkillsResourceWithRawResponse: - """ - 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/CaseMark/casedev-python#accessing-raw-response-data-eg-headers - """ - return SkillsResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> SkillsResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/CaseMark/casedev-python#with_streaming_response - """ - return SkillsResourceWithStreamingResponse(self) - - -class AsyncSkillsResource(AsyncAPIResource): - @cached_property - def namespaces(self) -> AsyncNamespacesResource: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return AsyncNamespacesResource(self._client) - - @cached_property - def with_raw_response(self) -> AsyncSkillsResourceWithRawResponse: - """ - 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/CaseMark/casedev-python#accessing-raw-response-data-eg-headers - """ - return AsyncSkillsResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> AsyncSkillsResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/CaseMark/casedev-python#with_streaming_response - """ - return AsyncSkillsResourceWithStreamingResponse(self) - - -class SkillsResourceWithRawResponse: - def __init__(self, skills: SkillsResource) -> None: - self._skills = skills - - @cached_property - def namespaces(self) -> NamespacesResourceWithRawResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return NamespacesResourceWithRawResponse(self._skills.namespaces) - - -class AsyncSkillsResourceWithRawResponse: - def __init__(self, skills: AsyncSkillsResource) -> None: - self._skills = skills - - @cached_property - def namespaces(self) -> AsyncNamespacesResourceWithRawResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return AsyncNamespacesResourceWithRawResponse(self._skills.namespaces) - - -class SkillsResourceWithStreamingResponse: - def __init__(self, skills: SkillsResource) -> None: - self._skills = skills - - @cached_property - def namespaces(self) -> NamespacesResourceWithStreamingResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return NamespacesResourceWithStreamingResponse(self._skills.namespaces) - - -class AsyncSkillsResourceWithStreamingResponse: - def __init__(self, skills: AsyncSkillsResource) -> None: - self._skills = skills - - @cached_property - def namespaces(self) -> AsyncNamespacesResourceWithStreamingResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return AsyncNamespacesResourceWithStreamingResponse(self._skills.namespaces) diff --git a/src/casedev/resources/agent/v1/__init__.py b/src/casedev/resources/agent/v1/__init__.py index ea57a9ca..1c3608c6 100644 --- a/src/casedev/resources/agent/v1/__init__.py +++ b/src/casedev/resources/agent/v1/__init__.py @@ -16,14 +16,6 @@ RunResourceWithStreamingResponse, AsyncRunResourceWithStreamingResponse, ) -from .chat import ( - ChatResource, - AsyncChatResource, - ChatResourceWithRawResponse, - AsyncChatResourceWithRawResponse, - ChatResourceWithStreamingResponse, - AsyncChatResourceWithStreamingResponse, -) from .agents import ( AgentsResource, AsyncAgentsResource, @@ -60,12 +52,6 @@ "AsyncExecuteResourceWithRawResponse", "ExecuteResourceWithStreamingResponse", "AsyncExecuteResourceWithStreamingResponse", - "ChatResource", - "AsyncChatResource", - "ChatResourceWithRawResponse", - "AsyncChatResourceWithRawResponse", - "ChatResourceWithStreamingResponse", - "AsyncChatResourceWithStreamingResponse", "V1Resource", "AsyncV1Resource", "V1ResourceWithRawResponse", diff --git a/src/casedev/resources/agent/v1/chat/__init__.py b/src/casedev/resources/agent/v1/chat/__init__.py deleted file mode 100644 index 478e511e..00000000 --- a/src/casedev/resources/agent/v1/chat/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from .chat import ( - ChatResource, - AsyncChatResource, - ChatResourceWithRawResponse, - AsyncChatResourceWithRawResponse, - ChatResourceWithStreamingResponse, - AsyncChatResourceWithStreamingResponse, -) -from .files import ( - FilesResource, - AsyncFilesResource, - FilesResourceWithRawResponse, - AsyncFilesResourceWithRawResponse, - FilesResourceWithStreamingResponse, - AsyncFilesResourceWithStreamingResponse, -) - -__all__ = [ - "FilesResource", - "AsyncFilesResource", - "FilesResourceWithRawResponse", - "AsyncFilesResourceWithRawResponse", - "FilesResourceWithStreamingResponse", - "AsyncFilesResourceWithStreamingResponse", - "ChatResource", - "AsyncChatResource", - "ChatResourceWithRawResponse", - "AsyncChatResourceWithRawResponse", - "ChatResourceWithStreamingResponse", - "AsyncChatResourceWithStreamingResponse", -] diff --git a/src/casedev/resources/agent/v1/chat/chat.py b/src/casedev/resources/agent/v1/chat/chat.py deleted file mode 100644 index 9e2057df..00000000 --- a/src/casedev/resources/agent/v1/chat/chat.py +++ /dev/null @@ -1,868 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Iterable, Optional - -import httpx - -from .files import ( - FilesResource, - AsyncFilesResource, - FilesResourceWithRawResponse, - AsyncFilesResourceWithRawResponse, - FilesResourceWithStreamingResponse, - AsyncFilesResourceWithStreamingResponse, -) -from ....._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import path_template, maybe_transform, async_maybe_transform -from ....._compat import cached_property -from ....._resource import SyncAPIResource, AsyncAPIResource -from ....._response import ( - to_raw_response_wrapper, - to_streamed_response_wrapper, - async_to_raw_response_wrapper, - async_to_streamed_response_wrapper, -) -from ....._streaming import Stream, AsyncStream -from ....._base_client import make_request_options -from .....types.agent.v1 import ( - chat_create_params, - chat_stream_params, - chat_respond_params, - chat_send_message_params, - chat_reply_to_question_params, -) -from .....types.agent.v1.chat_cancel_response import ChatCancelResponse -from .....types.agent.v1.chat_create_response import ChatCreateResponse -from .....types.agent.v1.chat_delete_response import ChatDeleteResponse -from .....types.agent.v1.chat_stream_response import ChatStreamResponse -from .....types.agent.v1.chat_respond_response import ChatRespondResponse - -__all__ = ["ChatResource", "AsyncChatResource"] - - -class ChatResource(SyncAPIResource): - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - - @cached_property - def files(self) -> FilesResource: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return FilesResource(self._client) - - @cached_property - def with_raw_response(self) -> ChatResourceWithRawResponse: - """ - 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/CaseMark/casedev-python#accessing-raw-response-data-eg-headers - """ - return ChatResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> ChatResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/CaseMark/casedev-python#with_streaming_response - """ - return ChatResourceWithStreamingResponse(self) - - def create( - self, - *, - idle_timeout_ms: Optional[int] | Omit = omit, - model: Optional[str] | Omit = omit, - title: str | Omit = omit, - vault_ids: Optional[SequenceNotStr[str]] | 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, - ) -> ChatCreateResponse: - """Creates a persistent chat session backed by a Daytona or Vercel runtime. - - Session - state is retained and can be resumed or recovered across requests. - - Args: - idle_timeout_ms: Idle timeout before session is eligible for snapshot/termination. Defaults to 15 - minutes. - - model: Optional model override for the chat runtime session - - title: Optional human-readable session title - - vault_ids: Restrict the chat session to specific vault IDs - - 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._post( - "/agent/v1/chat", - body=maybe_transform( - { - "idle_timeout_ms": idle_timeout_ms, - "model": model, - "title": title, - "vault_ids": vault_ids, - }, - chat_create_params.ChatCreateParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=ChatCreateResponse, - ) - - def delete( - self, - 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, - ) -> ChatDeleteResponse: - """ - Snapshots and terminates the active sandbox (if any), then marks the chat as - ended. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - return self._delete( - path_template("/agent/v1/chat/{id}", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=ChatDeleteResponse, - ) - - def cancel( - self, - 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, - ) -> ChatCancelResponse: - """ - Aborts the active generation for this chat session. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - return self._post( - path_template("/agent/v1/chat/{id}/cancel", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=ChatCancelResponse, - ) - - def reply_to_question( - self, - request_id: str, - *, - id: str, - answers: Iterable[SequenceNotStr[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: - """ - Answers a pending runtime question for the chat session bound to this agent - chat. - - Args: - answers: Answer selections for each prompt element in the pending question - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - if not request_id: - raise ValueError(f"Expected a non-empty value for `request_id` but received {request_id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._post( - path_template("/agent/v1/chat/{id}/question/{request_id}/reply", id=id, request_id=request_id), - body=maybe_transform({"answers": answers}, chat_reply_to_question_params.ChatReplyToQuestionParams), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - def respond( - self, - id: str, - *, - parts: Iterable[chat_respond_params.Part] | 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, - ) -> Stream[ChatRespondResponse]: - """ - Streams a single assistant turn as normalized SSE events with stable turn, - message, and part IDs. Emits events: `turn.started`, `turn.status`, - `message.created`, `message.part.updated`, `message.completed`, `session.usage`, - `turn.completed`. - - **When to use this endpoint:** Recommended for building custom chat UIs that - need real-time streaming progress. This is the primary streaming endpoint for - new integrations. - - **Alternatives:** - - - `POST /chat/:id/message` — synchronous, returns complete response as JSON - (best for server-to-server) - - Args: - parts: Message content parts. Currently only "text" type is supported. Additional types - (e.g. file, image) may be added in future versions. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})} - return self._post( - path_template("/agent/v1/chat/{id}/respond", id=id), - body=maybe_transform({"parts": parts}, chat_respond_params.ChatRespondParams), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=str, - stream=True, - stream_cls=Stream[ChatRespondResponse], - ) - - def send_message( - self, - id: str, - *, - parts: Iterable[chat_send_message_params.Part] | 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, - ) -> None: - """Sends a message and returns the complete response as a single JSON body. - - Blocks - until the agent turn completes. - - **When to use this endpoint:** Best for server-to-server integrations, - background processing, or any context where you want the full response in one - call without managing an SSE stream. - - **Alternatives:** - - - `POST /chat/:id/respond` — streaming SSE with normalized events (recommended - for custom chat UIs) - - Args: - parts: Message content parts. Currently only "text" type is supported. Additional types - (e.g. file, image) may be added in future versions. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._post( - path_template("/agent/v1/chat/{id}/message", id=id), - body=maybe_transform({"parts": parts}, chat_send_message_params.ChatSendMessageParams), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - def stream( - self, - id: str, - *, - last_event_id: int | 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, - ) -> Stream[ChatStreamResponse]: - """Relays runtime SSE events for this chat. - - Supports replay from buffered events - using Last-Event-ID. - - Args: - last_event_id: Replay events after this sequence number - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})} - return self._get( - path_template("/agent/v1/chat/{id}/stream", id=id), - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - query=maybe_transform({"last_event_id": last_event_id}, chat_stream_params.ChatStreamParams), - ), - cast_to=str, - stream=True, - stream_cls=Stream[ChatStreamResponse], - ) - - -class AsyncChatResource(AsyncAPIResource): - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - - @cached_property - def files(self) -> AsyncFilesResource: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return AsyncFilesResource(self._client) - - @cached_property - def with_raw_response(self) -> AsyncChatResourceWithRawResponse: - """ - 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/CaseMark/casedev-python#accessing-raw-response-data-eg-headers - """ - return AsyncChatResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> AsyncChatResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/CaseMark/casedev-python#with_streaming_response - """ - return AsyncChatResourceWithStreamingResponse(self) - - async def create( - self, - *, - idle_timeout_ms: Optional[int] | Omit = omit, - model: Optional[str] | Omit = omit, - title: str | Omit = omit, - vault_ids: Optional[SequenceNotStr[str]] | 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, - ) -> ChatCreateResponse: - """Creates a persistent chat session backed by a Daytona or Vercel runtime. - - Session - state is retained and can be resumed or recovered across requests. - - Args: - idle_timeout_ms: Idle timeout before session is eligible for snapshot/termination. Defaults to 15 - minutes. - - model: Optional model override for the chat runtime session - - title: Optional human-readable session title - - vault_ids: Restrict the chat session to specific vault IDs - - 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 await self._post( - "/agent/v1/chat", - body=await async_maybe_transform( - { - "idle_timeout_ms": idle_timeout_ms, - "model": model, - "title": title, - "vault_ids": vault_ids, - }, - chat_create_params.ChatCreateParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=ChatCreateResponse, - ) - - async def delete( - self, - 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, - ) -> ChatDeleteResponse: - """ - Snapshots and terminates the active sandbox (if any), then marks the chat as - ended. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - return await self._delete( - path_template("/agent/v1/chat/{id}", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=ChatDeleteResponse, - ) - - async def cancel( - self, - 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, - ) -> ChatCancelResponse: - """ - Aborts the active generation for this chat session. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - return await self._post( - path_template("/agent/v1/chat/{id}/cancel", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=ChatCancelResponse, - ) - - async def reply_to_question( - self, - request_id: str, - *, - id: str, - answers: Iterable[SequenceNotStr[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: - """ - Answers a pending runtime question for the chat session bound to this agent - chat. - - Args: - answers: Answer selections for each prompt element in the pending question - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - if not request_id: - raise ValueError(f"Expected a non-empty value for `request_id` but received {request_id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._post( - path_template("/agent/v1/chat/{id}/question/{request_id}/reply", id=id, request_id=request_id), - body=await async_maybe_transform( - {"answers": answers}, chat_reply_to_question_params.ChatReplyToQuestionParams - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - async def respond( - self, - id: str, - *, - parts: Iterable[chat_respond_params.Part] | 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, - ) -> AsyncStream[ChatRespondResponse]: - """ - Streams a single assistant turn as normalized SSE events with stable turn, - message, and part IDs. Emits events: `turn.started`, `turn.status`, - `message.created`, `message.part.updated`, `message.completed`, `session.usage`, - `turn.completed`. - - **When to use this endpoint:** Recommended for building custom chat UIs that - need real-time streaming progress. This is the primary streaming endpoint for - new integrations. - - **Alternatives:** - - - `POST /chat/:id/message` — synchronous, returns complete response as JSON - (best for server-to-server) - - Args: - parts: Message content parts. Currently only "text" type is supported. Additional types - (e.g. file, image) may be added in future versions. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})} - return await self._post( - path_template("/agent/v1/chat/{id}/respond", id=id), - body=await async_maybe_transform({"parts": parts}, chat_respond_params.ChatRespondParams), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=str, - stream=True, - stream_cls=AsyncStream[ChatRespondResponse], - ) - - async def send_message( - self, - id: str, - *, - parts: Iterable[chat_send_message_params.Part] | 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, - ) -> None: - """Sends a message and returns the complete response as a single JSON body. - - Blocks - until the agent turn completes. - - **When to use this endpoint:** Best for server-to-server integrations, - background processing, or any context where you want the full response in one - call without managing an SSE stream. - - **Alternatives:** - - - `POST /chat/:id/respond` — streaming SSE with normalized events (recommended - for custom chat UIs) - - Args: - parts: Message content parts. Currently only "text" type is supported. Additional types - (e.g. file, image) may be added in future versions. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._post( - path_template("/agent/v1/chat/{id}/message", id=id), - body=await async_maybe_transform({"parts": parts}, chat_send_message_params.ChatSendMessageParams), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - async def stream( - self, - id: str, - *, - last_event_id: int | 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, - ) -> AsyncStream[ChatStreamResponse]: - """Relays runtime SSE events for this chat. - - Supports replay from buffered events - using Last-Event-ID. - - Args: - last_event_id: Replay events after this sequence number - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})} - return await self._get( - path_template("/agent/v1/chat/{id}/stream", id=id), - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - query=await async_maybe_transform( - {"last_event_id": last_event_id}, chat_stream_params.ChatStreamParams - ), - ), - cast_to=str, - stream=True, - stream_cls=AsyncStream[ChatStreamResponse], - ) - - -class ChatResourceWithRawResponse: - def __init__(self, chat: ChatResource) -> None: - self._chat = chat - - self.create = to_raw_response_wrapper( - chat.create, - ) - self.delete = to_raw_response_wrapper( - chat.delete, - ) - self.cancel = to_raw_response_wrapper( - chat.cancel, - ) - self.reply_to_question = to_raw_response_wrapper( - chat.reply_to_question, - ) - self.respond = to_raw_response_wrapper( - chat.respond, - ) - self.send_message = to_raw_response_wrapper( - chat.send_message, - ) - self.stream = to_raw_response_wrapper( - chat.stream, - ) - - @cached_property - def files(self) -> FilesResourceWithRawResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return FilesResourceWithRawResponse(self._chat.files) - - -class AsyncChatResourceWithRawResponse: - def __init__(self, chat: AsyncChatResource) -> None: - self._chat = chat - - self.create = async_to_raw_response_wrapper( - chat.create, - ) - self.delete = async_to_raw_response_wrapper( - chat.delete, - ) - self.cancel = async_to_raw_response_wrapper( - chat.cancel, - ) - self.reply_to_question = async_to_raw_response_wrapper( - chat.reply_to_question, - ) - self.respond = async_to_raw_response_wrapper( - chat.respond, - ) - self.send_message = async_to_raw_response_wrapper( - chat.send_message, - ) - self.stream = async_to_raw_response_wrapper( - chat.stream, - ) - - @cached_property - def files(self) -> AsyncFilesResourceWithRawResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return AsyncFilesResourceWithRawResponse(self._chat.files) - - -class ChatResourceWithStreamingResponse: - def __init__(self, chat: ChatResource) -> None: - self._chat = chat - - self.create = to_streamed_response_wrapper( - chat.create, - ) - self.delete = to_streamed_response_wrapper( - chat.delete, - ) - self.cancel = to_streamed_response_wrapper( - chat.cancel, - ) - self.reply_to_question = to_streamed_response_wrapper( - chat.reply_to_question, - ) - self.respond = to_streamed_response_wrapper( - chat.respond, - ) - self.send_message = to_streamed_response_wrapper( - chat.send_message, - ) - self.stream = to_streamed_response_wrapper( - chat.stream, - ) - - @cached_property - def files(self) -> FilesResourceWithStreamingResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return FilesResourceWithStreamingResponse(self._chat.files) - - -class AsyncChatResourceWithStreamingResponse: - def __init__(self, chat: AsyncChatResource) -> None: - self._chat = chat - - self.create = async_to_streamed_response_wrapper( - chat.create, - ) - self.delete = async_to_streamed_response_wrapper( - chat.delete, - ) - self.cancel = async_to_streamed_response_wrapper( - chat.cancel, - ) - self.reply_to_question = async_to_streamed_response_wrapper( - chat.reply_to_question, - ) - self.respond = async_to_streamed_response_wrapper( - chat.respond, - ) - self.send_message = async_to_streamed_response_wrapper( - chat.send_message, - ) - self.stream = async_to_streamed_response_wrapper( - chat.stream, - ) - - @cached_property - def files(self) -> AsyncFilesResourceWithStreamingResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return AsyncFilesResourceWithStreamingResponse(self._chat.files) diff --git a/src/casedev/resources/agent/v1/chat/files.py b/src/casedev/resources/agent/v1/chat/files.py deleted file mode 100644 index 21eecdba..00000000 --- a/src/casedev/resources/agent/v1/chat/files.py +++ /dev/null @@ -1,278 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -import httpx - -from ....._types import Body, Query, Headers, NotGiven, not_given -from ....._utils import path_template -from ....._compat import cached_property -from ....._resource import SyncAPIResource, AsyncAPIResource -from ....._response import ( - BinaryAPIResponse, - AsyncBinaryAPIResponse, - StreamedBinaryAPIResponse, - AsyncStreamedBinaryAPIResponse, - to_raw_response_wrapper, - to_streamed_response_wrapper, - async_to_raw_response_wrapper, - to_custom_raw_response_wrapper, - async_to_streamed_response_wrapper, - to_custom_streamed_response_wrapper, - async_to_custom_raw_response_wrapper, - async_to_custom_streamed_response_wrapper, -) -from ....._base_client import make_request_options -from .....types.agent.v1.chat.file_list_response import FileListResponse - -__all__ = ["FilesResource", "AsyncFilesResource"] - - -class FilesResource(SyncAPIResource): - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - - @cached_property - def with_raw_response(self) -> FilesResourceWithRawResponse: - """ - 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/CaseMark/casedev-python#accessing-raw-response-data-eg-headers - """ - return FilesResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> FilesResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/CaseMark/casedev-python#with_streaming_response - """ - return FilesResourceWithStreamingResponse(self) - - def list( - self, - 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, - ) -> FileListResponse: - """Lists files created by the agent in the sandbox workspace. - - Only available while - the sandbox is running. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - return self._get( - path_template("/agent/v1/chat/{id}/files", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=FileListResponse, - ) - - def download( - self, - file_path: str, - *, - 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, - ) -> BinaryAPIResponse: - """Downloads a file from the sandbox workspace by path. - - Only available while the - sandbox is running. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - if not file_path: - raise ValueError(f"Expected a non-empty value for `file_path` but received {file_path!r}") - extra_headers = {"Accept": "application/octet-stream", **(extra_headers or {})} - return self._get( - path_template("/agent/v1/chat/{id}/files/{file_path}", id=id, file_path=file_path), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=BinaryAPIResponse, - ) - - -class AsyncFilesResource(AsyncAPIResource): - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - - @cached_property - def with_raw_response(self) -> AsyncFilesResourceWithRawResponse: - """ - 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/CaseMark/casedev-python#accessing-raw-response-data-eg-headers - """ - return AsyncFilesResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> AsyncFilesResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/CaseMark/casedev-python#with_streaming_response - """ - return AsyncFilesResourceWithStreamingResponse(self) - - async def list( - self, - 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, - ) -> FileListResponse: - """Lists files created by the agent in the sandbox workspace. - - Only available while - the sandbox is running. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - return await self._get( - path_template("/agent/v1/chat/{id}/files", id=id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=FileListResponse, - ) - - async def download( - self, - file_path: str, - *, - 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, - ) -> AsyncBinaryAPIResponse: - """Downloads a file from the sandbox workspace by path. - - Only available while the - sandbox is running. - - 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 id: - raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") - if not file_path: - raise ValueError(f"Expected a non-empty value for `file_path` but received {file_path!r}") - extra_headers = {"Accept": "application/octet-stream", **(extra_headers or {})} - return await self._get( - path_template("/agent/v1/chat/{id}/files/{file_path}", id=id, file_path=file_path), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=AsyncBinaryAPIResponse, - ) - - -class FilesResourceWithRawResponse: - def __init__(self, files: FilesResource) -> None: - self._files = files - - self.list = to_raw_response_wrapper( - files.list, - ) - self.download = to_custom_raw_response_wrapper( - files.download, - BinaryAPIResponse, - ) - - -class AsyncFilesResourceWithRawResponse: - def __init__(self, files: AsyncFilesResource) -> None: - self._files = files - - self.list = async_to_raw_response_wrapper( - files.list, - ) - self.download = async_to_custom_raw_response_wrapper( - files.download, - AsyncBinaryAPIResponse, - ) - - -class FilesResourceWithStreamingResponse: - def __init__(self, files: FilesResource) -> None: - self._files = files - - self.list = to_streamed_response_wrapper( - files.list, - ) - self.download = to_custom_streamed_response_wrapper( - files.download, - StreamedBinaryAPIResponse, - ) - - -class AsyncFilesResourceWithStreamingResponse: - def __init__(self, files: AsyncFilesResource) -> None: - self._files = files - - self.list = async_to_streamed_response_wrapper( - files.list, - ) - self.download = async_to_custom_streamed_response_wrapper( - files.download, - AsyncStreamedBinaryAPIResponse, - ) diff --git a/src/casedev/resources/agent/v1/v1.py b/src/casedev/resources/agent/v1/v1.py index c27f5ab3..5d84bf0b 100644 --- a/src/casedev/resources/agent/v1/v1.py +++ b/src/casedev/resources/agent/v1/v1.py @@ -26,14 +26,6 @@ ExecuteResourceWithStreamingResponse, AsyncExecuteResourceWithStreamingResponse, ) -from .chat.chat import ( - ChatResource, - AsyncChatResource, - ChatResourceWithRawResponse, - AsyncChatResourceWithRawResponse, - ChatResourceWithStreamingResponse, - AsyncChatResourceWithStreamingResponse, -) from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource @@ -62,13 +54,6 @@ def execute(self) -> ExecuteResource: """ return ExecuteResource(self._client) - @cached_property - def chat(self) -> ChatResource: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return ChatResource(self._client) - @cached_property def with_raw_response(self) -> V1ResourceWithRawResponse: """ @@ -111,13 +96,6 @@ def execute(self) -> AsyncExecuteResource: """ return AsyncExecuteResource(self._client) - @cached_property - def chat(self) -> AsyncChatResource: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return AsyncChatResource(self._client) - @cached_property def with_raw_response(self) -> AsyncV1ResourceWithRawResponse: """ @@ -163,13 +141,6 @@ def execute(self) -> ExecuteResourceWithRawResponse: """ return ExecuteResourceWithRawResponse(self._v1.execute) - @cached_property - def chat(self) -> ChatResourceWithRawResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return ChatResourceWithRawResponse(self._v1.chat) - class AsyncV1ResourceWithRawResponse: def __init__(self, v1: AsyncV1Resource) -> None: @@ -196,13 +167,6 @@ def execute(self) -> AsyncExecuteResourceWithRawResponse: """ return AsyncExecuteResourceWithRawResponse(self._v1.execute) - @cached_property - def chat(self) -> AsyncChatResourceWithRawResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return AsyncChatResourceWithRawResponse(self._v1.chat) - class V1ResourceWithStreamingResponse: def __init__(self, v1: V1Resource) -> None: @@ -229,13 +193,6 @@ def execute(self) -> ExecuteResourceWithStreamingResponse: """ return ExecuteResourceWithStreamingResponse(self._v1.execute) - @cached_property - def chat(self) -> ChatResourceWithStreamingResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return ChatResourceWithStreamingResponse(self._v1.chat) - class AsyncV1ResourceWithStreamingResponse: def __init__(self, v1: AsyncV1Resource) -> None: @@ -261,10 +218,3 @@ def execute(self) -> AsyncExecuteResourceWithStreamingResponse: Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows """ return AsyncExecuteResourceWithStreamingResponse(self._v1.execute) - - @cached_property - def chat(self) -> AsyncChatResourceWithStreamingResponse: - """ - Create, manage, and execute AI agents with tool access, sandbox environments, and async run workflows - """ - return AsyncChatResourceWithStreamingResponse(self._v1.chat) diff --git a/src/casedev/resources/skills/skills.py b/src/casedev/resources/skills/skills.py index 170390dc..2b01b62e 100644 --- a/src/casedev/resources/skills/skills.py +++ b/src/casedev/resources/skills/skills.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Optional +from typing import Iterable, Optional import httpx @@ -14,7 +14,7 @@ CustomResourceWithStreamingResponse, AsyncCustomResourceWithStreamingResponse, ) -from ...types import skill_create_params, skill_update_params, skill_resolve_params +from ...types import skill_create_params, skill_export_params, skill_update_params, skill_resolve_params from ..._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property @@ -29,6 +29,7 @@ from ...types.skill_read_response import SkillReadResponse from ...types.skill_create_response import SkillCreateResponse from ...types.skill_delete_response import SkillDeleteResponse +from ...types.skill_export_response import SkillExportResponse from ...types.skill_update_response import SkillUpdateResponse from ...types.skill_resolve_response import SkillResolveResponse @@ -67,6 +68,7 @@ def create( *, content: str, name: str, + files: Iterable[skill_create_params.File] | Omit = omit, metadata: object | Omit = omit, slug: str | Omit = omit, summary: str | Omit = omit, @@ -88,6 +90,9 @@ def create( name: Skill name + files: Optional bundled companion files installed alongside the skill as / + in sandbox skill directories. + metadata: Arbitrary metadata (author, license, etc.) slug: URL-safe slug. Auto-generated from name if omitted. @@ -110,6 +115,7 @@ def create( { "content": content, "name": name, + "files": files, "metadata": metadata, "slug": slug, "summary": summary, @@ -128,6 +134,7 @@ def update( path_slug: str, *, content: str | Omit = omit, + files: Optional[Iterable[skill_update_params.File]] | Omit = omit, metadata: object | Omit = omit, name: str | Omit = omit, body_slug: str | Omit = omit, @@ -146,6 +153,9 @@ def update( Version is auto-incremented. Args: + files: Optional replacement companion file tree. Omit to leave existing bundled files + unchanged; send [] to remove bundled files. + body_slug: New slug (renames the skill) extra_headers: Send extra headers @@ -163,6 +173,7 @@ def update( body=maybe_transform( { "content": content, + "files": files, "metadata": metadata, "name": name, "body_slug": body_slug, @@ -212,6 +223,48 @@ def delete( cast_to=SkillDeleteResponse, ) + def export( + self, + slug: str, + *, + target: str | 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, + ) -> SkillExportResponse: + """ + Export a skill as an installable filesystem tree for sandbox runtimes. + Authenticated org-scoped custom skills are resolved before curated skills. + + Args: + target: Agent runtime skill directory convention to export for. Most callers should omit + this and pass skillSlugs when creating a runtime. + + 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 slug: + raise ValueError(f"Expected a non-empty value for `slug` but received {slug!r}") + return self._get( + path_template("/skills/{slug}/export", slug=slug), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform({"target": target}, skill_export_params.SkillExportParams), + ), + cast_to=SkillExportResponse, + ) + def read( self, slug: str, @@ -327,6 +380,7 @@ async def create( *, content: str, name: str, + files: Iterable[skill_create_params.File] | Omit = omit, metadata: object | Omit = omit, slug: str | Omit = omit, summary: str | Omit = omit, @@ -348,6 +402,9 @@ async def create( name: Skill name + files: Optional bundled companion files installed alongside the skill as / + in sandbox skill directories. + metadata: Arbitrary metadata (author, license, etc.) slug: URL-safe slug. Auto-generated from name if omitted. @@ -370,6 +427,7 @@ async def create( { "content": content, "name": name, + "files": files, "metadata": metadata, "slug": slug, "summary": summary, @@ -388,6 +446,7 @@ async def update( path_slug: str, *, content: str | Omit = omit, + files: Optional[Iterable[skill_update_params.File]] | Omit = omit, metadata: object | Omit = omit, name: str | Omit = omit, body_slug: str | Omit = omit, @@ -406,6 +465,9 @@ async def update( Version is auto-incremented. Args: + files: Optional replacement companion file tree. Omit to leave existing bundled files + unchanged; send [] to remove bundled files. + body_slug: New slug (renames the skill) extra_headers: Send extra headers @@ -423,6 +485,7 @@ async def update( body=await async_maybe_transform( { "content": content, + "files": files, "metadata": metadata, "name": name, "body_slug": body_slug, @@ -472,6 +535,48 @@ async def delete( cast_to=SkillDeleteResponse, ) + async def export( + self, + slug: str, + *, + target: str | 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, + ) -> SkillExportResponse: + """ + Export a skill as an installable filesystem tree for sandbox runtimes. + Authenticated org-scoped custom skills are resolved before curated skills. + + Args: + target: Agent runtime skill directory convention to export for. Most callers should omit + this and pass skillSlugs when creating a runtime. + + 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 slug: + raise ValueError(f"Expected a non-empty value for `slug` but received {slug!r}") + return await self._get( + path_template("/skills/{slug}/export", slug=slug), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform({"target": target}, skill_export_params.SkillExportParams), + ), + cast_to=SkillExportResponse, + ) + async def read( self, slug: str, @@ -568,6 +673,9 @@ def __init__(self, skills: SkillsResource) -> None: self.delete = to_raw_response_wrapper( skills.delete, ) + self.export = to_raw_response_wrapper( + skills.export, + ) self.read = to_raw_response_wrapper( skills.read, ) @@ -594,6 +702,9 @@ def __init__(self, skills: AsyncSkillsResource) -> None: self.delete = async_to_raw_response_wrapper( skills.delete, ) + self.export = async_to_raw_response_wrapper( + skills.export, + ) self.read = async_to_raw_response_wrapper( skills.read, ) @@ -620,6 +731,9 @@ def __init__(self, skills: SkillsResource) -> None: self.delete = to_streamed_response_wrapper( skills.delete, ) + self.export = to_streamed_response_wrapper( + skills.export, + ) self.read = to_streamed_response_wrapper( skills.read, ) @@ -646,6 +760,9 @@ def __init__(self, skills: AsyncSkillsResource) -> None: self.delete = async_to_streamed_response_wrapper( skills.delete, ) + self.export = async_to_streamed_response_wrapper( + skills.export, + ) self.read = async_to_streamed_response_wrapper( skills.read, ) diff --git a/src/casedev/types/__init__.py b/src/casedev/types/__init__.py index 920e3f7e..5776e376 100644 --- a/src/casedev/types/__init__.py +++ b/src/casedev/types/__init__.py @@ -3,6 +3,7 @@ from __future__ import annotations from .skill_create_params import SkillCreateParams as SkillCreateParams +from .skill_export_params import SkillExportParams as SkillExportParams from .skill_read_response import SkillReadResponse as SkillReadResponse from .skill_update_params import SkillUpdateParams as SkillUpdateParams from .vault_create_params import VaultCreateParams as VaultCreateParams @@ -14,6 +15,7 @@ from .skill_resolve_params import SkillResolveParams as SkillResolveParams from .skill_create_response import SkillCreateResponse as SkillCreateResponse from .skill_delete_response import SkillDeleteResponse as SkillDeleteResponse +from .skill_export_response import SkillExportResponse as SkillExportResponse from .skill_update_response import SkillUpdateResponse as SkillUpdateResponse from .vault_create_response import VaultCreateResponse as VaultCreateResponse from .vault_delete_response import VaultDeleteResponse as VaultDeleteResponse diff --git a/src/casedev/types/agent/skills/__init__.py b/src/casedev/types/agent/skills/__init__.py deleted file mode 100644 index cdcf98d1..00000000 --- a/src/casedev/types/agent/skills/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from .namespace_create_params import NamespaceCreateParams as NamespaceCreateParams -from .namespace_publish_params import NamespacePublishParams as NamespacePublishParams diff --git a/src/casedev/types/agent/skills/namespace_create_params.py b/src/casedev/types/agent/skills/namespace_create_params.py deleted file mode 100644 index 0fc3889c..00000000 --- a/src/casedev/types/agent/skills/namespace_create_params.py +++ /dev/null @@ -1,25 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Optional -from typing_extensions import Required, Annotated, TypedDict - -from ...._utils import PropertyInfo - -__all__ = ["NamespaceCreateParams"] - - -class NamespaceCreateParams(TypedDict, total=False): - namespace_id: Required[Annotated[str, PropertyInfo(alias="namespaceId")]] - """URL-safe slug, e.g. - - "curi" or "client-firm-abc". Lowercase alphanumeric with single hyphens, 2-64 - chars. - """ - - description: Optional[str] - - label: Optional[str] - - metadata: Optional[object] diff --git a/src/casedev/types/agent/skills/namespace_publish_params.py b/src/casedev/types/agent/skills/namespace_publish_params.py deleted file mode 100644 index 49bb3963..00000000 --- a/src/casedev/types/agent/skills/namespace_publish_params.py +++ /dev/null @@ -1,24 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Iterable, Optional -from typing_extensions import Literal, Required, Annotated, TypedDict - -from ...._utils import PropertyInfo - -__all__ = ["NamespacePublishParams", "File"] - - -class NamespacePublishParams(TypedDict, total=False): - files: Required[Iterable[File]] - - -class File(TypedDict, total=False): - content: Required[str] - - encoding: Required[Literal["utf8", "base64"]] - - path: Required[str] - - content_type: Annotated[Optional[str], PropertyInfo(alias="contentType")] diff --git a/src/casedev/types/agent/v1/__init__.py b/src/casedev/types/agent/v1/__init__.py index 77f2f481..0945cf54 100644 --- a/src/casedev/types/agent/v1/__init__.py +++ b/src/casedev/types/agent/v1/__init__.py @@ -9,28 +9,18 @@ from .run_events_params import RunEventsParams as RunEventsParams from .run_exec_response import RunExecResponse as RunExecResponse from .run_list_response import RunListResponse as RunListResponse -from .chat_create_params import ChatCreateParams as ChatCreateParams -from .chat_stream_params import ChatStreamParams as ChatStreamParams from .run_watch_response import RunWatchResponse as RunWatchResponse from .agent_create_params import AgentCreateParams as AgentCreateParams from .agent_list_response import AgentListResponse as AgentListResponse from .agent_update_params import AgentUpdateParams as AgentUpdateParams -from .chat_respond_params import ChatRespondParams as ChatRespondParams from .run_cancel_response import RunCancelResponse as RunCancelResponse from .run_create_response import RunCreateResponse as RunCreateResponse from .run_events_response import RunEventsResponse as RunEventsResponse -from .chat_cancel_response import ChatCancelResponse as ChatCancelResponse -from .chat_create_response import ChatCreateResponse as ChatCreateResponse -from .chat_delete_response import ChatDeleteResponse as ChatDeleteResponse -from .chat_stream_response import ChatStreamResponse as ChatStreamResponse from .agent_create_response import AgentCreateResponse as AgentCreateResponse from .agent_delete_response import AgentDeleteResponse as AgentDeleteResponse from .agent_update_response import AgentUpdateResponse as AgentUpdateResponse -from .chat_respond_response import ChatRespondResponse as ChatRespondResponse from .execute_create_params import ExecuteCreateParams as ExecuteCreateParams from .agent_retrieve_response import AgentRetrieveResponse as AgentRetrieveResponse from .execute_create_response import ExecuteCreateResponse as ExecuteCreateResponse from .run_get_status_response import RunGetStatusResponse as RunGetStatusResponse -from .chat_send_message_params import ChatSendMessageParams as ChatSendMessageParams from .run_get_details_response import RunGetDetailsResponse as RunGetDetailsResponse -from .chat_reply_to_question_params import ChatReplyToQuestionParams as ChatReplyToQuestionParams diff --git a/src/casedev/types/agent/v1/chat/__init__.py b/src/casedev/types/agent/v1/chat/__init__.py deleted file mode 100644 index c76b8a61..00000000 --- a/src/casedev/types/agent/v1/chat/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from .file_list_response import FileListResponse as FileListResponse diff --git a/src/casedev/types/agent/v1/chat/file_list_response.py b/src/casedev/types/agent/v1/chat/file_list_response.py deleted file mode 100644 index 27115c8b..00000000 --- a/src/casedev/types/agent/v1/chat/file_list_response.py +++ /dev/null @@ -1,24 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import List, Optional - -from pydantic import Field as FieldInfo - -from ....._models import BaseModel - -__all__ = ["FileListResponse", "File"] - - -class File(BaseModel): - name: Optional[str] = None - - path: Optional[str] = None - """Relative path from /workspace""" - - size_bytes: Optional[int] = FieldInfo(alias="sizeBytes", default=None) - - -class FileListResponse(BaseModel): - chat_id: Optional[str] = FieldInfo(alias="chatId", default=None) - - files: Optional[List[File]] = None diff --git a/src/casedev/types/agent/v1/chat_cancel_response.py b/src/casedev/types/agent/v1/chat_cancel_response.py deleted file mode 100644 index 1dfa540a..00000000 --- a/src/casedev/types/agent/v1/chat_cancel_response.py +++ /dev/null @@ -1,13 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import Optional - -from ...._models import BaseModel - -__all__ = ["ChatCancelResponse"] - - -class ChatCancelResponse(BaseModel): - id: Optional[str] = None - - ok: Optional[bool] = None diff --git a/src/casedev/types/agent/v1/chat_create_params.py b/src/casedev/types/agent/v1/chat_create_params.py deleted file mode 100644 index 1db6914c..00000000 --- a/src/casedev/types/agent/v1/chat_create_params.py +++ /dev/null @@ -1,28 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Optional -from typing_extensions import Annotated, TypedDict - -from ...._types import SequenceNotStr -from ...._utils import PropertyInfo - -__all__ = ["ChatCreateParams"] - - -class ChatCreateParams(TypedDict, total=False): - idle_timeout_ms: Annotated[Optional[int], PropertyInfo(alias="idleTimeoutMs")] - """Idle timeout before session is eligible for snapshot/termination. - - Defaults to 15 minutes. - """ - - model: Optional[str] - """Optional model override for the chat runtime session""" - - title: str - """Optional human-readable session title""" - - vault_ids: Annotated[Optional[SequenceNotStr[str]], PropertyInfo(alias="vaultIds")] - """Restrict the chat session to specific vault IDs""" diff --git a/src/casedev/types/agent/v1/chat_create_response.py b/src/casedev/types/agent/v1/chat_create_response.py deleted file mode 100644 index e0bb127f..00000000 --- a/src/casedev/types/agent/v1/chat_create_response.py +++ /dev/null @@ -1,20 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import Optional -from datetime import datetime - -from pydantic import Field as FieldInfo - -from ...._models import BaseModel - -__all__ = ["ChatCreateResponse"] - - -class ChatCreateResponse(BaseModel): - id: Optional[str] = None - - created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None) - - idle_timeout_ms: Optional[int] = FieldInfo(alias="idleTimeoutMs", default=None) - - status: Optional[str] = None diff --git a/src/casedev/types/agent/v1/chat_delete_response.py b/src/casedev/types/agent/v1/chat_delete_response.py deleted file mode 100644 index a7730697..00000000 --- a/src/casedev/types/agent/v1/chat_delete_response.py +++ /dev/null @@ -1,21 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import Optional - -from pydantic import Field as FieldInfo - -from ...._models import BaseModel - -__all__ = ["ChatDeleteResponse"] - - -class ChatDeleteResponse(BaseModel): - id: Optional[str] = None - - cost: Optional[float] = None - - runtime_ms: Optional[int] = FieldInfo(alias="runtimeMs", default=None) - - snapshot_image_id: Optional[str] = FieldInfo(alias="snapshotImageId", default=None) - - status: Optional[str] = None diff --git a/src/casedev/types/agent/v1/chat_reply_to_question_params.py b/src/casedev/types/agent/v1/chat_reply_to_question_params.py deleted file mode 100644 index 1313b1fd..00000000 --- a/src/casedev/types/agent/v1/chat_reply_to_question_params.py +++ /dev/null @@ -1,17 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Iterable -from typing_extensions import Required, TypedDict - -from ...._types import SequenceNotStr - -__all__ = ["ChatReplyToQuestionParams"] - - -class ChatReplyToQuestionParams(TypedDict, total=False): - id: Required[str] - - answers: Required[Iterable[SequenceNotStr[str]]] - """Answer selections for each prompt element in the pending question""" diff --git a/src/casedev/types/agent/v1/chat_respond_params.py b/src/casedev/types/agent/v1/chat_respond_params.py deleted file mode 100644 index 54e121fb..00000000 --- a/src/casedev/types/agent/v1/chat_respond_params.py +++ /dev/null @@ -1,25 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Iterable -from typing_extensions import Literal, Required, TypedDict - -__all__ = ["ChatRespondParams", "Part"] - - -class ChatRespondParams(TypedDict, total=False): - parts: Iterable[Part] - """Message content parts. - - Currently only "text" type is supported. Additional types (e.g. file, image) may - be added in future versions. - """ - - -class Part(TypedDict, total=False): - text: Required[str] - """The message text content""" - - type: Required[Literal["text"]] - """Part type. Currently only "text" is supported.""" diff --git a/src/casedev/types/agent/v1/chat_respond_response.py b/src/casedev/types/agent/v1/chat_respond_response.py deleted file mode 100644 index cb341f97..00000000 --- a/src/casedev/types/agent/v1/chat_respond_response.py +++ /dev/null @@ -1,7 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing_extensions import TypeAlias - -__all__ = ["ChatRespondResponse"] - -ChatRespondResponse: TypeAlias = str diff --git a/src/casedev/types/agent/v1/chat_send_message_params.py b/src/casedev/types/agent/v1/chat_send_message_params.py deleted file mode 100644 index 547f32e6..00000000 --- a/src/casedev/types/agent/v1/chat_send_message_params.py +++ /dev/null @@ -1,25 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Iterable -from typing_extensions import Literal, Required, TypedDict - -__all__ = ["ChatSendMessageParams", "Part"] - - -class ChatSendMessageParams(TypedDict, total=False): - parts: Iterable[Part] - """Message content parts. - - Currently only "text" type is supported. Additional types (e.g. file, image) may - be added in future versions. - """ - - -class Part(TypedDict, total=False): - text: Required[str] - """The message text content""" - - type: Required[Literal["text"]] - """Part type. Currently only "text" is supported.""" diff --git a/src/casedev/types/agent/v1/chat_stream_params.py b/src/casedev/types/agent/v1/chat_stream_params.py deleted file mode 100644 index 0971ce50..00000000 --- a/src/casedev/types/agent/v1/chat_stream_params.py +++ /dev/null @@ -1,14 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing_extensions import Annotated, TypedDict - -from ...._utils import PropertyInfo - -__all__ = ["ChatStreamParams"] - - -class ChatStreamParams(TypedDict, total=False): - last_event_id: Annotated[int, PropertyInfo(alias="lastEventId")] - """Replay events after this sequence number""" diff --git a/src/casedev/types/agent/v1/chat_stream_response.py b/src/casedev/types/agent/v1/chat_stream_response.py deleted file mode 100644 index dd0223a9..00000000 --- a/src/casedev/types/agent/v1/chat_stream_response.py +++ /dev/null @@ -1,7 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing_extensions import TypeAlias - -__all__ = ["ChatStreamResponse"] - -ChatStreamResponse: TypeAlias = str diff --git a/src/casedev/types/skill_create_params.py b/src/casedev/types/skill_create_params.py index d0e406d0..98283de7 100644 --- a/src/casedev/types/skill_create_params.py +++ b/src/casedev/types/skill_create_params.py @@ -2,11 +2,13 @@ from __future__ import annotations -from typing_extensions import Required, TypedDict +from typing import Iterable +from typing_extensions import Required, Annotated, TypedDict from .._types import SequenceNotStr +from .._utils import PropertyInfo -__all__ = ["SkillCreateParams"] +__all__ = ["SkillCreateParams", "File"] class SkillCreateParams(TypedDict, total=False): @@ -16,6 +18,12 @@ class SkillCreateParams(TypedDict, total=False): name: Required[str] """Skill name""" + files: Iterable[File] + """ + Optional bundled companion files installed alongside the skill as / + in sandbox skill directories. + """ + metadata: object """Arbitrary metadata (author, license, etc.)""" @@ -27,3 +35,23 @@ class SkillCreateParams(TypedDict, total=False): tags: SequenceNotStr[str] """Tags for categorization and search boosting""" + + +class File(TypedDict, total=False): + content: Required[str] + + path: Required[str] + """Relative path inside the skill directory. + + SKILL.md is reserved for the root skill content. + """ + + content_type: Annotated[str, PropertyInfo(alias="contentType")] + + metadata: object + + name: str + + summary: str + + tags: SequenceNotStr[str] diff --git a/src/casedev/types/skill_create_response.py b/src/casedev/types/skill_create_response.py index b5d5c22b..1d254e5b 100644 --- a/src/casedev/types/skill_create_response.py +++ b/src/casedev/types/skill_create_response.py @@ -9,6 +9,8 @@ class SkillCreateResponse(BaseModel): + bundle: Optional[object] = None + content: Optional[str] = None created_at: Optional[datetime] = None diff --git a/src/casedev/types/skill_export_params.py b/src/casedev/types/skill_export_params.py new file mode 100644 index 00000000..ca05db01 --- /dev/null +++ b/src/casedev/types/skill_export_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 TypedDict + +__all__ = ["SkillExportParams"] + + +class SkillExportParams(TypedDict, total=False): + target: str + """Agent runtime skill directory convention to export for. + + Most callers should omit this and pass skillSlugs when creating a runtime. + """ diff --git a/src/casedev/types/skill_export_response.py b/src/casedev/types/skill_export_response.py new file mode 100644 index 00000000..146461ab --- /dev/null +++ b/src/casedev/types/skill_export_response.py @@ -0,0 +1,32 @@ +# 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 + +__all__ = ["SkillExportResponse", "File"] + + +class File(BaseModel): + content: Optional[str] = None + + content_type: Optional[str] = None + + path: Optional[str] = None + + sha256: Optional[str] = None + + size_bytes: Optional[int] = None + + +class SkillExportResponse(BaseModel): + files: Optional[List[File]] = None + + root: Optional[str] = None + + slug: Optional[str] = None + + source: Optional[Literal["custom", "curated"]] = None + + target: Optional[str] = None diff --git a/src/casedev/types/skill_update_params.py b/src/casedev/types/skill_update_params.py index 82a47852..1adebaa6 100644 --- a/src/casedev/types/skill_update_params.py +++ b/src/casedev/types/skill_update_params.py @@ -2,18 +2,24 @@ from __future__ import annotations -from typing import Optional -from typing_extensions import Annotated, TypedDict +from typing import Iterable, Optional +from typing_extensions import Required, Annotated, TypedDict from .._types import SequenceNotStr from .._utils import PropertyInfo -__all__ = ["SkillUpdateParams"] +__all__ = ["SkillUpdateParams", "File"] class SkillUpdateParams(TypedDict, total=False): content: str + files: Optional[Iterable[File]] + """Optional replacement companion file tree. + + Omit to leave existing bundled files unchanged; send [] to remove bundled files. + """ + metadata: object name: str @@ -24,3 +30,19 @@ class SkillUpdateParams(TypedDict, total=False): summary: Optional[str] tags: SequenceNotStr[str] + + +class File(TypedDict, total=False): + content: Required[str] + + path: Required[str] + + content_type: Annotated[str, PropertyInfo(alias="contentType")] + + metadata: object + + name: str + + summary: str + + tags: SequenceNotStr[str] diff --git a/src/casedev/types/skill_update_response.py b/src/casedev/types/skill_update_response.py index 74ad7525..bb503abd 100644 --- a/src/casedev/types/skill_update_response.py +++ b/src/casedev/types/skill_update_response.py @@ -9,6 +9,8 @@ class SkillUpdateResponse(BaseModel): + bundle: Optional[object] = None + content: Optional[str] = None metadata: Optional[object] = None diff --git a/src/casedev/types/vault/object_get_chunks_response.py b/src/casedev/types/vault/object_get_chunks_response.py index 62cf5a69..d345b56e 100644 --- a/src/casedev/types/vault/object_get_chunks_response.py +++ b/src/casedev/types/vault/object_get_chunks_response.py @@ -26,6 +26,18 @@ class Chunk(BaseModel): word_start_index: Optional[int] = None """First OCR word index covered by the chunk, if available""" + end_ms: Optional[int] = None + """Source media timestamp for the last word in the chunk. + + Present only for media-backed transcripts with real word timing. + """ + + start_ms: Optional[int] = None + """Source media timestamp for the first word in the chunk. + + Present only for media-backed transcripts with real word timing. + """ + class ObjectGetChunksResponse(BaseModel): chunks: List[Chunk] diff --git a/src/casedev/types/vault_search_response.py b/src/casedev/types/vault_search_response.py index 5d88c0aa..6e1d65ef 100644 --- a/src/casedev/types/vault_search_response.py +++ b/src/casedev/types/vault_search_response.py @@ -17,6 +17,12 @@ class Chunk(BaseModel): distance: Optional[float] = None """Vector similarity distance (lower is more similar)""" + end_ms: Optional[int] = None + """Source media timestamp for the last word in the chunk. + + Present only for media-backed transcripts with real word timing. + """ + object_id: Optional[str] = None """ID of the source document""" @@ -38,6 +44,12 @@ class Chunk(BaseModel): source: Optional[str] = None """Source identifier (deprecated, use object_id)""" + start_ms: Optional[int] = None + """Source media timestamp for the first word in the chunk. + + Present only for media-backed transcripts with real word timing. + """ + text: Optional[str] = None """Preview of the chunk text (up to 500 characters)""" diff --git a/tests/api_resources/agent/skills/__init__.py b/tests/api_resources/agent/skills/__init__.py deleted file mode 100644 index fd8019a9..00000000 --- a/tests/api_resources/agent/skills/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/agent/skills/test_namespaces.py b/tests/api_resources/agent/skills/test_namespaces.py deleted file mode 100644 index 7bcdff49..00000000 --- a/tests/api_resources/agent/skills/test_namespaces.py +++ /dev/null @@ -1,590 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -import os -from typing import Any, cast - -import pytest - -from casedev import Casedev, AsyncCasedev - -base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") - - -class TestNamespaces: - parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) - - @parametrize - def test_method_create(self, client: Casedev) -> None: - namespace = client.agent.skills.namespaces.create( - namespace_id="namespaceId", - ) - assert namespace is None - - @parametrize - def test_method_create_with_all_params(self, client: Casedev) -> None: - namespace = client.agent.skills.namespaces.create( - namespace_id="namespaceId", - description="description", - label="label", - metadata={}, - ) - assert namespace is None - - @parametrize - def test_raw_response_create(self, client: Casedev) -> None: - response = client.agent.skills.namespaces.with_raw_response.create( - namespace_id="namespaceId", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = response.parse() - assert namespace is None - - @parametrize - def test_streaming_response_create(self, client: Casedev) -> None: - with client.agent.skills.namespaces.with_streaming_response.create( - namespace_id="namespaceId", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_method_retrieve(self, client: Casedev) -> None: - namespace = client.agent.skills.namespaces.retrieve( - "id", - ) - assert namespace is None - - @parametrize - def test_raw_response_retrieve(self, client: Casedev) -> None: - response = client.agent.skills.namespaces.with_raw_response.retrieve( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = response.parse() - assert namespace is None - - @parametrize - def test_streaming_response_retrieve(self, client: Casedev) -> None: - with client.agent.skills.namespaces.with_streaming_response.retrieve( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_retrieve(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.skills.namespaces.with_raw_response.retrieve( - "", - ) - - @parametrize - def test_method_list(self, client: Casedev) -> None: - namespace = client.agent.skills.namespaces.list() - assert namespace is None - - @parametrize - def test_raw_response_list(self, client: Casedev) -> None: - response = client.agent.skills.namespaces.with_raw_response.list() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = response.parse() - assert namespace is None - - @parametrize - def test_streaming_response_list(self, client: Casedev) -> None: - with client.agent.skills.namespaces.with_streaming_response.list() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_method_delete(self, client: Casedev) -> None: - namespace = client.agent.skills.namespaces.delete( - "id", - ) - assert namespace is None - - @parametrize - def test_raw_response_delete(self, client: Casedev) -> None: - response = client.agent.skills.namespaces.with_raw_response.delete( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = response.parse() - assert namespace is None - - @parametrize - def test_streaming_response_delete(self, client: Casedev) -> None: - with client.agent.skills.namespaces.with_streaming_response.delete( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_delete(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.skills.namespaces.with_raw_response.delete( - "", - ) - - @parametrize - def test_method_publish(self, client: Casedev) -> None: - namespace = client.agent.skills.namespaces.publish( - id="id", - files=[ - { - "content": "content", - "encoding": "utf8", - "path": "path", - } - ], - ) - assert namespace is None - - @parametrize - def test_raw_response_publish(self, client: Casedev) -> None: - response = client.agent.skills.namespaces.with_raw_response.publish( - id="id", - files=[ - { - "content": "content", - "encoding": "utf8", - "path": "path", - } - ], - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = response.parse() - assert namespace is None - - @parametrize - def test_streaming_response_publish(self, client: Casedev) -> None: - with client.agent.skills.namespaces.with_streaming_response.publish( - id="id", - files=[ - { - "content": "content", - "encoding": "utf8", - "path": "path", - } - ], - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_publish(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.skills.namespaces.with_raw_response.publish( - id="", - files=[ - { - "content": "content", - "encoding": "utf8", - "path": "path", - } - ], - ) - - @parametrize - def test_method_pull(self, client: Casedev) -> None: - namespace = client.agent.skills.namespaces.pull( - "id", - ) - assert namespace is None - - @parametrize - def test_raw_response_pull(self, client: Casedev) -> None: - response = client.agent.skills.namespaces.with_raw_response.pull( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = response.parse() - assert namespace is None - - @parametrize - def test_streaming_response_pull(self, client: Casedev) -> None: - with client.agent.skills.namespaces.with_streaming_response.pull( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_pull(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.skills.namespaces.with_raw_response.pull( - "", - ) - - @parametrize - def test_method_rotate_token(self, client: Casedev) -> None: - namespace = client.agent.skills.namespaces.rotate_token( - "id", - ) - assert namespace is None - - @parametrize - def test_raw_response_rotate_token(self, client: Casedev) -> None: - response = client.agent.skills.namespaces.with_raw_response.rotate_token( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = response.parse() - assert namespace is None - - @parametrize - def test_streaming_response_rotate_token(self, client: Casedev) -> None: - with client.agent.skills.namespaces.with_streaming_response.rotate_token( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_rotate_token(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.skills.namespaces.with_raw_response.rotate_token( - "", - ) - - -class TestAsyncNamespaces: - parametrize = pytest.mark.parametrize( - "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] - ) - - @parametrize - async def test_method_create(self, async_client: AsyncCasedev) -> None: - namespace = await async_client.agent.skills.namespaces.create( - namespace_id="namespaceId", - ) - assert namespace is None - - @parametrize - async def test_method_create_with_all_params(self, async_client: AsyncCasedev) -> None: - namespace = await async_client.agent.skills.namespaces.create( - namespace_id="namespaceId", - description="description", - label="label", - metadata={}, - ) - assert namespace is None - - @parametrize - async def test_raw_response_create(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.skills.namespaces.with_raw_response.create( - namespace_id="namespaceId", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = await response.parse() - assert namespace is None - - @parametrize - async def test_streaming_response_create(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.skills.namespaces.with_streaming_response.create( - namespace_id="namespaceId", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = await response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_method_retrieve(self, async_client: AsyncCasedev) -> None: - namespace = await async_client.agent.skills.namespaces.retrieve( - "id", - ) - assert namespace is None - - @parametrize - async def test_raw_response_retrieve(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.skills.namespaces.with_raw_response.retrieve( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = await response.parse() - assert namespace is None - - @parametrize - async def test_streaming_response_retrieve(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.skills.namespaces.with_streaming_response.retrieve( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = await response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_retrieve(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.skills.namespaces.with_raw_response.retrieve( - "", - ) - - @parametrize - async def test_method_list(self, async_client: AsyncCasedev) -> None: - namespace = await async_client.agent.skills.namespaces.list() - assert namespace is None - - @parametrize - async def test_raw_response_list(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.skills.namespaces.with_raw_response.list() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = await response.parse() - assert namespace is None - - @parametrize - async def test_streaming_response_list(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.skills.namespaces.with_streaming_response.list() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = await response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_method_delete(self, async_client: AsyncCasedev) -> None: - namespace = await async_client.agent.skills.namespaces.delete( - "id", - ) - assert namespace is None - - @parametrize - async def test_raw_response_delete(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.skills.namespaces.with_raw_response.delete( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = await response.parse() - assert namespace is None - - @parametrize - async def test_streaming_response_delete(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.skills.namespaces.with_streaming_response.delete( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = await response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_delete(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.skills.namespaces.with_raw_response.delete( - "", - ) - - @parametrize - async def test_method_publish(self, async_client: AsyncCasedev) -> None: - namespace = await async_client.agent.skills.namespaces.publish( - id="id", - files=[ - { - "content": "content", - "encoding": "utf8", - "path": "path", - } - ], - ) - assert namespace is None - - @parametrize - async def test_raw_response_publish(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.skills.namespaces.with_raw_response.publish( - id="id", - files=[ - { - "content": "content", - "encoding": "utf8", - "path": "path", - } - ], - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = await response.parse() - assert namespace is None - - @parametrize - async def test_streaming_response_publish(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.skills.namespaces.with_streaming_response.publish( - id="id", - files=[ - { - "content": "content", - "encoding": "utf8", - "path": "path", - } - ], - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = await response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_publish(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.skills.namespaces.with_raw_response.publish( - id="", - files=[ - { - "content": "content", - "encoding": "utf8", - "path": "path", - } - ], - ) - - @parametrize - async def test_method_pull(self, async_client: AsyncCasedev) -> None: - namespace = await async_client.agent.skills.namespaces.pull( - "id", - ) - assert namespace is None - - @parametrize - async def test_raw_response_pull(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.skills.namespaces.with_raw_response.pull( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = await response.parse() - assert namespace is None - - @parametrize - async def test_streaming_response_pull(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.skills.namespaces.with_streaming_response.pull( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = await response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_pull(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.skills.namespaces.with_raw_response.pull( - "", - ) - - @parametrize - async def test_method_rotate_token(self, async_client: AsyncCasedev) -> None: - namespace = await async_client.agent.skills.namespaces.rotate_token( - "id", - ) - assert namespace is None - - @parametrize - async def test_raw_response_rotate_token(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.skills.namespaces.with_raw_response.rotate_token( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - namespace = await response.parse() - assert namespace is None - - @parametrize - async def test_streaming_response_rotate_token(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.skills.namespaces.with_streaming_response.rotate_token( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - namespace = await response.parse() - assert namespace is None - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_rotate_token(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.skills.namespaces.with_raw_response.rotate_token( - "", - ) diff --git a/tests/api_resources/agent/v1/chat/__init__.py b/tests/api_resources/agent/v1/chat/__init__.py deleted file mode 100644 index fd8019a9..00000000 --- a/tests/api_resources/agent/v1/chat/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/agent/v1/chat/test_files.py b/tests/api_resources/agent/v1/chat/test_files.py deleted file mode 100644 index 311e02d2..00000000 --- a/tests/api_resources/agent/v1/chat/test_files.py +++ /dev/null @@ -1,228 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -import os -from typing import Any, cast - -import httpx -import pytest -from respx import MockRouter - -from casedev import Casedev, AsyncCasedev -from tests.utils import assert_matches_type -from casedev._response import ( - BinaryAPIResponse, - AsyncBinaryAPIResponse, - StreamedBinaryAPIResponse, - AsyncStreamedBinaryAPIResponse, -) -from casedev.types.agent.v1.chat import FileListResponse - -base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") - - -class TestFiles: - parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) - - @parametrize - def test_method_list(self, client: Casedev) -> None: - file = client.agent.v1.chat.files.list( - "id", - ) - assert_matches_type(FileListResponse, file, path=["response"]) - - @parametrize - def test_raw_response_list(self, client: Casedev) -> None: - response = client.agent.v1.chat.files.with_raw_response.list( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - file = response.parse() - assert_matches_type(FileListResponse, file, path=["response"]) - - @parametrize - def test_streaming_response_list(self, client: Casedev) -> None: - with client.agent.v1.chat.files.with_streaming_response.list( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - file = response.parse() - assert_matches_type(FileListResponse, file, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_list(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.v1.chat.files.with_raw_response.list( - "", - ) - - @parametrize - @pytest.mark.respx(base_url=base_url) - def test_method_download(self, client: Casedev, respx_mock: MockRouter) -> None: - respx_mock.get("/agent/v1/chat/id/files/filePath").mock(return_value=httpx.Response(200, json={"foo": "bar"})) - file = client.agent.v1.chat.files.download( - file_path="filePath", - id="id", - ) - assert file.is_closed - assert file.json() == {"foo": "bar"} - assert cast(Any, file.is_closed) is True - assert isinstance(file, BinaryAPIResponse) - - @parametrize - @pytest.mark.respx(base_url=base_url) - def test_raw_response_download(self, client: Casedev, respx_mock: MockRouter) -> None: - respx_mock.get("/agent/v1/chat/id/files/filePath").mock(return_value=httpx.Response(200, json={"foo": "bar"})) - - file = client.agent.v1.chat.files.with_raw_response.download( - file_path="filePath", - id="id", - ) - - assert file.is_closed is True - assert file.http_request.headers.get("X-Stainless-Lang") == "python" - assert file.json() == {"foo": "bar"} - assert isinstance(file, BinaryAPIResponse) - - @parametrize - @pytest.mark.respx(base_url=base_url) - def test_streaming_response_download(self, client: Casedev, respx_mock: MockRouter) -> None: - respx_mock.get("/agent/v1/chat/id/files/filePath").mock(return_value=httpx.Response(200, json={"foo": "bar"})) - with client.agent.v1.chat.files.with_streaming_response.download( - file_path="filePath", - id="id", - ) as file: - assert not file.is_closed - assert file.http_request.headers.get("X-Stainless-Lang") == "python" - - assert file.json() == {"foo": "bar"} - assert cast(Any, file.is_closed) is True - assert isinstance(file, StreamedBinaryAPIResponse) - - assert cast(Any, file.is_closed) is True - - @parametrize - @pytest.mark.respx(base_url=base_url) - def test_path_params_download(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.v1.chat.files.with_raw_response.download( - file_path="filePath", - id="", - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `file_path` but received ''"): - client.agent.v1.chat.files.with_raw_response.download( - file_path="", - id="id", - ) - - -class TestAsyncFiles: - parametrize = pytest.mark.parametrize( - "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] - ) - - @parametrize - async def test_method_list(self, async_client: AsyncCasedev) -> None: - file = await async_client.agent.v1.chat.files.list( - "id", - ) - assert_matches_type(FileListResponse, file, path=["response"]) - - @parametrize - async def test_raw_response_list(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.v1.chat.files.with_raw_response.list( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - file = await response.parse() - assert_matches_type(FileListResponse, file, path=["response"]) - - @parametrize - async def test_streaming_response_list(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.v1.chat.files.with_streaming_response.list( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - file = await response.parse() - assert_matches_type(FileListResponse, file, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_list(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.v1.chat.files.with_raw_response.list( - "", - ) - - @parametrize - @pytest.mark.respx(base_url=base_url) - async def test_method_download(self, async_client: AsyncCasedev, respx_mock: MockRouter) -> None: - respx_mock.get("/agent/v1/chat/id/files/filePath").mock(return_value=httpx.Response(200, json={"foo": "bar"})) - file = await async_client.agent.v1.chat.files.download( - file_path="filePath", - id="id", - ) - assert file.is_closed - assert await file.json() == {"foo": "bar"} - assert cast(Any, file.is_closed) is True - assert isinstance(file, AsyncBinaryAPIResponse) - - @parametrize - @pytest.mark.respx(base_url=base_url) - async def test_raw_response_download(self, async_client: AsyncCasedev, respx_mock: MockRouter) -> None: - respx_mock.get("/agent/v1/chat/id/files/filePath").mock(return_value=httpx.Response(200, json={"foo": "bar"})) - - file = await async_client.agent.v1.chat.files.with_raw_response.download( - file_path="filePath", - id="id", - ) - - assert file.is_closed is True - assert file.http_request.headers.get("X-Stainless-Lang") == "python" - assert await file.json() == {"foo": "bar"} - assert isinstance(file, AsyncBinaryAPIResponse) - - @parametrize - @pytest.mark.respx(base_url=base_url) - async def test_streaming_response_download(self, async_client: AsyncCasedev, respx_mock: MockRouter) -> None: - respx_mock.get("/agent/v1/chat/id/files/filePath").mock(return_value=httpx.Response(200, json={"foo": "bar"})) - async with async_client.agent.v1.chat.files.with_streaming_response.download( - file_path="filePath", - id="id", - ) as file: - assert not file.is_closed - assert file.http_request.headers.get("X-Stainless-Lang") == "python" - - assert await file.json() == {"foo": "bar"} - assert cast(Any, file.is_closed) is True - assert isinstance(file, AsyncStreamedBinaryAPIResponse) - - assert cast(Any, file.is_closed) is True - - @parametrize - @pytest.mark.respx(base_url=base_url) - async def test_path_params_download(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.v1.chat.files.with_raw_response.download( - file_path="filePath", - id="", - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `file_path` but received ''"): - await async_client.agent.v1.chat.files.with_raw_response.download( - file_path="", - id="id", - ) diff --git a/tests/api_resources/agent/v1/test_chat.py b/tests/api_resources/agent/v1/test_chat.py deleted file mode 100644 index 34813571..00000000 --- a/tests/api_resources/agent/v1/test_chat.py +++ /dev/null @@ -1,648 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -import os -from typing import Any, cast - -import pytest - -from casedev import Casedev, AsyncCasedev -from tests.utils import assert_matches_type -from casedev.types.agent.v1 import ( - ChatCancelResponse, - ChatCreateResponse, - ChatDeleteResponse, -) - -base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") - - -class TestChat: - parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) - - @parametrize - def test_method_create(self, client: Casedev) -> None: - chat = client.agent.v1.chat.create() - assert_matches_type(ChatCreateResponse, chat, path=["response"]) - - @parametrize - def test_method_create_with_all_params(self, client: Casedev) -> None: - chat = client.agent.v1.chat.create( - idle_timeout_ms=0, - model="model", - title="title", - vault_ids=["string"], - ) - assert_matches_type(ChatCreateResponse, chat, path=["response"]) - - @parametrize - def test_raw_response_create(self, client: Casedev) -> None: - response = client.agent.v1.chat.with_raw_response.create() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - chat = response.parse() - assert_matches_type(ChatCreateResponse, chat, path=["response"]) - - @parametrize - def test_streaming_response_create(self, client: Casedev) -> None: - with client.agent.v1.chat.with_streaming_response.create() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - chat = response.parse() - assert_matches_type(ChatCreateResponse, chat, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_method_delete(self, client: Casedev) -> None: - chat = client.agent.v1.chat.delete( - "id", - ) - assert_matches_type(ChatDeleteResponse, chat, path=["response"]) - - @parametrize - def test_raw_response_delete(self, client: Casedev) -> None: - response = client.agent.v1.chat.with_raw_response.delete( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - chat = response.parse() - assert_matches_type(ChatDeleteResponse, chat, path=["response"]) - - @parametrize - def test_streaming_response_delete(self, client: Casedev) -> None: - with client.agent.v1.chat.with_streaming_response.delete( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - chat = response.parse() - assert_matches_type(ChatDeleteResponse, chat, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_delete(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.v1.chat.with_raw_response.delete( - "", - ) - - @parametrize - def test_method_cancel(self, client: Casedev) -> None: - chat = client.agent.v1.chat.cancel( - "id", - ) - assert_matches_type(ChatCancelResponse, chat, path=["response"]) - - @parametrize - def test_raw_response_cancel(self, client: Casedev) -> None: - response = client.agent.v1.chat.with_raw_response.cancel( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - chat = response.parse() - assert_matches_type(ChatCancelResponse, chat, path=["response"]) - - @parametrize - def test_streaming_response_cancel(self, client: Casedev) -> None: - with client.agent.v1.chat.with_streaming_response.cancel( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - chat = response.parse() - assert_matches_type(ChatCancelResponse, chat, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_cancel(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.v1.chat.with_raw_response.cancel( - "", - ) - - @parametrize - def test_method_reply_to_question(self, client: Casedev) -> None: - chat = client.agent.v1.chat.reply_to_question( - request_id="requestID", - id="id", - answers=[["string"]], - ) - assert chat is None - - @parametrize - def test_raw_response_reply_to_question(self, client: Casedev) -> None: - response = client.agent.v1.chat.with_raw_response.reply_to_question( - request_id="requestID", - id="id", - answers=[["string"]], - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - chat = response.parse() - assert chat is None - - @parametrize - def test_streaming_response_reply_to_question(self, client: Casedev) -> None: - with client.agent.v1.chat.with_streaming_response.reply_to_question( - request_id="requestID", - id="id", - answers=[["string"]], - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - chat = response.parse() - assert chat is None - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_reply_to_question(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.v1.chat.with_raw_response.reply_to_question( - request_id="requestID", - id="", - answers=[["string"]], - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `request_id` but received ''"): - client.agent.v1.chat.with_raw_response.reply_to_question( - request_id="", - id="id", - answers=[["string"]], - ) - - @parametrize - def test_method_respond(self, client: Casedev) -> None: - chat_stream = client.agent.v1.chat.respond( - id="id", - ) - chat_stream.response.close() - - @parametrize - def test_method_respond_with_all_params(self, client: Casedev) -> None: - chat_stream = client.agent.v1.chat.respond( - id="id", - parts=[ - { - "text": "text", - "type": "text", - } - ], - ) - chat_stream.response.close() - - @parametrize - def test_raw_response_respond(self, client: Casedev) -> None: - response = client.agent.v1.chat.with_raw_response.respond( - id="id", - ) - - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - stream = response.parse() - stream.close() - - @parametrize - def test_streaming_response_respond(self, client: Casedev) -> None: - with client.agent.v1.chat.with_streaming_response.respond( - id="id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - stream = response.parse() - stream.close() - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_respond(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.v1.chat.with_raw_response.respond( - id="", - ) - - @parametrize - def test_method_send_message(self, client: Casedev) -> None: - chat = client.agent.v1.chat.send_message( - id="id", - ) - assert chat is None - - @parametrize - def test_method_send_message_with_all_params(self, client: Casedev) -> None: - chat = client.agent.v1.chat.send_message( - id="id", - parts=[ - { - "text": "text", - "type": "text", - } - ], - ) - assert chat is None - - @parametrize - def test_raw_response_send_message(self, client: Casedev) -> None: - response = client.agent.v1.chat.with_raw_response.send_message( - id="id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - chat = response.parse() - assert chat is None - - @parametrize - def test_streaming_response_send_message(self, client: Casedev) -> None: - with client.agent.v1.chat.with_streaming_response.send_message( - id="id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - chat = response.parse() - assert chat is None - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_send_message(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.v1.chat.with_raw_response.send_message( - id="", - ) - - @parametrize - def test_method_stream(self, client: Casedev) -> None: - chat_stream = client.agent.v1.chat.stream( - id="id", - ) - chat_stream.response.close() - - @parametrize - def test_method_stream_with_all_params(self, client: Casedev) -> None: - chat_stream = client.agent.v1.chat.stream( - id="id", - last_event_id=0, - ) - chat_stream.response.close() - - @parametrize - def test_raw_response_stream(self, client: Casedev) -> None: - response = client.agent.v1.chat.with_raw_response.stream( - id="id", - ) - - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - stream = response.parse() - stream.close() - - @parametrize - def test_streaming_response_stream(self, client: Casedev) -> None: - with client.agent.v1.chat.with_streaming_response.stream( - id="id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - stream = response.parse() - stream.close() - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_stream(self, client: Casedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - client.agent.v1.chat.with_raw_response.stream( - id="", - ) - - -class TestAsyncChat: - parametrize = pytest.mark.parametrize( - "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] - ) - - @parametrize - async def test_method_create(self, async_client: AsyncCasedev) -> None: - chat = await async_client.agent.v1.chat.create() - assert_matches_type(ChatCreateResponse, chat, path=["response"]) - - @parametrize - async def test_method_create_with_all_params(self, async_client: AsyncCasedev) -> None: - chat = await async_client.agent.v1.chat.create( - idle_timeout_ms=0, - model="model", - title="title", - vault_ids=["string"], - ) - assert_matches_type(ChatCreateResponse, chat, path=["response"]) - - @parametrize - async def test_raw_response_create(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.v1.chat.with_raw_response.create() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - chat = await response.parse() - assert_matches_type(ChatCreateResponse, chat, path=["response"]) - - @parametrize - async def test_streaming_response_create(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.v1.chat.with_streaming_response.create() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - chat = await response.parse() - assert_matches_type(ChatCreateResponse, chat, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_method_delete(self, async_client: AsyncCasedev) -> None: - chat = await async_client.agent.v1.chat.delete( - "id", - ) - assert_matches_type(ChatDeleteResponse, chat, path=["response"]) - - @parametrize - async def test_raw_response_delete(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.v1.chat.with_raw_response.delete( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - chat = await response.parse() - assert_matches_type(ChatDeleteResponse, chat, path=["response"]) - - @parametrize - async def test_streaming_response_delete(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.v1.chat.with_streaming_response.delete( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - chat = await response.parse() - assert_matches_type(ChatDeleteResponse, chat, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_delete(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.v1.chat.with_raw_response.delete( - "", - ) - - @parametrize - async def test_method_cancel(self, async_client: AsyncCasedev) -> None: - chat = await async_client.agent.v1.chat.cancel( - "id", - ) - assert_matches_type(ChatCancelResponse, chat, path=["response"]) - - @parametrize - async def test_raw_response_cancel(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.v1.chat.with_raw_response.cancel( - "id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - chat = await response.parse() - assert_matches_type(ChatCancelResponse, chat, path=["response"]) - - @parametrize - async def test_streaming_response_cancel(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.v1.chat.with_streaming_response.cancel( - "id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - chat = await response.parse() - assert_matches_type(ChatCancelResponse, chat, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_cancel(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.v1.chat.with_raw_response.cancel( - "", - ) - - @parametrize - async def test_method_reply_to_question(self, async_client: AsyncCasedev) -> None: - chat = await async_client.agent.v1.chat.reply_to_question( - request_id="requestID", - id="id", - answers=[["string"]], - ) - assert chat is None - - @parametrize - async def test_raw_response_reply_to_question(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.v1.chat.with_raw_response.reply_to_question( - request_id="requestID", - id="id", - answers=[["string"]], - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - chat = await response.parse() - assert chat is None - - @parametrize - async def test_streaming_response_reply_to_question(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.v1.chat.with_streaming_response.reply_to_question( - request_id="requestID", - id="id", - answers=[["string"]], - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - chat = await response.parse() - assert chat is None - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_reply_to_question(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.v1.chat.with_raw_response.reply_to_question( - request_id="requestID", - id="", - answers=[["string"]], - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `request_id` but received ''"): - await async_client.agent.v1.chat.with_raw_response.reply_to_question( - request_id="", - id="id", - answers=[["string"]], - ) - - @parametrize - async def test_method_respond(self, async_client: AsyncCasedev) -> None: - chat_stream = await async_client.agent.v1.chat.respond( - id="id", - ) - await chat_stream.response.aclose() - - @parametrize - async def test_method_respond_with_all_params(self, async_client: AsyncCasedev) -> None: - chat_stream = await async_client.agent.v1.chat.respond( - id="id", - parts=[ - { - "text": "text", - "type": "text", - } - ], - ) - await chat_stream.response.aclose() - - @parametrize - async def test_raw_response_respond(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.v1.chat.with_raw_response.respond( - id="id", - ) - - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - stream = await response.parse() - await stream.close() - - @parametrize - async def test_streaming_response_respond(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.v1.chat.with_streaming_response.respond( - id="id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - stream = await response.parse() - await stream.close() - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_respond(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.v1.chat.with_raw_response.respond( - id="", - ) - - @parametrize - async def test_method_send_message(self, async_client: AsyncCasedev) -> None: - chat = await async_client.agent.v1.chat.send_message( - id="id", - ) - assert chat is None - - @parametrize - async def test_method_send_message_with_all_params(self, async_client: AsyncCasedev) -> None: - chat = await async_client.agent.v1.chat.send_message( - id="id", - parts=[ - { - "text": "text", - "type": "text", - } - ], - ) - assert chat is None - - @parametrize - async def test_raw_response_send_message(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.v1.chat.with_raw_response.send_message( - id="id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - chat = await response.parse() - assert chat is None - - @parametrize - async def test_streaming_response_send_message(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.v1.chat.with_streaming_response.send_message( - id="id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - chat = await response.parse() - assert chat is None - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_send_message(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.v1.chat.with_raw_response.send_message( - id="", - ) - - @parametrize - async def test_method_stream(self, async_client: AsyncCasedev) -> None: - chat_stream = await async_client.agent.v1.chat.stream( - id="id", - ) - await chat_stream.response.aclose() - - @parametrize - async def test_method_stream_with_all_params(self, async_client: AsyncCasedev) -> None: - chat_stream = await async_client.agent.v1.chat.stream( - id="id", - last_event_id=0, - ) - await chat_stream.response.aclose() - - @parametrize - async def test_raw_response_stream(self, async_client: AsyncCasedev) -> None: - response = await async_client.agent.v1.chat.with_raw_response.stream( - id="id", - ) - - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - stream = await response.parse() - await stream.close() - - @parametrize - async def test_streaming_response_stream(self, async_client: AsyncCasedev) -> None: - async with async_client.agent.v1.chat.with_streaming_response.stream( - id="id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - stream = await response.parse() - await stream.close() - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_stream(self, async_client: AsyncCasedev) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): - await async_client.agent.v1.chat.with_raw_response.stream( - id="", - ) diff --git a/tests/api_resources/test_skills.py b/tests/api_resources/test_skills.py index 4d276615..6ec325a2 100644 --- a/tests/api_resources/test_skills.py +++ b/tests/api_resources/test_skills.py @@ -13,6 +13,7 @@ SkillReadResponse, SkillCreateResponse, SkillDeleteResponse, + SkillExportResponse, SkillUpdateResponse, SkillResolveResponse, ) @@ -36,6 +37,17 @@ def test_method_create_with_all_params(self, client: Casedev) -> None: skill = client.skills.create( content="x", name="x", + files=[ + { + "content": "content", + "path": "path", + "content_type": "contentType", + "metadata": {}, + "name": "name", + "summary": "summary", + "tags": ["string"], + } + ], metadata={}, slug="slug", summary="summary", @@ -81,6 +93,17 @@ def test_method_update_with_all_params(self, client: Casedev) -> None: skill = client.skills.update( path_slug="slug", content="content", + files=[ + { + "content": "content", + "path": "path", + "content_type": "contentType", + "metadata": {}, + "name": "name", + "summary": "summary", + "tags": ["string"], + } + ], metadata={}, name="name", body_slug="slug", @@ -158,6 +181,52 @@ def test_path_params_delete(self, client: Casedev) -> None: "", ) + @parametrize + def test_method_export(self, client: Casedev) -> None: + skill = client.skills.export( + slug="slug", + ) + assert_matches_type(SkillExportResponse, skill, path=["response"]) + + @parametrize + def test_method_export_with_all_params(self, client: Casedev) -> None: + skill = client.skills.export( + slug="slug", + target="target", + ) + assert_matches_type(SkillExportResponse, skill, path=["response"]) + + @parametrize + def test_raw_response_export(self, client: Casedev) -> None: + response = client.skills.with_raw_response.export( + slug="slug", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + skill = response.parse() + assert_matches_type(SkillExportResponse, skill, path=["response"]) + + @parametrize + def test_streaming_response_export(self, client: Casedev) -> None: + with client.skills.with_streaming_response.export( + slug="slug", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + skill = response.parse() + assert_matches_type(SkillExportResponse, skill, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_export(self, client: Casedev) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `slug` but received ''"): + client.skills.with_raw_response.export( + slug="", + ) + @parametrize def test_method_read(self, client: Casedev) -> None: skill = client.skills.read( @@ -254,6 +323,17 @@ async def test_method_create_with_all_params(self, async_client: AsyncCasedev) - skill = await async_client.skills.create( content="x", name="x", + files=[ + { + "content": "content", + "path": "path", + "content_type": "contentType", + "metadata": {}, + "name": "name", + "summary": "summary", + "tags": ["string"], + } + ], metadata={}, slug="slug", summary="summary", @@ -299,6 +379,17 @@ async def test_method_update_with_all_params(self, async_client: AsyncCasedev) - skill = await async_client.skills.update( path_slug="slug", content="content", + files=[ + { + "content": "content", + "path": "path", + "content_type": "contentType", + "metadata": {}, + "name": "name", + "summary": "summary", + "tags": ["string"], + } + ], metadata={}, name="name", body_slug="slug", @@ -376,6 +467,52 @@ async def test_path_params_delete(self, async_client: AsyncCasedev) -> None: "", ) + @parametrize + async def test_method_export(self, async_client: AsyncCasedev) -> None: + skill = await async_client.skills.export( + slug="slug", + ) + assert_matches_type(SkillExportResponse, skill, path=["response"]) + + @parametrize + async def test_method_export_with_all_params(self, async_client: AsyncCasedev) -> None: + skill = await async_client.skills.export( + slug="slug", + target="target", + ) + assert_matches_type(SkillExportResponse, skill, path=["response"]) + + @parametrize + async def test_raw_response_export(self, async_client: AsyncCasedev) -> None: + response = await async_client.skills.with_raw_response.export( + slug="slug", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + skill = await response.parse() + assert_matches_type(SkillExportResponse, skill, path=["response"]) + + @parametrize + async def test_streaming_response_export(self, async_client: AsyncCasedev) -> None: + async with async_client.skills.with_streaming_response.export( + slug="slug", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + skill = await response.parse() + assert_matches_type(SkillExportResponse, skill, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_export(self, async_client: AsyncCasedev) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `slug` but received ''"): + await async_client.skills.with_raw_response.export( + slug="", + ) + @parametrize async def test_method_read(self, async_client: AsyncCasedev) -> None: skill = await async_client.skills.read(