Skip to content

Commit f63e0e4

Browse files
feat(api): bump for new endpoints
1 parent 5e05845 commit f63e0e4

38 files changed

+1330
-974
lines changed

.stats.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 15
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-f48bb509412536c41fdfa537894cecd4af486099d95fe79369f2ef239fa94a75.yml
3-
openapi_spec_hash: f8b886fdfdc5ee3d51d2cd05daee3bab
4-
config_hash: 6f12c5e4c662e1f315b95a70389b1549
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-2a2f6bfd48fd33b8162f97ecb46ad4568eb15b7221add1766567cb713d9609d8.yml
3+
openapi_spec_hash: 714cbd98920316b5dddbc881743ee554
4+
config_hash: 15424d9ae390c7fca17dbf08619fc88b

README.md

Lines changed: 99 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@ client = BeeperDesktop(
3333
access_token=os.environ.get("BEEPER_ACCESS_TOKEN"), # This is the default and can be omitted
3434
)
3535

36-
accounts = client.accounts.list()
36+
page = client.chats.search(
37+
include_muted=True,
38+
limit=3,
39+
type="single",
40+
)
41+
print(page.items)
3742
```
3843

3944
While you can provide a `access_token` keyword argument,
@@ -56,7 +61,12 @@ client = AsyncBeeperDesktop(
5661

5762

5863
async def main() -> None:
59-
accounts = await client.accounts.list()
64+
page = await client.chats.search(
65+
include_muted=True,
66+
limit=3,
67+
type="single",
68+
)
69+
print(page.items)
6070

6171

6272
asyncio.run(main())
@@ -88,7 +98,12 @@ async def main() -> None:
8898
access_token="My Access Token",
8999
http_client=DefaultAioHttpClient(),
90100
) as client:
91-
accounts = await client.accounts.list()
101+
page = await client.chats.search(
102+
include_muted=True,
103+
limit=3,
104+
type="single",
105+
)
106+
print(page.items)
92107

93108

94109
asyncio.run(main())
@@ -103,6 +118,85 @@ Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typ
103118

104119
Typed requests and responses provide autocomplete and documentation within your editor. If you would like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`.
105120

121+
## Pagination
122+
123+
List methods in the Beeper Desktop API are paginated.
124+
125+
This library provides auto-paginating iterators with each list response, so you do not have to request successive pages manually:
126+
127+
```python
128+
from beeper_desktop_api import BeeperDesktop
129+
130+
client = BeeperDesktop()
131+
132+
all_messages = []
133+
# Automatically fetches more pages as needed.
134+
for message in client.messages.search(
135+
account_ids=["local-telegram_ba_QFrb5lrLPhO3OT5MFBeTWv0x4BI"],
136+
limit=10,
137+
query="deployment",
138+
):
139+
# Do something with message here
140+
all_messages.append(message)
141+
print(all_messages)
142+
```
143+
144+
Or, asynchronously:
145+
146+
```python
147+
import asyncio
148+
from beeper_desktop_api import AsyncBeeperDesktop
149+
150+
client = AsyncBeeperDesktop()
151+
152+
153+
async def main() -> None:
154+
all_messages = []
155+
# Iterate through items across all pages, issuing requests as needed.
156+
async for message in client.messages.search(
157+
account_ids=["local-telegram_ba_QFrb5lrLPhO3OT5MFBeTWv0x4BI"],
158+
limit=10,
159+
query="deployment",
160+
):
161+
all_messages.append(message)
162+
print(all_messages)
163+
164+
165+
asyncio.run(main())
166+
```
167+
168+
Alternatively, you can use the `.has_next_page()`, `.next_page_info()`, or `.get_next_page()` methods for more granular control working with pages:
169+
170+
```python
171+
first_page = await client.messages.search(
172+
account_ids=["local-telegram_ba_QFrb5lrLPhO3OT5MFBeTWv0x4BI"],
173+
limit=10,
174+
query="deployment",
175+
)
176+
if first_page.has_next_page():
177+
print(f"will fetch next page using these details: {first_page.next_page_info()}")
178+
next_page = await first_page.get_next_page()
179+
print(f"number of items we just fetched: {len(next_page.items)}")
180+
181+
# Remove `await` for non-async usage.
182+
```
183+
184+
Or just work directly with the returned data:
185+
186+
```python
187+
first_page = await client.messages.search(
188+
account_ids=["local-telegram_ba_QFrb5lrLPhO3OT5MFBeTWv0x4BI"],
189+
limit=10,
190+
query="deployment",
191+
)
192+
193+
print(f"next page cursor: {first_page.oldest_cursor}") # => "next page cursor: ..."
194+
for message in first_page.items:
195+
print(message.id)
196+
197+
# Remove `await` for non-async usage.
198+
```
199+
106200
## Nested params
107201

