plato-sdk-v2 2.5.0__py3-none-any.whl → 2.6.0__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 (50) hide show
  1. plato/_generated/__init__.py +1 -1
  2. plato/_generated/api/v1/evals/get_scores_by_user.py +7 -0
  3. plato/_generated/api/v1/testcases/get_testcases.py +14 -0
  4. plato/_generated/api/v2/sessions/setup_sandbox.py +2 -2
  5. plato/_generated/models/__init__.py +42 -2
  6. plato/chronos/api/admin/__init__.py +17 -0
  7. plato/chronos/api/admin/clear_database_api_admin_clear_db_post.py +57 -0
  8. plato/chronos/api/admin/sync_agents_api_admin_sync_agents_post.py +67 -0
  9. plato/chronos/api/admin/sync_all_api_admin_sync_all_post.py +67 -0
  10. plato/chronos/api/admin/sync_runtimes_api_admin_sync_runtimes_post.py +67 -0
  11. plato/chronos/api/admin/sync_worlds_api_admin_sync_worlds_post.py +67 -0
  12. plato/chronos/api/agents/list_agents.py +5 -5
  13. plato/chronos/api/checkpoints/__init__.py +8 -0
  14. plato/chronos/api/checkpoints/list_checkpoints.py +52 -0
  15. plato/chronos/api/checkpoints/preview_checkpoint.py +74 -0
  16. plato/chronos/api/events/__init__.py +8 -0
  17. plato/chronos/api/events/get_session_event.py +68 -0
  18. plato/chronos/api/events/list_session_events.py +62 -0
  19. plato/chronos/api/jobs/launch_job.py +8 -2
  20. plato/chronos/api/otel/__init__.py +8 -0
  21. plato/chronos/api/otel/get_session_traces_api_otel_sessions__session_id__traces_get.py +56 -0
  22. plato/chronos/api/otel/receive_traces_api_otel_v1_traces_post.py +49 -0
  23. plato/chronos/api/registry/list_registry_agents_api_registry_agents_get.py +5 -5
  24. plato/chronos/api/runtimes/__init__.py +2 -1
  25. plato/chronos/api/runtimes/get_runtime_logs.py +61 -0
  26. plato/chronos/api/sessions/__init__.py +24 -1
  27. plato/chronos/api/sessions/close_session.py +66 -0
  28. plato/chronos/api/sessions/complete_session.py +74 -0
  29. plato/chronos/api/sessions/create_session.py +69 -0
  30. plato/chronos/api/sessions/get_session.py +20 -2
  31. plato/chronos/api/sessions/get_session_bash_logs_download.py +61 -0
  32. plato/chronos/api/sessions/get_session_envs.py +62 -0
  33. plato/chronos/api/sessions/get_session_live_logs.py +62 -0
  34. plato/chronos/api/sessions/get_session_logs.py +3 -3
  35. plato/chronos/api/sessions/get_session_status.py +62 -0
  36. plato/chronos/api/sessions/list_sessions.py +20 -2
  37. plato/chronos/api/sessions/list_tags.py +80 -0
  38. plato/chronos/api/sessions/update_session_tags.py +68 -0
  39. plato/chronos/models/__init__.py +241 -196
  40. plato/v1/cli/chronos.py +62 -0
  41. plato/v2/__init__.py +8 -0
  42. plato/v2/async_/__init__.py +4 -0
  43. plato/v2/async_/chronos.py +419 -0
  44. plato/v2/sync/__init__.py +3 -0
  45. plato/v2/sync/chronos.py +419 -0
  46. plato/worlds/base.py +12 -2
  47. {plato_sdk_v2-2.5.0.dist-info → plato_sdk_v2-2.6.0.dist-info}/METADATA +1 -1
  48. {plato_sdk_v2-2.5.0.dist-info → plato_sdk_v2-2.6.0.dist-info}/RECORD +50 -23
  49. {plato_sdk_v2-2.5.0.dist-info → plato_sdk_v2-2.6.0.dist-info}/WHEEL +0 -0
  50. {plato_sdk_v2-2.5.0.dist-info → plato_sdk_v2-2.6.0.dist-info}/entry_points.txt +0 -0
@@ -1,4 +1,4 @@
1
- """Plato API SDK - v0.37.6"""
1
+ """Plato API SDK - v0.41.4"""
2
2
 
3
3
  from . import api, errors, models
4
4
  from .client import AsyncClient, Client
