plato-sdk-v2 2.0.50__py3-none-any.whl → 2.2.4__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.
Files changed (158) hide show
  1. plato/__init__.py +7 -6
  2. plato/_generated/__init__.py +1 -1
  3. plato/_generated/api/v1/env/evaluate_session.py +3 -3
  4. plato/_generated/api/v1/env/log_state_mutation.py +4 -4
  5. plato/_generated/api/v1/sandbox/checkpoint_vm.py +3 -3
  6. plato/_generated/api/v1/sandbox/save_vm_snapshot.py +3 -3
  7. plato/_generated/api/v1/sandbox/setup_sandbox.py +8 -8
  8. plato/_generated/api/v1/session/__init__.py +2 -0
  9. plato/_generated/api/v1/session/get_sessions_for_archival.py +100 -0
  10. plato/_generated/api/v1/testcases/__init__.py +6 -2
  11. plato/_generated/api/v1/testcases/get_mutation_groups_for_testcase.py +98 -0
  12. plato/_generated/api/v1/testcases/{get_next_output_testcase_for_scoring.py → get_next_testcase_for_scoring.py} +23 -10
  13. plato/_generated/api/v1/testcases/get_testcase_metadata_for_scoring.py +74 -0
  14. plato/_generated/api/v2/__init__.py +2 -1
  15. plato/_generated/api/v2/jobs/__init__.py +4 -0
  16. plato/_generated/api/v2/jobs/checkpoint.py +3 -3
  17. plato/_generated/api/v2/jobs/disk_snapshot.py +3 -3
  18. plato/_generated/api/v2/jobs/log_for_job.py +4 -39
  19. plato/_generated/api/v2/jobs/make.py +4 -4
  20. plato/_generated/api/v2/jobs/setup_sandbox.py +97 -0
  21. plato/_generated/api/v2/jobs/snapshot.py +3 -3
  22. plato/_generated/api/v2/jobs/snapshot_store.py +91 -0
  23. plato/_generated/api/v2/sessions/__init__.py +4 -0
  24. plato/_generated/api/v2/sessions/checkpoint.py +3 -3
  25. plato/_generated/api/v2/sessions/disk_snapshot.py +3 -3
  26. plato/_generated/api/v2/sessions/evaluate.py +3 -3
  27. plato/_generated/api/v2/sessions/log_job_mutation.py +4 -39
  28. plato/_generated/api/v2/sessions/make.py +4 -4
  29. plato/_generated/api/v2/sessions/setup_sandbox.py +98 -0
  30. plato/_generated/api/v2/sessions/snapshot.py +3 -3
  31. plato/_generated/api/v2/sessions/snapshot_store.py +94 -0
  32. plato/_generated/api/v2/user/__init__.py +7 -0
  33. plato/_generated/api/v2/user/get_current_user.py +76 -0
  34. plato/_generated/models/__init__.py +174 -23
  35. plato/_sims_generator/__init__.py +19 -4
  36. plato/_sims_generator/instruction.py +203 -0
  37. plato/_sims_generator/templates/instruction/helpers.py.jinja +161 -0
  38. plato/_sims_generator/templates/instruction/init.py.jinja +43 -0
  39. plato/agents/__init__.py +107 -517
  40. plato/agents/base.py +145 -0
  41. plato/agents/build.py +61 -0
  42. plato/agents/config.py +160 -0
  43. plato/agents/logging.py +401 -0
  44. plato/agents/runner.py +161 -0
  45. plato/agents/trajectory.py +266 -0
  46. plato/chronos/__init__.py +37 -0
  47. plato/chronos/api/__init__.py +3 -0
  48. plato/chronos/api/agents/__init__.py +13 -0
  49. plato/chronos/api/agents/create_agent.py +63 -0
  50. plato/chronos/api/agents/delete_agent.py +61 -0
  51. plato/chronos/api/agents/get_agent.py +62 -0
  52. plato/chronos/api/agents/get_agent_schema.py +72 -0
  53. plato/chronos/api/agents/get_agent_versions.py +62 -0
  54. plato/chronos/api/agents/list_agents.py +57 -0
  55. plato/chronos/api/agents/lookup_agent.py +74 -0
  56. plato/chronos/api/auth/__init__.py +9 -0
  57. plato/chronos/api/auth/debug_auth_api_auth_debug_get.py +43 -0
  58. plato/chronos/api/auth/get_auth_status_api_auth_status_get.py +61 -0
  59. plato/chronos/api/auth/get_current_user_route_api_auth_me_get.py +60 -0
  60. plato/chronos/api/callback/__init__.py +11 -0
  61. plato/chronos/api/callback/push_agent_logs.py +61 -0
  62. plato/chronos/api/callback/update_agent_status.py +57 -0
  63. plato/chronos/api/callback/upload_artifacts.py +59 -0
  64. plato/chronos/api/callback/upload_logs_zip.py +57 -0
  65. plato/chronos/api/callback/upload_trajectory.py +57 -0
  66. plato/chronos/api/default/__init__.py +7 -0
  67. plato/chronos/api/default/health.py +43 -0
  68. plato/chronos/api/jobs/__init__.py +7 -0
  69. plato/chronos/api/jobs/launch_job.py +63 -0
  70. plato/chronos/api/registry/__init__.py +19 -0
  71. plato/chronos/api/registry/get_agent_schema_api_registry_agents__agent_name__schema_get.py +62 -0
  72. plato/chronos/api/registry/get_agent_versions_api_registry_agents__agent_name__versions_get.py +52 -0
  73. plato/chronos/api/registry/get_world_schema_api_registry_worlds__package_name__schema_get.py +68 -0
  74. plato/chronos/api/registry/get_world_versions_api_registry_worlds__package_name__versions_get.py +52 -0
  75. plato/chronos/api/registry/list_registry_agents_api_registry_agents_get.py +44 -0
  76. plato/chronos/api/registry/list_registry_worlds_api_registry_worlds_get.py +44 -0
  77. plato/chronos/api/runtimes/__init__.py +11 -0
  78. plato/chronos/api/runtimes/create_runtime.py +63 -0
  79. plato/chronos/api/runtimes/delete_runtime.py +61 -0
  80. plato/chronos/api/runtimes/get_runtime.py +62 -0
  81. plato/chronos/api/runtimes/list_runtimes.py +57 -0
  82. plato/chronos/api/runtimes/test_runtime.py +67 -0
  83. plato/chronos/api/secrets/__init__.py +11 -0
  84. plato/chronos/api/secrets/create_secret.py +63 -0
  85. plato/chronos/api/secrets/delete_secret.py +61 -0
  86. plato/chronos/api/secrets/get_secret.py +62 -0
  87. plato/chronos/api/secrets/list_secrets.py +57 -0
  88. plato/chronos/api/secrets/update_secret.py +68 -0
  89. plato/chronos/api/sessions/__init__.py +10 -0
  90. plato/chronos/api/sessions/get_session.py +62 -0
  91. plato/chronos/api/sessions/get_session_logs.py +72 -0
  92. plato/chronos/api/sessions/get_session_logs_download.py +62 -0
  93. plato/chronos/api/sessions/list_sessions.py +57 -0
  94. plato/chronos/api/status/__init__.py +8 -0
  95. plato/chronos/api/status/get_status_api_status_get.py +44 -0
  96. plato/chronos/api/status/get_version_info_api_version_get.py +44 -0
  97. plato/chronos/api/templates/__init__.py +11 -0
  98. plato/chronos/api/templates/create_template.py +63 -0
  99. plato/chronos/api/templates/delete_template.py +61 -0
  100. plato/chronos/api/templates/get_template.py +62 -0
  101. plato/chronos/api/templates/list_templates.py +57 -0
  102. plato/chronos/api/templates/update_template.py +68 -0
  103. plato/chronos/api/trajectories/__init__.py +8 -0
  104. plato/chronos/api/trajectories/get_trajectory.py +62 -0
  105. plato/chronos/api/trajectories/list_trajectories.py +62 -0
  106. plato/chronos/api/worlds/__init__.py +10 -0
  107. plato/chronos/api/worlds/create_world.py +63 -0
  108. plato/chronos/api/worlds/delete_world.py +61 -0
  109. plato/chronos/api/worlds/get_world.py +62 -0
  110. plato/chronos/api/worlds/list_worlds.py +57 -0
  111. plato/chronos/client.py +171 -0
  112. plato/chronos/errors.py +141 -0
  113. plato/chronos/models/__init__.py +647 -0
  114. plato/chronos/py.typed +0 -0
  115. plato/sims/cli.py +299 -123
  116. plato/sims/registry.py +77 -4
  117. plato/v1/cli/agent.py +88 -84
  118. plato/v1/cli/main.py +2 -0
  119. plato/v1/cli/pm.py +441 -119
  120. plato/v1/cli/sandbox.py +747 -191
  121. plato/v1/cli/sim.py +11 -0
  122. plato/v1/cli/verify.py +1269 -0
  123. plato/v1/cli/world.py +3 -0
  124. plato/v1/flow_executor.py +21 -17
  125. plato/v1/models/env.py +11 -11
  126. plato/v1/sdk.py +2 -2
  127. plato/v1/sync_env.py +11 -11
  128. plato/v1/sync_flow_executor.py +21 -17
  129. plato/v1/sync_sdk.py +4 -2
  130. plato/v2/__init__.py +2 -0
  131. plato/v2/async_/environment.py +20 -1
  132. plato/v2/async_/session.py +54 -3
  133. plato/v2/sync/environment.py +2 -1
  134. plato/v2/sync/session.py +52 -2
  135. plato/worlds/README.md +218 -0
  136. plato/worlds/__init__.py +54 -18
  137. plato/worlds/base.py +304 -93
  138. plato/worlds/config.py +239 -73
  139. plato/worlds/runner.py +391 -80
  140. {plato_sdk_v2-2.0.50.dist-info → plato_sdk_v2-2.2.4.dist-info}/METADATA +1 -3
  141. {plato_sdk_v2-2.0.50.dist-info → plato_sdk_v2-2.2.4.dist-info}/RECORD +143 -68
  142. {plato_sdk_v2-2.0.50.dist-info → plato_sdk_v2-2.2.4.dist-info}/entry_points.txt +1 -0
  143. plato/_generated/api/v2/interfaces/__init__.py +0 -27
  144. plato/_generated/api/v2/interfaces/v2_interface_browser_create.py +0 -68
  145. plato/_generated/api/v2/interfaces/v2_interface_cdp_url.py +0 -65
  146. plato/_generated/api/v2/interfaces/v2_interface_click.py +0 -64
  147. plato/_generated/api/v2/interfaces/v2_interface_close.py +0 -59
  148. plato/_generated/api/v2/interfaces/v2_interface_computer_create.py +0 -68
  149. plato/_generated/api/v2/interfaces/v2_interface_cursor.py +0 -64
  150. plato/_generated/api/v2/interfaces/v2_interface_key.py +0 -68
  151. plato/_generated/api/v2/interfaces/v2_interface_screenshot.py +0 -65
  152. plato/_generated/api/v2/interfaces/v2_interface_scroll.py +0 -70
  153. plato/_generated/api/v2/interfaces/v2_interface_type.py +0 -64
  154. plato/world/__init__.py +0 -44
  155. plato/world/base.py +0 -267
  156. plato/world/config.py +0 -139
  157. plato/world/types.py +0 -47
  158. {plato_sdk_v2-2.0.50.dist-info → plato_sdk_v2-2.2.4.dist-info}/WHEEL +0 -0
