Skip to content

Commit 9d7607b

Browse files
committed
Release 0.0.67
1 parent 006b058 commit 9d7607b

20 files changed

Lines changed: 543 additions & 163 deletions

File tree

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,24 @@ a proof of concept, but know that we will not be able to merge it as-is. We sugg
157157
an issue first to discuss with us!
158158

159159
On the other hand, contributions to the README are always very welcome!
160+
## Pagination
161+
162+
Paginated requests will return a `SyncPager` or `AsyncPager`, which can be used as generators for the underlying object.
163+
164+
```python
165+
from agentmail import AgentMail
166+
167+
client = AgentMail(
168+
api_key="YOUR_API_KEY",
169+
)
170+
response = client.inboxes.list()
171+
for item in response:
172+
yield item
173+
# alternatively, you can paginate page-by-page
174+
for page in response.iter_pages():
175+
yield page
176+
```
177+
160178
## Websockets
161179

162180
The SDK supports both sync and async websocket connections for real-time, low-latency communication. Sockets can be created using the `connect` method, which returns a context manager.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name = "agentmail"
33

44
[tool.poetry]
55
name = "agentmail"
6-
version = "0.0.66"
6+
version = "0.0.67"
77
description = ""
88
readme = "README.md"
99
authors = []

reference.md

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ from agentmail import AgentMail
1818
client = AgentMail(
1919
api_key="YOUR_API_KEY",
2020
)
21-
client.inboxes.list()
21+
response = client.inboxes.list()
22+
for item in response:
23+
yield item
24+
# alternatively, you can paginate page-by-page
25+
for page in response.iter_pages():
26+
yield page
2227

2328
```
2429
</dd>
@@ -271,7 +276,12 @@ from agentmail import AgentMail
271276
client = AgentMail(
272277
api_key="YOUR_API_KEY",
273278
)
274-
client.webhooks.list()
279+
response = client.webhooks.list()
280+
for item in response:
281+
yield item
282+
# alternatively, you can paginate page-by-page
283+
for page in response.iter_pages():
284+
yield page
275285

276286
```
277287
</dd>
@@ -527,7 +537,12 @@ from agentmail import AgentMail
527537
client = AgentMail(
528538
api_key="YOUR_API_KEY",
529539
)
530-
client.domains.list()
540+
response = client.domains.list()
541+
for item in response:
542+
yield item
543+
# alternatively, you can paginate page-by-page
544+
for page in response.iter_pages():
545+
yield page
531546

