payi 0.1.0a59__py3-none-any.whl → 0.1.0a60__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of payi might be problematic. Click here for more details.

Files changed (48) hide show
  1. payi/_version.py +1 -1
  2. payi/lib/instrument.py +128 -18
  3. payi/pagination.py +50 -0
  4. payi/resources/categories/categories.py +108 -23
  5. payi/resources/categories/resources.py +42 -12
  6. payi/resources/experiences/types/types.py +37 -17
  7. payi/resources/limits/limits.py +21 -30
  8. payi/resources/use_cases/__init__.py +14 -0
  9. payi/resources/use_cases/definitions/__init__.py +14 -0
  10. payi/resources/use_cases/definitions/definitions.py +68 -18
  11. payi/resources/use_cases/definitions/kpis.py +584 -0
  12. payi/resources/use_cases/kpis.py +469 -0
  13. payi/resources/use_cases/use_cases.py +32 -0
  14. payi/types/__init__.py +3 -3
  15. payi/types/categories/__init__.py +1 -1
  16. payi/types/categories/resource_list_params.py +17 -0
  17. payi/types/category_list_params.py +15 -0
  18. payi/types/category_list_resources_params.py +15 -0
  19. payi/types/category_response.py +0 -5
  20. payi/types/experiences/__init__.py +0 -1
  21. payi/types/experiences/type_list_params.py +6 -1
  22. payi/types/limit_list_params.py +4 -13
  23. payi/types/limit_list_response.py +30 -0
  24. payi/types/use_cases/__init__.py +4 -1
  25. payi/types/use_cases/definition_list_params.py +6 -1
  26. payi/types/use_cases/definitions/__init__.py +8 -0
  27. payi/types/use_cases/definitions/kpi_create_params.py +17 -0
  28. payi/types/use_cases/definitions/kpi_create_response.py +20 -0
  29. payi/types/use_cases/definitions/kpi_delete_response.py +20 -0
  30. payi/types/use_cases/definitions/kpi_list_params.py +17 -0
  31. payi/types/use_cases/definitions/kpi_list_response.py +20 -0
  32. payi/types/use_cases/definitions/kpi_retrieve_response.py +20 -0
  33. payi/types/use_cases/definitions/kpi_update_params.py +16 -0
  34. payi/types/use_cases/definitions/kpi_update_response.py +20 -0
  35. payi/types/use_cases/kpi_create_params.py +13 -0
  36. payi/types/use_cases/kpi_list_params.py +17 -0
  37. payi/types/use_cases/kpi_list_response.py +21 -0
  38. payi/types/use_cases/kpi_update_params.py +13 -0
  39. {payi-0.1.0a59.dist-info → payi-0.1.0a60.dist-info}/METADATA +91 -28
  40. {payi-0.1.0a59.dist-info → payi-0.1.0a60.dist-info}/RECORD +42 -29
  41. payi/types/categories/resource_list_response.py +0 -10
  42. payi/types/category_list_resources_response.py +0 -10
  43. payi/types/category_list_response.py +0 -10
  44. payi/types/experiences/type_list_response.py +0 -10
  45. payi/types/paged_limit_list.py +0 -52
  46. payi/types/use_cases/definition_list_response.py +0 -10
  47. {payi-0.1.0a59.dist-info → payi-0.1.0a60.dist-info}/WHEEL +0 -0
  48. {payi-0.1.0a59.dist-info → payi-0.1.0a60.dist-info}/licenses/LICENSE +0 -0
payi/_version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "payi"
4
- __version__ = "0.1.0-alpha.59" # x-release-please-version
4
+ __version__ = "0.1.0-alpha.60" # x-release-please-version
payi/lib/instrument.py CHANGED
@@ -25,10 +25,22 @@ class Context(TypedDict, total=False):
25
25
  proxy: bool
26
26
  experience_name: Optional[str]
27
27
  experience_id: Optional[str]
28
+ use_case_name: Optional[str]
29
+ use_case_id: Optional[str]
30
+ use_case_version: Optional[int]
28
31
  limit_ids: Optional['list[str]']
