diff --git a/packages/cli/package.json b/packages/cli/package.json
index b8a65708..790305e4 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@abox-dev/cli",
- "version": "0.1.4",
+ "version": "0.1.5",
"description": "CLI for AgentBox sandboxes and templates",
"homepage": "https://docs.agentbox.ru/en/cli/",
"license": "MIT",
diff --git a/packages/code-interpreter-js/package.json b/packages/code-interpreter-js/package.json
index 1dfa7308..ffa3f29b 100644
--- a/packages/code-interpreter-js/package.json
+++ b/packages/code-interpreter-js/package.json
@@ -1,6 +1,6 @@
{
"name": "@abox-dev/code-interpreter",
- "version": "0.1.4",
+ "version": "0.1.5",
"packageManager": "pnpm@10.34.5",
"description": "AgentBox Code Interpreter - Stateful code execution",
"homepage": "https://docs.agentbox.ru/en/sdk/code-interpreter/",
diff --git a/packages/code-interpreter-python/package.json b/packages/code-interpreter-python/package.json
index 86e190e0..a9f2b717 100644
--- a/packages/code-interpreter-python/package.json
+++ b/packages/code-interpreter-python/package.json
@@ -1,7 +1,7 @@
{
"name": "@abox-dev/code-interpreter-python",
"private": true,
- "version": "0.1.4",
+ "version": "0.1.5",
"scripts": {
"test": "uv run pytest -n 2 --verbose -x tests/test_sandbox_url.py",
"test:integration": "uv run pytest -n 2 --verbose -x",
diff --git a/packages/code-interpreter-python/pyproject.toml b/packages/code-interpreter-python/pyproject.toml
index 52ae57a5..f27ca9f7 100644
--- a/packages/code-interpreter-python/pyproject.toml
+++ b/packages/code-interpreter-python/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "abox-code-interpreter"
-version = "0.1.4"
+version = "0.1.5"
description = "AgentBox Code Interpreter - Stateful code execution"
authors = [{ name = "RetailDriver LLC" }]
license = "MIT"
diff --git a/packages/code-interpreter-python/uv.lock b/packages/code-interpreter-python/uv.lock
index 158f9462..f3501d7c 100644
--- a/packages/code-interpreter-python/uv.lock
+++ b/packages/code-interpreter-python/uv.lock
@@ -16,7 +16,7 @@ members = [
[[package]]
name = "abox-code-interpreter"
-version = "0.1.4"
+version = "0.1.5"
source = { editable = "." }
dependencies = [
{ name = "abox-sdk" },
@@ -58,7 +58,7 @@ dev = [
[[package]]
name = "abox-sdk"
-version = "0.1.4"
+version = "0.1.5"
source = { editable = "../python-sdk" }
dependencies = [
{ name = "attrs" },
diff --git a/packages/go-sdk/README.md b/packages/go-sdk/README.md
index 8c777361..2b9a648b 100644
--- a/packages/go-sdk/README.md
+++ b/packages/go-sdk/README.md
@@ -44,8 +44,8 @@ func main() {
Code Interpreter is available from
`github.com/abox-dev/sdk/packages/go-sdk/codeinterpreter`.
-API reference for this release: [core SDK on pkg.go.dev](https://pkg.go.dev/github.com/abox-dev/sdk/packages/go-sdk@v0.1.4) and
-[Code Interpreter on pkg.go.dev](https://pkg.go.dev/github.com/abox-dev/sdk/packages/go-sdk/codeinterpreter@v0.1.4).
+API reference for this release: [core SDK on pkg.go.dev](https://pkg.go.dev/github.com/abox-dev/sdk/packages/go-sdk@v0.1.5) and
+[Code Interpreter on pkg.go.dev](https://pkg.go.dev/github.com/abox-dev/sdk/packages/go-sdk/codeinterpreter@v0.1.5).
Documentation: [core SDK](https://docs.agentbox.ru/en/sdk/),
[sandboxes](https://docs.agentbox.ru/en/sdk/sandboxes/),
diff --git a/packages/go-sdk/internal/gen/api/client.gen.go b/packages/go-sdk/internal/gen/api/client.gen.go
index 236b3fab..3dfd74fa 100644
--- a/packages/go-sdk/internal/gen/api/client.gen.go
+++ b/packages/go-sdk/internal/gen/api/client.gen.go
@@ -949,6 +949,9 @@ type N409 = Error
// N500 defines model for 500.
type N500 = Error
+// N503 defines model for 503.
+type N503 = Error
+
// GetSandboxesMetricsParams defines parameters for GetSandboxesMetrics.
type GetSandboxesMetricsParams struct {
// SandboxIds Comma-separated list of sandbox IDs to get metrics for
@@ -3654,6 +3657,7 @@ type PostSandboxesResponse struct {
JSON400 *N400
JSON401 *N401
JSON500 *N500
+ JSON503 *N503
}
// Status returns HTTPResponse.Status
@@ -4970,6 +4974,13 @@ func ParsePostSandboxesResponse(rsp *http.Response) (*PostSandboxesResponse, err
}
response.JSON500 = &dest
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 503:
+ var dest N503
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON503 = &dest
+
}
return response, nil
diff --git a/packages/go-sdk/version.go b/packages/go-sdk/version.go
index 77627826..c5983de5 100644
--- a/packages/go-sdk/version.go
+++ b/packages/go-sdk/version.go
@@ -1,4 +1,4 @@
package agentbox
// Version is the AgentBox SDK release version.
-const Version = "0.1.4"
+const Version = "0.1.5"
diff --git a/packages/js-sdk/package.json b/packages/js-sdk/package.json
index 80beef65..b3f5fd45 100644
--- a/packages/js-sdk/package.json
+++ b/packages/js-sdk/package.json
@@ -1,6 +1,6 @@
{
"name": "@abox-dev/sdk",
- "version": "0.1.4",
+ "version": "0.1.5",
"description": "AgentBox SDK for secure cloud sandboxes",
"homepage": "https://docs.agentbox.ru/en/sdk/",
"license": "MIT",
diff --git a/packages/js-sdk/src/api/schema.gen.ts b/packages/js-sdk/src/api/schema.gen.ts
index 9921ef6e..f56f42fa 100644
--- a/packages/js-sdk/src/api/schema.gen.ts
+++ b/packages/js-sdk/src/api/schema.gen.ts
@@ -42,6 +42,7 @@ export interface paths {
400: components["responses"]["400"];
401: components["responses"]["401"];
500: components["responses"]["500"];
+ 503: components["responses"]["503"];
};
};
delete?: never;
@@ -1797,10 +1798,16 @@ export interface components {
/** @description Identifier of the node */
id: string;
machineInfo: components["schemas"]["MachineInfo"];
+ /**
+ * Format: uint32
+ * @description Runtime maintenance contract version reported by ServiceInfo
+ */
+ maintenanceVersion: number;
metrics: components["schemas"]["NodeMetrics"];
+ roles: components["schemas"]["NodeRole"][];
/**
* Format: uint32
- * @description Number of sandboxes running on the node
+ * @description Number of sandboxes running on the node; for template builders this is not an outstanding build count.
*/
sandboxCount: number;
/**
@@ -1837,10 +1844,16 @@ export interface components {
/** @description Identifier of the node */
id: string;
machineInfo: components["schemas"]["MachineInfo"];
+ /**
+ * Format: uint32
+ * @description Runtime maintenance contract version reported by ServiceInfo
+ */
+ maintenanceVersion: number;
metrics: components["schemas"]["NodeMetrics"];
+ roles: components["schemas"]["NodeRole"][];
/**
* Format: uint32
- * @description Number of sandboxes running on the node
+ * @description Number of sandboxes running on the node; for template builders this is not an outstanding build count.
*/
sandboxCount: number;
/** @description Service instance identifier of the node */
@@ -1909,6 +1922,8 @@ export interface components {
*/
memoryUsedBytes: number;
};
+ /** @enum {string} */
+ NodeRole: "worker" | "template-builder";
/**
* @description Status of the node.
* - draining: the node is bound to be shut down. It will not accept new sandboxes and will stop once all existing sandboxes are done.
@@ -2566,6 +2581,15 @@ export interface components {
"application/json": components["schemas"]["Error"];
};
};
+ /** @description Service temporarily unavailable */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Error"];
+ };
+ };
};
parameters: {
accessTokenID: string;
diff --git a/packages/python-sdk/agentbox/api/client/api/sandboxes/post_sandboxes.py b/packages/python-sdk/agentbox/api/client/api/sandboxes/post_sandboxes.py
index 856042fc..6cc1e08b 100644
--- a/packages/python-sdk/agentbox/api/client/api/sandboxes/post_sandboxes.py
+++ b/packages/python-sdk/agentbox/api/client/api/sandboxes/post_sandboxes.py
@@ -49,6 +49,10 @@ def _parse_response(
response_500 = Error.from_dict(response.json())
return response_500
+ if response.status_code == 503:
+ response_503 = Error.from_dict(response.json())
+
+ return response_503
if client.raise_on_unexpected_status:
raise errors.UnexpectedStatus(response.status_code, response.content)
else:
diff --git a/packages/python-sdk/agentbox/api/client/models/__init__.py b/packages/python-sdk/agentbox/api/client/models/__init__.py
index 22640c74..c0a9088a 100644
--- a/packages/python-sdk/agentbox/api/client/models/__init__.py
+++ b/packages/python-sdk/agentbox/api/client/models/__init__.py
@@ -29,6 +29,7 @@
from .node import Node
from .node_detail import NodeDetail
from .node_metrics import NodeMetrics
+from .node_role import NodeRole
from .node_status import NodeStatus
from .node_status_change import NodeStatusChange
from .resumed_sandbox import ResumedSandbox
@@ -115,6 +116,7 @@
"Node",
"NodeDetail",
"NodeMetrics",
+ "NodeRole",
"NodeStatus",
"NodeStatusChange",
"ResumedSandbox",
diff --git a/packages/python-sdk/agentbox/api/client/models/node.py b/packages/python-sdk/agentbox/api/client/models/node.py
index dfae913b..16ab4779 100644
--- a/packages/python-sdk/agentbox/api/client/models/node.py
+++ b/packages/python-sdk/agentbox/api/client/models/node.py
@@ -6,6 +6,7 @@
from attrs import field as _attrs_field
from dateutil.parser import isoparse
+from ..models.node_role import NodeRole
from ..models.node_status import NodeStatus
if TYPE_CHECKING:
@@ -20,6 +21,8 @@
class Node:
"""
Attributes:
+ roles (list[NodeRole]):
+ maintenance_version (int): Runtime maintenance contract version reported by ServiceInfo
version (str): Version of the orchestrator
commit (str): Commit of the orchestrator
id (str): Identifier of the node
@@ -31,13 +34,16 @@ class Node:
sandboxes are done.
- standby: the node is not actively used, but it can return to ready and continue serving traffic.
status_changed_at (datetime.datetime): Time when the node status was last changed
- sandbox_count (int): Number of sandboxes running on the node
+ sandbox_count (int): Number of sandboxes running on the node; for template builders this is not an outstanding
+ build count.
metrics (NodeMetrics): Node metrics
create_successes (int): Number of sandbox create successes
create_fails (int): Number of sandbox create fails
sandbox_starting_count (int): Number of starting Sandboxes
"""
+ roles: list[NodeRole]
+ maintenance_version: int
version: str
commit: str
id: str
@@ -54,6 +60,13 @@ class Node:
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
def to_dict(self) -> dict[str, Any]:
+ roles = []
+ for roles_item_data in self.roles:
+ roles_item = roles_item_data.value
+ roles.append(roles_item)
+
+ maintenance_version = self.maintenance_version
+
version = self.version
commit = self.commit
@@ -84,6 +97,8 @@ def to_dict(self) -> dict[str, Any]:
field_dict.update(self.additional_properties)
field_dict.update(
{
+ "roles": roles,
+ "maintenanceVersion": maintenance_version,
"version": version,
"commit": commit,
"id": id,
@@ -108,6 +123,15 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
from ..models.node_metrics import NodeMetrics
d = dict(src_dict)
+ roles = []
+ _roles = d.pop("roles")
+ for roles_item_data in _roles:
+ roles_item = NodeRole(roles_item_data)
+
+ roles.append(roles_item)
+
+ maintenance_version = d.pop("maintenanceVersion")
+
version = d.pop("version")
commit = d.pop("commit")
@@ -135,6 +159,8 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
sandbox_starting_count = d.pop("sandboxStartingCount")
node = cls(
+ roles=roles,
+ maintenance_version=maintenance_version,
version=version,
commit=commit,
id=id,
diff --git a/packages/python-sdk/agentbox/api/client/models/node_detail.py b/packages/python-sdk/agentbox/api/client/models/node_detail.py
index b5b5c014..3c2ef48f 100644
--- a/packages/python-sdk/agentbox/api/client/models/node_detail.py
+++ b/packages/python-sdk/agentbox/api/client/models/node_detail.py
@@ -6,6 +6,7 @@
from attrs import field as _attrs_field
from dateutil.parser import isoparse
+from ..models.node_role import NodeRole
from ..models.node_status import NodeStatus
if TYPE_CHECKING:
@@ -20,6 +21,8 @@
class NodeDetail:
"""
Attributes:
+ roles (list[NodeRole]):
+ maintenance_version (int): Runtime maintenance contract version reported by ServiceInfo
cluster_id (str): Identifier of the cluster
version (str): Version of the orchestrator
commit (str): Commit of the orchestrator
@@ -31,12 +34,15 @@ class NodeDetail:
sandboxes are done.
- standby: the node is not actively used, but it can return to ready and continue serving traffic.
status_changed_at (datetime.datetime): Time when the node status was last changed
- sandbox_count (int): Number of sandboxes running on the node
+ sandbox_count (int): Number of sandboxes running on the node; for template builders this is not an outstanding
+ build count.
metrics (NodeMetrics): Node metrics
create_successes (int): Number of sandbox create successes
create_fails (int): Number of sandbox create fails
"""
+ roles: list[NodeRole]
+ maintenance_version: int
cluster_id: str
version: str
commit: str
@@ -52,6 +58,13 @@ class NodeDetail:
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
def to_dict(self) -> dict[str, Any]:
+ roles = []
+ for roles_item_data in self.roles:
+ roles_item = roles_item_data.value
+ roles.append(roles_item)
+
+ maintenance_version = self.maintenance_version
+
cluster_id = self.cluster_id
version = self.version
@@ -80,6 +93,8 @@ def to_dict(self) -> dict[str, Any]:
field_dict.update(self.additional_properties)
field_dict.update(
{
+ "roles": roles,
+ "maintenanceVersion": maintenance_version,
"clusterID": cluster_id,
"version": version,
"commit": commit,
@@ -103,6 +118,15 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
from ..models.node_metrics import NodeMetrics
d = dict(src_dict)
+ roles = []
+ _roles = d.pop("roles")
+ for roles_item_data in _roles:
+ roles_item = NodeRole(roles_item_data)
+
+ roles.append(roles_item)
+
+ maintenance_version = d.pop("maintenanceVersion")
+
cluster_id = d.pop("clusterID")
version = d.pop("version")
@@ -128,6 +152,8 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
create_fails = d.pop("createFails")
node_detail = cls(
+ roles=roles,
+ maintenance_version=maintenance_version,
cluster_id=cluster_id,
version=version,
commit=commit,
diff --git a/packages/python-sdk/agentbox/api/client/models/node_role.py b/packages/python-sdk/agentbox/api/client/models/node_role.py
new file mode 100644
index 00000000..80a30c74
--- /dev/null
+++ b/packages/python-sdk/agentbox/api/client/models/node_role.py
@@ -0,0 +1,9 @@
+from enum import Enum
+
+
+class NodeRole(str, Enum):
+ TEMPLATE_BUILDER = "template-builder"
+ WORKER = "worker"
+
+ def __str__(self) -> str:
+ return str(self.value)
diff --git a/packages/python-sdk/package.json b/packages/python-sdk/package.json
index 811e3b7a..0ca08e10 100644
--- a/packages/python-sdk/package.json
+++ b/packages/python-sdk/package.json
@@ -1,7 +1,7 @@
{
"name": "@abox-dev/python-sdk",
"private": true,
- "version": "0.1.4",
+ "version": "0.1.5",
"scripts": {
"test": "uv run pytest -n 4 --verbose -x tests/test_*.py tests/shared",
"test:integration": "uv run pytest -n 4 --verbose -x tests/sync tests/async",
diff --git a/packages/python-sdk/pyproject.toml b/packages/python-sdk/pyproject.toml
index 3cb453c9..02ea6825 100644
--- a/packages/python-sdk/pyproject.toml
+++ b/packages/python-sdk/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "abox-sdk"
-version = "0.1.4"
+version = "0.1.5"
description = "AgentBox SDK for secure cloud sandboxes"
authors = [{ name = "RetailDriver LLC" }]
license = "MIT"
diff --git a/packages/python-sdk/uv.lock b/packages/python-sdk/uv.lock
index 6d1646f2..3d49ed27 100644
--- a/packages/python-sdk/uv.lock
+++ b/packages/python-sdk/uv.lock
@@ -8,7 +8,7 @@ resolution-markers = [
[[package]]
name = "abox-sdk"
-version = "0.1.4"
+version = "0.1.5"
source = { editable = "." }
dependencies = [
{ name = "attrs" },
diff --git a/reference/manifest.json b/reference/manifest.json
index 88308a90..f3672bda 100644
--- a/reference/manifest.json
+++ b/reference/manifest.json
@@ -2,12 +2,12 @@
"files": {
"connect/filesystem.md": "82a407c0ed5bd7cc707821ab73a943b6640a9e3793b354e9fc2a842bc799347e",
"connect/process.md": "7e0348bb046382f6c624659b5d8d1281c03df898c411f9502e8caea12f40b3f9",
- "openapi/control-plane.yml": "189a83a1177f0a64ad06a39cd0e6e4496bbcc2adec96fa4b083f325db2d75b52",
+ "openapi/control-plane.yml": "5c5c01d2be6377a5fcdc21c063d916978b7abd3a0c6edcf0d0a63d2a2d2908af",
"openapi/envd.yml": "334700432025fcdfd9f95f9e58d90e6290b835015a24f269548eba5500c0df4f",
"openapi/markdown/assignTemplateTags.md": "d537a5123d8d2f6a6e5bc533db96d530e372b8aa4a6dbad3808904ca59e232fb",
"openapi/markdown/composeFiles.md": "208ca29c5143720389bc82db267aa8aaa2e8e7780e8a6cd5c9e11717bb44c84a",
"openapi/markdown/connectSandbox.md": "f6fdd47bbc40c52b32e6f6513ff0919c0cd76e557d2e58131d0e5d309b28421d",
- "openapi/markdown/createSandbox.md": "5be57e2d56b48acade8416da552c7979edd8a01d71353ce03e4b6ffa716592a7",
+ "openapi/markdown/createSandbox.md": "3114c781a36a12a5f04ea0030dffaea9e29624d8b4273bb299f43c46ac2ea3f0",
"openapi/markdown/createSnapshot.md": "1af5dcb96e3217dfc98a54eb43cc721cdd58f875f88bd77cde0b4fe34df0cb0d",
"openapi/markdown/createTemplate.md": "1a8b379df9e0e03c7b1c1fe0308d693dc09e589c3d474ee521d71fe556a96db2",
"openapi/markdown/deleteTemplate.md": "c0dff20f19cb6d8958f8ee859154f9a2508bb0da6c6a4f8bdb517fd275974e83",
@@ -45,7 +45,7 @@
"sdk/cli/sandbox.md": "16b64c5a4e932eca2452e400e0faf154eba1d3c7373513aa7cd9744e02908313",
"sdk/cli/template.md": "f270b22b9ee10a9b954a14f24e04c5449b4d5823bb28002ffde3ed682594cfc5",
"sdk/go/code-interpreter.md": "9c56333b8181878d656baa27a4b56b768a0cb01c9d764f7ac8d52d32d8faa70c",
- "sdk/go/core.md": "41d700b3837e9aa7932779ba44186aaf0c54a6927ebaafa7945b0037b76db49e",
+ "sdk/go/core.md": "bfef1b73c0df94691e918838117ef2892baed56ffb2d1f12171898133265f09a",
"sdk/javascript/code-interpreter/README.md": "a787206eb86f81fc306b373ce20bc6c91464b0ab3c3ec7650eccbb6be5f676c5",
"sdk/javascript/code-interpreter/classes/Sandbox.md": "19d9f1f1e8847606a54d93c5a6e5d4c89f936a745866e8d6a2aa06758b605e60",
"sdk/javascript/code-interpreter/enumerations/ChartType.md": "cf1ba00cd3258cc88814b7215e101b0d775ceb15dd833636d58ae538d8107ec1",
@@ -182,14 +182,14 @@
"sdk/python/templates-async.md": "f5485b2595b9ccd9be8eda2990ed3341cddb39c5bcb0f9bdbcf9efc82dc8f3b3",
"sdk/python/templates-sync.md": "e1c5ce24c0e608ec0a3b248f0c19e90e521ec19a6e12626ecc23244afde3a249"
},
- "monoRevision": "559cf23aa80d22eeb1bd2769d4ab6646b8e40fcb",
+ "monoRevision": "a7d59d50e3dd84faee59aca08df1b5bb175266e6",
"packages": {
- "@abox-dev/cli": "0.1.4",
- "@abox-dev/code-interpreter": "0.1.4",
- "@abox-dev/sdk": "0.1.4",
- "abox-code-interpreter": "0.1.4",
- "abox-sdk": "0.1.4",
- "github.com/abox-dev/sdk/packages/go-sdk": "0.1.4"
+ "@abox-dev/cli": "0.1.5",
+ "@abox-dev/code-interpreter": "0.1.5",
+ "@abox-dev/sdk": "0.1.5",
+ "abox-code-interpreter": "0.1.5",
+ "abox-sdk": "0.1.5",
+ "github.com/abox-dev/sdk/packages/go-sdk": "0.1.5"
},
"schemaVersion": 1
}
diff --git a/reference/openapi/control-plane.yml b/reference/openapi/control-plane.yml
index 5208ac1d..fff382df 100644
--- a/reference/openapi/control-plane.yml
+++ b/reference/openapi/control-plane.yml
@@ -98,6 +98,12 @@ components:
application/json:
schema:
$ref: '#/components/schemas/Error'
+ '503':
+ description: Service temporarily unavailable
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
schemas:
TeamUser:
required:
@@ -1310,6 +1316,8 @@ paths:
$ref: '#/components/responses/400'
'500':
$ref: '#/components/responses/500'
+ '503':
+ $ref: '#/components/responses/503'
operationId: createSandbox
security:
- ApiKeyAuth: []
diff --git a/reference/openapi/markdown/createSandbox.md b/reference/openapi/markdown/createSandbox.md
index c72d3540..e450c6f2 100644
--- a/reference/openapi/markdown/createSandbox.md
+++ b/reference/openapi/markdown/createSandbox.md
@@ -205,3 +205,21 @@ Schema: `Error`
- **`message`** · `string` · required
Error
+
+### 503
+
+Service temporarily unavailable
+
+Content-Type: `application/json`
+
+Schema: `Error`
+
+- **`code`** · `integer` · required
+
+ Error code
+
+ Format: `int32`
+
+- **`message`** · `string` · required
+
+ Error
diff --git a/reference/sdk/go/core.md b/reference/sdk/go/core.md
index f991541b..fe0fef2e 100644
--- a/reference/sdk/go/core.md
+++ b/reference/sdk/go/core.md
@@ -261,7 +261,7 @@ Create a client, start a sandbox, and run a command:
Version is the AgentBox SDK release version.
- const Version = "0.1.4"
+ const Version = "0.1.5"
## func IAMTokenPlaceholder
diff --git a/scripts/public_openapi.py b/scripts/public_openapi.py
index 872a65cb..38a39c5d 100644
--- a/scripts/public_openapi.py
+++ b/scripts/public_openapi.py
@@ -5,9 +5,9 @@
from typing import Any
REMOVED_SCHEMAS = {
- "CreatedAccessToken",
+ "CatalogEntry",
+ "Mcp",
"NewVolume",
- "NewAccessToken",
"SandboxVolumeMount",
"TemplateLegacy",
"Volume",
@@ -15,7 +15,7 @@
"VolumeToken",
}
-CLIENT_REMOVED_PROPERTIES = {"volumeMounts"}
+CLIENT_REMOVED_PROPERTIES = {"mcp", "volumeMounts"}
REFERENCE_REMOVED_PROPERTIES = CLIENT_REMOVED_PROPERTIES | {
"envdAccessToken",
"trafficAccessToken",
diff --git a/spec/openapi.yml b/spec/openapi.yml
index dcac46c6..4eab0a14 100644
--- a/spec/openapi.yml
+++ b/spec/openapi.yml
@@ -189,6 +189,13 @@ components:
schema:
$ref: "#/components/schemas/Error"
+ "503":
+ description: Service temporarily unavailable
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Error"
+
schemas:
Team:
required:
@@ -296,6 +303,12 @@ components:
type: string
description: Environment variables for the sandbox
+ Mcp:
+ type: object
+ description: MCP configuration for the sandbox
+ additionalProperties: {}
+ nullable: true
+
SandboxNetworkConfig:
type: object
properties:
@@ -785,6 +798,8 @@ components:
$ref: "#/components/schemas/SandboxMetadata"
envVars:
$ref: "#/components/schemas/EnvVars"
+ mcp:
+ $ref: "#/components/schemas/Mcp"
iam:
$ref: "#/components/schemas/SandboxIam"
volumeMounts:
@@ -1318,6 +1333,17 @@ components:
type: boolean
description: Whether the step should be forced to run regardless of the cache
+ CatalogEntry:
+ type: object
+ required: [alias, description]
+ properties:
+ alias:
+ type: string
+ description: Bare global catalog name owned by the configured project.
+ description:
+ type: string
+ maxLength: 4096
+
TemplateBuildRequestV3:
properties:
name:
@@ -1725,8 +1751,15 @@ components:
type: string
description: CPU architecture of the node
+ NodeRole:
+ type: string
+ enum: [worker, template-builder]
+ x-enum-varnames: [NodeRoleWorker, NodeRoleTemplateBuilder]
+
Node:
required:
+ - roles
+ - maintenanceVersion
- id
- serviceInstanceID
- clusterID
@@ -1741,6 +1774,14 @@ components:
- commit
- machineInfo
properties:
+ roles:
+ type: array
+ items:
+ $ref: "#/components/schemas/NodeRole"
+ maintenanceVersion:
+ type: integer
+ format: uint32
+ description: Runtime maintenance contract version reported by ServiceInfo
version:
type: string
description: Version of the orchestrator
@@ -1767,7 +1808,7 @@ components:
sandboxCount:
type: integer
format: uint32
- description: Number of sandboxes running on the node
+ description: Number of sandboxes running on the node; for template builders this is not an outstanding build count.
metrics:
$ref: "#/components/schemas/NodeMetrics"
createSuccesses:
@@ -1785,6 +1826,8 @@ components:
NodeDetail:
required:
+ - roles
+ - maintenanceVersion
- id
- serviceInstanceID
- clusterID
@@ -1798,6 +1841,14 @@ components:
- metrics
- machineInfo
properties:
+ roles:
+ type: array
+ items:
+ $ref: "#/components/schemas/NodeRole"
+ maintenanceVersion:
+ type: integer
+ format: uint32
+ description: Runtime maintenance contract version reported by ServiceInfo
clusterID:
type: string
description: Identifier of the cluster
@@ -1824,7 +1875,7 @@ components:
sandboxCount:
type: integer
format: uint32
- description: Number of sandboxes running on the node
+ description: Number of sandboxes running on the node; for template builders this is not an outstanding build count.
metrics:
$ref: "#/components/schemas/NodeMetrics"
createSuccesses:
@@ -1836,39 +1887,6 @@ components:
format: uint64
description: Number of sandbox create fails
- CreatedAccessToken:
- required:
- - id
- - name
- - token
- - mask
- - createdAt
- properties:
- id:
- type: string
- format: uuid
- description: Identifier of the access token
- name:
- type: string
- description: Name of the access token
- token:
- type: string
- description: The fully created access token
- mask:
- $ref: "#/components/schemas/IdentifierMaskingDetails"
- createdAt:
- type: string
- format: date-time
- description: Timestamp of access token creation
-
- NewAccessToken:
- required:
- - name
- properties:
- name:
- type: string
- description: Name of the access token
-
TeamAPIKey:
required:
- id
@@ -2103,12 +2121,20 @@ paths:
/health:
get:
summary: Health check
- description: Health check
+ description: API readiness, independent of runtime worker availability
responses:
- "204":
- description: The service is healthy
- "401":
- $ref: "#/components/responses/401"
+ "200":
+ description: The API is initialized and ready to accept requests
+ content:
+ text/plain:
+ schema:
+ type: string
+ "503":
+ description: The API is not ready or is draining
+ content:
+ text/plain:
+ schema:
+ type: string
/teams:
get:
@@ -2290,6 +2316,8 @@ paths:
$ref: "#/components/responses/400"
"500":
$ref: "#/components/responses/500"
+ "503":
+ $ref: "#/components/responses/503"
/v2/sandboxes:
get:
@@ -3537,10 +3565,43 @@ paths:
"500":
$ref: "#/components/responses/500"
+ /admin/templates/{templateID}/catalog:
+ post:
+ summary: Expose a template in the global catalog
+ description: Sets public visibility, global alias and storefront description. Requires a ready default; does not assign tags. Disabled without TEMPLATE_CATALOG_TEAM_ID and TEMPLATE_CATALOG_ALIASES.
+ tags: [admin]
+ security:
+ - AdminApiKeyAuth: []
+ parameters:
+ - $ref: "#/components/parameters/templateID"
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/CatalogEntry"
+ responses:
+ "204":
+ description: Catalog entry configured
+ "400":
+ $ref: "#/components/responses/400"
+ "401":
+ $ref: "#/components/responses/401"
+ "403":
+ $ref: "#/components/responses/403"
+ "404":
+ $ref: "#/components/responses/404"
+ "409":
+ $ref: "#/components/responses/409"
+ "503":
+ $ref: "#/components/responses/503"
+ "500":
+ $ref: "#/components/responses/500"
+
/nodes:
get:
summary: List nodes
- description: List all nodes
+ description: List workers and template builders, including draining and unhealthy runtimes. Records are unique by clusterID and id.
tags: [admin]
security:
- AdminApiKeyAuth: []
@@ -3569,7 +3630,7 @@ paths:
/nodes/{nodeID}:
get:
summary: Node info
- description: Get node info
+ description: Read current ServiceInfo from a known worker or template builder. An unreachable runtime returns 503.
tags: [admin]
security:
- AdminApiKeyAuth: []
@@ -3583,6 +3644,8 @@ paths:
type: string
format: uuid
responses:
+ "503":
+ $ref: "#/components/responses/503"
"200":
description: Successfully returned the node
content:
@@ -3597,7 +3660,7 @@ paths:
$ref: "#/components/responses/500"
post:
summary: Change node status
- description: Change status of a node
+ description: Change worker or template builder status; acknowledged only after the runtime persists the maintenance decision.
tags: [admin]
security:
- AdminApiKeyAuth: []
@@ -3609,6 +3672,10 @@ paths:
schema:
$ref: "#/components/schemas/NodeStatusChange"
responses:
+ "503":
+ $ref: "#/components/responses/503"
+ "400":
+ $ref: "#/components/responses/400"
"204":
description: The node status was changed successfully
"409":
@@ -3745,34 +3812,6 @@ paths:
"500":
$ref: "#/components/responses/500"
- /access-tokens:
- post:
- summary: Create access token
- description: Create a new access token. Deprecated; use an AgentBox project API key instead.
- deprecated: true
- tags: [access-tokens]
- security:
- - AuthProviderBearerAuth: []
- requestBody:
- required: true
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/NewAccessToken"
- responses:
- "201":
- description: Access token created successfully
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/CreatedAccessToken"
- "401":
- $ref: "#/components/responses/401"
- "410":
- $ref: "#/components/responses/410"
- "500":
- $ref: "#/components/responses/500"
-
/access-tokens/{accessTokenID}:
delete:
summary: Delete access token
diff --git a/spec/source.json b/spec/source.json
index 4c1505b9..7225745a 100644
--- a/spec/source.json
+++ b/spec/source.json
@@ -1,8 +1,8 @@
{
"source": "agentbox/mono",
- "revision": "559cf23aa80d22eeb1bd2769d4ab6646b8e40fcb",
+ "revision": "a7d59d50e3dd84faee59aca08df1b5bb175266e6",
"files": {
- "spec/openapi.yml": "9e4e6cbbb135d9319da25fcfe82ed90081f146630bed5e543d016d6d5dcf4ba8",
+ "spec/openapi.yml": "a68d01da364290267f3b50b99c23e01c8a921900828a794a66b5189b988eff7f",
"spec/envd/envd.yaml": "dab04a541720b813e837eb803074a8ae7e5611411b79a619bddf676e7e5fb324",
"spec/envd/filesystem/filesystem.proto": "1d862617d00478673b68953ee9849e9a500b3307796d76e3f0567c95da69f77b",
"spec/envd/process/process.proto": "8edd9358c7dbfcad96796b3f0ed8d14c262b8b14d6bc7d5e84d468941511b8e0"