letta-client 0.1.221__py3-none-any.whl → 0.1.222__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.

letta_client/__init__.py CHANGED
@@ -334,6 +334,7 @@ from .templates import TemplatesListResponse, TemplatesListResponseTemplatesItem
334
334
  from .tools import (
335
335
  AddMcpServerRequest,
336
336
  AddMcpServerResponseItem,
337
+ ConnectMcpServerRequest,
337
338
  DeleteMcpServerResponseItem,
338
339
  ListMcpServersResponseValue,
339
340
  TestMcpServerRequest,
@@ -449,6 +450,7 @@ __all__ = [
449
450
  "ConditionalToolRuleSchema",
450
451
  "ConflictError",
451
452
  "ConflictErrorBody",
453
+ "ConnectMcpServerRequest",
452
454
  "ContextWindowOverview",
453
455
  "ContinueToolRule",
454
456
  "CoreMemoryBlockSchema",
@@ -24,7 +24,7 @@ class BaseClientWrapper:
24
24
  headers: typing.Dict[str, str] = {
25
25
  "X-Fern-Language": "Python",
26
26
  "X-Fern-SDK-Name": "letta-client",
27
- "X-Fern-SDK-Version": "0.1.221",
27
+ "X-Fern-SDK-Version": "0.1.222",
28
28
  }
29
29
  if self._project is not None:
30
30
  headers["X-Project"] = self._project
@@ -3,6 +3,7 @@
3
3
  from .types import (
4
4
  AddMcpServerRequest,
5
5
  AddMcpServerResponseItem,
6
+ ConnectMcpServerRequest,
6
7
  DeleteMcpServerResponseItem,
7
8
  ListMcpServersResponseValue,
8
9
  TestMcpServerRequest,
@@ -13,6 +14,7 @@ from .types import (
13
14
  __all__ = [
14
15
  "AddMcpServerRequest",
15
16
  "AddMcpServerResponseItem",
17
+ "ConnectMcpServerRequest",
16
18
  "DeleteMcpServerResponseItem",
17
19
  "ListMcpServersResponseValue",
18
20
  "TestMcpServerRequest",
@@ -23,6 +23,7 @@ from .types.delete_mcp_server_response_item import DeleteMcpServerResponseItem
23
23
  from .types.update_mcp_server_request import UpdateMcpServerRequest
24
24
  from .types.update_mcp_server_response import UpdateMcpServerResponse
25
25
  from .types.test_mcp_server_request import TestMcpServerRequest
26
+ from .types.connect_mcp_server_request import ConnectMcpServerRequest
26
27
  from ..core.client_wrapper import AsyncClientWrapper
27
28
 
28
29
  # this is used as the default value for optional parameters
@@ -1320,10 +1321,10 @@ class ToolsClient:
1320
1321
 
1321
1322
  def test_mcp_server(
1322
1323
  self, *, request: TestMcpServerRequest, request_options: typing.Optional[RequestOptions] = None
1323
- ) -> typing.List[McpTool]:
1324
+ ) -> typing.Optional[typing.Any]:
1324
1325
  """
1325
1326
  Test connection to an MCP server without adding it.
1326
- Returns the list of available tools if successful.
1327
+ Returns the list of available tools if successful, or OAuth information if OAuth is required.
1327
1328
 
1328
1329
  Parameters
1329
1330
  ----------
@@ -1334,7 +1335,7 @@ class ToolsClient:
1334
1335
 
1335
1336
  Returns
1336
1337
  -------
1337
- typing.List[McpTool]
1338
+ typing.Optional[typing.Any]
1338
1339
  Successful Response
1339
1340
 
1340
1341
  Examples
@@ -1365,9 +1366,77 @@ class ToolsClient:
1365
1366
  try:
1366
1367
  if 200 <= _response.status_code < 300:
1367
1368
  return typing.cast(
1368
- typing.List[McpTool],
1369
+ typing.Optional[typing.Any],
1369
1370
  construct_type(
1370
- type_=typing.List[McpTool], # type: ignore
1371
+ type_=typing.Optional[typing.Any], # type: ignore
1372
+ object_=_response.json(),
1373
+ ),
1374
+ )
1375
+ if _response.status_code == 422:
1376
+ raise UnprocessableEntityError(
1377
+ typing.cast(
1378
+ HttpValidationError,
1379
+ construct_type(
1380
+ type_=HttpValidationError, # type: ignore
1381
+ object_=_response.json(),
1382
+ ),
1383
+ )
1384
+ )
1385
+ _response_json = _response.json()
1386
+ except JSONDecodeError:
1387
+ raise ApiError(status_code=_response.status_code, body=_response.text)
1388
+ raise ApiError(status_code=_response.status_code, body=_response_json)
1389
+
1390
+ def connect_mcp_server(
1391
+ self, *, request: ConnectMcpServerRequest, request_options: typing.Optional[RequestOptions] = None
1392
+ ) -> typing.Optional[typing.Any]:
1393
+ """
1394
+ Connect to an MCP server with support for OAuth via SSE.
1395
+ Returns a stream of events handling authorization state and exchange if OAuth is required.
1396
+
1397
+ Parameters
1398
+ ----------
1399
+ request : ConnectMcpServerRequest
1400
+
1401
+ request_options : typing.Optional[RequestOptions]
1402
+ Request-specific configuration.
1403
+
1404
+ Returns
1405
+ -------
1406
+ typing.Optional[typing.Any]
1407
+ Successful response
1408
+
1409
+ Examples
1410
+ --------
1411
+ from letta_client import Letta, StdioServerConfig
1412
+
1413
+ client = Letta(
1414
+ project="YOUR_PROJECT",
1415
+ token="YOUR_TOKEN",
1416
+ )
1417
+ client.tools.connect_mcp_server(
1418
+ request=StdioServerConfig(
1419
+ server_name="server_name",
1420
+ command="command",
1421
+ args=["args"],
1422
+ ),
1423
+ )
1424
+ """
1425
+ _response = self._client_wrapper.httpx_client.request(
1426
+ "v1/tools/mcp/servers/connect",
1427
+ method="POST",
1428
+ json=convert_and_respect_annotation_metadata(
1429
+ object_=request, annotation=ConnectMcpServerRequest, direction="write"
1430
+ ),
1431
+ request_options=request_options,
1432
+ omit=OMIT,
1433
+ )
1434
+ try:
1435
+ if 200 <= _response.status_code < 300:
1436
+ return typing.cast(
1437
+ typing.Optional[typing.Any],
1438
+ construct_type(
1439
+ type_=typing.Optional[typing.Any], # type: ignore
1371
1440
  object_=_response.json(),
1372
1441
  ),
1373
1442
  )
@@ -1386,6 +1455,83 @@ class ToolsClient:
1386
1455
  raise ApiError(status_code=_response.status_code, body=_response.text)
1387
1456
  raise ApiError(status_code=_response.status_code, body=_response_json)
1388
1457
 
1458
+ def mcp_oauth_callback(
1459
+ self,
1460
+ session_id: str,
1461
+ *,
1462
+ code: typing.Optional[str] = None,
1463
+ state: typing.Optional[str] = None,
1464
+ error: typing.Optional[str] = None,
1465
+ error_description: typing.Optional[str] = None,
1466
+ request_options: typing.Optional[RequestOptions] = None,
1467
+ ) -> None:
1468
+ """
1469
+ Handle OAuth callback for MCP server authentication.
1470
+
1471
+ Parameters
1472
+ ----------
1473
+ session_id : str
1474
+
1475
+ code : typing.Optional[str]
1476
+ OAuth authorization code
1477
+
1478
+ state : typing.Optional[str]
1479
+ OAuth state parameter
1480
+
1481
+ error : typing.Optional[str]
1482
+ OAuth error
1483
+
1484
+ error_description : typing.Optional[str]
1485
+ OAuth error description
1486
+
1487
+ request_options : typing.Optional[RequestOptions]
1488
+ Request-specific configuration.
1489
+
1490
+ Returns
1491
+ -------
1492
+ None
1493
+
1494
+ Examples
1495
+ --------
1496
+ from letta_client import Letta
1497
+
1498
+ client = Letta(
1499
+ project="YOUR_PROJECT",
1500
+ token="YOUR_TOKEN",
1501
+ )
1502
+ client.tools.mcp_oauth_callback(
1503
+ session_id="session_id",
1504
+ )
1505
+ """
1506
+ _response = self._client_wrapper.httpx_client.request(
1507
+ f"v1/tools/mcp/oauth/callback/{jsonable_encoder(session_id)}",
1508
+ method="GET",
1509
+ params={
1510
+ "code": code,
1511
+ "state": state,
1512
+ "error": error,
1513
+ "error_description": error_description,
1514
+ },
1515
+ request_options=request_options,
1516
+ )
1517
+ try:
1518
+ if 200 <= _response.status_code < 300:
1519
+ return
1520
+ if _response.status_code == 422:
1521
+ raise UnprocessableEntityError(
1522
+ typing.cast(
1523
+ HttpValidationError,
1524
+ construct_type(
1525
+ type_=HttpValidationError, # type: ignore
1526
+ object_=_response.json(),
1527
+ ),
1528
+ )
1529
+ )
1530
+ _response_json = _response.json()
1531
+ except JSONDecodeError:
1532
+ raise ApiError(status_code=_response.status_code, body=_response.text)
1533
+ raise ApiError(status_code=_response.status_code, body=_response_json)
1534
+
1389
1535
 
1390
1536
  class AsyncToolsClient:
1391
1537
  def __init__(self, *, client_wrapper: AsyncClientWrapper):
@@ -2822,10 +2968,10 @@ class AsyncToolsClient:
2822
2968
 
2823
2969
  async def test_mcp_server(
2824
2970
  self, *, request: TestMcpServerRequest, request_options: typing.Optional[RequestOptions] = None
2825
- ) -> typing.List[McpTool]:
2971
+ ) -> typing.Optional[typing.Any]:
2826
2972
  """
2827
2973
  Test connection to an MCP server without adding it.
2828
- Returns the list of available tools if successful.
2974
+ Returns the list of available tools if successful, or OAuth information if OAuth is required.
2829
2975
 
2830
2976
  Parameters
2831
2977
  ----------
@@ -2836,7 +2982,7 @@ class AsyncToolsClient:
2836
2982
 
2837
2983
  Returns
2838
2984
  -------
2839
- typing.List[McpTool]
2985
+ typing.Optional[typing.Any]
2840
2986
  Successful Response
2841
2987
 
2842
2988
  Examples
@@ -2875,9 +3021,9 @@ class AsyncToolsClient:
2875
3021
  try:
2876
3022
  if 200 <= _response.status_code < 300:
2877
3023
  return typing.cast(
2878
- typing.List[McpTool],
3024
+ typing.Optional[typing.Any],
2879
3025
  construct_type(
2880
- type_=typing.List[McpTool], # type: ignore
3026
+ type_=typing.Optional[typing.Any], # type: ignore
2881
3027
  object_=_response.json(),
2882
3028
  ),
2883
3029
  )
@@ -2895,3 +3041,164 @@ class AsyncToolsClient:
2895
3041
  except JSONDecodeError:
2896
3042
  raise ApiError(status_code=_response.status_code, body=_response.text)
2897
3043
  raise ApiError(status_code=_response.status_code, body=_response_json)
3044
+
3045
+ async def connect_mcp_server(
3046
+ self, *, request: ConnectMcpServerRequest, request_options: typing.Optional[RequestOptions] = None
3047
+ ) -> typing.Optional[typing.Any]:
3048
+ """
3049
+ Connect to an MCP server with support for OAuth via SSE.
3050
+ Returns a stream of events handling authorization state and exchange if OAuth is required.
3051
+
3052
+ Parameters
3053
+ ----------
3054
+ request : ConnectMcpServerRequest
3055
+
3056
+ request_options : typing.Optional[RequestOptions]
3057
+ Request-specific configuration.
3058
+
3059
+ Returns
3060
+ -------
3061
+ typing.Optional[typing.Any]
3062
+ Successful response
3063
+
3064
+ Examples
3065
+ --------
3066
+ import asyncio
3067
+
3068
+ from letta_client import AsyncLetta, StdioServerConfig
3069
+
3070
+ client = AsyncLetta(
3071
+ project="YOUR_PROJECT",
3072
+ token="YOUR_TOKEN",
3073
+ )
3074
+
3075
+
3076
+ async def main() -> None:
3077
+ await client.tools.connect_mcp_server(
3078
+ request=StdioServerConfig(
3079
+ server_name="server_name",
3080
+ command="command",
3081
+ args=["args"],
3082
+ ),
3083
+ )
3084
+
3085
+
3086
+ asyncio.run(main())
3087
+ """
3088
+ _response = await self._client_wrapper.httpx_client.request(
3089
+ "v1/tools/mcp/servers/connect",
3090
+ method="POST",
3091
+ json=convert_and_respect_annotation_metadata(
3092
+ object_=request, annotation=ConnectMcpServerRequest, direction="write"
3093
+ ),
3094
+ request_options=request_options,
3095
+ omit=OMIT,
3096
+ )
3097
+ try:
3098
+ if 200 <= _response.status_code < 300:
3099
+ return typing.cast(
3100
+ typing.Optional[typing.Any],
3101
+ construct_type(
3102
+ type_=typing.Optional[typing.Any], # type: ignore
3103
+ object_=_response.json(),
3104
+ ),
3105
+ )
3106
+ if _response.status_code == 422:
3107
+ raise UnprocessableEntityError(
3108
+ typing.cast(
3109
+ HttpValidationError,
3110
+ construct_type(
3111
+ type_=HttpValidationError, # type: ignore
3112
+ object_=_response.json(),
3113
+ ),
3114
+ )
3115
+ )
3116
+ _response_json = _response.json()
3117
+ except JSONDecodeError:
3118
+ raise ApiError(status_code=_response.status_code, body=_response.text)
3119
+ raise ApiError(status_code=_response.status_code, body=_response_json)
3120
+
3121
+ async def mcp_oauth_callback(
3122
+ self,
3123
+ session_id: str,
3124
+ *,
3125
+ code: typing.Optional[str] = None,
3126
+ state: typing.Optional[str] = None,
3127
+ error: typing.Optional[str] = None,
3128
+ error_description: typing.Optional[str] = None,
3129
+ request_options: typing.Optional[RequestOptions] = None,
3130
+ ) -> None:
3131
+ """
3132
+ Handle OAuth callback for MCP server authentication.
3133
+
3134
+ Parameters
3135
+ ----------
3136
+ session_id : str
3137
+
3138
+ code : typing.Optional[str]
3139
+ OAuth authorization code
3140
+
3141
+ state : typing.Optional[str]
3142
+ OAuth state parameter
3143
+
3144
+ error : typing.Optional[str]
3145
+ OAuth error
3146
+
3147
+ error_description : typing.Optional[str]
3148
+ OAuth error description
3149
+
3150
+ request_options : typing.Optional[RequestOptions]
3151
+ Request-specific configuration.
3152
+
3153
+ Returns
3154
+ -------
3155
+ None
3156
+
3157
+ Examples
3158
+ --------
3159
+ import asyncio
3160
+
3161
+ from letta_client import AsyncLetta
3162
+
3163
+ client = AsyncLetta(
3164
+ project="YOUR_PROJECT",
3165
+ token="YOUR_TOKEN",
3166
+ )
3167
+
3168
+
3169
+ async def main() -> None:
3170
+ await client.tools.mcp_oauth_callback(
3171
+ session_id="session_id",
3172
+ )
3173
+
3174
+
3175
+ asyncio.run(main())
3176
+ """
3177
+ _response = await self._client_wrapper.httpx_client.request(
3178
+ f"v1/tools/mcp/oauth/callback/{jsonable_encoder(session_id)}",
3179
+ method="GET",
3180
+ params={
3181
+ "code": code,
3182
+ "state": state,
3183
+ "error": error,
3184
+ "error_description": error_description,
3185
+ },
3186
+ request_options=request_options,
3187
+ )
3188
+ try:
3189
+ if 200 <= _response.status_code < 300:
3190
+ return
3191
+ if _response.status_code == 422:
3192
+ raise UnprocessableEntityError(
3193
+ typing.cast(
3194
+ HttpValidationError,
3195
+ construct_type(
3196
+ type_=HttpValidationError, # type: ignore
3197
+ object_=_response.json(),
3198
+ ),
3199
+ )
3200
+ )
3201
+ _response_json = _response.json()
3202
+ except JSONDecodeError:
3203
+ raise ApiError(status_code=_response.status_code, body=_response.text)
3204
+ raise ApiError(status_code=_response.status_code, body=_response_json)
@@ -2,6 +2,7 @@
2
2
 
3
3
  from .add_mcp_server_request import AddMcpServerRequest
4
4
  from .add_mcp_server_response_item import AddMcpServerResponseItem
5
+ from .connect_mcp_server_request import ConnectMcpServerRequest
5
6
  from .delete_mcp_server_response_item import DeleteMcpServerResponseItem
6
7
  from .list_mcp_servers_response_value import ListMcpServersResponseValue
7
8
  from .test_mcp_server_request import TestMcpServerRequest
@@ -11,6 +12,7 @@ from .update_mcp_server_response import UpdateMcpServerResponse
11
12
  __all__ = [
12
13
  "AddMcpServerRequest",
13
14
  "AddMcpServerResponseItem",
15
+ "ConnectMcpServerRequest",
14
16
  "DeleteMcpServerResponseItem",
15
17
  "ListMcpServersResponseValue",
16
18
  "TestMcpServerRequest",
@@ -0,0 +1,8 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from ...types.stdio_server_config import StdioServerConfig
5
+ from ...types.sse_server_config import SseServerConfig
6
+ from ...types.streamable_http_server_config import StreamableHttpServerConfig
7
+
8
+ ConnectMcpServerRequest = typing.Union[StdioServerConfig, SseServerConfig, StreamableHttpServerConfig]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: letta-client
3
- Version: 0.1.221
3
+ Version: 0.1.222
4
4
  Summary:
5
5
  Requires-Python: >=3.8,<4.0
6
6
  Classifier: Intended Audience :: Developers
@@ -1,4 +1,4 @@
1
- letta_client/__init__.py,sha256=aiCSJoHJGKQtTMjXahT6WjiMyw1IlwC6owUrb1tIu2s,19424
1
+ letta_client/__init__.py,sha256=SHGQJZEiJUN0sO7ZVdwwTenizJTldEs9YqrB-ux8vCk,19484
2
2
  letta_client/agents/__init__.py,sha256=9wEJMighDL1OFg_7Qh-D50bubPbV4BWo1ZKYxdDJGIQ,2146
3
3
  letta_client/agents/blocks/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
4
4
  letta_client/agents/blocks/client.py,sha256=4UGPYxfGwNN3ZW-SkIdfVZK6cvCcumVAw0_AM8OmoBY,25046
@@ -75,7 +75,7 @@ letta_client/client_side_access_tokens/types/client_side_access_tokens_list_clie
75
75
  letta_client/client_side_access_tokens/types/client_side_access_tokens_list_client_side_access_tokens_response_tokens_item_policy_data_item_access_item.py,sha256=kNHfEWFl7u71Pu8NPqutod0a2NXfvq8il05Hqm0iBB4,284
76
76
  letta_client/core/__init__.py,sha256=OKbX2aCZXgHCDUsCouqv-OiX32xA6eFFCKIUH9M5Vzk,1591
77
77
  letta_client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
78
- letta_client/core/client_wrapper.py,sha256=igW7nKm6krTfc7tX6GMLo5a0-zx49SPQFt-ITwtC9s4,2336
78
+ letta_client/core/client_wrapper.py,sha256=b0zYRfgXmdOyNiBfVM4TwkcAkFdNDPqaceDjjnGsHUc,2336
79
79
  letta_client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
80
80
  letta_client/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
81
81
  letta_client/core/http_client.py,sha256=Z77OIxIbL4OAB2IDqjRq_sYa5yNYAWfmdhdCSSvh6Y4,19552
@@ -168,11 +168,12 @@ letta_client/templates/client.py,sha256=wcidkaF0eRgKEYRrDTgKAS_A57MO7H2S_muzznEV
168
168
  letta_client/templates/types/__init__.py,sha256=dAr_dEh0BdwUxAcV1sJ9RM07Z8nCv4dCK6fmTltqQ6c,286
169
169
  letta_client/templates/types/templates_list_response.py,sha256=HYloMVzk086c6fFGRYZz-Ozc_Yylozp2aPpweHS5uXI,866
170
170
  letta_client/templates/types/templates_list_response_templates_item.py,sha256=yyJq8wEOb2XIg99uhRMKoy2qD2CbuvI_5FAspwYWnfI,593
171
- letta_client/tools/__init__.py,sha256=kSIxsMdzxX6TlriU43BYesswM2yq_iPoF-6-p0LbJKI,525
172
- letta_client/tools/client.py,sha256=hedvLbLtOgS5evYipbQdp8RBQjUja9Mk9nWfuUrNtxQ,97003
173
- letta_client/tools/types/__init__.py,sha256=-U2DGiEFPko6D5VRQQRoiJeHDJqb2iZnrbtHSxhkL5w,751
171
+ letta_client/tools/__init__.py,sha256=qPV3aBl81CCoPAvuGdX-GiMyYkz0i49KerSRO-7BWXA,585
172
+ letta_client/tools/client.py,sha256=ljRP0WZUhkgMFGXwM327QJReaW_dt4WRYkcDWJ1SIzY,107013
173
+ letta_client/tools/types/__init__.py,sha256=U6Z2ZrKY4czFQyksSjoeoQHPbNQ0gJBM7QOGPJltqAA,846
174
174
  letta_client/tools/types/add_mcp_server_request.py,sha256=m3QdTmY2ZHQUWbxMTNsOhPnseWHVipsOTdSXuC7KHQI,371
175
175
  letta_client/tools/types/add_mcp_server_response_item.py,sha256=DNrB3LwstJzKrw_GRJ8tb3XCEJWfD16WzBoGrGY_ZQI,376
176
+ letta_client/tools/types/connect_mcp_server_request.py,sha256=KDHYKXnRRf9g8bHUUWvWdyIiJk-enBZ5EO7N80r-i80,375
176
177
  letta_client/tools/types/delete_mcp_server_response_item.py,sha256=YLIBE7OD535NJAncGpzMDGaQRe1831DNKcj2UzS9e0c,379
177
178
  letta_client/tools/types/list_mcp_servers_response_value.py,sha256=Eyji5qB7FhowiogsAbpcU_aMyH9zClv9lUMmHOmNPYk,379
178
179
  letta_client/tools/types/test_mcp_server_request.py,sha256=sLlOEZdmLfkHqHCkUjntGbr8_MkBhsqpMQ-HwdNOnq0,372
@@ -444,6 +445,6 @@ letta_client/types/web_search_options_user_location_approximate.py,sha256=Ywk01J
444
445
  letta_client/version.py,sha256=bttKLbIhO3UonCYQlqs600zzbQgfhCCMjeXR9WRzid4,79
445
446
  letta_client/voice/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
446
447
  letta_client/voice/client.py,sha256=47iQYCuW_qpKI4hM3pYVxn3hw7kgQj3emU1_oRpkRMA,5811
447
- letta_client-0.1.221.dist-info/METADATA,sha256=nMGSzoL0jIZOL35N-cSn_pQdxiK6y5lw34y0jfHt7yQ,5177
448
- letta_client-0.1.221.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
449
- letta_client-0.1.221.dist-info/RECORD,,
448
+ letta_client-0.1.222.dist-info/METADATA,sha256=kyaM48OWqtv4Wy5AAwhRJ2zWNk-ZIC5919-n3HPXzP8,5177
449
+ letta_client-0.1.222.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
450
+ letta_client-0.1.222.dist-info/RECORD,,