letta-client 0.1.113__py3-none-any.whl → 0.1.115__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 letta-client might be problematic. Click here for more details.

Files changed (20) hide show
  1. letta_client/__init__.py +20 -1
  2. letta_client/agents/client.py +124 -0
  3. letta_client/base_client.py +4 -0
  4. letta_client/client_side_access_tokens/__init__.py +19 -0
  5. letta_client/client_side_access_tokens/client.py +365 -0
  6. letta_client/client_side_access_tokens/types/__init__.py +29 -0
  7. letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_request_policy_item.py +24 -0
  8. letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_request_policy_item_access_item.py +7 -0
  9. letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_response.py +27 -0
  10. letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_response_policy.py +23 -0
  11. letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_response_policy_data_item.py +24 -0
  12. letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_response_policy_data_item_access_item.py +7 -0
  13. letta_client/core/client_wrapper.py +1 -1
  14. letta_client/errors/__init__.py +2 -1
  15. letta_client/errors/bad_request_error.py +9 -0
  16. letta_client/types/__init__.py +2 -0
  17. letta_client/types/bad_request_error_body.py +19 -0
  18. {letta_client-0.1.113.dist-info → letta_client-0.1.115.dist-info}/METADATA +1 -1
  19. {letta_client-0.1.113.dist-info → letta_client-0.1.115.dist-info}/RECORD +20 -9
  20. {letta_client-0.1.113.dist-info → letta_client-0.1.115.dist-info}/WHEEL +0 -0
