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,63 @@
1
+ """Launch Job"""
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 LaunchJobRequest, LaunchJobResponse
11
+
12
+
13
+ def _build_request_args(
14
+ body: LaunchJobRequest,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = "/api/jobs/launch"
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: LaunchJobRequest,
35
+ x_api_key: str | None = None,
36
+ ) -> LaunchJobResponse:
37
+ """Launch a new Chronos job."""
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 LaunchJobResponse.model_validate(response.json())
47
+
48
+
49
+ async def asyncio(
50
+ client: httpx.AsyncClient,
51
+ body: LaunchJobRequest,
52
+ x_api_key: str | None = None,
53
+ ) -> LaunchJobResponse:
54
+ """Launch a new Chronos job."""
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 LaunchJobResponse.model_validate(response.json())
@@ -0,0 +1,19 @@
1
+ """API endpoints."""
2
+
3
+ from . import (
4
+ get_agent_schema_api_registry_agents__agent_name__schema_get,
5
+ get_agent_versions_api_registry_agents__agent_name__versions_get,
6
+ get_world_schema_api_registry_worlds__package_name__schema_get,
7
+ get_world_versions_api_registry_worlds__package_name__versions_get,
8
+ list_registry_agents_api_registry_agents_get,
9
+ list_registry_worlds_api_registry_worlds_get,
10
+ )
11
+
12
+ __all__ = [
13
+ "list_registry_agents_api_registry_agents_get",
14
+ "get_agent_versions_api_registry_agents__agent_name__versions_get",
15
+ "get_agent_schema_api_registry_agents__agent_name__schema_get",
16
+ "list_registry_worlds_api_registry_worlds_get",
17
+ "get_world_versions_api_registry_worlds__package_name__versions_get",
18
+ "get_world_schema_api_registry_worlds__package_name__schema_get",
19
+ ]
@@ -0,0 +1,62 @@
1
+ """Get Agent Schema"""
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 AgentSchemaResponse
11
+
12
+
13
+ def _build_request_args(
14
+ agent_name: str,
15
+ version: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = f"/api/registry/agents/{agent_name}/schema"
19
+
20
+ params: dict[str, Any] = {}
21
+ if version is not None:
22
+ params["version"] = version
23
+
24
+ return {
25
+ "method": "GET",
26
+ "url": url,
27
+ "params": params,
28
+ }
29
+
30
+
31
+ def sync(
32
+ client: httpx.Client,
33
+ agent_name: str,
34
+ version: str | None = None,
35
+ ) -> AgentSchemaResponse:
36
+ """Get schema for an agent version from the registry."""
37
+
38
+ request_args = _build_request_args(
39
+ agent_name=agent_name,
40
+ version=version,
41
+ )
42
+
43
+ response = client.request(**request_args)
44
+ raise_for_status(response)
45
+ return AgentSchemaResponse.model_validate(response.json())
46
+
47
+
48
+ async def asyncio(
49
+ client: httpx.AsyncClient,
50
+ agent_name: str,
51
+ version: str | None = None,
52
+ ) -> AgentSchemaResponse:
53
+ """Get schema for an agent version from the registry."""
54
+
55
+ request_args = _build_request_args(
56
+ agent_name=agent_name,
57
+ version=version,
58
+ )
59
+
60
+ response = await client.request(**request_args)
61
+ raise_for_status(response)
62
+ return AgentSchemaResponse.model_validate(response.json())
@@ -0,0 +1,52 @@
1
+ """Get Agent Versions"""
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 AgentVersionsResponse
11
+
12
+
13
+ def _build_request_args(
14
+ agent_name: str,
15
+ ) -> dict[str, Any]:
16
+ """Build request arguments."""
17
+ url = f"/api/registry/agents/{agent_name}/versions"
18
+
19
+ return {
20
+ "method": "GET",
21
+ "url": url,
22
+ }
23
+
24
+
25
+ def sync(
26
+ client: httpx.Client,
27
+ agent_name: str,
28
+ ) -> AgentVersionsResponse:
29
+ """Get versions for an agent from the registry."""
30
+
31
+ request_args = _build_request_args(
32
+ agent_name=agent_name,
33
+ )
34
+
35
+ response = client.request(**request_args)
36
+ raise_for_status(response)
37
+ return AgentVersionsResponse.model_validate(response.json())
38
+
39
+
40
+ async def asyncio(
41
+ client: httpx.AsyncClient,
42
+ agent_name: str,
43
+ ) -> AgentVersionsResponse:
44
+ """Get versions for an agent from the registry."""
45
+
46
+ request_args = _build_request_args(
47
+ agent_name=agent_name,
48
+ )
49
+
50
+ response = await client.request(**request_args)
51
+ raise_for_status(response)
52
+ return AgentVersionsResponse.model_validate(response.json())
@@ -0,0 +1,68 @@
1
+ """Get World Schema"""
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 WorldSchemaResponse
11
+
12
+
13
+ def _build_request_args(
14
+ package_name: str,
15
+ version: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = f"/api/registry/worlds/{package_name}/schema"
19
+
20
+ params: dict[str, Any] = {}
21
+ if version is not None:
22
+ params["version"] = version
23
+
24
+ return {
25
+ "method": "GET",
26
+ "url": url,
27
+ "params": params,
28
+ }
29
+
30
+
31
+ def sync(
32
+ client: httpx.Client,
33
+ package_name: str,
34
+ version: str | None = None,
35
+ ) -> WorldSchemaResponse:
36
+ """Get schema for a world package from the registry.
37
+
38
+ First tries the registry's schema endpoint, then falls back to
39
+ extracting schema.json directly from the wheel."""
40
+
41
+ request_args = _build_request_args(
42
+ package_name=package_name,
43
+ version=version,
44
+ )
45
+
46
+ response = client.request(**request_args)
47
+ raise_for_status(response)
48
+ return WorldSchemaResponse.model_validate(response.json())
49
+
50
+
51
+ async def asyncio(
52
+ client: httpx.AsyncClient,
53
+ package_name: str,
54
+ version: str | None = None,
55
+ ) -> WorldSchemaResponse:
56
+ """Get schema for a world package from the registry.
57
+
58
+ First tries the registry's schema endpoint, then falls back to
59
+ extracting schema.json directly from the wheel."""
60
+
61
+ request_args = _build_request_args(
62
+ package_name=package_name,
63
+ version=version,
64
+ )
65
+
66
+ response = await client.request(**request_args)
67
+ raise_for_status(response)
68
+ return WorldSchemaResponse.model_validate(response.json())
@@ -0,0 +1,52 @@
1
+ """Get World Versions"""
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 WorldVersionsResponse
11
+
12
+
13
+ def _build_request_args(
14
+ package_name: str,
15
+ ) -> dict[str, Any]:
16
+ """Build request arguments."""
17
+ url = f"/api/registry/worlds/{package_name}/versions"
18
+
19
+ return {
20
+ "method": "GET",
21
+ "url": url,
22
+ }
23
+
24
+
25
+ def sync(
26
+ client: httpx.Client,
27
+ package_name: str,
28
+ ) -> WorldVersionsResponse:
29
+ """Get versions for a world package from the registry."""
30
+
31
+ request_args = _build_request_args(
32
+ package_name=package_name,
33
+ )
34
+
35
+ response = client.request(**request_args)
36
+ raise_for_status(response)
37
+ return WorldVersionsResponse.model_validate(response.json())
38
+
39
+
40
+ async def asyncio(
41
+ client: httpx.AsyncClient,
42
+ package_name: str,
43
+ ) -> WorldVersionsResponse:
44
+ """Get versions for a world package from the registry."""
45
+
46
+ request_args = _build_request_args(
47
+ package_name=package_name,
48
+ )
49
+
50
+ response = await client.request(**request_args)
51
+ raise_for_status(response)
52
+ return WorldVersionsResponse.model_validate(response.json())
@@ -0,0 +1,44 @@
1
+ """List Registry Agents"""
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 ChronosApiRegistryAgentListResponse
11
+
12
+
13
+ def _build_request_args() -> dict[str, Any]:
14
+ """Build request arguments."""
15
+ url = "/api/registry/agents"
16
+
17
+ return {
18
+ "method": "GET",
19
+ "url": url,
20
+ }
21
+
22
+
23
+ def sync(
24
+ client: httpx.Client,
25
+ ) -> ChronosApiRegistryAgentListResponse:
26
+ """List all agents from the registry with their ECR image URIs."""
27
+
28
+ request_args = _build_request_args()
29
+
30
+ response = client.request(**request_args)
31
+ raise_for_status(response)
32
+ return ChronosApiRegistryAgentListResponse.model_validate(response.json())
33
+
34
+
35
+ async def asyncio(
36
+ client: httpx.AsyncClient,
37
+ ) -> ChronosApiRegistryAgentListResponse:
38
+ """List all agents from the registry with their ECR image URIs."""
39
+
40
+ request_args = _build_request_args()
41
+
42
+ response = await client.request(**request_args)
43
+ raise_for_status(response)
44
+ return ChronosApiRegistryAgentListResponse.model_validate(response.json())
@@ -0,0 +1,44 @@
1
+ """List Registry Worlds"""
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 WorldCatalogResponse
11
+
12
+
13
+ def _build_request_args() -> dict[str, Any]:
14
+ """Build request arguments."""
15
+ url = "/api/registry/worlds"
16
+
17
+ return {
18
+ "method": "GET",
19
+ "url": url,
20
+ }
21
+
22
+
23
+ def sync(
24
+ client: httpx.Client,
25
+ ) -> WorldCatalogResponse:
26
+ """List all world packages from the registry."""
27
+
28
+ request_args = _build_request_args()
29
+
30
+ response = client.request(**request_args)
31
+ raise_for_status(response)
32
+ return WorldCatalogResponse.model_validate(response.json())
33
+
34
+
35
+ async def asyncio(
36
+ client: httpx.AsyncClient,
37
+ ) -> WorldCatalogResponse:
38
+ """List all world packages from the registry."""
39
+
40
+ request_args = _build_request_args()
41
+
42
+ response = await client.request(**request_args)
43
+ raise_for_status(response)
44
+ return WorldCatalogResponse.model_validate(response.json())
@@ -0,0 +1,11 @@
1
+ """API endpoints."""
2
+
3
+ from . import create_runtime, delete_runtime, get_runtime, list_runtimes, test_runtime
4
+
5
+ __all__ = [
6
+ "list_runtimes",
7
+ "create_runtime",
8
+ "get_runtime",
9
+ "delete_runtime",
10
+ "test_runtime",
11
+ ]
@@ -0,0 +1,63 @@
1
+ """Create Runtime"""
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 RuntimeCreate, RuntimeCreateResponse
11
+
12
+
13
+ def _build_request_args(
14
+ body: RuntimeCreate,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = "/api/runtimes"
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: RuntimeCreate,
35
+ x_api_key: str | None = None,
36
+ ) -> RuntimeCreateResponse:
37
+ """Create a new runtime (starts background job to build)."""
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 RuntimeCreateResponse.model_validate(response.json())
47
+
48
+
49
+ async def asyncio(
50
+ client: httpx.AsyncClient,
51
+ body: RuntimeCreate,
52
+ x_api_key: str | None = None,
53
+ ) -> RuntimeCreateResponse:
54
+ """Create a new runtime (starts background job to build)."""
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 RuntimeCreateResponse.model_validate(response.json())
@@ -0,0 +1,61 @@
1
+ """Delete Runtime"""
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
+ artifact_id: str,
14
+ x_api_key: str | None = None,
15
+ ) -> dict[str, Any]:
16
+ """Build request arguments."""
17
+ url = f"/api/runtimes/{artifact_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
+ artifact_id: str,
33
+ x_api_key: str | None = None,
34
+ ) -> dict[str, Any]:
35
+ """Delete a runtime."""
36
+
37
+ request_args = _build_request_args(
38
+ artifact_id=artifact_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
+ artifact_id: str,
50
+ x_api_key: str | None = None,
51
+ ) -> dict[str, Any]:
52
+ """Delete a runtime."""
53
+
54
+ request_args = _build_request_args(
55
+ artifact_id=artifact_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 Runtime"""
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 RuntimeResponse
11
+
12
+
13
+ def _build_request_args(
14
+ artifact_id: str,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = f"/api/runtimes/{artifact_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
+ artifact_id: str,
34
+ x_api_key: str | None = None,
35
+ ) -> RuntimeResponse:
36
+ """Get a runtime by artifact ID."""
37
+
38
+ request_args = _build_request_args(
39
+ artifact_id=artifact_id,
40
+ x_api_key=x_api_key,
41
+ )
42
+
43
+ response = client.request(**request_args)
44
+ raise_for_status(response)
45
+ return RuntimeResponse.model_validate(response.json())
46
+
47
+
48
+ async def asyncio(
49
+ client: httpx.AsyncClient,
50
+ artifact_id: str,
51
+ x_api_key: str | None = None,
52
+ ) -> RuntimeResponse:
53
+ """Get a runtime by artifact ID."""
54
+
55
+ request_args = _build_request_args(
56
+ artifact_id=artifact_id,
57
+ x_api_key=x_api_key,
58
+ )
59
+
60
+ response = await client.request(**request_args)
61
+ raise_for_status(response)
62
+ return RuntimeResponse.model_validate(response.json())
@@ -0,0 +1,57 @@
1
+ """List Runtimes"""
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 RuntimeListResponse
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/runtimes"
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
+ ) -> RuntimeListResponse:
34
+ """List all runtimes 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 RuntimeListResponse.model_validate(response.json())
43
+
44
+
45
+ async def asyncio(
46
+ client: httpx.AsyncClient,
47
+ x_api_key: str | None = None,
48
+ ) -> RuntimeListResponse:
49
+ """List all runtimes 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 RuntimeListResponse.model_validate(response.json())