@@ -15,6 +15,7 @@ def _build_request_args(
15
15
  page_size: int | None = None,
16
16
  days: float | None = None,
17
17
  include_human_results: bool | None = False,
18
+ date: str | None = None,
18
19
  authorization: str | None = None,
19
20
  x_api_key: str | None = None,
20
21
  ) -> dict[str, Any]:
@@ -32,6 +33,8 @@ def _build_request_args(
32
33
  params["days"] = days
33
34
  if include_human_results is not None:
34
35
  params["include_human_results"] = include_human_results
36
+ if date is not None:
37
+ params["date"] = date
35
38
 
36
39
  headers: dict[str, str] = {}
37
40
  if authorization is not None:
@@ -54,6 +57,7 @@ def sync(
54
57
  page_size: int | None = None,
55
58
  days: float | None = None,
56
59
  include_human_results: bool | None = False,
60
+ date: str | None = None,
57
61
  authorization: str | None = None,
58
62
  x_api_key: str | None = None,
59
63
  ) -> Any:
@@ -65,6 +69,7 @@ def sync(
65
69
  page_size=page_size,
66
70
  days=days,
67
71
  include_human_results=include_human_results,
72
+ date=date,
68
73
  authorization=authorization,
69
74
  x_api_key=x_api_key,
70
75
  )
@@ -81,6 +86,7 @@ async def asyncio(
81
86
  page_size: int | None = None,
82
87
  days: float | None = None,
83
88
  include_human_results: bool | None = False,
89
+ date: str | None = None,
84
90
  authorization: str | None = None,
85
91
  x_api_key: str | None = None,
86
92
  ) -> Any:
@@ -92,6 +98,7 @@ async def asyncio(
92
98
  page_size=page_size,
93
99
  days=days,
94
100
  include_human_results=include_human_results,
101
+ date=date,
95
102
  authorization=authorization,
96
103
  x_api_key=x_api_key,
97
104
  )
@@ -25,6 +25,8 @@ def _build_request_args(
25
25
  is_sample: bool | None = None,
26
26
  rejected: bool | None = None,
27
27
  exclude_assigned_to_annotators: bool | None = None,
28
+ workorder: str | None = None,
29
+ infeasible: bool | None = None,
28
30
  authorization: str | None = None,
29
31
  x_api_key: str | None = None,
30
32
  ) -> dict[str, Any]:
@@ -62,6 +64,10 @@ def _build_request_args(
62
64
  params["rejected"] = rejected
63
65
  if exclude_assigned_to_annotators is not None:
64
66
  params["exclude_assigned_to_annotators"] = exclude_assigned_to_annotators
67
+ if workorder is not None:
68
+ params["workorder"] = workorder
69
+ if infeasible is not None:
70
+ params["infeasible"] = infeasible
65
71
 
66
72
  headers: dict[str, str] = {}
67
73
  if authorization is not None:
@@ -94,6 +100,8 @@ def sync(
94
100
  is_sample: bool | None = None,
95
101
  rejected: bool | None = None,
96
102
  exclude_assigned_to_annotators: bool | None = None,
103
+ workorder: str | None = None,
104
+ infeasible: bool | None = None,
97
105
  authorization: str | None = None,
98
106
  x_api_key: str | None = None,
99
107
  ) -> Any:
@@ -115,6 +123,8 @@ def sync(
115
123
  is_sample=is_sample,
116
124
  rejected=rejected,
117
125
  exclude_assigned_to_annotators=exclude_assigned_to_annotators,
126
+ workorder=workorder,
127
+ infeasible=infeasible,
118
128
  authorization=authorization,
119
129
  x_api_key=x_api_key,
120
130
  )
@@ -141,6 +151,8 @@ async def asyncio(
141
151
  is_sample: bool | None = None,
142
152
  rejected: bool | None = None,
143
153
  exclude_assigned_to_annotators: bool | None = None,
154
+ workorder: str | None = None,
155
+ infeasible: bool | None = None,
144
156
  authorization: str | None = None,
145
157
  x_api_key: str | None = None,
146
158
  ) -> Any:
@@ -162,6 +174,8 @@ async def asyncio(
162
174
  is_sample=is_sample,
163
175
  rejected=rejected,
164
176
  exclude_assigned_to_annotators=exclude_assigned_to_annotators,
177
+ workorder=workorder,
178
+ infeasible=infeasible,
165
179
  authorization=authorization,
166
180
  x_api_key=x_api_key,
167
181
  )
@@ -53,7 +53,7 @@ def sync(
53
53
  - Mounting /dev/vdb to /mnt/docker for Docker storage
54
54
  - Configuring Docker with overlay2 storage driver
55
55
  - Setting up ECR and Docker Hub authentication
56
- - Creating a docker-user service for non-root Docker access"""
56
+ - Adding plato user to docker group for shared Docker access"""
57
57
 
58
58
  request_args = _build_request_args(
59
59
  session_id=session_id,
@@ -84,7 +84,7 @@ async def asyncio(
84
84
  - Mounting /dev/vdb to /mnt/docker for Docker storage
85
85
  - Configuring Docker with overlay2 storage driver
86
86
  - Setting up ECR and Docker Hub authentication
87
- - Creating a docker-user service for non-root Docker access"""
87
+ - Adding plato user to docker group for shared Docker access"""
88
88
 
89
89
  request_args = _build_request_args(
90
90
  session_id=session_id,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: tmp28thllk8.json
3
- # timestamp: 2026-01-17T04:45:09+00:00
2
+ # filename: tmppwt3ublb.json
3
+ # timestamp: 2026-01-23T22:08:30+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -840,6 +840,14 @@ class CreateSnapshotResult(BaseModel):
840
840
  """
841
841
  ID of the created snapshot artifact
842
842
  """
843
+ success: Annotated[bool | None, Field(title="Success")] = True
844
+ """
845
+ Whether snapshot creation succeeded
846
+ """
847
+ error: Annotated[str | None, Field(title="Error")] = None
848
+ """
849
+ Error message if failed
850
+ """
843
851
 
844
852
 
845
853
  class CreateTestCaseFromLabelsRequest(BaseModel):
@@ -1714,6 +1722,20 @@ class NodeNatsConfig(BaseModel):
1714
1722
  subject_prefix: Annotated[str | None, Field(title="Subject Prefix")] = "firecracker"
1715
1723
 
1716
1724
 
1725
+ class NodeNebulaConfig(BaseModel):
1726
+ model_config = ConfigDict(
1727
+ extra="allow",
1728
+ )
1729
+ lighthouse_upstream: Annotated[str | None, Field(title="Lighthouse Upstream")] = "100.64.1.1:4242"
1730
+ """
1731
+ Nebula lighthouse upstream address (host:port) for mesh connectivity.
1732
+ """
1733
+ lighthouse_ip: Annotated[str | None, Field(title="Lighthouse Ip")] = "100.64.1.1"
1734
+ """
1735
+ Nebula lighthouse mesh IP address.
1736
+ """
1737
+
1738
+
1717
1739
  class NodePolicyConfig(BaseModel):
1718
1740
  model_config = ConfigDict(
1719
1741
  extra="allow",
@@ -1808,6 +1830,10 @@ class NodeSnapshotStoreConfig(BaseModel):
1808
1830
  """
1809
1831
  Worker threads for snapshot-store compression.
1810
1832
  """
1833
+ upload_workers: Annotated[int | None, Field(title="Upload Workers")] = 6
1834
+ """
1835
+ Number of concurrent snapshot upload jobs.
1836
+ """
1811
1837
  upload_max_attempts: Annotated[int | None, Field(title="Upload Max Attempts")] = 3
1812
1838
  """
1813
1839
  Max upload attempts for snapshot-store uploads.
@@ -1846,6 +1872,12 @@ class NodeStreamConfig(BaseModel):
1846
1872
  resource_matcher_key_prefix: Annotated[str | None, Field(title="Resource Matcher Key Prefix")] = (
1847
1873
  "vm-resource-matcher"
1848
1874
  )
1875
+ artifact_upload_notification_channel: Annotated[str | None, Field(title="Artifact Upload Notification Channel")] = (
1876
+ "artifact-upload-notifications"
1877
+ )
1878
+ """
1879
+ Pubsub channel for artifact upload status updates.
1880
+ """
1849
1881
 
1850
1882
 
1851
1883
  class OODRequestLogInput(BaseModel):
@@ -4358,6 +4390,10 @@ class NodeConfig(BaseModel):
4358
4390
  """
4359
4391
  Build configuration including SSH keys for VMs
4360
4392
  """
4393
+ nebula: NodeNebulaConfig | None = None
4394
+ """
4395
+ Nebula mesh VPN configuration for lighthouse connectivity
4396
+ """
4361
4397
 
4362
4398
 
4363
4399
  class QueueStatusResponse(BaseModel):
@@ -4501,6 +4537,8 @@ class TestCaseCreateRequest(BaseModel):
4501
4537
  simulatorId: Annotated[int | None, Field(title="Simulatorid")] = None
4502
4538
  simulatorArtifactId: Annotated[str | None, Field(title="Simulatorartifactid")] = None
4503
4539
  simulatorArtifactIds: Annotated[list[str] | None, Field(title="Simulatorartifactids")] = None
4540
+ workorder: Annotated[str | None, Field(title="Workorder")] = None
4541
+ infeasible: Annotated[bool | None, Field(title="Infeasible")] = None
4504
4542
 
4505
4543
 
4506
4544
  class TestCaseUpdateRequest(BaseModel):
@@ -4525,6 +4563,8 @@ class TestCaseUpdateRequest(BaseModel):
4525
4563
  simulatorArtifactId: Annotated[str | None, Field(title="Simulatorartifactid")] = None
4526
4564
  simulatorArtifactIds: Annotated[list[str] | None, Field(title="Simulatorartifactids")] = None
4527
4565
  mutationIgnoreConfig: DatabaseIgnoreConfig | None = None
4566
+ workorder: Annotated[str | None, Field(title="Workorder")] = None
4567
+ infeasible: Annotated[bool | None, Field(title="Infeasible")] = None
4528
4568
 
4529
4569
 
4530
4570
  class WaitForReadyResponse(BaseModel):
@@ -0,0 +1,17 @@
1
+ """API endpoints."""
2
+
3
+ from . import (
4
+ clear_database_api_admin_clear_db_post,
5
+ sync_agents_api_admin_sync_agents_post,
6
+ sync_all_api_admin_sync_all_post,
7
+ sync_runtimes_api_admin_sync_runtimes_post,
8
+ sync_worlds_api_admin_sync_worlds_post,
9
+ )
10
+
11
+ __all__ = [
12
+ "sync_agents_api_admin_sync_agents_post",
13
+ "sync_worlds_api_admin_sync_worlds_post",
14
+ "sync_runtimes_api_admin_sync_runtimes_post",
15
+ "sync_all_api_admin_sync_all_post",
16
+ "clear_database_api_admin_clear_db_post",
17
+ ]
@@ -0,0 +1,57 @@
1
+ """Clear Database"""
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 ClearDbResult
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/admin/clear-db"
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": "POST",
25
+ "url": url,
26
+ "headers": headers,
27
+ }
28
+
29
+
30
+ def sync(
31
+ client: httpx.Client,
32
+ x_api_key: str | None = None,
33
+ ) -> ClearDbResult:
34
+ """Clear ALL data from the database. Only available in local environment."""
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 ClearDbResult.model_validate(response.json())
43
+
44
+
45
+ async def asyncio(
46
+ client: httpx.AsyncClient,
47
+ x_api_key: str | None = None,
48
+ ) -> ClearDbResult:
49
+ """Clear ALL data from the database. Only available in local environment."""
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 ClearDbResult.model_validate(response.json())
@@ -0,0 +1,67 @@
1
+ """Sync 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 SyncResult
11
+
12
+
13
+ def _build_request_args(
14
+ source_url: str,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = "/api/admin/sync/agents"
19
+
20
+ params: dict[str, Any] = {}
21
+ if source_url is not None:
22
+ params["source_url"] = source_url
23
+
24
+ headers: dict[str, str] = {}
25
+ if x_api_key is not None:
26
+ headers["X-API-Key"] = x_api_key
27
+
28
+ return {
29
+ "method": "POST",
30
+ "url": url,
31
+ "params": params,
32
+ "headers": headers,
33
+ }
34
+
35
+
36
+ def sync(
37
+ client: httpx.Client,
38
+ source_url: str,
39
+ x_api_key: str | None = None,
40
+ ) -> SyncResult:
41
+ """Sync agents from source Chronos to local database."""
42
+
43
+ request_args = _build_request_args(
44
+ source_url=source_url,
45
+ x_api_key=x_api_key,
46
+ )
47
+
48
+ response = client.request(**request_args)
49
+ raise_for_status(response)
50
+ return SyncResult.model_validate(response.json())
51
+
52
+
53
+ async def asyncio(
54
+ client: httpx.AsyncClient,
55
+ source_url: str,
56
+ x_api_key: str | None = None,
57
+ ) -> SyncResult:
58
+ """Sync agents from source Chronos to local database."""
59
+
60
+ request_args = _build_request_args(
61
+ source_url=source_url,
62
+ x_api_key=x_api_key,
63
+ )
64
+
65
+ response = await client.request(**request_args)
66
+ raise_for_status(response)
67
+ return SyncResult.model_validate(response.json())
@@ -0,0 +1,67 @@
1
+ """Sync All"""
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 SyncAllResult
11
+
12
+
13
+ def _build_request_args(
14
+ source_url: str,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = "/api/admin/sync/all"
19
+
20
+ params: dict[str, Any] = {}
21
+ if source_url is not None:
22
+ params["source_url"] = source_url
23
+
24
+ headers: dict[str, str] = {}
25
+ if x_api_key is not None:
26
+ headers["X-API-Key"] = x_api_key
27
+
28
+ return {
29
+ "method": "POST",
30
+ "url": url,
31
+ "params": params,
32
+ "headers": headers,
33
+ }
34
+
35
+
36
+ def sync(
37
+ client: httpx.Client,
38
+ source_url: str,
39
+ x_api_key: str | None = None,
40
+ ) -> SyncAllResult:
41
+ """Sync all data (agents, worlds, runtimes) from source."""
42
+
43
+ request_args = _build_request_args(
44
+ source_url=source_url,
45
+ x_api_key=x_api_key,
46
+ )
47
+
48
+ response = client.request(**request_args)
49
+ raise_for_status(response)
50
+ return SyncAllResult.model_validate(response.json())
51
+
52
+
53
+ async def asyncio(
54
+ client: httpx.AsyncClient,
55
+ source_url: str,
56
+ x_api_key: str | None = None,
57
+ ) -> SyncAllResult:
58
+ """Sync all data (agents, worlds, runtimes) from source."""
59
+
60
+ request_args = _build_request_args(
61
+ source_url=source_url,
62
+ x_api_key=x_api_key,
63
+ )
64
+
65
+ response = await client.request(**request_args)
66
+ raise_for_status(response)
67
+ return SyncAllResult.model_validate(response.json())
@@ -0,0 +1,67 @@
1
+ """Sync 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 SyncResult
11
+
12
+
13
+ def _build_request_args(
14
+ source_url: str,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = "/api/admin/sync/runtimes"
19
+
20
+ params: dict[str, Any] = {}
21
+ if source_url is not None:
22
+ params["source_url"] = source_url
23
+
24
+ headers: dict[str, str] = {}
25
+ if x_api_key is not None:
26
+ headers["X-API-Key"] = x_api_key
27
+
28
+ return {
29
+ "method": "POST",
30
+ "url": url,
31
+ "params": params,
32
+ "headers": headers,
33
+ }
34
+
35
+
36
+ def sync(
37
+ client: httpx.Client,
38
+ source_url: str,
39
+ x_api_key: str | None = None,
40
+ ) -> SyncResult:
41
+ """Sync runtimes from source Chronos to local database."""
42
+
43
+ request_args = _build_request_args(
44
+ source_url=source_url,
45
+ x_api_key=x_api_key,
46
+ )
47
+
48
+ response = client.request(**request_args)
49
+ raise_for_status(response)
50
+ return SyncResult.model_validate(response.json())
51
+
52
+
53
+ async def asyncio(
54
+ client: httpx.AsyncClient,
55
+ source_url: str,
56
+ x_api_key: str | None = None,
57
+ ) -> SyncResult:
58
+ """Sync runtimes from source Chronos to local database."""
59
+
60
+ request_args = _build_request_args(
61
+ source_url=source_url,
62
+ x_api_key=x_api_key,
63
+ )
64
+
65
+ response = await client.request(**request_args)
66
+ raise_for_status(response)
67
+ return SyncResult.model_validate(response.json())
@@ -0,0 +1,67 @@
1
+ """Sync 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 SyncResult
11
+
12
+
13
+ def _build_request_args(
14
+ source_url: str,
15
+ x_api_key: str | None = None,
16
+ ) -> dict[str, Any]:
17
+ """Build request arguments."""
18
+ url = "/api/admin/sync/worlds"
19
+
20
+ params: dict[str, Any] = {}
21
+ if source_url is not None:
22
+ params["source_url"] = source_url
23
+
24
+ headers: dict[str, str] = {}
25
+ if x_api_key is not None:
26
+ headers["X-API-Key"] = x_api_key
27
+
28
+ return {
29
+ "method": "POST",
30
+ "url": url,
31
+ "params": params,
32
+ "headers": headers,
33
+ }
34
+
35
+
36
+ def sync(
37
+ client: httpx.Client,
38
+ source_url: str,
39
+ x_api_key: str | None = None,
40
+ ) -> SyncResult:
41
+ """Sync worlds from source Chronos to local database."""
42
+
43
+ request_args = _build_request_args(
44
+ source_url=source_url,
45
+ x_api_key=x_api_key,
46
+ )
47
+
48
+ response = client.request(**request_args)
49
+ raise_for_status(response)
50
+ return SyncResult.model_validate(response.json())
51
+
52
+
53
+ async def asyncio(
54
+ client: httpx.AsyncClient,
55
+ source_url: str,
56
+ x_api_key: str | None = None,
57
+ ) -> SyncResult:
58
+ """Sync worlds from source Chronos to local database."""
59
+
60
+ request_args = _build_request_args(
61
+ source_url=source_url,
62
+ x_api_key=x_api_key,
63
+ )
64
+
65
+ response = await client.request(**request_args)
66
+ raise_for_status(response)
67
+ return SyncResult.model_validate(response.json())
@@ -7,7 +7,7 @@ from typing import Any
7
7
  import httpx
8
8
 
9
9
  from plato.chronos.errors import raise_for_status
10
- from plato.chronos.models import AgentListResponse
10
+ from plato.chronos.models import ChronosModelsAgentAgentListResponse
11
11
 
12
12
 
13
13
  def _build_request_args(
@@ -30,7 +30,7 @@ def _build_request_args(
30
30
  def sync(
31
31
  client: httpx.Client,
32
32
  x_api_key: str | None = None,
33
- ) -> AgentListResponse:
33
+ ) -> ChronosModelsAgentAgentListResponse:
34
34
  """List all agents for the org."""
35
35
 
36
36
  request_args = _build_request_args(
@@ -39,13 +39,13 @@ def sync(
39
39
 
40
40
  response = client.request(**request_args)
41
41
  raise_for_status(response)
42
- return AgentListResponse.model_validate(response.json())
42
+ return ChronosModelsAgentAgentListResponse.model_validate(response.json())
43
43
 
44
44
 
45
45
  async def asyncio(
46
46
  client: httpx.AsyncClient,
47
47
  x_api_key: str | None = None,
48
- ) -> AgentListResponse:
48
+ ) -> ChronosModelsAgentAgentListResponse:
49
49
  """List all agents for the org."""
50
50
 
51
51
  request_args = _build_request_args(
@@ -54,4 +54,4 @@ async def asyncio(
54
54
 
55
55
  response = await client.request(**request_args)
56
56
  raise_for_status(response)
57
- return AgentListResponse.model_validate(response.json())
57
+ return ChronosModelsAgentAgentListResponse.model_validate(response.json())
@@ -0,0 +1,8 @@
1
+ """API endpoints."""
2
+
3
+ from . import list_checkpoints, preview_checkpoint
4
+
5
+ __all__ = [
6
+ "preview_checkpoint",
7
+ "list_checkpoints",
8
+ ]
@@ -0,0 +1,52 @@
1
+ """List Checkpoints"""
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 CheckpointListResponse
11
+
12
+
13
+ def _build_request_args(
14
+ session_id: str,
15
+ ) -> dict[str, Any]:
16
+ """Build request arguments."""
17
+ url = f"/api/checkpoints/session/{session_id}"
18
+
19
+ return {
20
+ "method": "GET",
21
+ "url": url,
22
+ }
23
+
24
+
25
+ def sync(
26
+ client: httpx.Client,
27
+ session_id: str,
28
+ ) -> CheckpointListResponse:
29
+ """List all checkpoints for a Chronos session."""
30
+
31
+ request_args = _build_request_args(
32
+ session_id=session_id,
33
+ )
34
+
35
+ response = client.request(**request_args)
36
+ raise_for_status(response)
37
+ return CheckpointListResponse.model_validate(response.json())
38
+
39
+
40
+ async def asyncio(
41
+ client: httpx.AsyncClient,
42
+ session_id: str,
43
+ ) -> CheckpointListResponse:
44
+ """List all checkpoints for a Chronos session."""
45
+
46
+ request_args = _build_request_args(
47
+ session_id=session_id,
48
+ )
49
+
50
+ response = await client.request(**request_args)
51
+ raise_for_status(response)
52
+ return CheckpointListResponse.model_validate(response.json())