letta_client/__init__.py CHANGED
@@ -19,6 +19,7 @@ from .types import (
19
19
  AuthRequest,
20
20
  AuthResponse,
21
21
  AuthSchemeField,
22
+ BadRequestErrorBody,
22
23
  BaseToolRuleSchema,
23
24
  Block,
24
25
  BlockUpdate,
@@ -220,10 +221,11 @@ from .types import (
220
221
  WebSearchOptionsUserLocation,
221
222
  WebSearchOptionsUserLocationApproximate,
222
223
  )
223
- from .errors import ConflictError, InternalServerError, NotFoundError, UnprocessableEntityError
224
+ from .errors import BadRequestError, ConflictError, InternalServerError, NotFoundError, UnprocessableEntityError
224
225
  from . import (
225
226
  agents,
226
227
  blocks,
228
+ client_side_access_tokens,
227
229
  groups,
228
230
  health,
229
231
  identities,
@@ -250,6 +252,14 @@ from .agents import (
250
252
  UpdateAgentToolRulesItem,
251
253
  )
252
254
  from .client import AsyncLetta, Letta
255
+ from .client_side_access_tokens import (
256
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem,
257
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItemAccessItem,
258
+ ClientSideAccessTokensCreateClientSideAccessTokenResponse,
259
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicy,
260
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItem,
261
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItemAccessItem,
262
+ )
253
263
  from .environment import LettaEnvironment
254
264
  from .groups import GroupCreateManagerConfig, GroupUpdateManagerConfig
255
265
  from .templates import TemplatesCreateAgentsResponse
@@ -291,6 +301,8 @@ __all__ = [
291
301
  "AuthRequest",
292
302
  "AuthResponse",
293
303
  "AuthSchemeField",
304
+ "BadRequestError",
305
+ "BadRequestErrorBody",
294
306
  "BaseToolRuleSchema",
295
307
  "Block",
296
308
  "BlockUpdate",
@@ -324,6 +336,12 @@ __all__ = [
324
336
  "ChatCompletionUserMessageParamContentItem",
325
337
  "ChildToolRule",
326
338
  "ChildToolRuleSchema",
339
+ "ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem",
340
+ "ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItemAccessItem",
341
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponse",
342
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicy",
343
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItem",
344
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItemAccessItem",
327
345
  "CompletionCreateParamsNonStreaming",
328
346
  "CompletionCreateParamsNonStreamingFunctionCall",
329
347
  "CompletionCreateParamsNonStreamingMessagesItem",
@@ -508,6 +526,7 @@ __all__ = [
508
526
  "__version__",
509
527
  "agents",
510
528
  "blocks",
529
+ "client_side_access_tokens",
511
530
  "groups",
512
531
  "health",
513
532
  "identities",
@@ -1237,6 +1237,64 @@ class AgentsClient:
1237
1237
  raise ApiError(status_code=_response.status_code, body=_response.text)
1238
1238
  raise ApiError(status_code=_response.status_code, body=_response_json)
1239
1239
 
1240
+ def retrieve_batch_message_request(
1241
+ self, batch_id: str, *, request_options: typing.Optional[RequestOptions] = None
1242
+ ) -> LettaBatchResponse:
1243
+ """
1244
+ Retrieve the result or current status of a previously submitted batch message request.
1245
+
1246
+ Parameters
1247
+ ----------
1248
+ batch_id : str
1249
+
1250
+ request_options : typing.Optional[RequestOptions]
1251
+ Request-specific configuration.
1252
+
1253
+ Returns
1254
+ -------
1255
+ LettaBatchResponse
1256
+ Successful Response
1257
+
1258
+ Examples
1259
+ --------
1260
+ from letta_client import Letta
1261
+
1262
+ client = Letta(
1263
+ token="YOUR_TOKEN",
1264
+ )
1265
+ client.agents.retrieve_batch_message_request(
1266
+ batch_id="batch_id",
1267
+ )
1268
+ """
1269
+ _response = self._client_wrapper.httpx_client.request(
1270
+ f"v1/agents/messages/batches/{jsonable_encoder(batch_id)}",
1271
+ method="GET",
1272
+ request_options=request_options,
1273
+ )
1274
+ try:
1275
+ if 200 <= _response.status_code < 300:
1276
+ return typing.cast(
1277
+ LettaBatchResponse,
1278
+ construct_type(
1279
+ type_=LettaBatchResponse, # type: ignore
1280
+ object_=_response.json(),
1281
+ ),
1282
+ )
1283
+ if _response.status_code == 422:
1284
+ raise UnprocessableEntityError(
1285
+ typing.cast(
1286
+ HttpValidationError,
1287
+ construct_type(
1288
+ type_=HttpValidationError, # type: ignore
1289
+ object_=_response.json(),
1290
+ ),
1291
+ )
1292
+ )
1293
+ _response_json = _response.json()
1294
+ except JSONDecodeError:
1295
+ raise ApiError(status_code=_response.status_code, body=_response.text)
1296
+ raise ApiError(status_code=_response.status_code, body=_response_json)
1297
+
1240
1298
  def search(
1241
1299
  self,
1242
1300
  *,
@@ -2596,6 +2654,72 @@ class AsyncAgentsClient:
2596
2654
  raise ApiError(status_code=_response.status_code, body=_response.text)
2597
2655
  raise ApiError(status_code=_response.status_code, body=_response_json)
2598
2656
 
2657
+ async def retrieve_batch_message_request(
2658
+ self, batch_id: str, *, request_options: typing.Optional[RequestOptions] = None
2659
+ ) -> LettaBatchResponse:
2660
+ """
2661
+ Retrieve the result or current status of a previously submitted batch message request.
2662
+
2663
+ Parameters
2664
+ ----------
2665
+ batch_id : str
2666
+
2667
+ request_options : typing.Optional[RequestOptions]
2668
+ Request-specific configuration.
2669
+
2670
+ Returns
2671
+ -------
2672
+ LettaBatchResponse
2673
+ Successful Response
2674
+
2675
+ Examples
2676
+ --------
2677
+ import asyncio
2678
+
2679
+ from letta_client import AsyncLetta
2680
+
2681
+ client = AsyncLetta(
2682
+ token="YOUR_TOKEN",
2683
+ )
2684
+
2685
+
2686
+ async def main() -> None:
2687
+ await client.agents.retrieve_batch_message_request(
2688
+ batch_id="batch_id",
2689
+ )
2690
+
2691
+
2692
+ asyncio.run(main())
2693
+ """
2694
+ _response = await self._client_wrapper.httpx_client.request(
2695
+ f"v1/agents/messages/batches/{jsonable_encoder(batch_id)}",
2696
+ method="GET",
2697
+ request_options=request_options,
2698
+ )
2699
+ try:
2700
+ if 200 <= _response.status_code < 300:
2701
+ return typing.cast(
2702
+ LettaBatchResponse,
2703
+ construct_type(
2704
+ type_=LettaBatchResponse, # type: ignore
2705
+ object_=_response.json(),
2706
+ ),
2707
+ )
2708
+ if _response.status_code == 422:
2709
+ raise UnprocessableEntityError(
2710
+ typing.cast(
2711
+ HttpValidationError,
2712
+ construct_type(
2713
+ type_=HttpValidationError, # type: ignore
2714
+ object_=_response.json(),
2715
+ ),
2716
+ )
2717
+ )
2718
+ _response_json = _response.json()
2719
+ except JSONDecodeError:
2720
+ raise ApiError(status_code=_response.status_code, body=_response.text)
2721
+ raise ApiError(status_code=_response.status_code, body=_response_json)
2722
+
2599
2723
  async def search(
2600
2724
  self,
2601
2725
  *,
@@ -19,6 +19,7 @@ from .steps.client import StepsClient
19
19
  from .tag.client import TagClient
20
20
  from .voice.client import VoiceClient
21
21
  from .templates.client import TemplatesClient
22
+ from .client_side_access_tokens.client import ClientSideAccessTokensClient
22
23
  from .core.client_wrapper import AsyncClientWrapper
23
24
  from .tools.client import AsyncToolsClient
24
25
  from .sources.client import AsyncSourcesClient
@@ -35,6 +36,7 @@ from .steps.client import AsyncStepsClient
35
36
  from .tag.client import AsyncTagClient
36
37
  from .voice.client import AsyncVoiceClient
37
38
  from .templates.client import AsyncTemplatesClient
39
+ from .client_side_access_tokens.client import AsyncClientSideAccessTokensClient
38
40
 
39
41
 
40
42
  class LettaBase:
@@ -110,6 +112,7 @@ class LettaBase:
110
112
  self.tag = TagClient(client_wrapper=self._client_wrapper)
111
113
  self.voice = VoiceClient(client_wrapper=self._client_wrapper)
112
114
  self.templates = TemplatesClient(client_wrapper=self._client_wrapper)
115
+ self.client_side_access_tokens = ClientSideAccessTokensClient(client_wrapper=self._client_wrapper)
113
116
 
114
117
 
115
118
  class AsyncLettaBase:
@@ -185,6 +188,7 @@ class AsyncLettaBase:
185
188
  self.tag = AsyncTagClient(client_wrapper=self._client_wrapper)
186
189
  self.voice = AsyncVoiceClient(client_wrapper=self._client_wrapper)
187
190
  self.templates = AsyncTemplatesClient(client_wrapper=self._client_wrapper)
191
+ self.client_side_access_tokens = AsyncClientSideAccessTokensClient(client_wrapper=self._client_wrapper)
188
192
 
189
193
 
190
194
  def _get_base_url(*, base_url: typing.Optional[str] = None, environment: LettaEnvironment) -> str:
@@ -0,0 +1,19 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from .types import (
4
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem,
5
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItemAccessItem,
6
+ ClientSideAccessTokensCreateClientSideAccessTokenResponse,
7
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicy,
8
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItem,
9
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItemAccessItem,
10
+ )
11
+
12
+ __all__ = [
13
+ "ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem",
14
+ "ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItemAccessItem",
15
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponse",
16
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicy",
17
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItem",
18
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItemAccessItem",
19
+ ]
@@ -0,0 +1,365 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from ..core.client_wrapper import SyncClientWrapper
5
+ from .types.client_side_access_tokens_create_client_side_access_token_request_policy_item import (
6
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem,
7
+ )
8
+ from ..core.request_options import RequestOptions
9
+ from .types.client_side_access_tokens_create_client_side_access_token_response import (
10
+ ClientSideAccessTokensCreateClientSideAccessTokenResponse,
11
+ )
12
+ from ..core.serialization import convert_and_respect_annotation_metadata
13
+ from ..core.unchecked_base_model import construct_type
14
+ from ..errors.bad_request_error import BadRequestError
15
+ from json.decoder import JSONDecodeError
16
+ from ..core.api_error import ApiError
17
+ from ..core.jsonable_encoder import jsonable_encoder
18
+ from ..core.client_wrapper import AsyncClientWrapper
19
+
20
+ # this is used as the default value for optional parameters
21
+ OMIT = typing.cast(typing.Any, ...)
22
+
23
+
24
+ class ClientSideAccessTokensClient:
25
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
26
+ self._client_wrapper = client_wrapper
27
+
28
+ def client_side_access_tokens_create_client_side_access_token(
29
+ self,
30
+ *,
31
+ policy: typing.Sequence[ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem],
32
+ hostname: str,
33
+ expires_at: typing.Optional[str] = OMIT,
34
+ request_options: typing.Optional[RequestOptions] = None,
35
+ ) -> ClientSideAccessTokensCreateClientSideAccessTokenResponse:
36
+ """
37
+ Create a new client side access token with the specified configuration.
38
+
39
+ Parameters
40
+ ----------
41
+ policy : typing.Sequence[ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem]
42
+
43
+ hostname : str
44
+ The hostname of the client side application. Please specify the full URL including the protocol (http or https).
45
+
46
+ expires_at : typing.Optional[str]
47
+ The expiration date of the token. If not provided, the token will expire in 5 minutes
48
+
49
+ request_options : typing.Optional[RequestOptions]
50
+ Request-specific configuration.
51
+
52
+ Returns
53
+ -------
54
+ ClientSideAccessTokensCreateClientSideAccessTokenResponse
55
+ 201
56
+
57
+ Examples
58
+ --------
59
+ from letta_client import Letta
60
+ from letta_client.client_side_access_tokens import (
61
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem,
62
+ )
63
+
64
+ client = Letta(
65
+ token="YOUR_TOKEN",
66
+ )
67
+ client.client_side_access_tokens.client_side_access_tokens_create_client_side_access_token(
68
+ policy=[
69
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem(
70
+ id="id",
71
+ access=["read_messages"],
72
+ )
73
+ ],
74
+ hostname="hostname",
75
+ )
76
+ """
77
+ _response = self._client_wrapper.httpx_client.request(
78
+ "v1/client-side-access-tokens",
79
+ method="POST",
80
+ json={
81
+ "policy": convert_and_respect_annotation_metadata(
82
+ object_=policy,
83
+ annotation=typing.Sequence[ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem],
84
+ direction="write",
85
+ ),
86
+ "hostname": hostname,
87
+ "expires_at": expires_at,
88
+ },
89
+ headers={
90
+ "content-type": "application/json",
91
+ },
92
+ request_options=request_options,
93
+ omit=OMIT,
94
+ )
95
+ try:
96
+ if 200 <= _response.status_code < 300:
97
+ return typing.cast(
98
+ ClientSideAccessTokensCreateClientSideAccessTokenResponse,
99
+ construct_type(
100
+ type_=ClientSideAccessTokensCreateClientSideAccessTokenResponse, # type: ignore
101
+ object_=_response.json(),
102
+ ),
103
+ )
104
+ if _response.status_code == 400:
105
+ raise BadRequestError(
106
+ typing.cast(
107
+ typing.Optional[typing.Any],
108
+ construct_type(
109
+ type_=typing.Optional[typing.Any], # type: ignore
110
+ object_=_response.json(),
111
+ ),
112
+ )
113
+ )
114
+ _response_json = _response.json()
115
+ except JSONDecodeError:
116
+ raise ApiError(status_code=_response.status_code, body=_response.text)
117
+ raise ApiError(status_code=_response.status_code, body=_response_json)
118
+
119
+ def client_side_access_tokens_delete_client_side_access_token(
120
+ self,
121
+ token: str,
122
+ *,
123
+ request: typing.Optional[typing.Any] = None,
124
+ request_options: typing.Optional[RequestOptions] = None,
125
+ ) -> typing.Optional[typing.Any]:
126
+ """
127
+ Delete a client side access token.
128
+
129
+ Parameters
130
+ ----------
131
+ token : str
132
+ The access token to delete
133
+
134
+ request : typing.Optional[typing.Any]
135
+
136
+ request_options : typing.Optional[RequestOptions]
137
+ Request-specific configuration.
138
+
139
+ Returns
140
+ -------
141
+ typing.Optional[typing.Any]
142
+ 204
143
+
144
+ Examples
145
+ --------
146
+ from letta_client import Letta
147
+
148
+ client = Letta(
149
+ token="YOUR_TOKEN",
150
+ )
151
+ client.client_side_access_tokens.client_side_access_tokens_delete_client_side_access_token(
152
+ token="token",
153
+ request={"key": "value"},
154
+ )
155
+ """
156
+ _response = self._client_wrapper.httpx_client.request(
157
+ f"v1/client-side-access-tokens/{jsonable_encoder(token)}",
158
+ method="DELETE",
159
+ json=request,
160
+ request_options=request_options,
161
+ omit=OMIT,
162
+ )
163
+ try:
164
+ if 200 <= _response.status_code < 300:
165
+ return typing.cast(
166
+ typing.Optional[typing.Any],
167
+ construct_type(
168
+ type_=typing.Optional[typing.Any], # type: ignore
169
+ object_=_response.json(),
170
+ ),
171
+ )
172
+ if _response.status_code == 400:
173
+ raise BadRequestError(
174
+ typing.cast(
175
+ typing.Optional[typing.Any],
176
+ construct_type(
177
+ type_=typing.Optional[typing.Any], # type: ignore
178
+ object_=_response.json(),
179
+ ),
180
+ )
181
+ )
182
+ _response_json = _response.json()
183
+ except JSONDecodeError:
184
+ raise ApiError(status_code=_response.status_code, body=_response.text)
185
+ raise ApiError(status_code=_response.status_code, body=_response_json)
186
+
187
+
188
+ class AsyncClientSideAccessTokensClient:
189
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
190
+ self._client_wrapper = client_wrapper
191
+
192
+ async def client_side_access_tokens_create_client_side_access_token(
193
+ self,
194
+ *,
195
+ policy: typing.Sequence[ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem],
196
+ hostname: str,
197
+ expires_at: typing.Optional[str] = OMIT,
198
+ request_options: typing.Optional[RequestOptions] = None,
199
+ ) -> ClientSideAccessTokensCreateClientSideAccessTokenResponse:
200
+ """
201
+ Create a new client side access token with the specified configuration.
202
+
203
+ Parameters
204
+ ----------
205
+ policy : typing.Sequence[ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem]
206
+
207
+ hostname : str
208
+ The hostname of the client side application. Please specify the full URL including the protocol (http or https).
209
+
210
+ expires_at : typing.Optional[str]
211
+ The expiration date of the token. If not provided, the token will expire in 5 minutes
212
+
213
+ request_options : typing.Optional[RequestOptions]
214
+ Request-specific configuration.
215
+
216
+ Returns
217
+ -------
218
+ ClientSideAccessTokensCreateClientSideAccessTokenResponse
219
+ 201
220
+
221
+ Examples
222
+ --------
223
+ import asyncio
224
+
225
+ from letta_client import AsyncLetta
226
+ from letta_client.client_side_access_tokens import (
227
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem,
228
+ )
229
+
230
+ client = AsyncLetta(
231
+ token="YOUR_TOKEN",
232
+ )
233
+
234
+
235
+ async def main() -> None:
236
+ await client.client_side_access_tokens.client_side_access_tokens_create_client_side_access_token(
237
+ policy=[
238
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem(
239
+ id="id",
240
+ access=["read_messages"],
241
+ )
242
+ ],
243
+ hostname="hostname",
244
+ )
245
+
246
+
247
+ asyncio.run(main())
248
+ """
249
+ _response = await self._client_wrapper.httpx_client.request(
250
+ "v1/client-side-access-tokens",
251
+ method="POST",
252
+ json={
253
+ "policy": convert_and_respect_annotation_metadata(
254
+ object_=policy,
255
+ annotation=typing.Sequence[ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem],
256
+ direction="write",
257
+ ),
258
+ "hostname": hostname,
259
+ "expires_at": expires_at,
260
+ },
261
+ headers={
262
+ "content-type": "application/json",
263
+ },
264
+ request_options=request_options,
265
+ omit=OMIT,
266
+ )
267
+ try:
268
+ if 200 <= _response.status_code < 300:
269
+ return typing.cast(
270
+ ClientSideAccessTokensCreateClientSideAccessTokenResponse,
271
+ construct_type(
272
+ type_=ClientSideAccessTokensCreateClientSideAccessTokenResponse, # type: ignore
273
+ object_=_response.json(),
274
+ ),
275
+ )
276
+ if _response.status_code == 400:
277
+ raise BadRequestError(
278
+ typing.cast(
279
+ typing.Optional[typing.Any],
280
+ construct_type(
281
+ type_=typing.Optional[typing.Any], # type: ignore
282
+ object_=_response.json(),
283
+ ),
284
+ )
285
+ )
286
+ _response_json = _response.json()
287
+ except JSONDecodeError:
288
+ raise ApiError(status_code=_response.status_code, body=_response.text)
289
+ raise ApiError(status_code=_response.status_code, body=_response_json)
290
+
291
+ async def client_side_access_tokens_delete_client_side_access_token(
292
+ self,
293
+ token: str,
294
+ *,
295
+ request: typing.Optional[typing.Any] = None,
296
+ request_options: typing.Optional[RequestOptions] = None,
297
+ ) -> typing.Optional[typing.Any]:
298
+ """
299
+ Delete a client side access token.
300
+
301
+ Parameters
302
+ ----------
303
+ token : str
304
+ The access token to delete
305
+
306
+ request : typing.Optional[typing.Any]
307
+
308
+ request_options : typing.Optional[RequestOptions]
309
+ Request-specific configuration.
310
+
311
+ Returns
312
+ -------
313
+ typing.Optional[typing.Any]
314
+ 204
315
+
316
+ Examples
317
+ --------
318
+ import asyncio
319
+
320
+ from letta_client import AsyncLetta
321
+
322
+ client = AsyncLetta(
323
+ token="YOUR_TOKEN",
324
+ )
325
+
326
+
327
+ async def main() -> None:
328
+ await client.client_side_access_tokens.client_side_access_tokens_delete_client_side_access_token(
329
+ token="token",
330
+ request={"key": "value"},
331
+ )
332
+
333
+
334
+ asyncio.run(main())
335
+ """
336
+ _response = await self._client_wrapper.httpx_client.request(
337
+ f"v1/client-side-access-tokens/{jsonable_encoder(token)}",
338
+ method="DELETE",
339
+ json=request,
340
+ request_options=request_options,
341
+ omit=OMIT,
342
+ )
343
+ try:
344
+ if 200 <= _response.status_code < 300:
345
+ return typing.cast(
346
+ typing.Optional[typing.Any],
347
+ construct_type(
348
+ type_=typing.Optional[typing.Any], # type: ignore
349
+ object_=_response.json(),
350
+ ),
351
+ )
352
+ if _response.status_code == 400:
353
+ raise BadRequestError(
354
+ typing.cast(
355
+ typing.Optional[typing.Any],
356
+ construct_type(
357
+ type_=typing.Optional[typing.Any], # type: ignore
358
+ object_=_response.json(),
359
+ ),
360
+ )
361
+ )
362
+ _response_json = _response.json()
363
+ except JSONDecodeError:
364
+ raise ApiError(status_code=_response.status_code, body=_response.text)
365
+ raise ApiError(status_code=_response.status_code, body=_response_json)
@@ -0,0 +1,29 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from .client_side_access_tokens_create_client_side_access_token_request_policy_item import (
4
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem,
5
+ )
6
+ from .client_side_access_tokens_create_client_side_access_token_request_policy_item_access_item import (
7
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItemAccessItem,
8
+ )
9
+ from .client_side_access_tokens_create_client_side_access_token_response import (
10
+ ClientSideAccessTokensCreateClientSideAccessTokenResponse,
11
+ )
12
+ from .client_side_access_tokens_create_client_side_access_token_response_policy import (
13
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicy,
14
+ )
15
+ from .client_side_access_tokens_create_client_side_access_token_response_policy_data_item import (
16
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItem,
17
+ )
18
+ from .client_side_access_tokens_create_client_side_access_token_response_policy_data_item_access_item import (
19
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItemAccessItem,
20
+ )
21
+
22
+ __all__ = [
23
+ "ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem",
24
+ "ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItemAccessItem",
25
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponse",
26
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicy",
27
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItem",
28
+ "ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItemAccessItem",
29
+ ]
@@ -0,0 +1,24 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ...core.unchecked_base_model import UncheckedBaseModel
4
+ import typing
5
+ from .client_side_access_tokens_create_client_side_access_token_request_policy_item_access_item import (
6
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItemAccessItem,
7
+ )
8
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2
9
+ import pydantic
10
+
11
+
12
+ class ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItem(UncheckedBaseModel):
13
+ type: typing.Literal["agent"] = "agent"
14
+ id: str
15
+ access: typing.List[ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItemAccessItem]
16
+
17
+ if IS_PYDANTIC_V2:
18
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
19
+ else:
20
+
21
+ class Config:
22
+ frozen = True
23
+ smart_union = True
24
+ extra = pydantic.Extra.allow
@@ -0,0 +1,7 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ ClientSideAccessTokensCreateClientSideAccessTokenRequestPolicyItemAccessItem = typing.Union[
6
+ typing.Literal["read_messages", "write_messages", "read_agent", "write_agent"], typing.Any
7
+ ]
@@ -0,0 +1,27 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ...core.unchecked_base_model import UncheckedBaseModel
4
+ from .client_side_access_tokens_create_client_side_access_token_response_policy import (
5
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicy,
6
+ )
7
+ import typing_extensions
8
+ from ...core.serialization import FieldMetadata
9
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2
10
+ import typing
11
+ import pydantic
12
+
13
+
14
+ class ClientSideAccessTokensCreateClientSideAccessTokenResponse(UncheckedBaseModel):
15
+ policy: ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicy
16
+ token: str
17
+ hostname: str
18
+ expires_at: typing_extensions.Annotated[str, FieldMetadata(alias="expiresAt")]
19
+
20
+ if IS_PYDANTIC_V2:
21
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
22
+ else:
23
+
24
+ class Config:
25
+ frozen = True
26
+ smart_union = True
27
+ extra = pydantic.Extra.allow
@@ -0,0 +1,23 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ...core.unchecked_base_model import UncheckedBaseModel
4
+ import typing
5
+ from .client_side_access_tokens_create_client_side_access_token_response_policy_data_item import (
6
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItem,
7
+ )
8
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2
9
+ import pydantic
10
+
11
+
12
+ class ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicy(UncheckedBaseModel):
13
+ version: typing.Literal["1"] = "1"
14
+ data: typing.List[ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItem]
15
+
16
+ if IS_PYDANTIC_V2:
17
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
18
+ else:
19
+
20
+ class Config:
21
+ frozen = True
22
+ smart_union = True
23
+ extra = pydantic.Extra.allow
@@ -0,0 +1,24 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ...core.unchecked_base_model import UncheckedBaseModel
4
+ import typing
5
+ from .client_side_access_tokens_create_client_side_access_token_response_policy_data_item_access_item import (
6
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItemAccessItem,
7
+ )
8
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2
9
+ import pydantic
10
+
11
+
12
+ class ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItem(UncheckedBaseModel):
13
+ type: typing.Literal["agent"] = "agent"
14
+ id: str
15
+ access: typing.List[ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItemAccessItem]
16
+
17
+ if IS_PYDANTIC_V2:
18
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
19
+ else:
20
+
21
+ class Config:
22
+ frozen = True
23
+ smart_union = True
24
+ extra = pydantic.Extra.allow
@@ -0,0 +1,7 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ ClientSideAccessTokensCreateClientSideAccessTokenResponsePolicyDataItemAccessItem = typing.Union[
6
+ typing.Literal["read_messages", "write_messages", "read_agent", "write_agent"], typing.Any
7
+ ]
@@ -16,7 +16,7 @@ class BaseClientWrapper:
16
16
  headers: typing.Dict[str, str] = {
17
17
  "X-Fern-Language": "Python",
18
18
  "X-Fern-SDK-Name": "letta-client",
19
- "X-Fern-SDK-Version": "0.1.113",
19
+ "X-Fern-SDK-Version": "0.1.115",
20
20
  }
21
21
  if self.token is not None:
22
22
  headers["Authorization"] = f"Bearer {self.token}"
@@ -1,8 +1,9 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
+ from .bad_request_error import BadRequestError
3
4
  from .conflict_error import ConflictError
4
5
  from .internal_server_error import InternalServerError
5
6
  from .not_found_error import NotFoundError
6
7
  from .unprocessable_entity_error import UnprocessableEntityError
7
8
 
8
- __all__ = ["ConflictError", "InternalServerError", "NotFoundError", "UnprocessableEntityError"]
9
+ __all__ = ["BadRequestError", "ConflictError", "InternalServerError", "NotFoundError", "UnprocessableEntityError"]
@@ -0,0 +1,9 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ..core.api_error import ApiError
4
+ import typing
5
+
6
+
7
+ class BadRequestError(ApiError):
8
+ def __init__(self, body: typing.Optional[typing.Any]):
9
+ super().__init__(status_code=400, body=body)
@@ -18,6 +18,7 @@ from .audio import Audio
18
18
  from .auth_request import AuthRequest
19
19
  from .auth_response import AuthResponse
20
20
  from .auth_scheme_field import AuthSchemeField
21
+ from .bad_request_error_body import BadRequestErrorBody
21
22
  from .base_tool_rule_schema import BaseToolRuleSchema
22
23
  from .block import Block
23
24
  from .block_update import BlockUpdate
@@ -242,6 +243,7 @@ __all__ = [
242
243
  "AuthRequest",
243
244
  "AuthResponse",
244
245
  "AuthSchemeField",
246
+ "BadRequestErrorBody",
245
247
  "BaseToolRuleSchema",
246
248
  "Block",
247
249
  "BlockUpdate",
@@ -0,0 +1,19 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ..core.unchecked_base_model import UncheckedBaseModel
4
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2
5
+ import typing
6
+ import pydantic
7
+
8
+
9
+ class BadRequestErrorBody(UncheckedBaseModel):
10
+ message: str
11
+
12
+ if IS_PYDANTIC_V2:
13
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
14
+ else:
15
+
16
+ class Config:
17
+ frozen = True
18
+ smart_union = True
19
+ extra = pydantic.Extra.allow
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-client
3
- Version: 0.1.113
3
+ Version: 0.1.115
4
4
  Summary:
5
5
  Requires-Python: >=3.8,<4.0
6
6
  Classifier: Intended Audience :: Developers
@@ -1,8 +1,8 @@
1
- letta_client/__init__.py,sha256=d1gnZZWntFsL6yIr_dKOqcnHqMkHuHvkiXC35I5vrUs,14663
1
+ letta_client/__init__.py,sha256=lKX_QaChOyoSuENK27jEK217U_PfUOHcL63jQOm-qew,15774
2
2
  letta_client/agents/__init__.py,sha256=CveigJGrnkw3yZ8S9yZ2DpK1HV0v1fU-khsiLJJ0uaU,1452
3
3
  letta_client/agents/blocks/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
4
4
  letta_client/agents/blocks/client.py,sha256=u5zvutxoH_DqfSLWhRtNSRBC9_ezQDx682cxkxDz3JA,23822
5
- letta_client/agents/client.py,sha256=fg8siL3X3DW_FywnbbnTM-ptWj_SEA8kjtBrcR2509E,99434
5
+ letta_client/agents/client.py,sha256=VGKkSVTJ5j52fIh7PSNmMBD7gd0ZBu3dYcDPRoYU6as,103492
6
6
  letta_client/agents/context/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
7
7
  letta_client/agents/context/client.py,sha256=GKKvoG4N_K8Biz9yDjeIHpFG0C8Cwc7tHmEX3pTL_9U,4815
8
8
  letta_client/agents/core_memory/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
@@ -38,13 +38,22 @@ letta_client/agents/types/agents_search_request_search_item_zero.py,sha256=tGjwn
38
38
  letta_client/agents/types/agents_search_response.py,sha256=AQJVKps-bjCx2ujqESzW1Iy9ZYFS17hH_UFIeBeK4S8,815
39
39
  letta_client/agents/types/create_agent_request_tool_rules_item.py,sha256=L3FNsFTG9kVmuPbQhbCKNg3H2E5bB2Rgp92gWmGd-LM,689
40
40
  letta_client/agents/types/update_agent_tool_rules_item.py,sha256=k9MmcVPsK-EGl8XlT3JQwdlBNLgpGw528jmi8fCFS7g,682
41
- letta_client/base_client.py,sha256=bF1nEcPGrhNqelaWz3DgROYdroGsBFCjpAHHri0uq7I,8629
41
+ letta_client/base_client.py,sha256=blSmkOb1gId27sNL3QcKY5v7x1E_ZYLbZb7TLK4XCtU,9003
42
42
  letta_client/blocks/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
43
43
  letta_client/blocks/client.py,sha256=LE9dsHaBxFLC3G035f0VpNDG7XKWRK8y9OXpeFCMvUw,30082
44
44
  letta_client/client.py,sha256=k2mZqqEWciVmEQHgipjCK4kQILk74hpSqzcdNwdql9A,21212
45
+ letta_client/client_side_access_tokens/__init__.py,sha256=ivKMiZVIc5IjBZvinNK_aVy1RpvD9lWstT1XJzXc_ak,1015
46
+ letta_client/client_side_access_tokens/client.py,sha256=69zUzYSphr_r8HpnPpidXotKIDdFCS9YSK8haU8BiVM,13168
47
+ letta_client/client_side_access_tokens/types/__init__.py,sha256=Cjp8P6wW6EJKf4yiv1U1FzDiVI21dOv1IG_fn4Xzazc,1583
48
+ letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_request_policy_item.py,sha256=blQBjrrqrV6eqCqi2iP4KHkg_83bqkcs3F4kKvjH_gc,946
49
+ letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_request_policy_item_access_item.py,sha256=gFROGOsd-Gkj2JgVLBr_qgowdjywr5W__Z0Prj1osfE,270
50
+ letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_response.py,sha256=WK7Ekd6i-NiBvmD4dyvSiBCHtadXAOV3gl_-W8-e_0Q,1015
51
+ letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_response_policy.py,sha256=JusvFIWRKx9rOAw-qB7XrG7zQ4AkpNm_Qwm5hF-HudA,908
52
+ letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_response_policy_data_item.py,sha256=ou-3g9-saP3FftVHkWH9I3cGTk8ez4p8aZ_mChEgfH0,967
53
+ letta_client/client_side_access_tokens/types/client_side_access_tokens_create_client_side_access_token_response_policy_data_item_access_item.py,sha256=vefuUVB3pLCbCNBJACXMsEKZuwhMAGvLwSU3TU3Q4l4,275
45
54
  letta_client/core/__init__.py,sha256=OKbX2aCZXgHCDUsCouqv-OiX32xA6eFFCKIUH9M5Vzk,1591
46
55
  letta_client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
47
- letta_client/core/client_wrapper.py,sha256=L6bz6DGcMeq5IkCPnDNA3f9LQmhEmyh4k-ktfuwMcbk,1998
56
+ letta_client/core/client_wrapper.py,sha256=rUuUVuDTFJy3Pld-k-cXJFoE3ieVMn0V5tLmbnghtWI,1998
48
57
  letta_client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
49
58
  letta_client/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
50
59
  letta_client/core/http_client.py,sha256=Z77OIxIbL4OAB2IDqjRq_sYa5yNYAWfmdhdCSSvh6Y4,19552
@@ -56,7 +65,8 @@ letta_client/core/request_options.py,sha256=h0QUNCFVdCW_7GclVySCAY2w4NhtXVBUCmHg
56
65
  letta_client/core/serialization.py,sha256=D9h_t-RQON3-CHWs1C4ESY9B-Yd5d-l5lnTLb_X896g,9601
57
66
  letta_client/core/unchecked_base_model.py,sha256=zliEPgLnK9yQ1dZ0mHP6agQ7H0bTZk8AvX6VC1r9oPQ,10754
58
67
  letta_client/environment.py,sha256=91gYLF9bT4-hTPQ9dcPfmub4LgEl-T4a5kW7NXzRIJU,198
59
- letta_client/errors/__init__.py,sha256=wqo3GnyT9iRy7zuPMs6TXOg9GMNfDp4fxq7M8lFFgK8,367
68
+ letta_client/errors/__init__.py,sha256=sf5qYBpvBUchcwEIvulM7AYVGJkiVxknC9OX6TOpOdo,433
69
+ letta_client/errors/bad_request_error.py,sha256=_EbO8mWqN9kFZPvIap8qa1lL_EWkRcsZe1HKV9GDWJY,264
60
70
  letta_client/errors/conflict_error.py,sha256=INHRMcX6i0ywcbZfw-vn3aBoVi06bDjev3p_O8U8IA4,296
61
71
  letta_client/errors/internal_server_error.py,sha256=8USCagXyJJ1MOm9snpcXIUt6eNXvrd_aq7Gfcu1vlOI,268
62
72
  letta_client/errors/not_found_error.py,sha256=tBVCeBC8n3C811WHRj_n-hs3h8MqwR5gp0vLiobk7W8,262
@@ -106,7 +116,7 @@ letta_client/tools/types/add_mcp_server_request.py,sha256=EieZjfOT95sjkpxXdqy7gl
106
116
  letta_client/tools/types/add_mcp_server_response_item.py,sha256=TWdsKqGb1INhYtpGnAckz0Pw4nZShumSp4pfocRfxCA,270
107
117
  letta_client/tools/types/delete_mcp_server_response_item.py,sha256=MeZObU-7tMSCd-S5yuUjNDse6A1hUz1LLjbko0pXaro,273
108
118
  letta_client/tools/types/list_mcp_servers_response_value.py,sha256=AIoXu4bO8QNSU7zjL1jj0Rg4313wVtPaTt13W0aevLQ,273
109
- letta_client/types/__init__.py,sha256=3g30SRiC6aVG5mzeT9BPulQNV0A6IdK8msZiMofiHSs,19775
119
+ letta_client/types/__init__.py,sha256=WL1kUXfr7I6CDtXjtiw05YOpJ-7DYHFKslCKkoQgw8I,19858
110
120
  letta_client/types/action_model.py,sha256=y1e2XMv3skFaNJIBdYoBKgiORzGh05aOVvu-qVR9uHg,1240
111
121
  letta_client/types/action_parameters_model.py,sha256=LgKf5aPZG3-OHGxFdXiSokIDgce8c02xPYIAY05VgW8,828
112
122
  letta_client/types/action_response_model.py,sha256=yq2Fd9UU8j7vvtE3VqXUoRRvDzWcfJPj_95ynGdeHCs,824
@@ -125,6 +135,7 @@ letta_client/types/audio.py,sha256=aCgzL9SmkmM4yU7hy2IWwPrC-wtllplo3dQF9mjk7Fg,5
125
135
  letta_client/types/auth_request.py,sha256=q63VMj39aCmljDuzUeAClXEqyaoa_HKv5IraSv8ry9M,683
126
136
  letta_client/types/auth_response.py,sha256=jtG9Nn0voJcOWkBtvnuGGwhpUhYz9A8O7soOJZo_E_E,861
127
137
  letta_client/types/auth_scheme_field.py,sha256=W4-qgKtKUSpBHaSvjLyzLybOIsGo7Ggk4VECpsoPnqQ,881
138
+ letta_client/types/bad_request_error_body.py,sha256=E4_eWEc9xeW9BkXGViBDrevV8Jf6PjgEweeGS3vJLD4,567
128
139
  letta_client/types/base_tool_rule_schema.py,sha256=FbnJy6gb8wY_DPiU3Gs-u1Ol_l4K7-nAmPTc1oR3kOo,582
129
140
  letta_client/types/block.py,sha256=J8McqSpellhd-KsPYontU8DYg3YV41_fQW5rR-85qMk,2900
130
141
  letta_client/types/block_update.py,sha256=oIgxvSnav5vxztBdslRMiWOgRaAp3dh43pinZpoLzxk,1496
@@ -330,6 +341,6 @@ letta_client/voice/__init__.py,sha256=7hX85553PiRMtIMM12a0DSoFzsglNiUziYR2ekS84Q
330
341
  letta_client/voice/client.py,sha256=STjswa5oOLoP59QwTJvQwi73kgn0UzKOaXc2CsTRI4k,6912
331
342
  letta_client/voice/types/__init__.py,sha256=FRc3iKRTONE4N8Lf1IqvnqWZ2kXdrFFvkL7PxVcR8Ew,212
332
343
  letta_client/voice/types/create_voice_chat_completions_request_body.py,sha256=ZLfKgNK1T6IAwLEvaBVFfy7jEAoPUXP28n-nfmHkklc,391
333
- letta_client-0.1.113.dist-info/METADATA,sha256=uIWZPBRPXAkNt7pYPeBGEvxOsZcVvtpKUmvJ3TmEMwQ,5042
334
- letta_client-0.1.113.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
335
- letta_client-0.1.113.dist-info/RECORD,,
344
+ letta_client-0.1.115.dist-info/METADATA,sha256=G0BZPzIt1KSnnO3942-jsDC5Ron_CJN5JiZYaRIFsLI,5042
345
+ letta_client-0.1.115.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
346
+ letta_client-0.1.115.dist-info/RECORD,,