openmeter 1.0.0b53__py3-none-any.whl → 2.0.0__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 openmeter might be problematic. Click here for more details.

Files changed (132) hide show
  1. openmeter/__init__.py +89 -15
  2. openmeter/_base_client.py +2041 -0
  3. openmeter/_client.py +518 -70
  4. openmeter/_compat.py +221 -0
  5. openmeter/_constants.py +14 -0
  6. openmeter/_exceptions.py +108 -0
  7. openmeter/_files.py +127 -0
  8. openmeter/_models.py +777 -0
  9. openmeter/_qs.py +150 -0
  10. openmeter/_resource.py +43 -0
  11. openmeter/_response.py +820 -0
  12. openmeter/_streaming.py +333 -0
  13. openmeter/_types.py +222 -0
  14. openmeter/_utils/__init__.py +56 -0
  15. openmeter/_utils/_logs.py +25 -0
  16. openmeter/_utils/_proxy.py +63 -0
  17. openmeter/_utils/_reflection.py +42 -0
  18. openmeter/_utils/_streams.py +12 -0
  19. openmeter/_utils/_sync.py +81 -0
  20. openmeter/_utils/_transform.py +387 -0
  21. openmeter/_utils/_typing.py +120 -0
  22. openmeter/_utils/_utils.py +419 -0
  23. openmeter/_version.py +4 -0
  24. openmeter/lib/.keep +4 -0
  25. openmeter/py.typed +0 -1
  26. openmeter/resources/__init__.py +103 -0
  27. openmeter/resources/debug/__init__.py +33 -0
  28. openmeter/resources/debug/debug.py +102 -0
  29. openmeter/resources/debug/metrics.py +146 -0
  30. openmeter/resources/entitlements/__init__.py +47 -0
  31. openmeter/resources/entitlements/entitlements.py +450 -0
  32. openmeter/resources/entitlements/features.py +578 -0
  33. openmeter/resources/entitlements/grants.py +389 -0
  34. openmeter/resources/events.py +442 -0
  35. openmeter/resources/meters/__init__.py +33 -0
  36. openmeter/resources/meters/meters.py +666 -0
  37. openmeter/resources/meters/subjects.py +163 -0
  38. openmeter/resources/notifications/__init__.py +75 -0
  39. openmeter/resources/notifications/channels.py +686 -0
  40. openmeter/resources/notifications/events.py +365 -0
  41. openmeter/resources/notifications/notifications.py +198 -0
  42. openmeter/resources/notifications/rules.py +781 -0
  43. openmeter/resources/notifications/webhook.py +208 -0
  44. openmeter/resources/portal/__init__.py +47 -0
  45. openmeter/resources/portal/meters.py +230 -0
  46. openmeter/resources/portal/portal.py +112 -0
  47. openmeter/resources/portal/tokens.py +359 -0
  48. openmeter/resources/subjects/entitlements/__init__.py +33 -0
  49. openmeter/resources/subjects/entitlements/entitlements.py +1881 -0
  50. openmeter/resources/subjects/entitlements/grants.py +453 -0
  51. openmeter/resources/subjects.py +419 -0
  52. openmeter/types/__init__.py +21 -0
  53. openmeter/types/debug/__init__.py +5 -0
  54. openmeter/types/debug/metric_list_response.py +7 -0
  55. openmeter/types/entitlement.py +238 -0
  56. openmeter/types/entitlements/__init__.py +11 -0
  57. openmeter/types/entitlements/feature.py +61 -0
  58. openmeter/types/entitlements/feature_create_params.py +43 -0
  59. openmeter/types/entitlements/feature_list_params.py +23 -0
  60. openmeter/types/entitlements/grant_list_params.py +57 -0
  61. openmeter/types/entitlements/grant_list_response.py +11 -0
  62. openmeter/types/entitlements/grant_paginated_response.py +24 -0
  63. openmeter/types/entitlements/list_features_result.py +28 -0
  64. openmeter/types/event_ingest_params.py +46 -0
  65. openmeter/types/event_ingest_response.py +43 -0
  66. openmeter/types/event_list_params.py +22 -0
  67. openmeter/types/event_list_response.py +9 -0
  68. openmeter/types/ingested_event.py +59 -0
  69. openmeter/types/list_entitlements_result.py +28 -0
  70. openmeter/types/meter.py +53 -0
  71. openmeter/types/meter_create_params.py +50 -0
  72. openmeter/types/meter_list_response.py +9 -0
  73. openmeter/types/meter_query_params.py +50 -0
  74. openmeter/types/meter_query_result.py +35 -0
  75. openmeter/types/meters/__init__.py +5 -0
  76. openmeter/types/meters/subject_list_response.py +8 -0
  77. openmeter/types/notifications/__init__.py +18 -0
  78. openmeter/types/notifications/channel_create_params.py +34 -0
  79. openmeter/types/notifications/channel_list_params.py +41 -0
  80. openmeter/types/notifications/channel_list_response.py +24 -0
  81. openmeter/types/notifications/channel_update_params.py +34 -0
  82. openmeter/types/notifications/event_list_params.py +61 -0
  83. openmeter/types/notifications/event_list_response.py +24 -0
  84. openmeter/types/notifications/notification_channel.py +47 -0
  85. openmeter/types/notifications/notification_event.py +215 -0
  86. openmeter/types/notifications/notification_rule.py +70 -0
  87. openmeter/types/notifications/rule_create_params.py +39 -0
  88. openmeter/types/notifications/rule_list_params.py +54 -0
  89. openmeter/types/notifications/rule_list_response.py +24 -0
  90. openmeter/types/notifications/rule_update_params.py +39 -0
  91. openmeter/types/notifications/webhook_svix_params.py +26 -0
  92. openmeter/types/portal/__init__.py +10 -0
  93. openmeter/types/portal/meter_query_params.py +44 -0
  94. openmeter/types/portal/portal_token.py +28 -0
  95. openmeter/types/portal/token_create_params.py +17 -0
  96. openmeter/types/portal/token_invalidate_params.py +15 -0
  97. openmeter/types/portal/token_list_params.py +12 -0
  98. openmeter/types/portal/token_list_response.py +9 -0
  99. openmeter/types/shared/__init__.py +3 -0
  100. openmeter/types/subject.py +37 -0
  101. openmeter/types/subject_list_response.py +9 -0
  102. openmeter/types/subject_param.py +27 -0
  103. openmeter/types/subject_upsert_params.py +39 -0
  104. openmeter/types/subject_upsert_response.py +10 -0
  105. openmeter/types/subjects/__init__.py +13 -0
  106. openmeter/types/subjects/entitlement_history_params.py +35 -0
  107. openmeter/types/subjects/entitlement_history_response.py +98 -0
  108. openmeter/types/subjects/entitlement_list_response.py +10 -0
  109. openmeter/types/subjects/entitlements/__init__.py +8 -0
  110. openmeter/types/subjects/entitlements/entitlement_grant.py +103 -0
  111. openmeter/types/subjects/entitlements/grant_list_response.py +10 -0
  112. openmeter-2.0.0.dist-info/METADATA +396 -0
  113. openmeter-2.0.0.dist-info/RECORD +115 -0
  114. {openmeter-1.0.0b53.dist-info → openmeter-2.0.0.dist-info}/WHEEL +1 -1
  115. openmeter-2.0.0.dist-info/licenses/LICENSE +201 -0
  116. openmeter/_configuration.py +0 -36
  117. openmeter/_operations/__init__.py +0 -17
  118. openmeter/_operations/_operations.py +0 -2098
  119. openmeter/_operations/_patch.py +0 -20
  120. openmeter/_patch.py +0 -20
  121. openmeter/_serialization.py +0 -2008
  122. openmeter/_vendor.py +0 -24
  123. openmeter/aio/__init__.py +0 -21
  124. openmeter/aio/_client.py +0 -83
  125. openmeter/aio/_configuration.py +0 -36
  126. openmeter/aio/_operations/__init__.py +0 -17
  127. openmeter/aio/_operations/_operations.py +0 -1771
  128. openmeter/aio/_operations/_patch.py +0 -20
  129. openmeter/aio/_patch.py +0 -20
  130. openmeter/aio/_vendor.py +0 -24
  131. openmeter-1.0.0b53.dist-info/METADATA +0 -92
  132. openmeter-1.0.0b53.dist-info/RECORD +0 -21
