futurehouse-client 0.3.20.dev208__py3-none-any.whl → 0.3.20.dev225__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.
@@ -37,6 +37,7 @@ from httpx import (
37
37
  from ldp.agent import AgentConfig
38
38
  from requests.exceptions import RequestException, Timeout
39
39
  from tenacity import (
40
+ before_sleep_log,
40
41
  retry,
41
42
  retry_if_exception_type,
42
43
  stop_after_attempt,
@@ -295,7 +296,7 @@ class RestClient:
295
296
  response.raise_for_status()
296
297
  return response.json()
297
298
  except Exception as e:
298
- raise JobFetchError(f"Error checking job: {e!s}") from e
299
+ raise JobFetchError(f"Error checking job: {e!r}.") from e
299
300
 
300
301
  def _fetch_my_orgs(self) -> list[str]:
301
302
  response = self.client.get(f"/v0.1/organizations?filter={True}")
@@ -325,7 +326,7 @@ class RestClient:
325
326
  response.raise_for_status()
326
327
  return response.json()
327
328
  except Exception as e:
328
- raise RestClientError(f"Error checking assembly status: {e}") from e
329
+ raise RestClientError(f"Error checking assembly status: {e!r}.") from e
329
330
 
330
331
  def _wait_for_all_assemblies_completion(
331
332
  self,
@@ -375,7 +376,7 @@ class RestClient:
375
376
  elif status == ExecutionStatus.FAIL.value:
376
377
  error_msg = status_data.get("error", "Unknown assembly error")
377
378
  raise RestClientError(
378
- f"Assembly failed for {file_name}: {error_msg}"
379
+ f"Assembly failed for {file_name}: {error_msg}."
379
380
  )
380
381
  elif status == ExecutionStatus.IN_PROGRESS.value:
381
382
  logger.debug(f"Assembly in progress for {file_name}...")
@@ -384,7 +385,7 @@ class RestClient:
384
385
  raise # Re-raise assembly errors
385
386
  except Exception as e:
386
387
  logger.warning(
387
- f"Error checking assembly status for {file_name}: {e}"
388
+ f"Error checking assembly status for {file_name}: {e!r}."
388
389
  )
389
390
 
390
391
  # Don't sleep if all files are complete
@@ -394,7 +395,7 @@ class RestClient:
394
395
  if len(completed_files) < len(file_names):
395
396
  remaining_files = set(file_names) - completed_files
396
397
  logger.warning(
397
- f"Assembly timeout for files: {remaining_files} after {timeout} seconds"
398
+ f"Assembly timeout for files: {remaining_files} after {timeout} seconds."
398
399
  )
399
400
  return False
400
401
 
@@ -413,7 +414,7 @@ class RestClient:
413
414
 
414
415
  """
415
416
  if not path.is_dir():
416
- raise JobFetchError(f"Path {path} is not a directory")
417
+ raise JobFetchError(f"Path {path} is not a directory.")
417
418
 
418
419
  @staticmethod
419
420
  def _validate_template_path(template_path: str | os.PathLike) -> None:
@@ -450,12 +451,13 @@ class RestClient:
450
451
 
451
452
  """
452
453
  if not files:
453
- raise TaskFetchError(f"No files found in {path}")
454
+ raise TaskFetchError(f"No files found in {path}.")
454
455
 
455
456
  @retry(
456
457
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
457
458
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
458
459
  retry=retry_if_connection_error,
460
+ before_sleep=before_sleep_log(logger, logging.WARNING),
459
461
  )
460
462
  def get_task(
461
463
  self, task_id: str | None = None, history: bool = False, verbose: bool = False
@@ -496,6 +498,7 @@ class RestClient:
496
498
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
497
499
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
498
500
  retry=retry_if_connection_error,
501
+ before_sleep=before_sleep_log(logger, logging.WARNING),
499
502
  )
500
503
  async def aget_task(
501
504
  self, task_id: str | None = None, history: bool = False, verbose: bool = False
@@ -519,7 +522,7 @@ class RestClient:
519
522
  ) as response:
520
523
  if response.status_code in {401, 403}:
521
524
  raise PermissionError(
522
- f"Error getting task: Permission denied for task {task_id}"
525
+ f"Error getting task: Permission denied for task {task_id}."
523
526
  )
524
527
  response.raise_for_status()
525
528
  json_data = "".join([chunk async for chunk in response.aiter_text()])
@@ -536,6 +539,7 @@ class RestClient:
536
539
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
537
540
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
538
541
  retry=retry_if_connection_error,
542
+ before_sleep=before_sleep_log(logger, logging.WARNING),
539
543
  )
540
544
  def create_task(
541
545
  self,
@@ -560,7 +564,7 @@ class RestClient:
560
564
  )
561
565
  if response.status_code in {401, 403}:
562
566
  raise PermissionError(
563
- f"Error creating task: Permission denied for task {task_data.name}"
567
+ f"Error creating task: Permission denied for task {task_data.name}."
564
568
  )
565
569
  response.raise_for_status()
566
570
  trajectory_id = response.json()["trajectory_id"]
@@ -571,6 +575,7 @@ class RestClient:
571
575
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
572
576
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
573
577
  retry=retry_if_connection_error,
578
+ before_sleep=before_sleep_log(logger, logging.WARNING),
574
579
  )
575
580
  async def acreate_task(
576
581
  self,
@@ -595,7 +600,7 @@ class RestClient:
595
600
  )
596
601
  if response.status_code in {401, 403}:
597
602
  raise PermissionError(
598
- f"Error creating task: Permission denied for task {task_data.name}"
603
+ f"Error creating task: Permission denied for task {task_data.name}."
599
604
  )
600
605
  response.raise_for_status()
601
606
  trajectory_id = response.json()["trajectory_id"]
@@ -747,6 +752,7 @@ class RestClient:
747
752
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
748
753
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
749
754
  retry=retry_if_connection_error,
755
+ before_sleep=before_sleep_log(logger, logging.WARNING),
750
756
  )
