futurehouse-client 0.4.2.dev274__py3-none-any.whl → 0.4.3.dev4__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.
@@ -1,3 +1,4 @@
1
+ # ruff: noqa: PLR0915
1
2
  import ast
2
3
  import asyncio
3
4
  import base64
@@ -54,12 +55,14 @@ from futurehouse_client.models.app import (
54
55
  from futurehouse_client.models.rest import (
55
56
  DiscoveryResponse,
56
57
  ExecutionStatus,
58
+ SearchCriterion,
57
59
  UserAgentRequest,
58
60
  UserAgentRequestPostPayload,
59
61
  UserAgentRequestStatus,
60
62
  UserAgentResponsePayload,
61
63
  WorldModel,
62
64
  WorldModelResponse,
65
+ WorldModelSearchPayload,
63
66
  )
64
67
  from futurehouse_client.utils.auth import RefreshingJWT
65
68
  from futurehouse_client.utils.general import (
@@ -332,16 +335,23 @@ class RestClient(DataStorageMethods):
332
335
  raise ValueError(f"Organization '{organization}' not found.")
333
336
  return filtered_orgs
334
337
 
338
+ @retry(
339
+ stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
340
+ wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
341
+ retry=retry_if_connection_error,
342
+ before_sleep=before_sleep_log(logger, logging.WARNING),
343
+ )
335
344
  def _check_job(self, name: str, organization: str) -> dict[str, Any]:
336
- try:
337
- response = self.client.get(
338
- f"/v0.1/crows/{name}/organizations/{organization}"
339
- )
340
- response.raise_for_status()
341
- return response.json()
342
- except Exception as e:
343
- raise JobFetchError(f"Error checking job: {e!r}.") from e
345
+ response = self.client.get(f"/v0.1/crows/{name}/organizations/{organization}")
346
+ response.raise_for_status()
347
+ return response.json()
344
348
 
349
+ @retry(
350
+ stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
351
+ wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
352
+ retry=retry_if_connection_error,
353
+ before_sleep=before_sleep_log(logger, logging.WARNING),
354
+ )
345
355
  def _fetch_my_orgs(self) -> list[str]:
346
356
  response = self.client.get(f"/v0.1/organizations?filter={True}")
347
357
  response.raise_for_status()
@@ -699,10 +709,12 @@ class RestClient(DataStorageMethods):
699
709
 
700
710
  async def arun_tasks_until_done(
701
711
  self,
702
- task_data: TaskRequest
703
- | dict[str, Any]
704
- | Collection[TaskRequest]
705
- | Collection[dict[str, Any]],
712
+ task_data: (
713
+ TaskRequest
714
+ | dict[str, Any]
715
+ | Collection[TaskRequest]
716
+ | Collection[dict[str, Any]]
717
+ ),
706
718
  verbose: bool = False,
707
719
  progress_bar: bool = False,
708
720
  concurrency: int = 10,
@@ -770,10 +782,12 @@ class RestClient(DataStorageMethods):
770
782
 
771
783
  def run_tasks_until_done(
772
784
  self,
773
- task_data: TaskRequest
774
- | dict[str, Any]
775
- | Collection[TaskRequest]
776
- | Collection[dict[str, Any]],
785
+ task_data: (
786
+ TaskRequest
787
+ | dict[str, Any]
788
+ | Collection[TaskRequest]
789
+ | Collection[dict[str, Any]]
790
+ ),
777
791
  verbose: bool = False,
778
792
  progress_bar: bool = False,
779
793
  timeout: int = DEFAULT_AGENT_TIMEOUT,
@@ -846,12 +860,9 @@ class RestClient(DataStorageMethods):
846
860
  )
847
861
  def get_build_status(self, build_id: UUID | None = None) -> dict[str, Any]:
848
862
  """Get the status of a build."""
849
- try:
850
- build_id = build_id or self.build_id
851
- response = self.client.get(f"/v0.1/builds/{build_id}")
852
- response.raise_for_status()
853
- except Exception as e:
854
- raise JobFetchError(f"Error getting build status: {e!r}.") from e
863
+ build_id = build_id or self.build_id
864
+ response = self.client.get(f"/v0.1/builds/{build_id}")
865
+ response.raise_for_status()
855
866
  return response.json()
856
867
 
857
868
  # TODO: Refactor later so we don't have to ignore PLR0915
@@ -861,7 +872,7 @@ class RestClient(DataStorageMethods):
861
872
  retry=retry_if_connection_error,
862
873
  before_sleep=before_sleep_log(logger, logging.WARNING),
863
874
  )
864
- def create_job(self, config: JobDeploymentConfig) -> dict[str, Any]: # noqa: PLR0915
875
+ def create_job(self, config: JobDeploymentConfig) -> dict[str, Any]:
865
876
  """Creates a futurehouse job deployment from the environment and environment files.
866
877
 
867
878
  Args:
@@ -1606,6 +1617,56 @@ class RestClient(DataStorageMethods):
1606
1617
  except Exception as e:
1607
1618
  raise WorldModelFetchError(f"An unexpected error occurred: {e!r}.") from e
1608
1619
 
1620
+ @retry(
1621
+ stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
1622
+ wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
1623
+ retry=retry_if_connection_error,
1624
+ )
1625
+ def list_world_models(
1626
+ self,
1627
+ name: str | None = None,
1628
+ project_id: UUID | str | None = None,
1629
+ limit: int = 150,
1630
+ offset: int = 0,
1631
+ sort_order: str = "asc",
1632
+ ) -> list[WorldModelResponse]:
1633
+ """List world models with different behavior based on filters.
1634
+
1635
+ When filtering by name: returns only the latest version for that name.
1636
+ When filtering by project_id (without name): returns all versions for that project.
1637
+ When no filters: returns latest version of each world model.
1638
+
1639
+ Args:
1640
+ name: Filter by world model name.
1641
+ project_id: Filter by project ID.
1642
+ limit: The maximum number of models to return.
1643
+ offset: Number of results to skip for pagination.
1644
+ sort_order: Sort order 'asc' or 'desc'.
1645
+
1646
+ Returns:
1647
+ A list of world model dictionaries.
1648
+ """
1649
+ try:
1650
+ params: dict[str, str | int] = {
1651
+ "limit": limit,
1652
+ "offset": offset,
1653
+ "sort_order": sort_order,
1654
+ }
1655
+ if name:
1656
+ params["name"] = name
1657
+ if project_id:
1658
+ params["project_id"] = str(project_id)
1659
+
1660
+ response = self.client.get("/v0.1/world-models", params=params)
1661
+ response.raise_for_status()
1662
+ return response.json()
1663
+ except HTTPStatusError as e:
1664
+ raise WorldModelFetchError(
1665
+ f"Error listing world models: {e.response.status_code} - {e.response.text}"
1666
+ ) from e
1667
+ except Exception as e:
1668
+ raise WorldModelFetchError(f"An unexpected error occurred: {e!r}.") from e
1669
+
1609
1670
  @retry(
1610
1671
  stop=stop_after_attempt(MAX_RETRY_ATTEMPTS),
1611
1672
  wait=wait_exponential(multiplier=RETRY_MULTIPLIER, max=MAX_RETRY_WAIT),
@@ -1613,34 +1674,43 @@ class RestClient(DataStorageMethods):
1613
1674
  )
1614
1675
  def search_world_models(
1615
1676
  self,
1616
- query: str,
1677
+ criteria: list[SearchCriterion] | None = None,
1617
1678
  size: int = 10,
1618
- total_search_size: int = 50,
1679
+ project_id: UUID | str | None = None,
1619
1680
  search_all_versions: bool = False,
1620
- ) -> list[str]:
1621
- """Search for world models.
1681
+ ) -> list[WorldModelResponse]:
1682
+ """Search world models using structured criteria.
1622
1683
 
1623
1684
  Args:
1624
- query: The search query.
1685
+ criteria: List of SearchCriterion objects with field, operator, and value.
1625
1686
  size: The number of results to return.
1626
- total_search_size: The number of results to search for.
1627
- search_all_versions: Whether to search all versions of the world model or just the latest one.
1687
+ project_id: Optional filter by project ID.
1688
+ search_all_versions: Whether to search all versions or just latest.
1628
1689
 
1629
1690
  Returns:
1630
- A list of world model names.
1691
+ A list of world model responses.
1692
+
1693
+ Example:
1694
+ from futurehouse_client.models.rest import SearchCriterion, SearchOperator
1695
+ criteria = [
1696
+ SearchCriterion(field="name", operator=SearchOperator.CONTAINS, value="chemistry"),
1697
+ SearchCriterion(field="email", operator=SearchOperator.CONTAINS, value="tyler"),
1698
+ ]
1699
+ results = client.search_world_models(criteria=criteria, size=20)
1631
1700
  """
1632
1701
  try:
1633
- # Use the consolidated endpoint with search parameters
1634
- response = self.client.get(
1635
- "/v0.1/world-models",
1636
- params={
1637
- "q": query,
1638
- "size": size,
1639
- "search_all_versions": search_all_versions,
1640
- },
1702
+ payload = WorldModelSearchPayload(
1703
+ criteria=criteria or [],
1704
+ size=size,
1705
+ project_id=project_id,
1706
+ search_all_versions=search_all_versions,
1707
+ )
1708
+
1709
+ response = self.client.post(
1710
+ "/v0.1/world-models/search",
1711
+ json=payload.model_dump(mode="json"),
1641
1712
  )
1642
1713
  response.raise_for_status()
1643
- # The new endpoint returns a list of models directly
1644
1714
  return response.json()
1645
1715
  except HTTPStatusError as e:
1646
1716
  raise WorldModelFetchError(
@@ -27,13 +27,17 @@ class InitialState(BaseState):
27
27
 
28
28
  class ASVState(BaseState, Generic[T]):
29
29
  action: OpResult[T] = Field()
30
- next_agent_state: Any = Field()
30
+ next_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
+
37
41
 
38
42
  class EnvResetState(BaseState):
39
43
  observations: list[Message] = Field()
@@ -59,6 +59,7 @@ class DataStorageEntry(BaseModel):
59
59
  class DataStorageType(StrEnum):
60
60
  BIGQUERY = auto()
61
61
  GCS = auto()
62
+ LINK = auto()
62
63
  PG_TABLE = auto()
63
64
  RAW_CONTENT = auto()
64
65
  ELASTIC_SEARCH = auto()
@@ -83,8 +84,8 @@ class DataStorageLocationPayload(BaseModel):
83
84
  location: str | None = None
84
85
 
85
86
 
86
- class DataStorageLocationDetails(BaseModel):
87
- """Model representing the location details within a DataStorageLocations object."""
87
+ class DataStorageLocationConfig(BaseModel):
88
+ """Model representing the location configuration within a DataStorageLocations object."""
88
89
 
89
90
  storage_type: str = Field(description="Type of storage (e.g., 'gcs', 'pg_table')")
90
91
  content_type: str = Field(description="Type of content stored")
@@ -93,15 +94,19 @@ class DataStorageLocationDetails(BaseModel):
93
94
  location: str | None = Field(
94
95
  default=None, description="Location path or identifier"
95
96
  )
97
+ signed_url: str | None = Field(
98
+ default=None,
99
+ description="Signed URL for uploading/downloading the file to/from GCS",
100
+ )
96
101
 
97
102
 
98
- class DataStorageLocations(BaseModel):
103
+ class DataStorageLocation(BaseModel):
99
104
  """Model representing storage locations for a data storage entry."""
100
105
 
101
106
  id: UUID = Field(description="Unique identifier for the storage locations")
102
107
  data_storage_id: UUID = Field(description="ID of the associated data storage entry")
103
- storage_config: DataStorageLocationDetails = Field(
104
- description="Storage configuration details"
108
+ storage_config: DataStorageLocationConfig = Field(
109
+ description="Storage location configuration"
105
110
  )
106
111
  created_at: datetime = Field(description="Timestamp when the location was created")
107
112
 
@@ -110,13 +115,9 @@ class DataStorageResponse(BaseModel):
110
115
  """Response model for data storage operations."""
111
116
 
112
117
  data_storage: DataStorageEntry = Field(description="The created data storage entry")
113
- storage_location: DataStorageLocations = Field(
118
+ storage_locations: list[DataStorageLocation] = Field(
114
119
  description="Storage location for this data entry"
115
120
  )
116
- signed_url: str | None = Field(
117
- default=None,
118
- description="Signed URL for uploading/downloading the file to/from GCS",
119
- )
120
121
 
121
122
 
122
123
  class DataStorageRequestPayload(BaseModel):
@@ -152,6 +153,19 @@ class DataStorageRequestPayload(BaseModel):
152
153
  )
153
154
 
154
155
 
156
+ class CreateDatasetPayload(BaseModel):
157
+ """Payload for creating a dataset."""
158
+
159
+ id: UUID | None = Field(
160
+ default=None,
161
+ description="ID of the dataset to create, or None to create a new dataset",
162
+ )
163
+ name: str = Field(description="Name of the dataset")
164
+ description: str | None = Field(
165
+ default=None, description="Description of the dataset"
166
+ )
167
+
168
+
155
169
  class ManifestEntry(BaseModel):
156
170
  """Model representing a single entry in a manifest file."""
157
171
 
@@ -63,7 +63,37 @@ class WorldModel(BaseModel):
63
63
  project_id: UUID | str | None = None
64
64
 
65
65
 
66
- class WorldModelResponse(BaseModel):
66
+ class SearchOperator(StrEnum):
67
+ """Operators for structured search criteria."""
68
+
69
+ EQUALS = "equals"
70
+ CONTAINS = "contains"
71
+ STARTS_WITH = "starts_with"
72
+ ENDS_WITH = "ends_with"
73
+ GREATER_THAN = "greater_than"
74
+ LESS_THAN = "less_than"
75
+ BETWEEN = "between"
76
+ IN = "in"
77
+
78
+
79
+ class SearchCriterion(BaseModel):
80
+ """A single search criterion with field, operator, and value."""
81
+
82
+ field: str
83
+ operator: SearchOperator
84
+ value: str | list[str] | bool
85
+
86
+
87
+ class WorldModelSearchPayload(BaseModel):
88
+ """Payload for structured world model search."""
89
+
90
+ criteria: list[SearchCriterion]
91
+ size: int = 10
92
+ project_id: UUID | str | None = None
93
+ search_all_versions: bool = False
94
+
95
+
96
+ class WorldModelResponse(WorldModel):
67
97
  """
68
98
  Response model for a world model snapshot.
69
99
 
@@ -71,13 +101,8 @@ class WorldModelResponse(BaseModel):
71
101
  """
72
102
 
73
103
  id: UUID | str
74
- prior: UUID | str | None
75
- name: str
76
- description: str | None
77
- content: str
78
- trajectory_id: UUID | str | None
104
+ name: str # type: ignore[mutable-override] # The API always returns a non-optional name, overriding the base model's optional field.
79
105
  email: str | None
80
- model_metadata: JsonValue | None
81
106
  enabled: bool
82
107
  created_at: datetime
83
108
 
@@ -141,3 +166,10 @@ class DiscoveryResponse(BaseModel):
141
166
  associated_trajectories: list[UUID | str]
142
167
  validation_level: int
143
168
  created_at: datetime
169
+
170
+
171
+ class DataStorageSearchPayload(BaseModel):
172
+ """Payload for structured data storage search."""
173
+
174
+ criteria: list[SearchCriterion]
175
+ size: int = 10
@@ -1,22 +1,31 @@
1
1
  import asyncio
2
- from collections.abc import Awaitable, Iterable
2
+ from collections.abc import Awaitable, Callable, Iterable
3
3
  from typing import TypeVar
4
4
 
5
5
  from httpx import (
6
6
  CloseError,
7
7
  ConnectError,
8
8
  ConnectTimeout,
9
+ HTTPStatusError,
9
10
  NetworkError,
10
11
  ReadError,
11
12
  ReadTimeout,
12
13
  RemoteProtocolError,
14
+ codes,
13
15
  )
14
16
  from requests.exceptions import RequestException, Timeout
15
- from tenacity import retry_if_exception_type
17
+ from tenacity import RetryCallState
16
18
  from tqdm.asyncio import tqdm
17
19
 
18
20
  T = TypeVar("T")
19
21
 
22
+ RETRYABLE_HTTP_STATUS_CODES = {
23
+ codes.TOO_MANY_REQUESTS,
24
+ codes.INTERNAL_SERVER_ERROR,
25
+ codes.BAD_GATEWAY,
26
+ codes.SERVICE_UNAVAILABLE,
27
+ codes.GATEWAY_TIMEOUT,
28
+ }
20
29
 
21
30
  _BASE_CONNECTION_ERRORS = (
22
31
  # From requests
@@ -33,12 +42,32 @@ _BASE_CONNECTION_ERRORS = (
33
42
  CloseError,
34
43
  )
35
44
 
36
- retry_if_connection_error = retry_if_exception_type(_BASE_CONNECTION_ERRORS)
37
45
 
46
+ def create_retry_if_connection_error(
47
+ *additional_exceptions,
48
+ ) -> Callable[[RetryCallState], bool]:
49
+ """Create a retry condition with base connection errors, HTTP status errors, plus additional exceptions."""
38
50
 
39
- def create_retry_if_connection_error(*additional_exceptions):
40
- """Create a retry condition with base connection errors plus additional exceptions."""
41
- return retry_if_exception_type(_BASE_CONNECTION_ERRORS + additional_exceptions)
51
+ def status_retries_with_exceptions(retry_state: RetryCallState) -> bool:
52
+ if retry_state.outcome is not None and hasattr(
53
+ retry_state.outcome, "exception"
54
+ ):
55
+ exception = retry_state.outcome.exception()
56
+ # connection errors
57
+ if isinstance(exception, _BASE_CONNECTION_ERRORS):
58
+ return True
59
+ # custom exceptions provided
60
+ if additional_exceptions and isinstance(exception, additional_exceptions):
61
+ return True
62
+ # any http exceptions
63
+ if isinstance(exception, HTTPStatusError):
64
+ return exception.response.status_code in RETRYABLE_HTTP_STATUS_CODES
65
+ return False
66
+
67
+ return status_retries_with_exceptions
68
+
69
+
70
+ retry_if_connection_error = create_retry_if_connection_error()
42
71
 
43
72
 
44
73
  async def gather_with_concurrency(
@@ -5,7 +5,7 @@ from aviary.core import Tool
5
5
 
6
6
  from futurehouse_client.clients.rest_client import RestClient
7
7
  from futurehouse_client.models.app import Stage
8
- from futurehouse_client.models.rest import WorldModel
8
+ from futurehouse_client.models.rest import SearchCriterion, SearchOperator, WorldModel
9
9
 
10
10
 
11
11
  class WorldModelTools:
@@ -56,7 +56,26 @@ class WorldModelTools:
56
56
  Returns:
57
57
  list[str]: A list of world model IDs that match the search query.
58
58
  """
59
- return WorldModelTools._get_client().search_world_models(query, size=size)
59
+ criteria = (
60
+ [
61
+ SearchCriterion(
62
+ field="name", operator=SearchOperator.CONTAINS, value=query
63
+ ),
64
+ SearchCriterion(
65
+ field="description", operator=SearchOperator.CONTAINS, value=query
66
+ ),
67
+ SearchCriterion(
68
+ field="content", operator=SearchOperator.CONTAINS, value=query
69
+ ),
70
+ ]
71
+ if query
72
+ else []
73
+ )
74
+
75
+ results = WorldModelTools._get_client().search_world_models(
76
+ criteria=criteria, size=size
77
+ )
78
+ return [str(model.id) for model in results]
60
79
 
61
80
 
62
81
  create_world_model_tool = Tool.from_function(WorldModelTools.create_world_model)
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.4.2.dev274'
32
- __version_tuple__ = version_tuple = (0, 4, 2, 'dev274')
31
+ __version__ = version = '0.4.3.dev4'
32
+ __version_tuple__ = version_tuple = (0, 4, 3, 'dev4')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: futurehouse-client
3
- Version: 0.4.2.dev274
3
+ Version: 0.4.3.dev4
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
@@ -220,6 +220,7 @@ Requires-Dist: google-resumable-media[aiohttp]
220
220
  Requires-Dist: httpx
221
221
  Requires-Dist: ldp>=0.22.0
222
222
  Requires-Dist: litellm
223
+ Requires-Dist: openai<1.100.0,>=1
223
224
  Requires-Dist: pydantic
224
225
  Requires-Dist: python-dotenv
225
226
  Requires-Dist: requests
@@ -249,6 +250,7 @@ Provides-Extra: monitoring
249
250
  Requires-Dist: newrelic>=8.8.0; extra == "monitoring"
250
251
  Provides-Extra: typing
251
252
  Requires-Dist: types-PyYAML; extra == "typing"
253
+ Requires-Dist: types-aiofiles; extra == "typing"
252
254
  Requires-Dist: types-requests; extra == "typing"
253
255
  Requires-Dist: types-tqdm; extra == "typing"
254
256
  Dynamic: license-file
@@ -0,0 +1,23 @@
1
+ futurehouse_client/__init__.py,sha256=PvFTkocA-hobsWoDEBEdrUgLIbuVbDs_0nvMdImJmHk,707
2
+ futurehouse_client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ futurehouse_client/version.py,sha256=kOgZVjU1tKUOHA6yPt_l-szLGN5R86g2ugQlc5gpR-c,717
4
+ futurehouse_client/clients/__init__.py,sha256=-HXNj-XJ3LRO5XM6MZ709iPs29YpApss0Q2YYg1qMZw,280
5
+ futurehouse_client/clients/data_storage_methods.py,sha256=csSMVtG2GdbTCO6UizaGyx7rwlaaBp8qVYq0BuSuHdE,99558
6
+ futurehouse_client/clients/job_client.py,sha256=b5gpzulZpxpv9R337r3UKItnMdtd6CGlI1sV3_VQJso,13985
7
+ futurehouse_client/clients/rest_client.py,sha256=Ng36P8obNW1WTRYWTqLQ0ka5tefT-r723_Kr0haT9aM,103225
8
+ futurehouse_client/models/__init__.py,sha256=0YlzKGymbY1g4cXxnUc0BUnthTkVBf12bCZlGUcMQqk,701
9
+ futurehouse_client/models/app.py,sha256=UUg17I3zk6cH_7mrdojHGYvQfm_SeDkuUxsPlRyIYz0,31895
10
+ futurehouse_client/models/client.py,sha256=n4HD0KStKLm6Ek9nL9ylP-bkK10yzAaD1uIDF83Qp_A,1828
11
+ futurehouse_client/models/data_storage_methods.py,sha256=GS1FbuMsUJSh7Evjt86vOri-95hfiLyASBS1xG7erNk,12793
12
+ futurehouse_client/models/rest.py,sha256=Fqw0_ypULzd7IV93PKooSG9W5_g7fGFsdW9jNVVImHA,4514
13
+ futurehouse_client/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ futurehouse_client/utils/auth.py,sha256=tgWELjKfg8eWme_qdcRmc8TjQN9DVZuHHaVXZNHLchk,2960
15
+ futurehouse_client/utils/general.py,sha256=PIkGLCSA3kUvc6mwR-prEB7YnMdKILOIm6cPowSZzzs,2532
16
+ futurehouse_client/utils/module_utils.py,sha256=aFyd-X-pDARXz9GWpn8SSViUVYdSbuy9vSkrzcVIaGI,4955
17
+ futurehouse_client/utils/monitoring.py,sha256=UjRlufe67kI3VxRHOd5fLtJmlCbVA2Wqwpd4uZhXkQM,8728
18
+ futurehouse_client/utils/world_model_tools.py,sha256=v2krZGrco0ur2a_pcRMtnQL05SxlIoBXuJ5R1JkQNws,2921
19
+ futurehouse_client-0.4.3.dev4.dist-info/licenses/LICENSE,sha256=oQ9ZHjUi-_6GfP3gs14FlPb0OlGwE1QCCKFGnJ4LD2I,11341
20
+ futurehouse_client-0.4.3.dev4.dist-info/METADATA,sha256=JxnfoEkNB5un_UU0irHM48xQLQXjPBsxqa5OjRG0-Mk,27068
21
+ futurehouse_client-0.4.3.dev4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
22
+ futurehouse_client-0.4.3.dev4.dist-info/top_level.txt,sha256=TRuLUCt_qBnggdFHCX4O_BoCu1j2X43lKfIZC-ElwWY,19
23
+ futurehouse_client-0.4.3.dev4.dist-info/RECORD,,
@@ -1,23 +0,0 @@
1
- futurehouse_client/__init__.py,sha256=PvFTkocA-hobsWoDEBEdrUgLIbuVbDs_0nvMdImJmHk,707
2
- futurehouse_client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- futurehouse_client/version.py,sha256=Rysz_q8l0T_Q0y2ULuxn71ApOfUlXV-jxY5p3loPl1E,721
4
- futurehouse_client/clients/__init__.py,sha256=-HXNj-XJ3LRO5XM6MZ709iPs29YpApss0Q2YYg1qMZw,280
5
- futurehouse_client/clients/data_storage_methods.py,sha256=wfvN3GdS0R8IT_b_vizNny6nADbE7ZTVIVAE6MrA5iE,71558
6
- futurehouse_client/clients/job_client.py,sha256=b5gpzulZpxpv9R337r3UKItnMdtd6CGlI1sV3_VQJso,13985
7
- futurehouse_client/clients/rest_client.py,sha256=zSQfvS63yzzCnbhvwmJk8Pkyn1442cQNthpIE7Ebd5g,100498
8
- futurehouse_client/models/__init__.py,sha256=0YlzKGymbY1g4cXxnUc0BUnthTkVBf12bCZlGUcMQqk,701
9
- futurehouse_client/models/app.py,sha256=UUg17I3zk6cH_7mrdojHGYvQfm_SeDkuUxsPlRyIYz0,31895
10
- futurehouse_client/models/client.py,sha256=WFD1ddR0O7nD1ErqcJ-kt_miIW22KP6IDOSkaSdVZ8M,1716
11
- futurehouse_client/models/data_storage_methods.py,sha256=49YXPToxi6AzujtEnIo08GbPh_uHrwaCsvFh9cARArE,12377
12
- futurehouse_client/models/rest.py,sha256=x0qp8ut628fNBwB29ZJzSsWXdpSsIedsUS-Xq5ctL7c,3671
13
- futurehouse_client/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- futurehouse_client/utils/auth.py,sha256=tgWELjKfg8eWme_qdcRmc8TjQN9DVZuHHaVXZNHLchk,2960
15
- futurehouse_client/utils/general.py,sha256=Gxy8JJ2g6nO-gphf_kHAlkowb0eP_DqD4MSF58IXExE,1592
16
- futurehouse_client/utils/module_utils.py,sha256=aFyd-X-pDARXz9GWpn8SSViUVYdSbuy9vSkrzcVIaGI,4955
17
- futurehouse_client/utils/monitoring.py,sha256=UjRlufe67kI3VxRHOd5fLtJmlCbVA2Wqwpd4uZhXkQM,8728
18
- futurehouse_client/utils/world_model_tools.py,sha256=Ctiy-EfK7EXrjmKO_nI6V5VhOJyHKWc0sKwa8Q0HAAo,2292
19
- futurehouse_client-0.4.2.dev274.dist-info/licenses/LICENSE,sha256=oQ9ZHjUi-_6GfP3gs14FlPb0OlGwE1QCCKFGnJ4LD2I,11341
20
- futurehouse_client-0.4.2.dev274.dist-info/METADATA,sha256=ZFyppyLGspK7Iz_VovFU5imp5ePeipB2fM-JS0X4x-g,26987
21
- futurehouse_client-0.4.2.dev274.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
22
- futurehouse_client-0.4.2.dev274.dist-info/top_level.txt,sha256=TRuLUCt_qBnggdFHCX4O_BoCu1j2X43lKfIZC-ElwWY,19
23
- futurehouse_client-0.4.2.dev274.dist-info/RECORD,,