@@ -0,0 +1,208 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Dict
6
+ from typing_extensions import Literal
7
+
8
+ import httpx
9
+
10
+ from ..._types import NOT_GIVEN, Body, Query, Headers, NoneType, NotGiven
11
+ from ..._utils import (
12
+ maybe_transform,
13
+ async_maybe_transform,
14
+ )
15
+ from ..._compat import cached_property
16
+ from ..._resource import SyncAPIResource, AsyncAPIResource
17
+ from ..._response import (
18
+ to_raw_response_wrapper,
19
+ to_streamed_response_wrapper,
20
+ async_to_raw_response_wrapper,
21
+ async_to_streamed_response_wrapper,
22
+ )
23
+ from ..._base_client import make_request_options
24
+ from ...types.notifications import webhook_svix_params
25
+
26
+ __all__ = ["WebhookResource", "AsyncWebhookResource"]
27
+
28
+
29
+ class WebhookResource(SyncAPIResource):
30
+ @cached_property
31
+ def with_raw_response(self) -> WebhookResourceWithRawResponse:
32
+ """
33
+ This property can be used as a prefix for any HTTP method call to return the
34
+ the raw response object instead of the parsed content.
35
+
36
+ For more information, see https://www.github.com/openmeterio/openmeter-python#accessing-raw-response-data-eg-headers
37
+ """
38
+ return WebhookResourceWithRawResponse(self)
39
+
40
+ @cached_property
41
+ def with_streaming_response(self) -> WebhookResourceWithStreamingResponse:
42
+ """
43
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
44
+
45
+ For more information, see https://www.github.com/openmeterio/openmeter-python#with_streaming_response
46
+ """
47
+ return WebhookResourceWithStreamingResponse(self)
48
+
49
+ def svix(
50
+ self,
51
+ *,
52
+ data: Dict[str, str],
53
+ type: Literal[
54
+ "endpoint.created",
55
+ "endpoint.deleted",
56
+ "endpoint.disabled",
57
+ "endpoint.updated",
58
+ "message.attempt.exhausted",
59
+ "message.attempt.failing",
60
+ "message.attempt.recovered",
61
+ ],
62
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
63
+ # The extra values given here take precedence over values defined on the client or passed to this method.
64
+ extra_headers: Headers | None = None,
65
+ extra_query: Query | None = None,
66
+ extra_body: Body | None = None,
67
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
68
+ ) -> None:
69
+ """
70
+ Callback endpoint used by Svix to notify about operational events.
71
+
72
+ Args:
73
+ data: The payload of the Svix operational webhook request.
74
+
75
+ type: The type of the Svix operational webhook request.
76
+
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
+ extra_headers = {"Accept": "*/*", **(extra_headers or {})}
86
+ return self._post(
87
+ "/api/v1/notification/webhook/svix",
88
+ body=maybe_transform(
89
+ {
90
+ "data": data,
91
+ "type": type,
92
+ },
93
+ webhook_svix_params.WebhookSvixParams,
94
+ ),
95
+ options=make_request_options(
96
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
97
+ ),
98
+ cast_to=NoneType,
99
+ )
100
+
101
+
102
+ class AsyncWebhookResource(AsyncAPIResource):
103
+ @cached_property
104
+ def with_raw_response(self) -> AsyncWebhookResourceWithRawResponse:
105
+ """
106
+ This property can be used as a prefix for any HTTP method call to return the
107
+ the raw response object instead of the parsed content.
108
+
109
+ For more information, see https://www.github.com/openmeterio/openmeter-python#accessing-raw-response-data-eg-headers
110
+ """
111
+ return AsyncWebhookResourceWithRawResponse(self)
112
+
113
+ @cached_property
114
+ def with_streaming_response(self) -> AsyncWebhookResourceWithStreamingResponse:
115
+ """
116
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
117
+
118
+ For more information, see https://www.github.com/openmeterio/openmeter-python#with_streaming_response
119
+ """
120
+ return AsyncWebhookResourceWithStreamingResponse(self)
121
+
122
+ async def svix(
123
+ self,
124
+ *,
125
+ data: Dict[str, str],
126
+ type: Literal[
127
+ "endpoint.created",
128
+ "endpoint.deleted",
129
+ "endpoint.disabled",
130
+ "endpoint.updated",
131
+ "message.attempt.exhausted",
132
+ "message.attempt.failing",
133
+ "message.attempt.recovered",
134
+ ],
135
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
136
+ # The extra values given here take precedence over values defined on the client or passed to this method.
137
+ extra_headers: Headers | None = None,
138
+ extra_query: Query | None = None,
139
+ extra_body: Body | None = None,
140
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
141
+ ) -> None:
142
+ """
143
+ Callback endpoint used by Svix to notify about operational events.
144
+
145
+ Args:
146
+ data: The payload of the Svix operational webhook request.
147
+
148
+ type: The type of the Svix operational webhook request.
149
+
150
+ extra_headers: Send extra headers
151
+
152
+ extra_query: Add additional query parameters to the request
153
+
154
+ extra_body: Add additional JSON properties to the request
155
+
156
+ timeout: Override the client-level default timeout for this request, in seconds
157
+ """
158
+ extra_headers = {"Accept": "*/*", **(extra_headers or {})}
159
+ return await self._post(
160
+ "/api/v1/notification/webhook/svix",
161
+ body=await async_maybe_transform(
162
+ {
163
+ "data": data,
164
+ "type": type,
165
+ },
166
+ webhook_svix_params.WebhookSvixParams,
167
+ ),
168
+ options=make_request_options(
169
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
170
+ ),
171
+ cast_to=NoneType,
172
+ )
173
+
174
+
175
+ class WebhookResourceWithRawResponse:
176
+ def __init__(self, webhook: WebhookResource) -> None:
177
+ self._webhook = webhook
178
+
179
+ self.svix = to_raw_response_wrapper(
180
+ webhook.svix,
181
+ )
182
+
183
+
184
+ class AsyncWebhookResourceWithRawResponse:
185
+ def __init__(self, webhook: AsyncWebhookResource) -> None:
186
+ self._webhook = webhook
187
+
188
+ self.svix = async_to_raw_response_wrapper(
189
+ webhook.svix,
190
+ )
191
+
192
+
193
+ class WebhookResourceWithStreamingResponse:
194
+ def __init__(self, webhook: WebhookResource) -> None:
195
+ self._webhook = webhook
196
+
197
+ self.svix = to_streamed_response_wrapper(
198
+ webhook.svix,
199
+ )
200
+
201
+
202
+ class AsyncWebhookResourceWithStreamingResponse:
203
+ def __init__(self, webhook: AsyncWebhookResource) -> None:
204
+ self._webhook = webhook
205
+
206
+ self.svix = async_to_streamed_response_wrapper(
207
+ webhook.svix,
208
+ )
@@ -0,0 +1,47 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from .meters import (
4
+ MetersResource,
5
+ AsyncMetersResource,
6
+ MetersResourceWithRawResponse,
7
+ AsyncMetersResourceWithRawResponse,
8
+ MetersResourceWithStreamingResponse,
9
+ AsyncMetersResourceWithStreamingResponse,
10
+ )
11
+ from .portal import (
12
+ PortalResource,
13
+ AsyncPortalResource,
14
+ PortalResourceWithRawResponse,
15
+ AsyncPortalResourceWithRawResponse,
16
+ PortalResourceWithStreamingResponse,
17
+ AsyncPortalResourceWithStreamingResponse,
18
+ )
19
+ from .tokens import (
20
+ TokensResource,
21
+ AsyncTokensResource,
22
+ TokensResourceWithRawResponse,
23
+ AsyncTokensResourceWithRawResponse,
24
+ TokensResourceWithStreamingResponse,
25
+ AsyncTokensResourceWithStreamingResponse,
26
+ )
27
+
28
+ __all__ = [
29
+ "MetersResource",
30
+ "AsyncMetersResource",
31
+ "MetersResourceWithRawResponse",
32
+ "AsyncMetersResourceWithRawResponse",
33
+ "MetersResourceWithStreamingResponse",
34
+ "AsyncMetersResourceWithStreamingResponse",
35
+ "TokensResource",
36
+ "AsyncTokensResource",
37
+ "TokensResourceWithRawResponse",
38
+ "AsyncTokensResourceWithRawResponse",
39
+ "TokensResourceWithStreamingResponse",
40
+ "AsyncTokensResourceWithStreamingResponse",
41
+ "PortalResource",
42
+ "AsyncPortalResource",
43
+ "PortalResourceWithRawResponse",
44
+ "AsyncPortalResourceWithRawResponse",
45
+ "PortalResourceWithStreamingResponse",
46
+ "AsyncPortalResourceWithStreamingResponse",
47
+ ]
@@ -0,0 +1,230 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Dict, List, Union
6
+ from datetime import datetime
7
+ from typing_extensions import Literal
8
+
9
+ import httpx
10
+
11
+ from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven
12
+ from ..._utils import (
13
+ maybe_transform,
14
+ async_maybe_transform,
15
+ )
16
+ from ..._compat import cached_property
17
+ from ..._resource import SyncAPIResource, AsyncAPIResource
18
+ from ..._response import (
19
+ to_raw_response_wrapper,
20
+ to_streamed_response_wrapper,
21
+ async_to_raw_response_wrapper,
22
+ async_to_streamed_response_wrapper,
23
+ )
24
+ from ..._base_client import make_request_options
25
+ from ...types.portal import meter_query_params
26
+ from ...types.meter_query_result import MeterQueryResult
27
+
28
+ __all__ = ["MetersResource", "AsyncMetersResource"]
29
+
30
+
31
+ class MetersResource(SyncAPIResource):
32
+ @cached_property
33
+ def with_raw_response(self) -> MetersResourceWithRawResponse:
34
+ return MetersResourceWithRawResponse(self)
35
+
36
+ @cached_property
37
+ def with_streaming_response(self) -> MetersResourceWithStreamingResponse:
38
+ return MetersResourceWithStreamingResponse(self)
39
+
40
+ def query(
41
+ self,
42
+ meter_slug: str,
43
+ *,
44
+ filter_group_by: Dict[str, str] | NotGiven = NOT_GIVEN,
45
+ from_: Union[str, datetime] | NotGiven = NOT_GIVEN,
46
+ group_by: List[str] | NotGiven = NOT_GIVEN,
47
+ to: Union[str, datetime] | NotGiven = NOT_GIVEN,
48
+ window_size: Literal["MINUTE", "HOUR", "DAY"] | NotGiven = NOT_GIVEN,
49
+ window_time_zone: str | NotGiven = NOT_GIVEN,
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
+ ) -> MeterQueryResult:
57
+ """Query meter for consumer portal.
58
+
59
+ This endpoint is publicly exposable to
60
+ consumers.
61
+
62
+ Args:
63
+ filter_group_by: Simple filter for group bys with exact match.
64
+
65
+ Usage: `?filterGroupBy[type]=input&filterGroupBy[model]=gpt-4`
66
+
67
+ from_: Start date-time in RFC 3339 format. Inclusive.
68
+
69
+ group_by: If not specified a single aggregate will be returned for each subject and time
70
+ window. `subject` is a reserved group by value.
71
+
72
+ to: End date-time in RFC 3339 format. Inclusive.
73
+
74
+ window_size: If not specified, a single usage aggregate will be returned for the entirety of
75
+ the specified period for each subject and group.
76
+
77
+ window_time_zone: The value is the name of the time zone as defined in the IANA Time Zone Database
78
+ (http://www.iana.org/time-zones). If not specified, the UTC timezone will be
79
+ used.
80
+
81
+ extra_headers: Send extra headers
82
+
83
+ extra_query: Add additional query parameters to the request
84
+
85
+ extra_body: Add additional JSON properties to the request
86
+
87
+ timeout: Override the client-level default timeout for this request, in seconds
88
+ """
89
+ if not meter_slug:
90
+ raise ValueError(f"Expected a non-empty value for `meter_slug` but received {meter_slug!r}")
91
+ return self._get(
92
+ f"/api/v1/portal/meters/{meter_slug}/query",
93
+ options=make_request_options(
94
+ extra_headers=extra_headers,
95
+ extra_query=extra_query,
96
+ extra_body=extra_body,
97
+ timeout=timeout,
98
+ query=maybe_transform(
99
+ {
100
+ "filter_group_by": filter_group_by,
101
+ "from_": from_,
102
+ "group_by": group_by,
103
+ "to": to,
104
+ "window_size": window_size,
105
+ "window_time_zone": window_time_zone,
106
+ },
107
+ meter_query_params.MeterQueryParams,
108
+ ),
109
+ ),
110
+ cast_to=MeterQueryResult,
111
+ )
112
+
113
+
114
+ class AsyncMetersResource(AsyncAPIResource):
115
+ @cached_property
116
+ def with_raw_response(self) -> AsyncMetersResourceWithRawResponse:
117
+ return AsyncMetersResourceWithRawResponse(self)
118
+
119
+ @cached_property
120
+ def with_streaming_response(self) -> AsyncMetersResourceWithStreamingResponse:
121
+ return AsyncMetersResourceWithStreamingResponse(self)
122
+
123
+ async def query(
124
+ self,
125
+ meter_slug: str,
126
+ *,
127
+ filter_group_by: Dict[str, str] | NotGiven = NOT_GIVEN,
128
+ from_: Union[str, datetime] | NotGiven = NOT_GIVEN,
129
+ group_by: List[str] | NotGiven = NOT_GIVEN,
130
+ to: Union[str, datetime] | NotGiven = NOT_GIVEN,
131
+ window_size: Literal["MINUTE", "HOUR", "DAY"] | NotGiven = NOT_GIVEN,
132
+ window_time_zone: str | NotGiven = NOT_GIVEN,
133
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
134
+ # The extra values given here take precedence over values defined on the client or passed to this method.
135
+ extra_headers: Headers | None = None,
136
+ extra_query: Query | None = None,
137
+ extra_body: Body | None = None,
138
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
139
+ ) -> MeterQueryResult:
140
+ """Query meter for consumer portal.
141
+
142
+ This endpoint is publicly exposable to
143
+ consumers.
144
+
145
+ Args:
146
+ filter_group_by: Simple filter for group bys with exact match.
147
+
148
+ Usage: `?filterGroupBy[type]=input&filterGroupBy[model]=gpt-4`
149
+
150
+ from_: Start date-time in RFC 3339 format. Inclusive.
151
+
152
+ group_by: If not specified a single aggregate will be returned for each subject and time
153
+ window. `subject` is a reserved group by value.
154
+
155
+ to: End date-time in RFC 3339 format. Inclusive.
156
+
157
+ window_size: If not specified, a single usage aggregate will be returned for the entirety of
158
+ the specified period for each subject and group.
159
+
160
+ window_time_zone: The value is the name of the time zone as defined in the IANA Time Zone Database
161
+ (http://www.iana.org/time-zones). If not specified, the UTC timezone will be
162
+ used.
163
+
164
+ extra_headers: Send extra headers
165
+
166
+ extra_query: Add additional query parameters to the request
167
+
168
+ extra_body: Add additional JSON properties to the request
169
+
170
+ timeout: Override the client-level default timeout for this request, in seconds
171
+ """
172
+ if not meter_slug:
173
+ raise ValueError(f"Expected a non-empty value for `meter_slug` but received {meter_slug!r}")
174
+ return await self._get(
175
+ f"/api/v1/portal/meters/{meter_slug}/query",
176
+ options=make_request_options(
177
+ extra_headers=extra_headers,
178
+ extra_query=extra_query,
179
+ extra_body=extra_body,
180
+ timeout=timeout,
181
+ query=await async_maybe_transform(
182
+ {
183
+ "filter_group_by": filter_group_by,
184
+ "from_": from_,
185
+ "group_by": group_by,
186
+ "to": to,
187
+ "window_size": window_size,
188
+ "window_time_zone": window_time_zone,
189
+ },
190
+ meter_query_params.MeterQueryParams,
191
+ ),
192
+ ),
193
+ cast_to=MeterQueryResult,
194
+ )
195
+
196
+
197
+ class MetersResourceWithRawResponse:
198
+ def __init__(self, meters: MetersResource) -> None:
199
+ self._meters = meters
200
+
201
+ self.query = to_raw_response_wrapper(
202
+ meters.query,
203
+ )
204
+
205
+
206
+ class AsyncMetersResourceWithRawResponse:
207
+ def __init__(self, meters: AsyncMetersResource) -> None:
208
+ self._meters = meters
209
+
210
+ self.query = async_to_raw_response_wrapper(
211
+ meters.query,
212
+ )
213
+
214
+
215
+ class MetersResourceWithStreamingResponse:
216
+ def __init__(self, meters: MetersResource) -> None:
217
+ self._meters = meters
218
+
219
+ self.query = to_streamed_response_wrapper(
220
+ meters.query,
221
+ )
222
+
223
+
224
+ class AsyncMetersResourceWithStreamingResponse:
225
+ def __init__(self, meters: AsyncMetersResource) -> None:
226
+ self._meters = meters
227
+
228
+ self.query = async_to_streamed_response_wrapper(
229
+ meters.query,
230
+ )
@@ -0,0 +1,112 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from .meters import (
6
+ MetersResource,
7
+ AsyncMetersResource,
8
+ MetersResourceWithRawResponse,
9
+ AsyncMetersResourceWithRawResponse,
10
+ MetersResourceWithStreamingResponse,
11
+ AsyncMetersResourceWithStreamingResponse,
12
+ )
13
+ from .tokens import (
14
+ TokensResource,
15
+ AsyncTokensResource,
16
+ TokensResourceWithRawResponse,
17
+ AsyncTokensResourceWithRawResponse,
18
+ TokensResourceWithStreamingResponse,
19
+ AsyncTokensResourceWithStreamingResponse,
20
+ )
21
+ from ..._compat import cached_property
22
+ from ..._resource import SyncAPIResource, AsyncAPIResource
23
+
24
+ __all__ = ["PortalResource", "AsyncPortalResource"]
25
+
26
+
27
+ class PortalResource(SyncAPIResource):
28
+ @cached_property
29
+ def meters(self) -> MetersResource:
30
+ return MetersResource(self._client)
31
+
32
+ @cached_property
33
+ def tokens(self) -> TokensResource:
34
+ return TokensResource(self._client)
35
+
36
+ @cached_property
37
+ def with_raw_response(self) -> PortalResourceWithRawResponse:
38
+ return PortalResourceWithRawResponse(self)
39
+
40
+ @cached_property
41
+ def with_streaming_response(self) -> PortalResourceWithStreamingResponse:
42
+ return PortalResourceWithStreamingResponse(self)
43
+
44
+
45
+ class AsyncPortalResource(AsyncAPIResource):
46
+ @cached_property
47
+ def meters(self) -> AsyncMetersResource:
48
+ return AsyncMetersResource(self._client)
49
+
50
+ @cached_property
51
+ def tokens(self) -> AsyncTokensResource:
52
+ return AsyncTokensResource(self._client)
53
+
54
+ @cached_property
55
+ def with_raw_response(self) -> AsyncPortalResourceWithRawResponse:
56
+ return AsyncPortalResourceWithRawResponse(self)
57
+
58
+ @cached_property
59
+ def with_streaming_response(self) -> AsyncPortalResourceWithStreamingResponse:
60
+ return AsyncPortalResourceWithStreamingResponse(self)
61
+
62
+
63
+ class PortalResourceWithRawResponse:
64
+ def __init__(self, portal: PortalResource) -> None:
65
+ self._portal = portal
66
+
67
+ @cached_property
68
+ def meters(self) -> MetersResourceWithRawResponse:
69
+ return MetersResourceWithRawResponse(self._portal.meters)
70
+
71
+ @cached_property
72
+ def tokens(self) -> TokensResourceWithRawResponse:
73
+ return TokensResourceWithRawResponse(self._portal.tokens)
74
+
75
+
76
+ class AsyncPortalResourceWithRawResponse:
77
+ def __init__(self, portal: AsyncPortalResource) -> None:
78
+ self._portal = portal
79
+
80
+ @cached_property
81
+ def meters(self) -> AsyncMetersResourceWithRawResponse:
82
+ return AsyncMetersResourceWithRawResponse(self._portal.meters)
83
+
84
+ @cached_property
85
+ def tokens(self) -> AsyncTokensResourceWithRawResponse:
86
+ return AsyncTokensResourceWithRawResponse(self._portal.tokens)
87
+
88
+
89
+ class PortalResourceWithStreamingResponse:
90
+ def __init__(self, portal: PortalResource) -> None:
91
+ self._portal = portal
92
+
93
+ @cached_property
94
+ def meters(self) -> MetersResourceWithStreamingResponse:
95
+ return MetersResourceWithStreamingResponse(self._portal.meters)
96
+
97
+ @cached_property
98
+ def tokens(self) -> TokensResourceWithStreamingResponse:
99
+ return TokensResourceWithStreamingResponse(self._portal.tokens)
100
+
101
+
102
+ class AsyncPortalResourceWithStreamingResponse:
103
+ def __init__(self, portal: AsyncPortalResource) -> None:
104
+ self._portal = portal
105
+
106
+ @cached_property
107
+ def meters(self) -> AsyncMetersResourceWithStreamingResponse:
108
+ return AsyncMetersResourceWithStreamingResponse(self._portal.meters)
109
+
110
+ @cached_property
111
+ def tokens(self) -> AsyncTokensResourceWithStreamingResponse:
112
+ return AsyncTokensResourceWithStreamingResponse(self._portal.tokens)