751
757
  def get_build_status(self, build_id: UUID | None = None) -> dict[str, Any]:
752
758
  """Get the status of a build."""
@@ -755,7 +761,7 @@ class RestClient:
755
761
  response = self.client.get(f"/v0.1/builds/{build_id}")
756
762
  response.raise_for_status()
757
763
  except Exception as e:
758
- raise JobFetchError(f"Error getting build status: {e!s}") from e
764
+ raise JobFetchError(f"Error getting build status: {e!r}.") from e
759
765
  return response.json()
760
766
 
761
767
  # TODO: Refactor later so we don't have to ignore PLR0915
@@ -763,6 +769,7 @@ class RestClient:
763
769
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
764
770
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
765
771
  retry=retry_if_connection_error,
772
+ before_sleep=before_sleep_log(logger, logging.WARNING),
766
773
  )
767
774
  def create_job(self, config: JobDeploymentConfig) -> dict[str, Any]: # noqa: PLR0915
768
775
  """Creates a futurehouse job deployment from the environment and environment files.
@@ -940,10 +947,10 @@ class RestClient:
940
947
  error_detail = response.json()
941
948
  error_message = error_detail.get("detail", str(e))
942
949
  raise JobCreationError(
943
- f"Server validation error: {error_message}"
950
+ f"Server validation error: {error_message}."
944
951
  ) from e
945
952
  except Exception as e:
946
- raise JobCreationError(f"Error generating docker image: {e!s}") from e
953
+ raise JobCreationError(f"Error generating docker image: {e!r}.") from e
947
954
  return build_context
948
955
 
949
956
  # TODO: we should have have an async upload_file, check_assembly_status,
@@ -952,6 +959,7 @@ class RestClient:
952
959
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
953
960
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
954
961
  retry=retry_if_connection_error,
962
+ before_sleep=before_sleep_log(logger, logging.WARNING),
955
963
  )
956
964
  def upload_file(
957
965
  self,
@@ -999,7 +1007,7 @@ class RestClient:
999
1007
  )
1000
1008
  if not success:
1001
1009
  raise RestClientError(
1002
- f"Assembly failed or timed out for one or more files: {uploaded_files}"
1010
+ f"Assembly failed or timed out for one or more files: {uploaded_files}."
1003
1011
  )
1004
1012
 
1005
1013
  logger.info(f"Successfully uploaded {file_path} to {upload_id}")
@@ -1044,7 +1052,9 @@ class RestClient:
1044
1052
  )
1045
1053
  uploaded_files.append(file_name)
1046
1054
  except Exception as e:
1047
- raise FileUploadError(f"Error uploading directory {dir_path}: {e}") from e
1055
+ raise FileUploadError(
1056
+ f"Error uploading directory {dir_path}: {e!r}."
1057
+ ) from e
1048
1058
 
1049
1059
  return uploaded_files
1050
1060
 
@@ -1095,7 +1105,7 @@ class RestClient:
1095
1105
  logger.info(f"Successfully uploaded {file_name}")
1096
1106
  except Exception as e:
1097
1107
  logger.exception(f"Error uploading file {file_path}")
1098
- raise FileUploadError(f"Error uploading file {file_path}: {e}") from e
1108
+ raise FileUploadError(f"Error uploading file {file_path}: {e!r}.") from e
1099
1109
  return status_url
1100
1110
 
1101
1111
  def _upload_chunks_parallel(
@@ -1156,9 +1166,9 @@ class RestClient:
1156
1166
  f"Uploaded chunk {chunk_index + 1}/{total_chunks} of {file_name}"
1157
1167
  )
1158
1168
  except Exception as e:
1159
- logger.error(f"Error uploading chunk {chunk_index}: {e}")
1169
+ logger.error(f"Error uploading chunk {chunk_index}: {e!r}.")
1160
1170
  raise FileUploadError(
1161
- f"Error uploading chunk {chunk_index} of {file_name}: {e}"
1171
+ f"Error uploading chunk {chunk_index} of {file_name}: {e!r}."
1162
1172
  ) from e
1163
1173
 
1164
1174
  # Upload the final chunk with retry logic
@@ -1224,11 +1234,11 @@ class RestClient:
1224
1234
  except Exception as e:
1225
1235
  if retries >= max_retries - 1:
1226
1236
  raise FileUploadError(
1227
- f"Error uploading final chunk of {file_name}: {e}"
1237
+ f"Error uploading final chunk of {file_name}: {e!r}."
1228
1238
  ) from e
1229
1239
  retries += 1
1230
1240
  logger.warning(
1231
- f"Error uploading final chunk of {file_name}, retrying in {retry_delay}s... (attempt {retries}/{max_retries}): {e}"
1241
+ f"Error uploading final chunk of {file_name}, retrying in {retry_delay}s... (attempt {retries}/{max_retries}): {e!r}."
1232
1242
  )
1233
1243
  time.sleep(retry_delay)
1234
1244
 
@@ -1296,6 +1306,7 @@ class RestClient:
1296
1306
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
1297
1307
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
1298
1308
  retry=retry_if_connection_error,
1309
+ before_sleep=before_sleep_log(logger, logging.WARNING),
1299
1310
  )
1300
1311
  def list_files(
1301
1312
  self,
@@ -1318,7 +1329,7 @@ class RestClient:
1318
1329
  """