29
32
  request_tags: Optional['list[str]']
30
33
  user_id: Optional[str]
31
34
 
35
+ class ParentState(TypedDict, total=False):
36
+ experience_name: Optional[str]
37
+ experience_id: Optional[str]
38
+ use_case_name: Optional[str]
39
+ use_case_id: Optional[str]
40
+ use_case_version: Optional[int]
41
+ limit_ids: Optional['list[str]']
42
+ request_tags: Optional['list[str]']
43
+
32
44
  class IsStreaming(Enum):
33
45
  false = 0
34
46
  true = 1
@@ -221,40 +233,51 @@ class PayiInstrumentor:
221
233
 
222
234
  def _setup_call_func(
223
235
  self
224
- ) -> 'tuple[Context, Optional[str], Optional[str]]':
236
+ ) -> 'tuple[Context, ParentState]':
225
237
  context: Context = {}
238
+ parentState: ParentState = {}
226
239
 
227
240
  if len(self._context_stack) > 0:
228
241
  # copy current context into the upcoming context
229
242
  context = self._context_stack[-1].copy()
230
243
  context.pop("proxy")
231
- previous_experience_name = context.get("experience_name", None)
232
- previous_experience_id = context.get("experience_id", None)
233
- else:
234
- previous_experience_name = None
235
- previous_experience_id = None
236
- return (context, previous_experience_name, previous_experience_id)
244
+ parentState["experience_name"] = context.get("experience_name", None)
245
+ parentState["experience_id"] = context.get("experience_id", None)
246
+ parentState["use_case_name"] = context.get("use_case_name", None)
247
+ parentState["use_case_id"] = context.get("use_case_id", None)
248
+ parentState["use_case_version"] = context.get("use_case_version", None)
249
+ parentState["limit_ids"] = context.get("limit_ids", None)
250
+ parentState["request_tags"] = context.get("request_tags", None)
251
+
252
+ return (context, parentState)
237
253
 
238
254
  def _init_context(
239
255
  self,
240
256
  context: Context,
241
- previous_experience_name: Optional[str],
242
- previous_experience_id: Optional[str],
257
+ parentState: ParentState,
243
258
  proxy: bool,
244
259
  limit_ids: Optional["list[str]"],
245
260
  request_tags: Optional["list[str]"],
246
261
  experience_name: Optional[str],
247
262
  experience_id: Optional[str],
263
+ use_case_name: Optional[str],
264
+ use_case_id: Optional[str],
265
+ use_case_version: Optional[int],
248
266
  user_id: Optional[str],
249
267
  ) -> None:
250
268
  context["proxy"] = proxy
251
269
 
270
+ # TODO use case what if caller specified epxerience / use_case ID and no name?
271
+
252
272
  # Handle experience name and ID logic
253
273
  if not experience_name:
254
274
  # If no experience_name specified, use previous values
255
- context["experience_name"] = previous_experience_name
256
- context["experience_id"] = previous_experience_id
275
+ context["experience_name"] = parentState.get("experience_name", None)
276
+ context["experience_id"] = parentState.get("experience_id", None)
257
277
  else:
278
+ previous_experience_name = parentState.get("experience_name", None)
279
+ previous_experience_id = parentState.get("experience_id", None)
280
+
258
281
  # If experience_name is specified
259
282
  if experience_name == previous_experience_name:
260
283
  # Same experience name, use previous ID unless new one specified
@@ -265,6 +288,29 @@ class PayiInstrumentor:
265
288
  context["experience_name"] = experience_name
266
289
  context["experience_id"] = experience_id if experience_id else str(uuid.uuid4())
267
290
 