108202
Nested parameters are dictionaries, typed using `TypedDict`, for example:
@@ -112,11 +206,10 @@ from beeper_desktop_api import BeeperDesktop
112206

113207
client = BeeperDesktop()
114208

115-
base_response = client.chats.reminders.create(
209+
client.chats.reminders.create(
116210
chat_id="!NCdzlIaMjZUmvmvyHU:beeper.com",
117211
reminder={"remind_at_ms": 0},
118212
)
119-
print(base_response.reminder)
120213
```
121214

122215
## Handling errors
@@ -135,10 +228,7 @@ from beeper_desktop_api import BeeperDesktop
135228
client = BeeperDesktop()
136229

137230
try:
138-
client.messages.send(
139-
chat_id="1229391",
140-
text="Hello! Just checking in on the project status.",
141-
)
231+
client.accounts.list()
142232
except beeper_desktop_api.APIConnectionError as e:
143233
print("The server could not be reached")
144234
print(e.__cause__) # an underlying Exception, likely raised within httpx.

api.md

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
# Shared Types
22

33
```python
4-
from beeper_desktop_api.types import Attachment, BaseResponse, Error, Message, Reaction, User
4+
from beeper_desktop_api.types import Attachment, Error, Message, Reaction, User
55
```
66

77
# BeeperDesktop
88

99
Types:
1010

1111
```python
12-
from beeper_desktop_api.types import DownloadAssetResponse, FocusResponse, SearchResponse
12+
from beeper_desktop_api.types import FocusResponse, SearchResponse
1313
```
1414

1515
Methods:
1616

17-
- <code title="post /v1/download-asset">client.<a href="./src/beeper_desktop_api/_client.py">download_asset</a>(\*\*<a href="src/beeper_desktop_api/types/client_download_asset_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/download_asset_response.py">DownloadAssetResponse</a></code>
1817
- <code title="post /v1/focus">client.<a href="./src/beeper_desktop_api/_client.py">focus</a>(\*\*<a href="src/beeper_desktop_api/types/client_focus_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/focus_response.py">FocusResponse</a></code>
1918
- <code title="get /v1/search">client.<a href="./src/beeper_desktop_api/_client.py">search</a>(\*\*<a href="src/beeper_desktop_api/types/client_search_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/search_response.py">SearchResponse</a></code>
2019

@@ -28,20 +27,19 @@ from beeper_desktop_api.types import Account, AccountListResponse
2827

2928
Methods:
3029

31-
- <code title="get /v1/accounts">client.accounts.<a href="./src/beeper_desktop_api/resources/accounts.py">list</a>() -> <a href="./src/beeper_desktop_api/types/account_list_response.py">AccountListResponse</a></code>
30+
- <code title="get /v1/accounts">client.accounts.<a href="./src/beeper_desktop_api/resources/accounts/accounts.py">list</a>() -> <a href="./src/beeper_desktop_api/types/account_list_response.py">AccountListResponse</a></code>
3231

33-
# Search
32+
## Contacts
3433

3534
Types:
3635

3736
```python
38-
from beeper_desktop_api.types import SearchContactsResponse
37+
from beeper_desktop_api.types.accounts import ContactSearchResponse
3938
```
4039

4140
Methods:
4241

43-
- <code title="get /v1/search/chats">client.search.<a href="./src/beeper_desktop_api/resources/search.py">chats</a>(\*\*<a href="src/beeper_desktop_api/types/search_chats_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/chat.py">SyncCursorSearch[Chat]</a></code>
44-
- <code title="get /v1/search/contacts/{accountID}">client.search.<a href="./src/beeper_desktop_api/resources/search.py">contacts</a>(account_id, \*\*<a href="src/beeper_desktop_api/types/search_contacts_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/search_contacts_response.py">SearchContactsResponse</a></code>
42+
- <code title="get /v1/accounts/{accountID}/contacts">client.accounts.contacts.<a href="./src/beeper_desktop_api/resources/accounts/contacts.py">search</a>(account_id, \*\*<a href="src/beeper_desktop_api/types/accounts/contact_search_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/accounts/contact_search_response.py">ContactSearchResponse</a></code>
4543

4644
# Chats
4745

@@ -55,15 +53,16 @@ Methods:
5553

5654
- <code title="post /v1/chats">client.chats.<a href="./src/beeper_desktop_api/resources/chats/chats.py">create</a>(\*\*<a href="src/beeper_desktop_api/types/chat_create_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/chat_create_response.py">ChatCreateResponse</a></code>
5755
- <code title="get /v1/chats/{chatID}">client.chats.<a href="./src/beeper_desktop_api/resources/chats/chats.py">retrieve</a>(chat_id, \*\*<a href="src/beeper_desktop_api/types/chat_retrieve_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/chat.py">Chat</a></code>
58-
- <code title="get /v1/chats">client.chats.<a href="./src/beeper_desktop_api/resources/chats/chats.py">list</a>(\*\*<a href="src/beeper_desktop_api/types/chat_list_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/chat_list_response.py">SyncCursorList[ChatListResponse]</a></code>
59-
- <code title="post /v1/chats/{chatID}/archive">client.chats.<a href="./src/beeper_desktop_api/resources/chats/chats.py">archive</a>(chat_id, \*\*<a href="src/beeper_desktop_api/types/chat_archive_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/shared/base_response.py">BaseResponse</a></code>
56+
- <code title="get /v1/chats">client.chats.<a href="./src/beeper_desktop_api/resources/chats/chats.py">list</a>(\*\*<a href="src/beeper_desktop_api/types/chat_list_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/chat_list_response.py">SyncCursorNoLimit[ChatListResponse]</a></code>
57+
- <code title="post /v1/chats/{chatID}/archive">client.chats.<a href="./src/beeper_desktop_api/resources/chats/chats.py">archive</a>(chat_id, \*\*<a href="src/beeper_desktop_api/types/chat_archive_params.py">params</a>) -> None</code>
58+
- <code title="get /v1/chats/search">client.chats.<a href="./src/beeper_desktop_api/resources/chats/chats.py">search</a>(\*\*<a href="src/beeper_desktop_api/types/chat_search_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/chat.py">SyncCursorSearch[Chat]</a></code>
6059

6160
## Reminders
6261

6362
Methods:
6463

65-
- <code title="post /v1/chats/{chatID}/reminders">client.chats.reminders.<a href="./src/beeper_desktop_api/resources/chats/reminders.py">create</a>(chat_id, \*\*<a href="src/beeper_desktop_api/types/chats/reminder_create_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/shared/base_response.py">BaseResponse</a></code>
66-
- <code title="delete /v1/chats/{chatID}/reminders">client.chats.reminders.<a href="./src/beeper_desktop_api/resources/chats/reminders.py">delete</a>(chat_id) -> <a href="./src/beeper_desktop_api/types/shared/base_response.py">BaseResponse</a></code>
64+
- <code title="post /v1/chats/{chatID}/reminders">client.chats.reminders.<a href="./src/beeper_desktop_api/resources/chats/reminders.py">create</a>(chat_id, \*\*<a href="src/beeper_desktop_api/types/chats/reminder_create_params.py">params</a>) -> None</code>
65+
- <code title="delete /v1/chats/{chatID}/reminders">client.chats.reminders.<a href="./src/beeper_desktop_api/resources/chats/reminders.py">delete</a>(chat_id) -> None</code>
6766

6867
# Messages
6968

@@ -75,6 +74,18 @@ from beeper_desktop_api.types import MessageSendResponse
7574

7675
Methods:
7776

78-
- <code title="get /v1/chats/{chatID}/messages">client.messages.<a href="./src/beeper_desktop_api/resources/messages.py">list</a>(chat_id, \*\*<a href="src/beeper_desktop_api/types/message_list_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/shared/message.py">SyncCursorList[Message]</a></code>
79-
- <code title="get /v1/search/messages">client.messages.<a href="./src/beeper_desktop_api/resources/messages.py">search</a>(\*\*<a href="src/beeper_desktop_api/types/message_search_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/shared/message.py">SyncCursorSearch[Message]</a></code>
77+
- <code title="get /v1/chats/{chatID}/messages">client.messages.<a href="./src/beeper_desktop_api/resources/messages.py">list</a>(chat_id, \*\*<a href="src/beeper_desktop_api/types/message_list_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/shared/message.py">SyncCursorSortKey[Message]</a></code>
78+
- <code title="get /v1/messages/search">client.messages.<a href="./src/beeper_desktop_api/resources/messages.py">search</a>(\*\*<a href="src/beeper_desktop_api/types/message_search_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/shared/message.py">SyncCursorSearch[Message]</a></code>
8079
- <code title="post /v1/chats/{chatID}/messages">client.messages.<a href="./src/beeper_desktop_api/resources/messages.py">send</a>(chat_id, \*\*<a href="src/beeper_desktop_api/types/message_send_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/message_send_response.py">MessageSendResponse</a></code>
80+
81+
# Assets
82+
83+
Types:
84+
85+
```python
86+
from beeper_desktop_api.types import AssetDownloadResponse
87+
```
88+
89+
Methods:
90+
91+
- <code title="post /v1/assets/download">client.assets.<a href="./src/beeper_desktop_api/resources/assets.py">download</a>(\*\*<a href="src/beeper_desktop_api/types/asset_download_params.py">params</a>) -> <a href="./src/beeper_desktop_api/types/asset_download_response.py">AssetDownloadResponse</a></code>

0 commit comments

Comments
 (0)