532547
```
533548
</dd>
@@ -766,7 +781,12 @@ from agentmail import AgentMail
766781
client = AgentMail(
767782
api_key="YOUR_API_KEY",
768783
)
769-
client.drafts.list()
784+
response = client.drafts.list()
785+
for item in response:
786+
yield item
787+
# alternatively, you can paginate page-by-page
788+
for page in response.iter_pages():
789+
yield page
770790

771791
```
772792
</dd>
@@ -917,9 +937,14 @@ from agentmail import AgentMail
917937
client = AgentMail(
918938
api_key="YOUR_API_KEY",
919939
)
920-
client.inboxes.drafts.list(
940+
response = client.inboxes.drafts.list(
921941
inbox_id="inbox_id",
922942
)
943+
for item in response:
944+
yield item
945+
# alternatively, you can paginate page-by-page
946+
for page in response.iter_pages():
947+
yield page
923948

924949
```
925950
</dd>
@@ -1369,9 +1394,14 @@ from agentmail import AgentMail
13691394
client = AgentMail(
13701395
api_key="YOUR_API_KEY",
13711396
)
1372-
client.inboxes.messages.list(
1397+
response = client.inboxes.messages.list(
13731398
inbox_id="inbox_id",
13741399
)
1400+
for item in response:
1401+
yield item
1402+
# alternatively, you can paginate page-by-page
1403+
for page in response.iter_pages():
1404+
yield page
13751405

13761406
```
13771407
</dd>
@@ -2105,9 +2135,14 @@ from agentmail import AgentMail
21052135
client = AgentMail(
21062136
api_key="YOUR_API_KEY",
21072137
)
2108-
client.inboxes.threads.list(
2138+
response = client.inboxes.threads.list(
21092139
inbox_id="inbox_id",
21102140
)
2141+
for item in response:
2142+
yield item
2143+
# alternatively, you can paginate page-by-page
2144+
for page in response.iter_pages():
2145+
yield page
21112146

21122147
```
21132148
</dd>
@@ -2494,7 +2529,12 @@ from agentmail import AgentMail
24942529
client = AgentMail(
24952530
api_key="YOUR_API_KEY",
24962531
)
2497-
client.threads.list()
2532+
response = client.threads.list()
2533+
for item in response:
2534+
yield item
2535+
# alternatively, you can paginate page-by-page
2536+
for page in response.iter_pages():
2537+
yield page
24982538

24992539
```
25002540
</dd>

src/agentmail/core/client_wrapper.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ def __init__(
2323

2424
def get_headers(self) -> typing.Dict[str, str]:
2525
headers: typing.Dict[str, str] = {
26-
"User-Agent": "agentmail/0.0.66",
26+
"User-Agent": "agentmail/0.0.67",
2727
"X-Fern-Language": "Python",
2828
"X-Fern-SDK-Name": "agentmail",
29-
"X-Fern-SDK-Version": "0.0.66",
29+
"X-Fern-SDK-Version": "0.0.67",
3030
**(self.get_custom_headers() or {}),
3131
}
3232
headers["Authorization"] = f"Bearer {self._get_api_key()}"

src/agentmail/domains/client.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import typing
44

55
from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
6+
from ..core.pagination import AsyncPager, SyncPager
67
from ..core.request_options import RequestOptions
78
from ..types.limit import Limit
89
from ..types.page_token import PageToken
@@ -11,7 +12,7 @@
1112
from .types.domain import Domain
1213
from .types.domain_id import DomainId
1314
from .types.domain_name import DomainName
14-
from .types.list_domains_response import ListDomainsResponse
15+
from .types.domain_summary import DomainSummary
1516

1617
# this is used as the default value for optional parameters
1718
OMIT = typing.cast(typing.Any, ...)
@@ -38,7 +39,7 @@ def list(
3839
limit: typing.Optional[Limit] = None,
3940
page_token: typing.Optional[PageToken] = None,
4041
request_options: typing.Optional[RequestOptions] = None,
41-
) -> ListDomainsResponse:
42+
) -> SyncPager[DomainSummary]:
4243
"""
4344
Parameters
4445
----------
@@ -51,7 +52,7 @@ def list(
5152
5253
Returns
5354
-------
54-
ListDomainsResponse
55+
SyncPager[DomainSummary]
5556
5657
Examples
5758
--------
@@ -60,10 +61,14 @@ def list(
6061
client = AgentMail(
6162
api_key="YOUR_API_KEY",
6263
)
63-
client.domains.list()
64+
response = client.domains.list()
65+
for item in response:
66+
yield item
67+
# alternatively, you can paginate page-by-page
68+
for page in response.iter_pages():
69+
yield page
6470
"""
65-
_response = self._raw_client.list(limit=limit, page_token=page_token, request_options=request_options)
66-
return _response.data
71+
return self._raw_client.list(limit=limit, page_token=page_token, request_options=request_options)
6772

6873
def get(self, domain: DomainId, *, request_options: typing.Optional[RequestOptions] = None) -> Domain:
6974
"""
@@ -179,7 +184,7 @@ async def list(
179184
limit: typing.Optional[Limit] = None,
180185
page_token: typing.Optional[PageToken] = None,
181186
request_options: typing.Optional[RequestOptions] = None,
182-
) -> ListDomainsResponse:
187+
) -> AsyncPager[DomainSummary]:
183188
"""
184189
Parameters
185190
----------
@@ -192,7 +197,7 @@ async def list(
192197
193198
Returns
194199
-------
195-
ListDomainsResponse
200+
AsyncPager[DomainSummary]
196201
197202
Examples
198203
--------
@@ -206,13 +211,18 @@ async def list(
206211
207212
208213
async def main() -> None:
209-
await client.domains.list()
214+
response = await client.domains.list()
215+
async for item in response:
216+
yield item
217+
218+
# alternatively, you can paginate page-by-page
219+
async for page in response.iter_pages():
220+
yield page
210221
211222
212223
asyncio.run(main())
213224
"""
214-
_response = await self._raw_client.list(limit=limit, page_token=page_token, request_options=request_options)
215-
return _response.data
225+
return await self._raw_client.list(limit=limit, page_token=page_token, request_options=request_options)
216226

217227
async def get(self, domain: DomainId, *, request_options: typing.Optional[RequestOptions] = None) -> Domain:
218228
"""

src/agentmail/domains/raw_client.py

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
88
from ..core.http_response import AsyncHttpResponse, HttpResponse
99
from ..core.jsonable_encoder import jsonable_encoder
10+
from ..core.pagination import AsyncPager, BaseHttpResponse, SyncPager
1011
from ..core.request_options import RequestOptions
1112
from ..core.unchecked_base_model import construct_type
1213
from ..errors.not_found_error import NotFoundError
@@ -19,6 +20,7 @@
1920
from .types.domain import Domain
2021
from .types.domain_id import DomainId
2122
from .types.domain_name import DomainName
23+
from .types.domain_summary import DomainSummary
2224
from .types.list_domains_response import ListDomainsResponse
2325

2426
# this is used as the default value for optional parameters
@@ -35,7 +37,7 @@ def list(
3537
limit: typing.Optional[Limit] = None,
3638
page_token: typing.Optional[PageToken] = None,
3739
request_options: typing.Optional[RequestOptions] = None,
38-
) -> HttpResponse[ListDomainsResponse]:
40+
) -> SyncPager[DomainSummary]:
3941
"""
4042
Parameters
4143
----------
@@ -48,7 +50,7 @@ def list(
4850
4951
Returns
5052
-------
51-
HttpResponse[ListDomainsResponse]
53+
SyncPager[DomainSummary]
5254
"""
5355
_response = self._client_wrapper.httpx_client.request(
5456
"v0/domains",
@@ -62,14 +64,24 @@ def list(
6264
)
6365
try:
6466
if 200 <= _response.status_code < 300:
65-
_data = typing.cast(
67+
_parsed_response = typing.cast(
6668
ListDomainsResponse,
6769
construct_type(
6870
type_=ListDomainsResponse, # type: ignore
6971
object_=_response.json(),
7072
),
7173
)
72-
return HttpResponse(response=_response, data=_data)
74+
_items = _parsed_response.domains
75+
_parsed_next = _parsed_response.next_page_token
76+
_has_next = _parsed_next is not None and _parsed_next != ""
77+
_get_next = lambda: self.list(
78+
limit=limit,
79+
page_token=_parsed_next,
80+
request_options=request_options,
81+
)
82+
return SyncPager(
83+
has_next=_has_next, items=_items, get_next=_get_next, response=BaseHttpResponse(response=_response)
84+
)
7385
_response_json = _response.json()
7486
except JSONDecodeError:
7587
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
@@ -230,7 +242,7 @@ async def list(
230242
limit: typing.Optional[Limit] = None,
231243
page_token: typing.Optional[PageToken] = None,
232244
request_options: typing.Optional[RequestOptions] = None,
233-
) -> AsyncHttpResponse[ListDomainsResponse]:
245+
) -> AsyncPager[DomainSummary]:
234246
"""
235247
Parameters
236248
----------
@@ -243,7 +255,7 @@ async def list(
243255
244256
Returns
245257
-------
246-
AsyncHttpResponse[ListDomainsResponse]
258+
AsyncPager[DomainSummary]
247259
"""
248260
_response = await self._client_wrapper.httpx_client.request(
249261
"v0/domains",
@@ -257,14 +269,27 @@ async def list(
257269
)
258270
try:
259271
if 200 <= _response.status_code < 300:
260-
_data = typing.cast(
272+
_parsed_response = typing.cast(
261273
ListDomainsResponse,
262274
construct_type(
263275
type_=ListDomainsResponse, # type: ignore
264276
object_=_response.json(),
265277
),
266278
)
267-
return AsyncHttpResponse(response=_response, data=_data)
279+
_items = _parsed_response.domains
280+
_parsed_next = _parsed_response.next_page_token
281+
_has_next = _parsed_next is not None and _parsed_next != ""
282+
283+
async def _get_next():
284+
return await self.list(
285+
limit=limit,
286+
page_token=_parsed_next,
287+
request_options=request_options,
288+
)
289+
290+
return AsyncPager(
291+
has_next=_has_next, items=_items, get_next=_get_next, response=BaseHttpResponse(response=_response)
292+
)
268293
_response_json = _response.json()
269294
except JSONDecodeError:
270295
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)

0 commit comments

Comments
 (0)