291
+ # Handle use case name and ID logic
292
+ if not use_case_name: # TODO use case
293
+ # If no use_case_name specified, use previous values
294
+ context["use_case_name"] = parentState.get("use_case_name", None)
295
+ context["use_case_id"] = parentState.get("use_case_id", None)
296
+ context["use_case_version"] = parentState.get("use_case_version", None)
297
+ else:
298
+ previous_use_case_name = parentState.get("use_case_name", None)
299
+ previous_use_case_id = parentState.get("use_case_id", None)
300
+ previous_use_case_version = parentState.get("use_case_version", None)
301
+
302
+ # If use_case_name is specified
303
+ if use_case_name == previous_use_case_name:
304
+ # Same use case name, use previous ID unless new one specified
305
+ context["use_case_name"] = use_case_name
306
+ context["use_case_id"] = use_case_id if use_case_id else previous_use_case_id
307
+ context["use_case_version"] = use_case_version if use_case_version else previous_use_case_version
308
+ else:
309
+ # Different experience name, use specified ID or generate one
310
+ context["use_case_name"] = use_case_name
311
+ context["use_case_id"] = use_case_id if use_case_id else str(uuid.uuid4())
312
+ context["use_case_version"] = use_case_version
313
+
268
314
  # set any values explicitly passed by the caller, otherwise use what is already in the context
269
315
  if limit_ids:
270
316
  context["limit_ids"] = limit_ids
@@ -283,22 +329,27 @@ class PayiInstrumentor:
283
329
  request_tags: Optional["list[str]"],
284
330
  experience_name: Optional[str],
285
331
  experience_id: Optional[str],
332
+ use_case_name: Optional[str],
333
+ use_case_id: Optional[str],
334
+ use_case_version: Optional[int],
286
335
  user_id: Optional[str],
287
336
  *args: Any,
288
337
  **kwargs: Any,
289
338
  ) -> Any:
290
- context, previous_experience_name, previous_experience_id = self._setup_call_func()
339
+ context, parentState = self._setup_call_func()
291
340
 
292
341
  with self:
293
342
  self._init_context(
294
343
  context,
295
- previous_experience_name,
296
- previous_experience_id,
344
+ parentState,
297
345
  proxy,
298
346
  limit_ids,
299
347
  request_tags,
300
348
  experience_name,
301
349
  experience_id,
350
+ use_case_name,
351
+ use_case_id,
352
+ use_case_version,
302
353
  user_id)
303
354
  return await func(*args, **kwargs)
304
355
 
@@ -310,22 +361,27 @@ class PayiInstrumentor:
310
361
  request_tags: Optional["list[str]"],
311
362
  experience_name: Optional[str],
312
363
  experience_id: Optional[str],
364
+ use_case_name: Optional[str],
365
+ use_case_id: Optional[str],
366
+ use_case_version: Optional[int],
313
367
  user_id: Optional[str],
314
368
  *args: Any,
315
369
  **kwargs: Any,
316
370
  ) -> Any:
317
- context, previous_experience_name, previous_experience_id = self._setup_call_func()
371
+ context, parentState = self._setup_call_func()
318
372
 
319
373
  with self:
320
374
  self._init_context(
321
375
  context,
322
- previous_experience_name,
323
- previous_experience_id,
376
+ parentState,
324
377
  proxy,
325
378
  limit_ids,
326
379
  request_tags,
327
380
  experience_name,
328
381
  experience_id,
382
+ use_case_name,
383
+ use_case_id,
384
+ use_case_version,
329
385
  user_id)
330
386
  return func(*args, **kwargs)
331
387
 
@@ -348,7 +404,6 @@ class PayiInstrumentor:
348
404
  # Return the current top of the stack
349
405
  return self._context_stack[-1] if self._context_stack else None
350
406
 