@@ -0,0 +1,44 @@
1
+ """Get Status"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ import httpx
8
+
9
+ from plato.chronos.errors import raise_for_status
10
+ from plato.chronos.models import StatusResponse
11
+
12
+
13
+ def _build_request_args() -> dict[str, Any]:
14
+ """Build request arguments."""
15
+ url = "/api/status"
16
+
17
+ return {
18
+ "method": "GET",
19
+ "url": url,
20
+ }
21
+
22
+
23
+ def sync(
24
+ client: httpx.Client,
25
+ ) -> StatusResponse:
26
+ """Get status of all connected services."""
27
+
28
+ request_args = _build_request_args()
29
+
30
+ response = client.request(**request_args)
31
+ raise_for_status(response)
32
+ return StatusResponse.model_validate(response.json())
33
+
34
+
35
+ async def asyncio(
36
+ client: httpx.AsyncClient,
37
+ ) -> StatusResponse:
38
+ """Get status of all connected services."""
39
+
40
+ request_args = _build_request_args()
41
+
42
+ response = await client.request(**request_args)
43
+ raise_for_status(response)
44
+ return StatusResponse.model_validate(response.json())
@@ -0,0 +1,44 @@
1
+ """Get Version Info"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ import httpx
8
+
9
+ from plato.chronos.errors import raise_for_status
10
+ from plato.chronos.models import VersionResponse
11
+
12
+
13
+ def _build_request_args() -> dict[str, Any]:
14
+ """Build request arguments."""
15
+ url = "/api/version"
16
+
17
+ return {
18
+ "method": "GET",
19
+ "url": url,
20
+ }
21
+
22
+
23
+ def sync(
24
+ client: httpx.Client,
25
+ ) -> VersionResponse:
26
+ """Get version information."""
27
+
28
+ request_args = _build_request_args()
29
+
30
+ response = client.request(**request_args)
31
+ raise_for_status(response)
32
+ return VersionResponse.model_validate(response.json())
33
+
34
+
35
+ async def asyncio(
36
+ client: httpx.AsyncClient,
37
+ ) -> VersionResponse:
38
+ """Get version information."""
39
+
40
+ request_args = _build_request_args()
41
+
42
+ response = await client.request(**request_args)
43
+ raise_for_status(response)
44
+ return VersionResponse.model_validate(response.json())
@@ -0,0 +1,11 @@
1
+ """API endpoints."""
2
+
3
+ from . import create_template, delete_template, get_template, list_templates, update_template
4
+
5
+ __all__ = [
6
+ "list_templates",
7
+ "create_template",
8
+ "get_template",
9
+ "update_template",
10
+ "delete_template",
11
+ ]
@@ -0,0 +1,63 @@
1
+ """Create Template"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ import httpx
8
+
9
+ from plato.chronos.errors import raise_for_status
10
+ from plato.chronos.models import JobTemplateCreate, JobTemplateResponse
11
+
12
+
13
+ def _build_request_args(
14
+ body: JobTemplateCreate,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = "/api/templates"
19
+
20
+ headers: dict[str, str] = {}
21
+ if x_api_key is not None:
22
+ headers["X-API-Key"] = x_api_key
23
+
24
+ return {
25
+ "method": "POST",
26
+ "url": url,
27
+ "json": body.model_dump(mode="json", exclude_none=True),
28
+ "headers": headers,
29
+ }
30
+
31
+
32
+ def sync(
33
+ client: httpx.Client,
34
+ body: JobTemplateCreate,
35
+ x_api_key: str | None = None,
36
+ ) -> JobTemplateResponse:
37
+ """Create a new job template."""
38
+
39
+ request_args = _build_request_args(
40
+ body=body,
41
+ x_api_key=x_api_key,
42
+ )
43
+
44
+ response = client.request(**request_args)
45
+ raise_for_status(response)
46
+ return JobTemplateResponse.model_validate(response.json())
47
+
48
+
49
+ async def asyncio(
50
+ client: httpx.AsyncClient,
51
+ body: JobTemplateCreate,
52
+ x_api_key: str | None = None,
53
+ ) -> JobTemplateResponse:
54
+ """Create a new job template."""
55
+
56
+ request_args = _build_request_args(
57
+ body=body,
58
+ x_api_key=x_api_key,
59
+ )
60
+
61
+ response = await client.request(**request_args)
62
+ raise_for_status(response)
63
+ return JobTemplateResponse.model_validate(response.json())
@@ -0,0 +1,61 @@
1
+ """Delete Template"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ import httpx
8
+
9
+ from plato.chronos.errors import raise_for_status
10
+
11
+
12
+ def _build_request_args(
13
+ public_id: str,
14
+ x_api_key: str | None = None,
15
+ ) -> dict[str, Any]:
16
+ """Build request arguments."""
17
+ url = f"/api/templates/{public_id}"
18
+
19
+ headers: dict[str, str] = {}
20
+ if x_api_key is not None:
21
+ headers["X-API-Key"] = x_api_key
22
+
23
+ return {
24
+ "method": "DELETE",
25
+ "url": url,
26
+ "headers": headers,
27
+ }
28
+
29
+
30
+ def sync(
31
+ client: httpx.Client,
32
+ public_id: str,
33
+ x_api_key: str | None = None,
34
+ ) -> dict[str, Any]:
35
+ """Delete a job template."""
36
+
37
+ request_args = _build_request_args(
38
+ public_id=public_id,
39
+ x_api_key=x_api_key,
40
+ )
41
+
42
+ response = client.request(**request_args)
43
+ raise_for_status(response)
44
+ return response.json()
45
+
46
+
47
+ async def asyncio(
48
+ client: httpx.AsyncClient,
49
+ public_id: str,
50
+ x_api_key: str | None = None,
51
+ ) -> dict[str, Any]:
52
+ """Delete a job template."""
53
+
54
+ request_args = _build_request_args(
55
+ public_id=public_id,
56
+ x_api_key=x_api_key,
57
+ )
58
+
59
+ response = await client.request(**request_args)
60
+ raise_for_status(response)
61
+ return response.json()
@@ -0,0 +1,62 @@
1
+ """Get Template"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ import httpx
8
+
9
+ from plato.chronos.errors import raise_for_status
10
+ from plato.chronos.models import JobTemplateResponse
11
+
12
+
13
+ def _build_request_args(
14
+ public_id: str,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = f"/api/templates/{public_id}"
19
+
20
+ headers: dict[str, str] = {}
21
+ if x_api_key is not None:
22
+ headers["X-API-Key"] = x_api_key
23
+
24
+ return {
25
+ "method": "GET",
26
+ "url": url,
27
+ "headers": headers,
28
+ }
29
+
30
+
31
+ def sync(
32
+ client: httpx.Client,
33
+ public_id: str,
34
+ x_api_key: str | None = None,
35
+ ) -> JobTemplateResponse:
36
+ """Get a job template by public ID."""
37
+
38
+ request_args = _build_request_args(
39
+ public_id=public_id,
40
+ x_api_key=x_api_key,
41
+ )
42
+
43
+ response = client.request(**request_args)
44
+ raise_for_status(response)
45
+ return JobTemplateResponse.model_validate(response.json())
46
+
47
+
48
+ async def asyncio(
49
+ client: httpx.AsyncClient,
50
+ public_id: str,
51
+ x_api_key: str | None = None,
52
+ ) -> JobTemplateResponse:
53
+ """Get a job template by public ID."""
54
+
55
+ request_args = _build_request_args(
56
+ public_id=public_id,
57
+ x_api_key=x_api_key,
58
+ )
59
+
60
+ response = await client.request(**request_args)
61
+ raise_for_status(response)
62
+ return JobTemplateResponse.model_validate(response.json())
@@ -0,0 +1,57 @@
1
+ """List Templates"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ import httpx
8
+
9
+ from plato.chronos.errors import raise_for_status
10
+ from plato.chronos.models import JobTemplateListResponse
11
+
12
+
13
+ def _build_request_args(
14
+ x_api_key: str | None = None,
15
+ ) -> dict[str, Any]:
16
+ """Build request arguments."""
17
+ url = "/api/templates"
18
+
19
+ headers: dict[str, str] = {}
20
+ if x_api_key is not None:
21
+ headers["X-API-Key"] = x_api_key
22
+
23
+ return {
24
+ "method": "GET",
25
+ "url": url,
26
+ "headers": headers,
27
+ }
28
+
29
+
30
+ def sync(
31
+ client: httpx.Client,
32
+ x_api_key: str | None = None,
33
+ ) -> JobTemplateListResponse:
34
+ """List all job templates for the org."""
35
+
36
+ request_args = _build_request_args(
37
+ x_api_key=x_api_key,
38
+ )
39
+
40
+ response = client.request(**request_args)
41
+ raise_for_status(response)
42
+ return JobTemplateListResponse.model_validate(response.json())
43
+
44
+
45
+ async def asyncio(
46
+ client: httpx.AsyncClient,
47
+ x_api_key: str | None = None,
48
+ ) -> JobTemplateListResponse:
49
+ """List all job templates for the org."""
50
+
51
+ request_args = _build_request_args(
52
+ x_api_key=x_api_key,
53
+ )
54
+
55
+ response = await client.request(**request_args)
56
+ raise_for_status(response)
57
+ return JobTemplateListResponse.model_validate(response.json())
@@ -0,0 +1,68 @@
1
+ """Update Template"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ import httpx
8
+
9
+ from plato.chronos.errors import raise_for_status
10
+ from plato.chronos.models import JobTemplateResponse, JobTemplateUpdate
11
+
12
+
13
+ def _build_request_args(
14
+ public_id: str,
15
+ body: JobTemplateUpdate,
16
+ x_api_key: str | None = None,
17
+ ) -> dict[str, Any]:
18
+ """Build request arguments."""
19
+ url = f"/api/templates/{public_id}"
20
+
21
+ headers: dict[str, str] = {}
22
+ if x_api_key is not None:
23
+ headers["X-API-Key"] = x_api_key
24
+
25
+ return {
26
+ "method": "PUT",
27
+ "url": url,
28
+ "json": body.model_dump(mode="json", exclude_none=True),
29
+ "headers": headers,
30
+ }
31
+
32
+
33
+ def sync(
34
+ client: httpx.Client,
35
+ public_id: str,
36
+ body: JobTemplateUpdate,
37
+ x_api_key: str | None = None,
38
+ ) -> JobTemplateResponse:
39
+ """Update a job template."""
40
+
41
+ request_args = _build_request_args(
42
+ public_id=public_id,
43
+ body=body,
44
+ x_api_key=x_api_key,
45
+ )
46
+
47
+ response = client.request(**request_args)
48
+ raise_for_status(response)
49
+ return JobTemplateResponse.model_validate(response.json())
50
+
51
+
52
+ async def asyncio(
53
+ client: httpx.AsyncClient,
54
+ public_id: str,
55
+ body: JobTemplateUpdate,
56
+ x_api_key: str | None = None,
57
+ ) -> JobTemplateResponse:
58
+ """Update a job template."""
59
+
60
+ request_args = _build_request_args(
61
+ public_id=public_id,
62
+ body=body,
63
+ x_api_key=x_api_key,
64
+ )
65
+
66
+ response = await client.request(**request_args)
67
+ raise_for_status(response)
68
+ return JobTemplateResponse.model_validate(response.json())
@@ -0,0 +1,8 @@
1
+ """API endpoints."""
2
+
3
+ from . import get_trajectory, list_trajectories
4
+
5
+ __all__ = [
6
+ "list_trajectories",
7
+ "get_trajectory",
8
+ ]
@@ -0,0 +1,62 @@
1
+ """Get Trajectory"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ import httpx
8
+
9
+ from plato.chronos.errors import raise_for_status
10
+ from plato.chronos.models import TrajectoryResponse
11
+
12
+
13
+ def _build_request_args(
14
+ public_id: str,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = f"/api/trajectories/{public_id}"
19
+
20
+ headers: dict[str, str] = {}
21
+ if x_api_key is not None:
22
+ headers["X-API-Key"] = x_api_key
23
+
24
+ return {
25
+ "method": "GET",
26
+ "url": url,
27
+ "headers": headers,
28
+ }
29
+
30
+
31
+ def sync(
32
+ client: httpx.Client,
33
+ public_id: str,
34
+ x_api_key: str | None = None,
35
+ ) -> TrajectoryResponse:
36
+ """Get a trajectory by public ID."""
37
+
38
+ request_args = _build_request_args(
39
+ public_id=public_id,
40
+ x_api_key=x_api_key,
41
+ )
42
+
43
+ response = client.request(**request_args)
44
+ raise_for_status(response)
45
+ return TrajectoryResponse.model_validate(response.json())
46
+
47
+
48
+ async def asyncio(
49
+ client: httpx.AsyncClient,
50
+ public_id: str,
51
+ x_api_key: str | None = None,
52
+ ) -> TrajectoryResponse:
53
+ """Get a trajectory by public ID."""
54
+
55
+ request_args = _build_request_args(
56
+ public_id=public_id,
57
+ x_api_key=x_api_key,
58
+ )
59
+
60
+ response = await client.request(**request_args)
61
+ raise_for_status(response)
62
+ return TrajectoryResponse.model_validate(response.json())
@@ -0,0 +1,62 @@
1
+ """List Trajectories For Session"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ import httpx
8
+
9
+ from plato.chronos.errors import raise_for_status
10
+ from plato.chronos.models import TrajectoryListResponse
11
+
12
+
13
+ def _build_request_args(
14
+ session_public_id: str,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = f"/api/trajectories/session/{session_public_id}"
19
+
20
+ headers: dict[str, str] = {}
21
+ if x_api_key is not None:
22
+ headers["X-API-Key"] = x_api_key
23
+
24
+ return {
25
+ "method": "GET",
26
+ "url": url,
27
+ "headers": headers,
28
+ }
29
+
30
+
31
+ def sync(
32
+ client: httpx.Client,
33
+ session_public_id: str,
34
+ x_api_key: str | None = None,
35
+ ) -> TrajectoryListResponse:
36
+ """List all trajectories for a session."""
37
+
38
+ request_args = _build_request_args(
39
+ session_public_id=session_public_id,
40
+ x_api_key=x_api_key,
41
+ )
42
+
43
+ response = client.request(**request_args)
44
+ raise_for_status(response)
45
+ return TrajectoryListResponse.model_validate(response.json())
46
+
47
+
48
+ async def asyncio(
49
+ client: httpx.AsyncClient,
50
+ session_public_id: str,
51
+ x_api_key: str | None = None,
52
+ ) -> TrajectoryListResponse:
53
+ """List all trajectories for a session."""
54
+
55
+ request_args = _build_request_args(
56
+ session_public_id=session_public_id,
57
+ x_api_key=x_api_key,
58
+ )
59
+
60
+ response = await client.request(**request_args)
61
+ raise_for_status(response)
62
+ return TrajectoryListResponse.model_validate(response.json())
@@ -0,0 +1,10 @@
1
+ """API endpoints."""
2
+
3
+ from . import create_world, delete_world, get_world, list_worlds
4
+
5
+ __all__ = [
6
+ "list_worlds",
7
+ "create_world",
8
+ "get_world",
9
+ "delete_world",
10
+ ]
@@ -0,0 +1,63 @@
1
+ """Create World"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ import httpx
8
+
9
+ from plato.chronos.errors import raise_for_status
10
+ from plato.chronos.models import WorldCreate, WorldResponse
11
+
12
+
13
+ def _build_request_args(
14
+ body: WorldCreate,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = "/api/worlds"
19
+
20
+ headers: dict[str, str] = {}
21
+ if x_api_key is not None:
22
+ headers["X-API-Key"] = x_api_key
23
+
24
+ return {
25
+ "method": "POST",
26
+ "url": url,
27
+ "json": body.model_dump(mode="json", exclude_none=True),
28
+ "headers": headers,
29
+ }
30
+
31
+
32
+ def sync(
33
+ client: httpx.Client,
34
+ body: WorldCreate,
35
+ x_api_key: str | None = None,
36
+ ) -> WorldResponse:
37
+ """Create a new world."""
38
+
39
+ request_args = _build_request_args(
40
+ body=body,
41
+ x_api_key=x_api_key,
42
+ )
43
+
44
+ response = client.request(**request_args)
45
+ raise_for_status(response)
46
+ return WorldResponse.model_validate(response.json())
47
+
48
+
49
+ async def asyncio(
50
+ client: httpx.AsyncClient,
51
+ body: WorldCreate,
52
+ x_api_key: str | None = None,
53
+ ) -> WorldResponse:
54
+ """Create a new world."""
55
+
56
+ request_args = _build_request_args(
57
+ body=body,
58
+ x_api_key=x_api_key,
59
+ )
60
+
61
+ response = await client.request(**request_args)
62
+ raise_for_status(response)
63
+ return WorldResponse.model_validate(response.json())
@@ -0,0 +1,61 @@
1
+ """Delete World"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ import httpx
8
+
9
+ from plato.chronos.errors import raise_for_status
10
+
11
+
12
+ def _build_request_args(
13
+ public_id: str,
14
+ x_api_key: str | None = None,
15
+ ) -> dict[str, Any]:
16
+ """Build request arguments."""
17
+ url = f"/api/worlds/{public_id}"
18
+
19
+ headers: dict[str, str] = {}
20
+ if x_api_key is not None:
21
+ headers["X-API-Key"] = x_api_key
22
+
23
+ return {
24
+ "method": "DELETE",
25
+ "url": url,
26
+ "headers": headers,
27
+ }
28
+
29
+
30
+ def sync(
31
+ client: httpx.Client,
32
+ public_id: str,
33
+ x_api_key: str | None = None,
34
+ ) -> dict[str, Any]:
35
+ """Archive a world."""
36
+
37
+ request_args = _build_request_args(
38
+ public_id=public_id,
39
+ x_api_key=x_api_key,
40
+ )
41
+
42
+ response = client.request(**request_args)
43
+ raise_for_status(response)
44
+ return response.json()
45
+
46
+
47
+ async def asyncio(
48
+ client: httpx.AsyncClient,
49
+ public_id: str,
50
+ x_api_key: str | None = None,
51
+ ) -> dict[str, Any]:
52
+ """Archive a world."""
53
+
54
+ request_args = _build_request_args(
55
+ public_id=public_id,
56
+ x_api_key=x_api_key,
57
+ )
58
+
59
+ response = await client.request(**request_args)
60
+ raise_for_status(response)
61
+ return response.json()