1319
1330
  if not bool(trajectory_id) ^ bool(upload_id):
1320
1331
  raise RestClientError(
1321
- "Must at least specify one of trajectory_id or upload_id, but not both"
1332
+ "Must at least specify one of trajectory_id or upload_id, but not both."
1322
1333
  )
1323
1334
  try:
1324
1335
  url = f"/v0.1/crows/{job_name}/list-files"
@@ -1332,18 +1343,19 @@ class RestClient:
1332
1343
  f"Error listing files for job {job_name}, trajectory {trajectory_id}, upload_id {upload_id}: {e.response.text}"
1333
1344
  )
1334
1345
  raise RestClientError(
1335
- f"Error listing files: {e.response.status_code} - {e.response.text}"
1346
+ f"Error listing files: {e.response.status_code} - {e.response.text}."
1336
1347
  ) from e
1337
1348
  except Exception as e:
1338
1349
  logger.exception(
1339
1350
  f"Error listing files for job {job_name}, trajectory {trajectory_id}, upload_id {upload_id}"
1340
1351
  )
1341
- raise RestClientError(f"Error listing files: {e!s}") from e
1352
+ raise RestClientError(f"Error listing files: {e!r}.") from e
1342
1353
 
1343
1354
  @retry(
1344
1355
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
1345
1356
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
1346
1357
  retry=retry_if_connection_error,
1358
+ before_sleep=before_sleep_log(logger, logging.WARNING),
1347
1359
  )
