Skip to content

Commit 61c6c30

Browse files
committed
Release 0.0.45
1 parent 08d7d65 commit 61c6c30

6 files changed

Lines changed: 163 additions & 15 deletions

File tree

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.44"
6+
version = "0.0.45"
77
description = ""
88
readme = "README.md"
99
authors = []

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.44",
26+
"User-Agent": "agentmail/0.0.45",
2727
"X-Fern-Language": "Python",
2828
"X-Fern-SDK-Name": "agentmail",
29-
"X-Fern-SDK-Version": "0.0.44",
29+
"X-Fern-SDK-Version": "0.0.45",
3030
**(self.get_custom_headers() or {}),
3131
}
3232
headers["Authorization"] = f"Bearer {self._get_api_key()}"

src/agentmail/inboxes/messages/client.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,26 @@ def get_attachment(
154154
with self._raw_client.get_attachment(inbox_id, message_id, attachment_id, request_options=request_options) as r:
155155
yield from r.data
156156

157+
def get_raw_message(
158+
self, inbox_id: InboxId, message_id: MessageId, *, request_options: typing.Optional[RequestOptions] = None
159+
) -> typing.Iterator[bytes]:
160+
"""
161+
Parameters
162+
----------
163+
inbox_id : InboxId
164+
165+
message_id : MessageId
166+
167+
request_options : typing.Optional[RequestOptions]
168+
Request-specific configuration. You can pass in configuration such as `chunk_size`, and more to customize the request and response.
169+
170+
Returns
171+
-------
172+
typing.Iterator[bytes]
173+
"""
174+
with self._raw_client.get_raw_message(inbox_id, message_id, request_options=request_options) as r:
175+
yield from r.data
176+
157177
def send(
158178
self,
159179
inbox_id: InboxId,
@@ -488,6 +508,27 @@ async def get_attachment(
488508
async for _chunk in r.data:
489509
yield _chunk
490510

511+
async def get_raw_message(
512+
self, inbox_id: InboxId, message_id: MessageId, *, request_options: typing.Optional[RequestOptions] = None
513+
) -> typing.AsyncIterator[bytes]:
514+
"""
515+
Parameters
516+
----------
517+
inbox_id : InboxId
518+
519+
message_id : MessageId
520+
521+
request_options : typing.Optional[RequestOptions]
522+
Request-specific configuration. You can pass in configuration such as `chunk_size`, and more to customize the request and response.
523+
524+
Returns
525+
-------
526+
typing.AsyncIterator[bytes]
527+
"""
528+
async with self._raw_client.get_raw_message(inbox_id, message_id, request_options=request_options) as r:
529+
async for _chunk in r.data:
530+
yield _chunk
531+
491532
async def send(
492533
self,
493534
inbox_id: InboxId,

src/agentmail/inboxes/messages/raw_client.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,59 @@ def _stream() -> HttpResponse[typing.Iterator[bytes]]:
221221

222222
yield _stream()
223223

224+
@contextlib.contextmanager
225+
def get_raw_message(
226+
self, inbox_id: InboxId, message_id: MessageId, *, request_options: typing.Optional[RequestOptions] = None
227+
) -> typing.Iterator[HttpResponse[typing.Iterator[bytes]]]:
228+
"""
229+
Parameters
230+
----------
231+
inbox_id : InboxId
232+
233+
message_id : MessageId
234+
235+
request_options : typing.Optional[RequestOptions]
236+
Request-specific configuration. You can pass in configuration such as `chunk_size`, and more to customize the request and response.
237+
238+
Returns
239+
-------
240+
typing.Iterator[HttpResponse[typing.Iterator[bytes]]]
241+
"""
242+
with self._client_wrapper.httpx_client.stream(
243+
f"v0/inboxes/{jsonable_encoder(inbox_id)}/messages/{jsonable_encoder(message_id)}/raw",
244+
base_url=self._client_wrapper.get_environment().http,
245+
method="GET",
246+
request_options=request_options,
247+
) as _response:
248+
249+
def _stream() -> HttpResponse[typing.Iterator[bytes]]:
250+
try:
251+
if 200 <= _response.status_code < 300:
252+
_chunk_size = request_options.get("chunk_size", None) if request_options is not None else None
253+
return HttpResponse(
254+
response=_response, data=(_chunk for _chunk in _response.iter_bytes(chunk_size=_chunk_size))
255+
)
256+
_response.read()
257+
if _response.status_code == 404:
258+
raise NotFoundError(
259+
headers=dict(_response.headers),
260+
body=typing.cast(
261+
ErrorResponse,
262+
construct_type(
263+
type_=ErrorResponse, # type: ignore
264+
object_=_response.json(),
265+
),
266+
),
267+
)
268+
_response_json = _response.json()
269+
except JSONDecodeError:
270+
raise ApiError(
271+
status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
272+
)
273+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
274+
275+
yield _stream()
276+
224277
def send(
225278
self,
226279
inbox_id: InboxId,
@@ -714,6 +767,60 @@ async def _stream() -> AsyncHttpResponse[typing.AsyncIterator[bytes]]:
714767

715768
yield await _stream()
716769

770+
@contextlib.asynccontextmanager
771+
async def get_raw_message(
772+
self, inbox_id: InboxId, message_id: MessageId, *, request_options: typing.Optional[RequestOptions] = None
773+
) -> typing.AsyncIterator[AsyncHttpResponse[typing.AsyncIterator[bytes]]]:
774+
"""
775+
Parameters
776+
----------
777+
inbox_id : InboxId
778+
779+
message_id : MessageId
780+
781+
request_options : typing.Optional[RequestOptions]
782+
Request-specific configuration. You can pass in configuration such as `chunk_size`, and more to customize the request and response.
783+
784+
Returns
785+
-------
786+
typing.AsyncIterator[AsyncHttpResponse[typing.AsyncIterator[bytes]]]
787+
"""
788+
async with self._client_wrapper.httpx_client.stream(
789+
f"v0/inboxes/{jsonable_encoder(inbox_id)}/messages/{jsonable_encoder(message_id)}/raw",
790+
base_url=self._client_wrapper.get_environment().http,
791+
method="GET",
792+
request_options=request_options,
793+
) as _response:
794+
795+
async def _stream() -> AsyncHttpResponse[typing.AsyncIterator[bytes]]:
796+
try:
797+
if 200 <= _response.status_code < 300:
798+
_chunk_size = request_options.get("chunk_size", None) if request_options is not None else None
799+
return AsyncHttpResponse(
800+
response=_response,
801+
data=(_chunk async for _chunk in _response.aiter_bytes(chunk_size=_chunk_size)),
802+
)
803+
await _response.aread()
804+
if _response.status_code == 404:
805+
raise NotFoundError(
806+
headers=dict(_response.headers),
807+
body=typing.cast(
808+
ErrorResponse,
809+
construct_type(
810+
type_=ErrorResponse, # type: ignore
811+
object_=_response.json(),
812+
),
813+
),
814+
)
815+
_response_json = _response.json()
816+
except JSONDecodeError:
817+
raise ApiError(
818+
status_code=_response.status_code, headers=dict(_response.headers), body=_response.text
819+
)
820+
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
821+
822+
yield await _stream()
823+
717824
async def send(
718825
self,
719826
inbox_id: InboxId,

src/agentmail/websockets/client.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@ def with_raw_response(self) -> RawWebsocketsClient:
3535

3636
@contextmanager
3737
def connect(
38-
self, *, auth_token: str, request_options: typing.Optional[RequestOptions] = None
38+
self, *, auth_token: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
3939
) -> typing.Iterator[WebsocketsSocketClient]:
4040
"""
4141
Parameters
4242
----------
43-
auth_token : str
44-
Your API key.
43+
auth_token : typing.Optional[str]
44+
Your API key. Required if Authorization header is not set.
4545
4646
request_options : typing.Optional[RequestOptions]
4747
Request-specific configuration.
@@ -93,13 +93,13 @@ def with_raw_response(self) -> AsyncRawWebsocketsClient:
9393

9494
@asynccontextmanager
9595
async def connect(
96-
self, *, auth_token: str, request_options: typing.Optional[RequestOptions] = None
96+
self, *, auth_token: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
9797
) -> typing.AsyncIterator[AsyncWebsocketsSocketClient]:
9898
"""
9999
Parameters
100100
----------
101-
auth_token : str
102-
Your API key.
101+
auth_token : typing.Optional[str]
102+
Your API key. Required if Authorization header is not set.
103103
104104
request_options : typing.Optional[RequestOptions]
105105
Request-specific configuration.

src/agentmail/websockets/raw_client.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ def __init__(self, *, client_wrapper: SyncClientWrapper):
2323

2424
@contextmanager
2525
def connect(
26-
self, *, auth_token: str, request_options: typing.Optional[RequestOptions] = None
26+
self, *, auth_token: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
2727
) -> typing.Iterator[WebsocketsSocketClient]:
2828
"""
2929
Parameters
3030
----------
31-
auth_token : str
32-
Your API key.
31+
auth_token : typing.Optional[str]
32+
Your API key. Required if Authorization header is not set.
3333
3434
request_options : typing.Optional[RequestOptions]
3535
Request-specific configuration.
@@ -70,13 +70,13 @@ def __init__(self, *, client_wrapper: AsyncClientWrapper):
7070

7171
@asynccontextmanager
7272
async def connect(
73-
self, *, auth_token: str, request_options: typing.Optional[RequestOptions] = None
73+
self, *, auth_token: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
7474
) -> typing.AsyncIterator[AsyncWebsocketsSocketClient]:
7575
"""
7676
Parameters
7777
----------
78-
auth_token : str
79-
Your API key.
78+
auth_token : typing.Optional[str]
79+
Your API key. Required if Authorization header is not set.
8080
8181
request_options : typing.Optional[RequestOptions]
8282
Request-specific configuration.

0 commit comments

Comments
 (0)