351
-
352
407
  def _prepare_ingest(
353
408
  self,
354
409
  ingest: IngestUnitsParams,
@@ -359,6 +414,9 @@ class PayiInstrumentor:
359
414
  request_tags = ingest_extra_headers.pop(PayiHeaderNames.request_tags, None)
360
415
  experience_name = ingest_extra_headers.pop(PayiHeaderNames.experience_name, None)
361
416
  experience_id = ingest_extra_headers.pop(PayiHeaderNames.experience_id, None)
417
+ use_case_name = ingest_extra_headers.pop(PayiHeaderNames.use_case_name, None)
418
+ use_case_id = ingest_extra_headers.pop(PayiHeaderNames.use_case_id, None)
419
+ use_case_version = ingest_extra_headers.pop(PayiHeaderNames.use_case_version, None)
362
420
  user_id = ingest_extra_headers.pop(PayiHeaderNames.user_id, None)
363
421
 
364
422
  if limit_ids:
@@ -369,6 +427,12 @@ class PayiInstrumentor:
369
427
  ingest["experience_name"] = experience_name
370
428
  if experience_id:
371
429
  ingest["experience_id"] = experience_id
430
+ if use_case_name:
431
+ ingest["use_case_name"] = use_case_name
432
+ if use_case_id:
433
+ ingest["use_case_id"] = use_case_id
434
+ if use_case_version:
435
+ ingest["use_case_version"] = int(use_case_version)
372
436
  if user_id:
373
437
  ingest["user_id"] = user_id
374
438
 
@@ -656,6 +720,9 @@ class PayiInstrumentor:
656
720
  request_tags: Optional[list[str]] = context.get("request_tags")
657
721
  experience_name: Optional[str] = context.get("experience_name")
658
722
  experience_id: Optional[str] = context.get("experience_id")
723
+ use_case_name: Optional[str] = context.get("use_case_name")
724
+ use_case_id: Optional[str] = context.get("use_case_id")
725
+ use_case_version: Optional[int] = context.get("use_case_version")
659
726
  user_id: Optional[str] = context.get("user_id")
660
727
 
661
728
  # Merge limits from the decorator and extra headers
@@ -703,6 +770,31 @@ class PayiInstrumentor:
703
770
  # use the inner experience name and id as-is
704
771
  ...
705
772
 
773
+ # inner extra_headers use_casee_name and use_case_id take precedence over outer decorator use_case_name and use_case_id
774
+ # if either inner value is specified, ignore outer decorator values
775
+ if PayiHeaderNames.use_case_name not in extra_headers and PayiHeaderNames.use_case_id not in extra_headers:
776
+
777
+ # use decorator values
778
+ if use_case_name is not None:
779
+ extra_headers[PayiHeaderNames.use_case_name] = use_case_name
780
+ if use_case_id is not None:
781
+ extra_headers[PayiHeaderNames.use_case_id] = use_case_id
782
+ if use_case_version is not None:
783
+ extra_headers[PayiHeaderNames.use_case_version] = str(use_case_version)
784
+
785
+ elif PayiHeaderNames.use_case_id in extra_headers and PayiHeaderNames.use_case_name not in extra_headers:
786
+ # use the decorator experience name and the inner experience id
787
+ if use_case_name is not None:
788
+ extra_headers[PayiHeaderNames.use_case_name] = use_case_name
789
+
790
+ # use the decorator experience version and the inner experience id
791
+ if use_case_version is not None:
792
+ extra_headers[PayiHeaderNames.use_case_version] = str(use_case_version) # TODO use case
793
+
794
+ else:
795
+ # use the inner experience name and id as-is
796
+ ...
797
+
706
798
  @staticmethod
707
799
  def update_for_vision(input: int, units: 'dict[str, Units]') -> int:
708
800
  if PayiInstrumentor.estimated_prompt_tokens in units:
@@ -926,6 +1018,9 @@ def ingest(
926
1018
  request_tags: Optional["list[str]"] = None,
927
1019
  experience_name: Optional[str] = None,
928
1020
  experience_id: Optional[str] = None,
1021
+ use_case_name: Optional[str] = None,
1022
+ use_case_id: Optional[str] = None,
1023
+ use_case_version: Optional[int] = None,
929
1024
  user_id: Optional[str] = None,
930
1025
  ) -> Any:
931
1026
  def _ingest(func: Any) -> Any:
@@ -942,6 +1037,9 @@ def ingest(
942
1037
  request_tags,
943
1038
  experience_name,
944
1039
  experience_id,
1040
+ use_case_name,
1041
+ use_case_id,
1042
+ use_case_version,
945
1043
  user_id,
946
1044
  *args,
947
1045
  **kwargs,
@@ -958,6 +1056,9 @@ def ingest(
958
1056
  request_tags,
959
1057
  experience_name,
960
1058
  experience_id,
1059
+ use_case_name,
1060
+ use_case_id,
1061
+ use_case_version,
961
1062
  user_id,
962
1063
  *args,
963
1064
  **kwargs,
@@ -970,6 +1071,9 @@ def proxy(
970
1071
  request_tags: Optional["list[str]"] = None,
971
1072
  experience_name: Optional[str] = None,
972
1073
  experience_id: Optional[str] = None,
1074
+ use_case_id: Optional[str] = None,
1075
+ use_case_name: Optional[str] = None,
1076
+ use_case_version: Optional[int] = None,
973
1077
  user_id: Optional[str] = None,
974
1078
  ) -> Any:
975
1079
  def _proxy(func: Any) -> Any:
@@ -985,6 +1089,9 @@ def proxy(
985
1089
  request_tags,
986
1090
  experience_name,
987
1091
  experience_id,
1092
+ use_case_name,
1093
+ use_case_id,
1094
+ use_case_version,
988
1095
  user_id,
989
1096
  *args,
990
1097
  **kwargs
@@ -1002,6 +1109,9 @@ def proxy(
1002
1109
  request_tags,
1003
1110
  experience_name,
1004
1111
  experience_id,
1112
+ use_case_name,
1113
+ use_case_id,
1114
+ use_case_version,
1005
1115
  user_id,
1006
1116
  *args,
1007
1117
  **kwargs
payi/pagination.py ADDED
@@ -0,0 +1,50 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import List, Generic, TypeVar, Optional
4
+ from typing_extensions import override
5
+
6
+ from ._base_client import BasePage, PageInfo, BaseSyncPage, BaseAsyncPage
7
+
8
+ __all__ = ["SyncCursorPage", "AsyncCursorPage"]
9
+
10
+ _T = TypeVar("_T")
11
+
12
+
13
+ class SyncCursorPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
14
+ items: List[_T]
15
+ cursor: Optional[str] = None
16
+
17
+ @override
18
+ def _get_page_items(self) -> List[_T]:
19
+ items = self.items
20
+ if not items:
21
+ return []
22
+ return items
23
+
24
+ @override
25
+ def next_page_info(self) -> Optional[PageInfo]:
26
+ cursor = self.cursor
27
+ if not cursor:
28
+ return None
29
+
30
+ return PageInfo(params={"cursor": cursor})
31
+
32
+
33
+ class AsyncCursorPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
34
+ items: List[_T]
35
+ cursor: Optional[str] = None
36
+
37
+ @override
38
+ def _get_page_items(self) -> List[_T]:
39
+ items = self.items
40
+ if not items:
41
+ return []
42
+ return items
43
+
44
+ @override
45
+ def next_page_info(self) -> Optional[PageInfo]:
46
+ cursor = self.cursor
47
+ if not cursor:
48
+ return None
49
+
50
+ return PageInfo(params={"cursor": cursor})
@@ -4,7 +4,9 @@ from __future__ import annotations
4
4
 
5
5
  import httpx
6
6
 
7
+ from ...types import category_list_params, category_list_resources_params
7
8
  from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven
9
+ from ..._utils import maybe_transform
8
10
  from ..._compat import cached_property
9
11
  from .resources import (
10
12
  ResourcesResource,
@@ -21,10 +23,11 @@ from ..._response import (
21
23
  async_to_raw_response_wrapper,
22
24
  async_to_streamed_response_wrapper,
23
25
  )
24
- from ..._base_client import make_request_options
25
- from ...types.category_list_response import CategoryListResponse
26
+ from ...pagination import SyncCursorPage, AsyncCursorPage
27
+ from ..._base_client import AsyncPaginator, make_request_options
28
+ from ...types.category_response import CategoryResponse
26
29
  from ...types.category_delete_response import CategoryDeleteResponse
27
- from ...types.category_list_resources_response import CategoryListResourcesResponse
30
+ from ...types.category_resource_response import CategoryResourceResponse
28
31
  from ...types.category_delete_resource_response import CategoryDeleteResourceResponse
29
32
 
30
33
  __all__ = ["CategoriesResource", "AsyncCategoriesResource"]
@@ -57,20 +60,46 @@ class CategoriesResource(SyncAPIResource):
57
60
  def list(
58
61
  self,
59
62
  *,
63
+ cursor: str | NotGiven = NOT_GIVEN,
64
+ limit: int | NotGiven = NOT_GIVEN,
65
+ sort_ascending: bool | NotGiven = NOT_GIVEN,
60
66
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
61
67
  # The extra values given here take precedence over values defined on the client or passed to this method.
62
68
  extra_headers: Headers | None = None,
63
69
  extra_query: Query | None = None,
64
70
  extra_body: Body | None = None,
65
71
  timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
66
- ) -> CategoryListResponse:
67
- """Get all Categories"""
68
- return self._get(
72
+ ) -> SyncCursorPage[CategoryResponse]:
73
+ """
74
+ Get all Categories
75
+
76
+ Args:
77
+ extra_headers: Send extra headers
78
+
79
+ extra_query: Add additional query parameters to the request
80
+
81
+ extra_body: Add additional JSON properties to the request
82
+
83
+ timeout: Override the client-level default timeout for this request, in seconds
84
+ """
85
+ return self._get_api_list(
69
86
  "/api/v1/categories",
87
+ page=SyncCursorPage[CategoryResponse],
70
88
  options=make_request_options(
71
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
89
+ extra_headers=extra_headers,
90
+ extra_query=extra_query,
91
+ extra_body=extra_body,
92
+ timeout=timeout,
93
+ query=maybe_transform(
94
+ {
95
+ "cursor": cursor,
96
+ "limit": limit,
97
+ "sort_ascending": sort_ascending,
98
+ },
99
+ category_list_params.CategoryListParams,
100
+ ),
72
101
  ),
73
- cast_to=CategoryListResponse,
102
+ model=CategoryResponse,
74
103
  )
75
104
 
76
105
  def delete(
@@ -146,13 +175,16 @@ class CategoriesResource(SyncAPIResource):
146
175
  self,
147
176
  category: str,
148
177
  *,
178
+ cursor: str | NotGiven = NOT_GIVEN,
179
+ limit: int | NotGiven = NOT_GIVEN,
180
+ sort_ascending: bool | NotGiven = NOT_GIVEN,
149
181
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
150
182
  # The extra values given here take precedence over values defined on the client or passed to this method.
151
183
  extra_headers: Headers | None = None,
152
184
  extra_query: Query | None = None,
153
185
  extra_body: Body | None = None,
154
186
  timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
155
- ) -> CategoryListResourcesResponse:
187
+ ) -> SyncCursorPage[CategoryResourceResponse]:
156
188
  """
157
189
  Get all Resources for a Category
158
190
 
@@ -167,12 +199,24 @@ class CategoriesResource(SyncAPIResource):
167
199
  """
168
200
  if not category:
169
201
  raise ValueError(f"Expected a non-empty value for `category` but received {category!r}")
170
- return self._get(
202
+ return self._get_api_list(
171
203
  f"/api/v1/categories/{category}/resources",
204
+ page=SyncCursorPage[CategoryResourceResponse],
172
205
  options=make_request_options(
173
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
206
+ extra_headers=extra_headers,
207
+ extra_query=extra_query,
208
+ extra_body=extra_body,
209
+ timeout=timeout,
210
+ query=maybe_transform(
211
+ {
212
+ "cursor": cursor,
213
+ "limit": limit,
214
+ "sort_ascending": sort_ascending,
215
+ },
216
+ category_list_resources_params.CategoryListResourcesParams,
217
+ ),
174
218
  ),
175
- cast_to=CategoryListResourcesResponse,
219
+ model=CategoryResourceResponse,
176
220
  )
177
221
 
178
222
 
@@ -200,23 +244,49 @@ class AsyncCategoriesResource(AsyncAPIResource):
200
244
  """
201
245
  return AsyncCategoriesResourceWithStreamingResponse(self)
202
246
 
203
- async def list(
247
+ def list(
204
248
  self,
205
249
  *,
250
+ cursor: str | NotGiven = NOT_GIVEN,
251
+ limit: int | NotGiven = NOT_GIVEN,
252
+ sort_ascending: bool | NotGiven = NOT_GIVEN,
206
253
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
207
254
  # The extra values given here take precedence over values defined on the client or passed to this method.
208
255
  extra_headers: Headers | None = None,
209
256
  extra_query: Query | None = None,
210
257
  extra_body: Body | None = None,
211
258
  timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
212
- ) -> CategoryListResponse:
213
- """Get all Categories"""
214
- return await self._get(
259
+ ) -> AsyncPaginator[CategoryResponse, AsyncCursorPage[CategoryResponse]]:
260
+ """
261
+ Get all Categories
262
+
263
+ Args:
264
+ extra_headers: Send extra headers
265
+
266
+ extra_query: Add additional query parameters to the request
267
+
268
+ extra_body: Add additional JSON properties to the request
269
+
270
+ timeout: Override the client-level default timeout for this request, in seconds
271
+ """
272
+ return self._get_api_list(
215
273
  "/api/v1/categories",
274
+ page=AsyncCursorPage[CategoryResponse],
216
275
  options=make_request_options(
217
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
276
+ extra_headers=extra_headers,
277
+ extra_query=extra_query,
278
+ extra_body=extra_body,
279
+ timeout=timeout,
280
+ query=maybe_transform(
281
+ {
282
+ "cursor": cursor,
283
+ "limit": limit,
284
+ "sort_ascending": sort_ascending,
285
+ },
286
+ category_list_params.CategoryListParams,
287
+ ),
218
288
  ),
219
- cast_to=CategoryListResponse,
289
+ model=CategoryResponse,
220
290
  )
221
291
 
222
292
  async def delete(
@@ -288,17 +358,20 @@ class AsyncCategoriesResource(AsyncAPIResource):
288
358
  cast_to=CategoryDeleteResourceResponse,
289
359
  )
290
360
 
291
- async def list_resources(
361
+ def list_resources(
292
362
  self,
293
363
  category: str,
294
364
  *,
365
+ cursor: str | NotGiven = NOT_GIVEN,
366
+ limit: int | NotGiven = NOT_GIVEN,
367
+ sort_ascending: bool | NotGiven = NOT_GIVEN,
295
368
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
296
369
  # The extra values given here take precedence over values defined on the client or passed to this method.
297
370
  extra_headers: Headers | None = None,
298
371
  extra_query: Query | None = None,
299
372
  extra_body: Body | None = None,
300
373
  timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
301
- ) -> CategoryListResourcesResponse:
374
+ ) -> AsyncPaginator[CategoryResourceResponse, AsyncCursorPage[CategoryResourceResponse]]:
302
375
  """
303
376
  Get all Resources for a Category
304
377
 
@@ -313,12 +386,24 @@ class AsyncCategoriesResource(AsyncAPIResource):
313
386
  """
314
387
  if not category:
315
388
  raise ValueError(f"Expected a non-empty value for `category` but received {category!r}")
316
- return await self._get(
389
+ return self._get_api_list(
317
390
  f"/api/v1/categories/{category}/resources",
391
+ page=AsyncCursorPage[CategoryResourceResponse],
318
392
  options=make_request_options(
319
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
393
+ extra_headers=extra_headers,
394
+ extra_query=extra_query,
395
+ extra_body=extra_body,
396
+ timeout=timeout,
397
+ query=maybe_transform(
398
+ {
399
+ "cursor": cursor,
400
+ "limit": limit,
401
+ "sort_ascending": sort_ascending,
402
+ },
403
+ category_list_resources_params.CategoryListResourcesParams,
404
+ ),
320
405
  ),
321
- cast_to=CategoryListResourcesResponse,
406
+ model=CategoryResourceResponse,
322
407
  )
323
408
 
324
409