1348
1360
  def download_file(
1349
1361
  self,
@@ -1394,7 +1406,7 @@ class RestClient:
1394
1406
  if destination_path.exists():
1395
1407
  destination_path.unlink()
1396
1408
  raise RestClientError(
1397
- f"Error downloading file: {e.response.status_code} - {e.response.text}"
1409
+ f"Error downloading file: {e.response.status_code} - {e.response.text}."
1398
1410
  ) from e
1399
1411
  except RemoteProtocolError as e:
1400
1412
  logger.error(
@@ -1413,12 +1425,13 @@ class RestClient:
1413
1425
  )
1414
1426
  if destination_path.exists():
1415
1427
  destination_path.unlink() # Clean up partial file
1416
- raise RestClientError(f"Error downloading file: {e!s}") from e
1428
+ raise RestClientError(f"Error downloading file: {e!r}.") from e
1417
1429
 
1418
1430
  @retry(
1419
1431
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
1420
1432
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
1421
1433
  retry=retry_if_connection_error,
1434
+ before_sleep=before_sleep_log(logger, logging.WARNING),
1422
1435
  )
1423
1436
  def get_world_model(
1424
1437
  self, world_model_id: UUID | None = None, name: str | None = None
@@ -1450,15 +1463,16 @@ class RestClient:
1450
1463
  "World model not found with the specified identifier."
1451
1464
  ) from e
1452
1465
  raise WorldModelFetchError(
1453
- f"Error fetching world model: {e.response.status_code} - {e.response.text}"
1466
+ f"Error fetching world model: {e.response.status_code} - {e.response.text}."
1454
1467
  ) from e
1455
1468
  except Exception as e:
1456
- raise WorldModelFetchError(f"An unexpected error occurred: {e}") from e
1469
+ raise WorldModelFetchError(f"An unexpected error occurred: {e!r}.") from e
1457
1470
 
1458
1471
  @retry(
1459
1472
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
1460
1473
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
1461
1474
  retry=retry_if_connection_error,
1475
+ before_sleep=before_sleep_log(logger, logging.WARNING),
1462
1476
  )
1463
1477
  async def aget_world_model(
1464
1478
  self, world_model_id: UUID | None = None, name: str | None = None
@@ -1490,15 +1504,16 @@ class RestClient:
1490
1504
  "World model not found with the specified identifier."
1491
1505
  ) from e
1492
1506
  raise WorldModelFetchError(
1493
- f"Error fetching world model: {e.response.status_code} - {e.response.text}"
1507
+ f"Error fetching world model: {e.response.status_code} - {e.response.text}."
1494
1508
  ) from e
1495
1509
  except Exception as e:
1496
- raise WorldModelFetchError(f"An unexpected error occurred: {e}") from e
1510
+ raise WorldModelFetchError(f"An unexpected error occurred: {e!r}.") from e
1497
1511
 
1498
1512
  @retry(
1499
1513
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
1500
1514
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
1501
1515
  retry=retry_if_connection_error,
1516
+ before_sleep=before_sleep_log(logger, logging.WARNING),
1502
1517
  )
1503
1518
  def create_world_model(self, payload: WorldModel) -> UUID:
1504
1519
  """Create a new, immutable world model snapshot.
@@ -1522,20 +1537,21 @@ class RestClient:
1522
1537
  except HTTPStatusError as e:
1523
1538
  if e.response.status_code == codes.BAD_REQUEST:
1524
1539
  raise WorldModelCreationError(
1525
- f"Invalid payload for world model creation: {e.response.text}"
1540
+ f"Invalid payload for world model creation: {e.response.text}."
1526
1541
  ) from e
1527
1542
  raise WorldModelCreationError(
1528
- f"Error creating world model: {e.response.status_code} - {e.response.text}"
1543
+ f"Error creating world model: {e.response.status_code} - {e.response.text}."
1529
1544
  ) from e
1530
1545
  except Exception as e:
1531
1546
  raise WorldModelCreationError(
1532
- f"An unexpected error occurred during world model creation: {e}"
1547
+ f"An unexpected error occurred during world model creation: {e!r}."
1533
1548
  ) from e
1534
1549
 
1535
1550
  @retry(
1536
1551
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
1537
1552
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
1538
1553
  retry=retry_if_connection_error,
1554
+ before_sleep=before_sleep_log(logger, logging.WARNING),
1539
1555
  )
1540
1556
  async def acreate_world_model(self, payload: WorldModel) -> UUID:
1541
1557
  """Asynchronously create a new, immutable world model snapshot.
@@ -1558,14 +1574,14 @@ class RestClient:
1558
1574
  except HTTPStatusError as e:
1559
1575
  if e.response.status_code == codes.BAD_REQUEST:
1560
1576
  raise WorldModelCreationError(
1561
- f"Invalid payload for world model creation: {e.response.text}"
1577
+ f"Invalid payload for world model creation: {e.response.text}."
1562
1578
  ) from e
1563
1579
  raise WorldModelCreationError(
1564
- f"Error creating world model: {e.response.status_code} - {e.response.text}"
1580
+ f"Error creating world model: {e.response.status_code} - {e.response.text}."
1565
1581
  ) from e
1566
1582
  except Exception as e:
1567
1583
  raise WorldModelCreationError(
1568
- f"An unexpected error occurred during world model creation: {e}"
1584
+ f"An unexpected error occurred during world model creation: {e!r}."
1569
1585
  ) from e
1570
1586
 
1571
1587
  @retry(
@@ -27,17 +27,13 @@ class InitialState(BaseState):
27
27
 
28
28
  class ASVState(BaseState, Generic[T]):
29
29
  action: OpResult[T] = Field()
30
- next_state: Any = Field()
30
+ next_agent_state: Any = Field()
31
31
  value: float = Field()
32
32
 
33
33
  @field_serializer("action")
34
34
  def serialize_action(self, action: OpResult[T]) -> dict:
35
35
  return action.to_dict()
36
36
 
37
- @field_serializer("next_state")
38
- def serialize_next_state(self, state: Any) -> str:
39
- return str(state)
40
-
41
37
 
42
38
  class EnvResetState(BaseState):
43
39
  observations: list[Message] = Field()
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.3.20.dev208'
21
- __version_tuple__ = version_tuple = (0, 3, 20, 'dev208')
20
+ __version__ = version = '0.3.20.dev225'
21
+ __version_tuple__ = version_tuple = (0, 3, 20, 'dev225')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: futurehouse-client
3
- Version: 0.3.20.dev208
3
+ Version: 0.3.20.dev225
4
4
  Summary: A client for interacting with endpoints of the FutureHouse service.
5
5
  Author-email: FutureHouse technical staff <hello@futurehouse.org>
6
6
  License: Apache License
@@ -1,20 +1,20 @@
1
1
  futurehouse_client/__init__.py,sha256=BztM_ntbgmIEjzvnBWcvPhvLjM8xGDFCK0Upf3-nIn8,488
2
2
  futurehouse_client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- futurehouse_client/version.py,sha256=Q9A-Uuc0KS3oj8dhvFHWadX__nXqTHy-htzKO30lPiU,530
3
+ futurehouse_client/version.py,sha256=UzQXVtwR5aOM-s9sEJYt5xEHWLIMFYPuR7s_I_I9-sI,530
4
4
  futurehouse_client/clients/__init__.py,sha256=-HXNj-XJ3LRO5XM6MZ709iPs29YpApss0Q2YYg1qMZw,280
5
5
  futurehouse_client/clients/job_client.py,sha256=D51_qTxya6g5Wfg_ZfJdP031TV_YDJeXkGMiYAJ1qRc,11962
6
- futurehouse_client/clients/rest_client.py,sha256=v5INQ9Wsb3A3U2zdLfRUP2H1hXpsZHtiZdVEav3Sv6o,69215
6
+ futurehouse_client/clients/rest_client.py,sha256=m4izsMCwq2V_oR-zkzxdLE-4y6Z0mm5ArWvpvtuaBKY,70158
7
7
  futurehouse_client/models/__init__.py,sha256=kQ4R7VEuRxO0IQEW_sk9CndBL7zzl8rUKI24ddyYLM0,647
8
8
  futurehouse_client/models/app.py,sha256=SvkXOu5Qx28_jCS84XKKepnpGyfrQUEVnxS-JGqmsaE,29128
9
- futurehouse_client/models/client.py,sha256=n4HD0KStKLm6Ek9nL9ylP-bkK10yzAaD1uIDF83Qp_A,1828
9
+ futurehouse_client/models/client.py,sha256=WFD1ddR0O7nD1ErqcJ-kt_miIW22KP6IDOSkaSdVZ8M,1716
10
10
  futurehouse_client/models/rest.py,sha256=AwPMcB1ruoqaI8NIhX2ZzN8UuX6XsaQ7uzeSE8EpwKk,1573
11
11
  futurehouse_client/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  futurehouse_client/utils/auth.py,sha256=tgWELjKfg8eWme_qdcRmc8TjQN9DVZuHHaVXZNHLchk,2960
13
13
  futurehouse_client/utils/general.py,sha256=A_rtTiYW30ELGEZlWCIArO7q1nEmqi8hUlmBRYkMQ_c,767
14
14
  futurehouse_client/utils/module_utils.py,sha256=aFyd-X-pDARXz9GWpn8SSViUVYdSbuy9vSkrzcVIaGI,4955
15
15
  futurehouse_client/utils/monitoring.py,sha256=UjRlufe67kI3VxRHOd5fLtJmlCbVA2Wqwpd4uZhXkQM,8728
16
- futurehouse_client-0.3.20.dev208.dist-info/licenses/LICENSE,sha256=oQ9ZHjUi-_6GfP3gs14FlPb0OlGwE1QCCKFGnJ4LD2I,11341
17
- futurehouse_client-0.3.20.dev208.dist-info/METADATA,sha256=JwxHWSPvfSXwCJAtDcPlHhv5YiLOgv8YQT3OKsZbZoY,26805
18
- futurehouse_client-0.3.20.dev208.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
- futurehouse_client-0.3.20.dev208.dist-info/top_level.txt,sha256=TRuLUCt_qBnggdFHCX4O_BoCu1j2X43lKfIZC-ElwWY,19
20
- futurehouse_client-0.3.20.dev208.dist-info/RECORD,,
16
+ futurehouse_client-0.3.20.dev225.dist-info/licenses/LICENSE,sha256=oQ9ZHjUi-_6GfP3gs14FlPb0OlGwE1QCCKFGnJ4LD2I,11341
17
+ futurehouse_client-0.3.20.dev225.dist-info/METADATA,sha256=Ns45fN-WRg5MFzEERIfrHHHIsSB-cLXIVMyPY3a-R1c,26805
18
+ futurehouse_client-0.3.20.dev225.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
+ futurehouse_client-0.3.20.dev225.dist-info/top_level.txt,sha256=TRuLUCt_qBnggdFHCX4O_BoCu1j2X43lKfIZC-ElwWY,19
20
+ futurehouse_client-0.3.20.dev225.dist-info/RECORD,,