1# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
  2
  3from __future__ import annotations
  4
  5from typing import Any, cast
  6from typing_extensions import Literal
  7
  8import httpx
  9
 10from .... import _legacy_response
 11from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
 12from ...._utils import maybe_transform
 13from ...._compat import cached_property
 14from ...._resource import SyncAPIResource, AsyncAPIResource
 15from ...._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper
 16from ....pagination import SyncConversationCursorPage, AsyncConversationCursorPage
 17from ...._base_client import AsyncPaginator, make_request_options
 18from ....types.beta.chatkit import thread_list_params, thread_list_items_params
 19from ....types.beta.chatkit.chatkit_thread import ChatKitThread
 20from ....types.beta.chatkit.thread_delete_response import ThreadDeleteResponse
 21from ....types.beta.chatkit.chatkit_thread_item_list import Data
 22
 23__all__ = ["Threads", "AsyncThreads"]
 24
 25
 26class Threads(SyncAPIResource):
 27    @cached_property
 28    def with_raw_response(self) -> ThreadsWithRawResponse:
 29        """
 30        This property can be used as a prefix for any HTTP method call to return
 31        the raw response object instead of the parsed content.
 32
 33        For more information, see https://www.github.com/openai/openai-python#accessing-raw-response-data-eg-headers
 34        """
 35        return ThreadsWithRawResponse(self)
 36
 37    @cached_property
 38    def with_streaming_response(self) -> ThreadsWithStreamingResponse:
 39        """
 40        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 41
 42        For more information, see https://www.github.com/openai/openai-python#with_streaming_response
 43        """
 44        return ThreadsWithStreamingResponse(self)
 45
 46    def retrieve(
 47        self,
 48        thread_id: str,
 49        *,
 50        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
 51        # The extra values given here take precedence over values defined on the client or passed to this method.
 52        extra_headers: Headers | None = None,
 53        extra_query: Query | None = None,
 54        extra_body: Body | None = None,
 55        timeout: float | httpx.Timeout | None | NotGiven = not_given,
 56    ) -> ChatKitThread:
 57        """
 58        Retrieve a ChatKit thread
 59
 60        Args:
 61          extra_headers: Send extra headers
 62
 63          extra_query: Add additional query parameters to the request
 64
 65          extra_body: Add additional JSON properties to the request
 66
 67          timeout: Override the client-level default timeout for this request, in seconds
 68        """
 69        if not thread_id:
 70            raise ValueError(f"Expected a non-empty value for `thread_id` but received {thread_id!r}")
 71        extra_headers = {"OpenAI-Beta": "chatkit_beta=v1", **(extra_headers or {})}
 72        return self._get(
 73            f"/chatkit/threads/{thread_id}",
 74            options=make_request_options(
 75                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
 76            ),
 77            cast_to=ChatKitThread,
 78        )
 79
 80    def list(
 81        self,
 82        *,
 83        after: str | Omit = omit,
 84        before: str | Omit = omit,
 85        limit: int | Omit = omit,
 86        order: Literal["asc", "desc"] | Omit = omit,
 87        user: str | Omit = omit,
 88        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
 89        # The extra values given here take precedence over values defined on the client or passed to this method.
 90        extra_headers: Headers | None = None,
 91        extra_query: Query | None = None,
 92        extra_body: Body | None = None,
 93        timeout: float | httpx.Timeout | None | NotGiven = not_given,
 94    ) -> SyncConversationCursorPage[ChatKitThread]:
 95        """
 96        List ChatKit threads
 97
 98        Args:
 99          after: List items created after this thread item ID. Defaults to null for the first
100              page.
101
102          before: List items created before this thread item ID. Defaults to null for the newest
103              results.
104
105          limit: Maximum number of thread items to return. Defaults to 20.
106
107          order: Sort order for results by creation time. Defaults to `desc`.
108
109          user: Filter threads that belong to this user identifier. Defaults to null to return
110              all users.
111
112          extra_headers: Send extra headers
113
114          extra_query: Add additional query parameters to the request
115
116          extra_body: Add additional JSON properties to the request
117
118          timeout: Override the client-level default timeout for this request, in seconds
119        """
120        extra_headers = {"OpenAI-Beta": "chatkit_beta=v1", **(extra_headers or {})}
121        return self._get_api_list(
122            "/chatkit/threads",
123            page=SyncConversationCursorPage[ChatKitThread],
124            options=make_request_options(
125                extra_headers=extra_headers,
126                extra_query=extra_query,
127                extra_body=extra_body,
128                timeout=timeout,
129                query=maybe_transform(
130                    {
131                        "after": after,
132                        "before": before,
133                        "limit": limit,
134                        "order": order,
135                        "user": user,
136                    },
137                    thread_list_params.ThreadListParams,
138                ),
139            ),
140            model=ChatKitThread,
141        )
142
143    def delete(
144        self,
145        thread_id: str,
146        *,
147        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
148        # The extra values given here take precedence over values defined on the client or passed to this method.
149        extra_headers: Headers | None = None,
150        extra_query: Query | None = None,
151        extra_body: Body | None = None,
152        timeout: float | httpx.Timeout | None | NotGiven = not_given,
153    ) -> ThreadDeleteResponse:
154        """
155        Delete a ChatKit thread
156
157        Args:
158          extra_headers: Send extra headers
159
160          extra_query: Add additional query parameters to the request
161
162          extra_body: Add additional JSON properties to the request
163
164          timeout: Override the client-level default timeout for this request, in seconds
165        """
166        if not thread_id:
167            raise ValueError(f"Expected a non-empty value for `thread_id` but received {thread_id!r}")
168        extra_headers = {"OpenAI-Beta": "chatkit_beta=v1", **(extra_headers or {})}
169        return self._delete(
170            f"/chatkit/threads/{thread_id}",
171            options=make_request_options(
172                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
173            ),
174            cast_to=ThreadDeleteResponse,
175        )
176
177    def list_items(
178        self,
179        thread_id: str,
180        *,
181        after: str | Omit = omit,
182        before: str | Omit = omit,
183        limit: int | Omit = omit,
184        order: Literal["asc", "desc"] | Omit = omit,
185        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
186        # The extra values given here take precedence over values defined on the client or passed to this method.
187        extra_headers: Headers | None = None,
188        extra_query: Query | None = None,
189        extra_body: Body | None = None,
190        timeout: float | httpx.Timeout | None | NotGiven = not_given,
191    ) -> SyncConversationCursorPage[Data]:
192        """
193        List ChatKit thread items
194
195        Args:
196          after: List items created after this thread item ID. Defaults to null for the first
197              page.
198
199          before: List items created before this thread item ID. Defaults to null for the newest
200              results.
201
202          limit: Maximum number of thread items to return. Defaults to 20.
203
204          order: Sort order for results by creation time. Defaults to `desc`.
205
206          extra_headers: Send extra headers
207
208          extra_query: Add additional query parameters to the request
209
210          extra_body: Add additional JSON properties to the request
211
212          timeout: Override the client-level default timeout for this request, in seconds
213        """
214        if not thread_id:
215            raise ValueError(f"Expected a non-empty value for `thread_id` but received {thread_id!r}")
216        extra_headers = {"OpenAI-Beta": "chatkit_beta=v1", **(extra_headers or {})}
217        return self._get_api_list(
218            f"/chatkit/threads/{thread_id}/items",
219            page=SyncConversationCursorPage[Data],
220            options=make_request_options(
221                extra_headers=extra_headers,
222                extra_query=extra_query,
223                extra_body=extra_body,
224                timeout=timeout,
225                query=maybe_transform(
226                    {
227                        "after": after,
228                        "before": before,
229                        "limit": limit,
230                        "order": order,
231                    },
232                    thread_list_items_params.ThreadListItemsParams,
233                ),
234            ),
235            model=cast(Any, Data),  # Union types cannot be passed in as arguments in the type system
236        )
237
238
239class AsyncThreads(AsyncAPIResource):
240    @cached_property
241    def with_raw_response(self) -> AsyncThreadsWithRawResponse:
242        """
243        This property can be used as a prefix for any HTTP method call to return
244        the raw response object instead of the parsed content.
245
246        For more information, see https://www.github.com/openai/openai-python#accessing-raw-response-data-eg-headers
247        """
248        return AsyncThreadsWithRawResponse(self)
249
250    @cached_property
251    def with_streaming_response(self) -> AsyncThreadsWithStreamingResponse:
252        """
253        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
254
255        For more information, see https://www.github.com/openai/openai-python#with_streaming_response
256        """
257        return AsyncThreadsWithStreamingResponse(self)
258
259    async def retrieve(
260        self,
261        thread_id: str,
262        *,
263        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
264        # The extra values given here take precedence over values defined on the client or passed to this method.
265        extra_headers: Headers | None = None,
266        extra_query: Query | None = None,
267        extra_body: Body | None = None,
268        timeout: float | httpx.Timeout | None | NotGiven = not_given,
269    ) -> ChatKitThread:
270        """
271        Retrieve a ChatKit thread
272
273        Args:
274          extra_headers: Send extra headers
275
276          extra_query: Add additional query parameters to the request
277
278          extra_body: Add additional JSON properties to the request
279
280          timeout: Override the client-level default timeout for this request, in seconds
281        """
282        if not thread_id:
283            raise ValueError(f"Expected a non-empty value for `thread_id` but received {thread_id!r}")
284        extra_headers = {"OpenAI-Beta": "chatkit_beta=v1", **(extra_headers or {})}
285        return await self._get(
286            f"/chatkit/threads/{thread_id}",
287            options=make_request_options(
288                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
289            ),
290            cast_to=ChatKitThread,
291        )
292
293    def list(
294        self,
295        *,
296        after: str | Omit = omit,
297        before: str | Omit = omit,
298        limit: int | Omit = omit,
299        order: Literal["asc", "desc"] | Omit = omit,
300        user: str | Omit = omit,
301        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
302        # The extra values given here take precedence over values defined on the client or passed to this method.
303        extra_headers: Headers | None = None,
304        extra_query: Query | None = None,
305        extra_body: Body | None = None,
306        timeout: float | httpx.Timeout | None | NotGiven = not_given,
307    ) -> AsyncPaginator[ChatKitThread, AsyncConversationCursorPage[ChatKitThread]]:
308        """
309        List ChatKit threads
310
311        Args:
312          after: List items created after this thread item ID. Defaults to null for the first
313              page.
314
315          before: List items created before this thread item ID. Defaults to null for the newest
316              results.
317
318          limit: Maximum number of thread items to return. Defaults to 20.
319
320          order: Sort order for results by creation time. Defaults to `desc`.
321
322          user: Filter threads that belong to this user identifier. Defaults to null to return
323              all users.
324
325          extra_headers: Send extra headers
326
327          extra_query: Add additional query parameters to the request
328
329          extra_body: Add additional JSON properties to the request
330
331          timeout: Override the client-level default timeout for this request, in seconds
332        """
333        extra_headers = {"OpenAI-Beta": "chatkit_beta=v1", **(extra_headers or {})}
334        return self._get_api_list(
335            "/chatkit/threads",
336            page=AsyncConversationCursorPage[ChatKitThread],
337            options=make_request_options(
338                extra_headers=extra_headers,
339                extra_query=extra_query,
340                extra_body=extra_body,
341                timeout=timeout,
342                query=maybe_transform(
343                    {
344                        "after": after,
345                        "before": before,
346                        "limit": limit,
347                        "order": order,
348                        "user": user,
349                    },
350                    thread_list_params.ThreadListParams,
351                ),
352            ),
353            model=ChatKitThread,
354        )
355
356    async def delete(
357        self,
358        thread_id: str,
359        *,
360        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
361        # The extra values given here take precedence over values defined on the client or passed to this method.
362        extra_headers: Headers | None = None,
363        extra_query: Query | None = None,
364        extra_body: Body | None = None,
365        timeout: float | httpx.Timeout | None | NotGiven = not_given,
366    ) -> ThreadDeleteResponse:
367        """
368        Delete a ChatKit thread
369
370        Args:
371          extra_headers: Send extra headers
372
373          extra_query: Add additional query parameters to the request
374
375          extra_body: Add additional JSON properties to the request
376
377          timeout: Override the client-level default timeout for this request, in seconds
378        """
379        if not thread_id:
380            raise ValueError(f"Expected a non-empty value for `thread_id` but received {thread_id!r}")
381        extra_headers = {"OpenAI-Beta": "chatkit_beta=v1", **(extra_headers or {})}
382        return await self._delete(
383            f"/chatkit/threads/{thread_id}",
384            options=make_request_options(
385                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
386            ),
387            cast_to=ThreadDeleteResponse,
388        )
389
390    def list_items(
391        self,
392        thread_id: str,
393        *,
394        after: str | Omit = omit,
395        before: str | Omit = omit,
396        limit: int | Omit = omit,
397        order: Literal["asc", "desc"] | Omit = omit,
398        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
399        # The extra values given here take precedence over values defined on the client or passed to this method.
400        extra_headers: Headers | None = None,
401        extra_query: Query | None = None,
402        extra_body: Body | None = None,
403        timeout: float | httpx.Timeout | None | NotGiven = not_given,
404    ) -> AsyncPaginator[Data, AsyncConversationCursorPage[Data]]:
405        """
406        List ChatKit thread items
407
408        Args:
409          after: List items created after this thread item ID. Defaults to null for the first
410              page.
411
412          before: List items created before this thread item ID. Defaults to null for the newest
413              results.
414
415          limit: Maximum number of thread items to return. Defaults to 20.
416
417          order: Sort order for results by creation time. Defaults to `desc`.
418
419          extra_headers: Send extra headers
420
421          extra_query: Add additional query parameters to the request
422
423          extra_body: Add additional JSON properties to the request
424
425          timeout: Override the client-level default timeout for this request, in seconds
426        """
427        if not thread_id:
428            raise ValueError(f"Expected a non-empty value for `thread_id` but received {thread_id!r}")
429        extra_headers = {"OpenAI-Beta": "chatkit_beta=v1", **(extra_headers or {})}
430        return self._get_api_list(
431            f"/chatkit/threads/{thread_id}/items",
432            page=AsyncConversationCursorPage[Data],
433            options=make_request_options(
434                extra_headers=extra_headers,
435                extra_query=extra_query,
436                extra_body=extra_body,
437                timeout=timeout,
438                query=maybe_transform(
439                    {
440                        "after": after,
441                        "before": before,
442                        "limit": limit,
443                        "order": order,
444                    },
445                    thread_list_items_params.ThreadListItemsParams,
446                ),
447            ),
448            model=cast(Any, Data),  # Union types cannot be passed in as arguments in the type system
449        )
450
451
452class ThreadsWithRawResponse:
453    def __init__(self, threads: Threads) -> None:
454        self._threads = threads
455
456        self.retrieve = _legacy_response.to_raw_response_wrapper(
457            threads.retrieve,
458        )
459        self.list = _legacy_response.to_raw_response_wrapper(
460            threads.list,
461        )
462        self.delete = _legacy_response.to_raw_response_wrapper(
463            threads.delete,
464        )
465        self.list_items = _legacy_response.to_raw_response_wrapper(
466            threads.list_items,
467        )
468
469
470class AsyncThreadsWithRawResponse:
471    def __init__(self, threads: AsyncThreads) -> None:
472        self._threads = threads
473
474        self.retrieve = _legacy_response.async_to_raw_response_wrapper(
475            threads.retrieve,
476        )
477        self.list = _legacy_response.async_to_raw_response_wrapper(
478            threads.list,
479        )
480        self.delete = _legacy_response.async_to_raw_response_wrapper(
481            threads.delete,
482        )
483        self.list_items = _legacy_response.async_to_raw_response_wrapper(
484            threads.list_items,
485        )
486
487
488class ThreadsWithStreamingResponse:
489    def __init__(self, threads: Threads) -> None:
490        self._threads = threads
491
492        self.retrieve = to_streamed_response_wrapper(
493            threads.retrieve,
494        )
495        self.list = to_streamed_response_wrapper(
496            threads.list,
497        )
498        self.delete = to_streamed_response_wrapper(
499            threads.delete,
500        )
501        self.list_items = to_streamed_response_wrapper(
502            threads.list_items,
503        )
504
505
506class AsyncThreadsWithStreamingResponse:
507    def __init__(self, threads: AsyncThreads) -> None:
508        self._threads = threads
509
510        self.retrieve = async_to_streamed_response_wrapper(
511            threads.retrieve,
512        )
513        self.list = async_to_streamed_response_wrapper(
514            threads.list,
515        )
516        self.delete = async_to_streamed_response_wrapper(
517            threads.delete,
518        )
519        self.list_items = async_to_streamed_response_wrapper(
520            threads.list_items,
521        )