@aexhq/sdk 0.40.6 → 0.40.8
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.
- package/README.md +159 -159
- package/dist/_contracts/asset-upload-helper.d.ts +38 -0
- package/dist/_contracts/asset-upload-helper.js +111 -0
- package/dist/_contracts/internal.d.ts +5 -9
- package/dist/_contracts/internal.js +5 -79
- package/dist/_contracts/operations.d.ts +9 -2
- package/dist/_contracts/operations.js +141 -16
- package/dist/_contracts/retry-core.d.ts +27 -0
- package/dist/_contracts/retry-core.js +75 -0
- package/dist/_contracts/runtime-types.d.ts +6 -0
- package/dist/_contracts/stable.d.ts +10 -5
- package/dist/_contracts/stable.js +10 -5
- package/dist/asset-upload.d.ts +2 -1
- package/dist/asset-upload.js +28 -61
- package/dist/asset-upload.js.map +1 -1
- package/dist/cli.mjs +297 -80
- package/dist/cli.mjs.sha256 +1 -1
- package/dist/client.d.ts +5 -0
- package/dist/client.js +8 -13
- package/dist/client.js.map +1 -1
- package/dist/retry.js +13 -41
- package/dist/retry.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/authentication.md +125 -125
- package/docs/billing.md +118 -118
- package/docs/concepts/agent-tools.md +66 -66
- package/docs/concepts/composition.md +37 -37
- package/docs/concepts/providers-and-runtimes.md +54 -54
- package/docs/concepts/runs.md +49 -49
- package/docs/concepts/subagents.md +88 -88
- package/docs/credentials.md +125 -125
- package/docs/defaults.md +64 -64
- package/docs/errors.md +196 -196
- package/docs/events.md +243 -243
- package/docs/limits-and-quotas.md +144 -144
- package/docs/limits.md +50 -50
- package/docs/mcp.md +44 -44
- package/docs/networking.md +163 -163
- package/docs/outputs.md +267 -267
- package/docs/public-surface.json +77 -77
- package/docs/quickstart.md +119 -119
- package/docs/release.md +38 -38
- package/docs/retries.md +129 -129
- package/docs/run-config.md +58 -58
- package/docs/run-record.md +55 -55
- package/docs/secrets.md +125 -125
- package/docs/testing.md +35 -35
- package/docs/vision-skills.md +91 -91
- package/docs/webhooks.md +127 -127
- package/examples/feature-tour.ts +282 -282
- package/examples/spike-settle-latency.ts +125 -125
- package/package.json +1 -1
|
@@ -1,144 +1,144 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Limits & quotas
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Limits & quotas
|
|
6
|
-
|
|
7
|
-
These are the hard ceilings and caps that bound a run, a workspace, and a single
|
|
8
|
-
request. Every value is mirrored from a single source-of-truth constant in the
|
|
9
|
-
platform's limits module; this page is hand-maintained against those constants.
|
|
10
|
-
If a value here ever disagrees with the constant, the constant wins.
|
|
11
|
-
|
|
12
|
-
Each row is named by its source-of-truth constant. For the values that apply
|
|
13
|
-
when you omit an option, see
|
|
14
|
-
[Defaults](defaults.md). For product/policy boundaries (what aex does and does
|
|
15
|
-
not promise), see [Limits](limits.md).
|
|
16
|
-
|
|
17
|
-
Each row is tagged with its **source**:
|
|
18
|
-
|
|
19
|
-
- **aex policy** — an aex platform ceiling, the same for every workspace.
|
|
20
|
-
- **Workspace default** — a per-workspace value with a configurable override.
|
|
21
|
-
|
|
22
|
-
And whether you can **raise** it: per-run option, per-plan, or no.
|
|
23
|
-
|
|
24
|
-
## Run scope
|
|
25
|
-
|
|
26
|
-
| Limit | Value | Source | Raisable? | Constant |
|
|
27
|
-
| --- | --- | --- | --- | --- |
|
|
28
|
-
| Maximum run timeout | 8 hours (also the default when `timeout` is omitted) | aex policy | Per plan (billing-driven) | `RUN_MAX_TIMEOUT_MS` |
|
|
29
|
-
| Minimum run timeout | 1 minute | aex policy | No (floor) | `RUN_MIN_TIMEOUT_MS` |
|
|
30
|
-
| Per-call exec timeout (default) | 30 minutes | aex policy | Per-call via the tool call's `timeoutMs` | `RUN_DEFAULT_EXEC_TIMEOUT_MS` |
|
|
31
|
-
| MCP connect timeout (default) | 30 seconds | aex policy | Per-port via `connectTimeoutMs` | `RUN_DEFAULT_MCP_CONNECT_TIMEOUT_MS` |
|
|
32
|
-
| MCP call timeout (default) | 30 minutes | aex policy | Per-port via `callTimeoutMs` | `RUN_DEFAULT_MCP_CALL_TIMEOUT_MS` |
|
|
33
|
-
| Per-session spend cap | None by default; when set, the session is stopped once its spend would exceed the cap | aex policy | Per-session via `overrides.maxSpendUsd` (a positive USD amount) | — |
|
|
34
|
-
| Max agent iterations (turns) per run | 20 by default; hard ceiling 200 | aex policy | Per-session via `overrides.maxTurns` (a positive integer, clamped to the ceiling) | `RUN_DEFAULT_MAX_TURNS` / `RUN_MAX_TURNS_CEILING` |
|
|
35
|
-
|
|
36
|
-
### Output capture (per run)
|
|
37
|
-
|
|
38
|
-
Files stream from the container to object storage one at a time. When a cap is
|
|
39
|
-
reached, remaining files are **dropped and counted in the summary**, never
|
|
40
|
-
silently lost.
|
|
41
|
-
|
|
42
|
-
| Limit | Value | Source | Raisable? | Constant |
|
|
43
|
-
| --- | --- | --- | --- | --- |
|
|
44
|
-
| Capture wall-clock budget | 1 hour | aex policy | No (hard ceiling) | `RUN_CAPTURE_DEFAULT_TIMEOUT_MS` |
|
|
45
|
-
| Max files captured | 50,000 | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_FILES` |
|
|
46
|
-
| Max bytes per captured file | 500 GB (decimal) | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_FILE_BYTES` |
|
|
47
|
-
| Max total captured bytes | 500 GB (decimal) | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_TOTAL_BYTES` |
|
|
48
|
-
|
|
49
|
-
### Tool output caps (per run)
|
|
50
|
-
|
|
51
|
-
| Limit | Value | Source | Raisable? | Constant |
|
|
52
|
-
| --- | --- | --- | --- | --- |
|
|
53
|
-
| `web_fetch` returned body | 500 KB (UTF-8) | aex policy | Per-call via `max_bytes` | `REQUEST_WEB_FETCH_DEFAULT_MAX_BYTES` |
|
|
54
|
-
| `bash_output` per-read body | 1 MB (UTF-8) | aex policy | No (hard ceiling) | `RUN_BASH_BG_OUTPUT_MAX_BYTES` |
|
|
55
|
-
| `grep` max file size (larger files skipped — use `bash grep`) | 25 MB | aex policy | No (hard ceiling) | `RUN_TOOL_GREP_MAX_FILE_BYTES` |
|
|
56
|
-
| `head`/`tail` max file size (larger files rejected — use `bash head`/`tail`) | 100 MB | aex policy | No (hard ceiling) | `RUN_TOOL_HEAD_TAIL_MAX_FILE_BYTES` |
|
|
57
|
-
| `grep`/`glob` files visited per recursive walk (then truncates with a notice) | 100,000 | aex policy | No (hard ceiling) | `RUN_TOOL_WALK_MAX_FILES` |
|
|
58
|
-
|
|
59
|
-
### Subagents (per run lineage)
|
|
60
|
-
|
|
61
|
-
| Limit | Value | Source | Raisable? | Constant |
|
|
62
|
-
| --- | --- | --- | --- | --- |
|
|
63
|
-
| Max subagent depth (`subagent` tool) | 5 (a depth-5 lineage may not spawn deeper) | aex policy | No public per-run override (subagents run in-process) | `RUN_MAX_PUBLIC_SUBAGENT_DEPTH` |
|
|
64
|
-
| Concurrent child runs per lineage root | 1000 live (non-terminal); hard ceiling 4096 | aex policy | No public per-run override (subagents run in-process) | `RUN_DEFAULT_MAX_CONCURRENT_CHILD_RUNS` |
|
|
65
|
-
|
|
66
|
-
### Retention (per run)
|
|
67
|
-
|
|
68
|
-
| Limit | Value | Source | Raisable? | Constant |
|
|
69
|
-
| --- | --- | --- | --- | --- |
|
|
70
|
-
| Per-run metadata record TTL | 24 hours | aex policy | No (hard ceiling) | `RUN_KV_RECORD_TTL_SECONDS` |
|
|
71
|
-
| Per-run secret-envelope TTL | 24 hours | aex policy | No (hard ceiling) | `RUN_KV_SECRET_TTL_SECONDS` |
|
|
72
|
-
|
|
73
|
-
## Sandbox (managed runtime)
|
|
74
|
-
|
|
75
|
-
Each run executes in an ephemeral Linux container sized by the `runtime` preset.
|
|
76
|
-
A few behaviours are worth knowing before you rely on the filesystem or RAM:
|
|
77
|
-
|
|
78
|
-
- **Only `/workspace` persists across turns** of the same session. Everything
|
|
79
|
-
outside `/workspace` is reset between turns and is gone when the session ends —
|
|
80
|
-
write deliverables and any state you want to survive a turn under `/workspace`.
|
|
81
|
-
- **The image is minimal.** Declare OS/language packages with
|
|
82
|
-
`environment.packages` so they are present deterministically at boot. A runtime
|
|
83
|
-
install inside the agent (`pip install`, `apt-get`) is best-effort and
|
|
84
|
-
**non-persistent** (reset next turn), and `pip` is subject to PEP 668
|
|
85
|
-
(`externally-managed-environment`) — prefer `environment.packages`, or a
|
|
86
|
-
virtualenv you create under `/workspace`.
|
|
87
|
-
- **`/proc/meminfo` reports the HOST's RAM, not your preset's.** Your actual
|
|
88
|
-
memory ceiling is the preset's `memoryMb` (e.g. `shared-0.25x-1gb` = 1 GB, the
|
|
89
|
-
default; `shared-4x-12gb` = 12 GB). The presets are the SSoT in
|
|
90
|
-
[`packages/contracts/src/runtime-sizes.ts`](https://github.com/aexhq/aex/blob/main/packages/contracts/src/runtime-sizes.ts);
|
|
91
|
-
see [Defaults](defaults.md).
|
|
92
|
-
- **The agent loop is bounded** by `maxTurns` (default 20, ceiling 200) — a
|
|
93
|
-
documented, per-run-overridable limit (see the Run scope table above and
|
|
94
|
-
`overrides.maxTurns`), not a silent cutoff.
|
|
95
|
-
|
|
96
|
-
## Workspace scope
|
|
97
|
-
|
|
98
|
-
| Limit | Value | Source | Raisable? | Constant |
|
|
99
|
-
| --- | --- | --- | --- | --- |
|
|
100
|
-
| Workspace storage cap | 500 GB (decimal; admins uncapped — not a customer entitlement) | Workspace default | Per-plane via env `AEX_WORKSPACE_STORAGE_CAP_BYTES` | `WORKSPACE_DEFAULT_STORAGE_CAP_BYTES` |
|
|
101
|
-
| Max concurrent runs per workspace | Plan-based: **5** live (non-terminal) root runs on the free plan, **50** on Pro, **200** on Team; hard platform ceiling **200**. One more submit past the cap fails with `429 workspace_concurrency_exceeded` (see [Errors](errors.md)). Subagent children are governed separately by the per-lineage caps below. Read your effective cap from `aex.whoami().limits.maxConcurrentRuns`. | Workspace default (per plan) | Per-plan (upgrade) or per-workspace override (contact support), clamped to the 200 ceiling | `PLANS[planKey].maxConcurrentRuns` / `WORKSPACE_MAX_CONCURRENT_RUNS_CEILING` |
|
|
102
|
-
| Monthly workspace spend cap | **$250** per rolling UTC calendar month by default; `0` = unlimited. A submit past the cap fails with `402 workspace_spend_cap_exceeded` (see [Errors](errors.md)). | Workspace default | Per-workspace override (contact support) | `WORKSPACE_DEFAULT_SPEND_CAP_USD` |
|
|
103
|
-
| Skill bundle max compressed size (`.zip`) | 10 GiB (enforced at upload by the SDK and re-enforced server-side) | aex policy | No (hard ceiling) | `SKILL_BUNDLE_LIMITS.maxCompressedBytes` |
|
|
104
|
-
| Skill bundle max decompressed size (sum of uncompressed file sizes) | 50 MB | aex policy | No (hard ceiling) | `SKILL_BUNDLE_LIMITS.maxDecompressedBytes` |
|
|
105
|
-
| Skill bundle max file entries | 1,000 | Workspace default | Per-workspace (plan/env) | `WORKSPACE_SKILL_BUNDLE_MAX_FILES` |
|
|
106
|
-
| Skill bundle max directory depth (`a/b/c/d` = 4) | 16 | Workspace default | Per-workspace (plan/env) | `WORKSPACE_SKILL_BUNDLE_MAX_DEPTH` |
|
|
107
|
-
| Skill bundle max entry path length | 512 characters | Workspace default | No (hard ceiling) | `WORKSPACE_SKILL_BUNDLE_MAX_PATH_LENGTH` |
|
|
108
|
-
| `File.mountPath` max length | 512 characters | Workspace default | No (hard ceiling) | `WORKSPACE_MOUNT_PATH_MAX_LENGTH` |
|
|
109
|
-
|
|
110
|
-
### Rate limits (per workspace, per minute)
|
|
111
|
-
|
|
112
|
-
Run submission has its own platform-enforced velocity cap: **120 submits per
|
|
113
|
-
minute** per workspace by default (`0` = disabled). Past it, `POST /runs` fails
|
|
114
|
-
with `429 workspace_submit_rate_exceeded` (see [Errors](errors.md)). It is
|
|
115
|
-
overridable per-plane via `AEX_WORKSPACE_SUBMIT_RATE_PER_MIN` or per-workspace
|
|
116
|
-
via support.
|
|
117
|
-
|
|
118
|
-
The dashboard mutation actions below default as listed; each is overridable
|
|
119
|
-
per-plane via the matching `AEX_RATE_LIMIT_<ACTION>_PER_MINUTE` env var.
|
|
120
|
-
|
|
121
|
-
| Action | Default per minute | Source | Constant |
|
|
122
|
-
| --- | --- | --- | --- |
|
|
123
|
-
| Run cancel | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
|
|
124
|
-
| Run delete | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
|
|
125
|
-
| Signed output link | 120 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
|
|
126
|
-
| API key create | 10 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
|
|
127
|
-
| API key delete | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
|
|
128
|
-
|
|
129
|
-
### Introspecting your effective caps
|
|
130
|
-
|
|
131
|
-
`aex.whoami()` (CLI: `aex whoami`) returns a `limits` object carrying the
|
|
132
|
-
workspace's *effective* values for the caps above — `maxConcurrentRuns`,
|
|
133
|
-
`submitRatePerMinute`, `spendCapUsd`, plus the live `monthSpendUsd`,
|
|
134
|
-
`balanceUsd`, `balanceGraceFloorUsd`, and `paymentMethodStatus` — resolved by
|
|
135
|
-
the same code the admission gates use, so you can anticipate a `429`/`402`
|
|
136
|
-
before submitting. See [Authentication](authentication.md) and
|
|
137
|
-
[Errors](errors.md).
|
|
138
|
-
|
|
139
|
-
## Request Scope
|
|
140
|
-
|
|
141
|
-
| Limit | Value | Source | Raisable? | Constant |
|
|
142
|
-
| --- | --- | --- | --- | --- |
|
|
143
|
-
| Signed output URL TTL | 300 seconds | aex policy | Per-call via `expiresSeconds` | `REQUEST_PRESIGN_URL_DEFAULT_TTL_SECONDS` |
|
|
144
|
-
| Event-stream connection ticket TTL | 60 seconds | aex policy | Per-mint via `ttlMs` | `REQUEST_TICKET_DEFAULT_TTL_MS` |
|
|
1
|
+
---
|
|
2
|
+
title: Limits & quotas
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Limits & quotas
|
|
6
|
+
|
|
7
|
+
These are the hard ceilings and caps that bound a run, a workspace, and a single
|
|
8
|
+
request. Every value is mirrored from a single source-of-truth constant in the
|
|
9
|
+
platform's limits module; this page is hand-maintained against those constants.
|
|
10
|
+
If a value here ever disagrees with the constant, the constant wins.
|
|
11
|
+
|
|
12
|
+
Each row is named by its source-of-truth constant. For the values that apply
|
|
13
|
+
when you omit an option, see
|
|
14
|
+
[Defaults](defaults.md). For product/policy boundaries (what aex does and does
|
|
15
|
+
not promise), see [Limits](limits.md).
|
|
16
|
+
|
|
17
|
+
Each row is tagged with its **source**:
|
|
18
|
+
|
|
19
|
+
- **aex policy** — an aex platform ceiling, the same for every workspace.
|
|
20
|
+
- **Workspace default** — a per-workspace value with a configurable override.
|
|
21
|
+
|
|
22
|
+
And whether you can **raise** it: per-run option, per-plan, or no.
|
|
23
|
+
|
|
24
|
+
## Run scope
|
|
25
|
+
|
|
26
|
+
| Limit | Value | Source | Raisable? | Constant |
|
|
27
|
+
| --- | --- | --- | --- | --- |
|
|
28
|
+
| Maximum run timeout | 8 hours (also the default when `timeout` is omitted) | aex policy | Per plan (billing-driven) | `RUN_MAX_TIMEOUT_MS` |
|
|
29
|
+
| Minimum run timeout | 1 minute | aex policy | No (floor) | `RUN_MIN_TIMEOUT_MS` |
|
|
30
|
+
| Per-call exec timeout (default) | 30 minutes | aex policy | Per-call via the tool call's `timeoutMs` | `RUN_DEFAULT_EXEC_TIMEOUT_MS` |
|
|
31
|
+
| MCP connect timeout (default) | 30 seconds | aex policy | Per-port via `connectTimeoutMs` | `RUN_DEFAULT_MCP_CONNECT_TIMEOUT_MS` |
|
|
32
|
+
| MCP call timeout (default) | 30 minutes | aex policy | Per-port via `callTimeoutMs` | `RUN_DEFAULT_MCP_CALL_TIMEOUT_MS` |
|
|
33
|
+
| Per-session spend cap | None by default; when set, the session is stopped once its spend would exceed the cap | aex policy | Per-session via `overrides.maxSpendUsd` (a positive USD amount) | — |
|
|
34
|
+
| Max agent iterations (turns) per run | 20 by default; hard ceiling 200 | aex policy | Per-session via `overrides.maxTurns` (a positive integer, clamped to the ceiling) | `RUN_DEFAULT_MAX_TURNS` / `RUN_MAX_TURNS_CEILING` |
|
|
35
|
+
|
|
36
|
+
### Output capture (per run)
|
|
37
|
+
|
|
38
|
+
Files stream from the container to object storage one at a time. When a cap is
|
|
39
|
+
reached, remaining files are **dropped and counted in the summary**, never
|
|
40
|
+
silently lost.
|
|
41
|
+
|
|
42
|
+
| Limit | Value | Source | Raisable? | Constant |
|
|
43
|
+
| --- | --- | --- | --- | --- |
|
|
44
|
+
| Capture wall-clock budget | 1 hour | aex policy | No (hard ceiling) | `RUN_CAPTURE_DEFAULT_TIMEOUT_MS` |
|
|
45
|
+
| Max files captured | 50,000 | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_FILES` |
|
|
46
|
+
| Max bytes per captured file | 500 GB (decimal) | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_FILE_BYTES` |
|
|
47
|
+
| Max total captured bytes | 500 GB (decimal) | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_TOTAL_BYTES` |
|
|
48
|
+
|
|
49
|
+
### Tool output caps (per run)
|
|
50
|
+
|
|
51
|
+
| Limit | Value | Source | Raisable? | Constant |
|
|
52
|
+
| --- | --- | --- | --- | --- |
|
|
53
|
+
| `web_fetch` returned body | 500 KB (UTF-8) | aex policy | Per-call via `max_bytes` | `REQUEST_WEB_FETCH_DEFAULT_MAX_BYTES` |
|
|
54
|
+
| `bash_output` per-read body | 1 MB (UTF-8) | aex policy | No (hard ceiling) | `RUN_BASH_BG_OUTPUT_MAX_BYTES` |
|
|
55
|
+
| `grep` max file size (larger files skipped — use `bash grep`) | 25 MB | aex policy | No (hard ceiling) | `RUN_TOOL_GREP_MAX_FILE_BYTES` |
|
|
56
|
+
| `head`/`tail` max file size (larger files rejected — use `bash head`/`tail`) | 100 MB | aex policy | No (hard ceiling) | `RUN_TOOL_HEAD_TAIL_MAX_FILE_BYTES` |
|
|
57
|
+
| `grep`/`glob` files visited per recursive walk (then truncates with a notice) | 100,000 | aex policy | No (hard ceiling) | `RUN_TOOL_WALK_MAX_FILES` |
|
|
58
|
+
|
|
59
|
+
### Subagents (per run lineage)
|
|
60
|
+
|
|
61
|
+
| Limit | Value | Source | Raisable? | Constant |
|
|
62
|
+
| --- | --- | --- | --- | --- |
|
|
63
|
+
| Max subagent depth (`subagent` tool) | 5 (a depth-5 lineage may not spawn deeper) | aex policy | No public per-run override (subagents run in-process) | `RUN_MAX_PUBLIC_SUBAGENT_DEPTH` |
|
|
64
|
+
| Concurrent child runs per lineage root | 1000 live (non-terminal); hard ceiling 4096 | aex policy | No public per-run override (subagents run in-process) | `RUN_DEFAULT_MAX_CONCURRENT_CHILD_RUNS` |
|
|
65
|
+
|
|
66
|
+
### Retention (per run)
|
|
67
|
+
|
|
68
|
+
| Limit | Value | Source | Raisable? | Constant |
|
|
69
|
+
| --- | --- | --- | --- | --- |
|
|
70
|
+
| Per-run metadata record TTL | 24 hours | aex policy | No (hard ceiling) | `RUN_KV_RECORD_TTL_SECONDS` |
|
|
71
|
+
| Per-run secret-envelope TTL | 24 hours | aex policy | No (hard ceiling) | `RUN_KV_SECRET_TTL_SECONDS` |
|
|
72
|
+
|
|
73
|
+
## Sandbox (managed runtime)
|
|
74
|
+
|
|
75
|
+
Each run executes in an ephemeral Linux container sized by the `runtime` preset.
|
|
76
|
+
A few behaviours are worth knowing before you rely on the filesystem or RAM:
|
|
77
|
+
|
|
78
|
+
- **Only `/workspace` persists across turns** of the same session. Everything
|
|
79
|
+
outside `/workspace` is reset between turns and is gone when the session ends —
|
|
80
|
+
write deliverables and any state you want to survive a turn under `/workspace`.
|
|
81
|
+
- **The image is minimal.** Declare OS/language packages with
|
|
82
|
+
`environment.packages` so they are present deterministically at boot. A runtime
|
|
83
|
+
install inside the agent (`pip install`, `apt-get`) is best-effort and
|
|
84
|
+
**non-persistent** (reset next turn), and `pip` is subject to PEP 668
|
|
85
|
+
(`externally-managed-environment`) — prefer `environment.packages`, or a
|
|
86
|
+
virtualenv you create under `/workspace`.
|
|
87
|
+
- **`/proc/meminfo` reports the HOST's RAM, not your preset's.** Your actual
|
|
88
|
+
memory ceiling is the preset's `memoryMb` (e.g. `shared-0.25x-1gb` = 1 GB, the
|
|
89
|
+
default; `shared-4x-12gb` = 12 GB). The presets are the SSoT in
|
|
90
|
+
[`packages/contracts/src/runtime-sizes.ts`](https://github.com/aexhq/aex/blob/main/packages/contracts/src/runtime-sizes.ts);
|
|
91
|
+
see [Defaults](defaults.md).
|
|
92
|
+
- **The agent loop is bounded** by `maxTurns` (default 20, ceiling 200) — a
|
|
93
|
+
documented, per-run-overridable limit (see the Run scope table above and
|
|
94
|
+
`overrides.maxTurns`), not a silent cutoff.
|
|
95
|
+
|
|
96
|
+
## Workspace scope
|
|
97
|
+
|
|
98
|
+
| Limit | Value | Source | Raisable? | Constant |
|
|
99
|
+
| --- | --- | --- | --- | --- |
|
|
100
|
+
| Workspace storage cap | 500 GB (decimal; admins uncapped — not a customer entitlement) | Workspace default | Per-plane via env `AEX_WORKSPACE_STORAGE_CAP_BYTES` | `WORKSPACE_DEFAULT_STORAGE_CAP_BYTES` |
|
|
101
|
+
| Max concurrent runs per workspace | Plan-based: **5** live (non-terminal) root runs on the free plan, **50** on Pro, **200** on Team; hard platform ceiling **200**. One more submit past the cap fails with `429 workspace_concurrency_exceeded` (see [Errors](errors.md)). Subagent children are governed separately by the per-lineage caps below. Read your effective cap from `aex.whoami().limits.maxConcurrentRuns`. | Workspace default (per plan) | Per-plan (upgrade) or per-workspace override (contact support), clamped to the 200 ceiling | `PLANS[planKey].maxConcurrentRuns` / `WORKSPACE_MAX_CONCURRENT_RUNS_CEILING` |
|
|
102
|
+
| Monthly workspace spend cap | **$250** per rolling UTC calendar month by default; `0` = unlimited. A submit past the cap fails with `402 workspace_spend_cap_exceeded` (see [Errors](errors.md)). | Workspace default | Per-workspace override (contact support) | `WORKSPACE_DEFAULT_SPEND_CAP_USD` |
|
|
103
|
+
| Skill bundle max compressed size (`.zip`) | 10 GiB (enforced at upload by the SDK and re-enforced server-side) | aex policy | No (hard ceiling) | `SKILL_BUNDLE_LIMITS.maxCompressedBytes` |
|
|
104
|
+
| Skill bundle max decompressed size (sum of uncompressed file sizes) | 50 MB | aex policy | No (hard ceiling) | `SKILL_BUNDLE_LIMITS.maxDecompressedBytes` |
|
|
105
|
+
| Skill bundle max file entries | 1,000 | Workspace default | Per-workspace (plan/env) | `WORKSPACE_SKILL_BUNDLE_MAX_FILES` |
|
|
106
|
+
| Skill bundle max directory depth (`a/b/c/d` = 4) | 16 | Workspace default | Per-workspace (plan/env) | `WORKSPACE_SKILL_BUNDLE_MAX_DEPTH` |
|
|
107
|
+
| Skill bundle max entry path length | 512 characters | Workspace default | No (hard ceiling) | `WORKSPACE_SKILL_BUNDLE_MAX_PATH_LENGTH` |
|
|
108
|
+
| `File.mountPath` max length | 512 characters | Workspace default | No (hard ceiling) | `WORKSPACE_MOUNT_PATH_MAX_LENGTH` |
|
|
109
|
+
|
|
110
|
+
### Rate limits (per workspace, per minute)
|
|
111
|
+
|
|
112
|
+
Run submission has its own platform-enforced velocity cap: **120 submits per
|
|
113
|
+
minute** per workspace by default (`0` = disabled). Past it, `POST /runs` fails
|
|
114
|
+
with `429 workspace_submit_rate_exceeded` (see [Errors](errors.md)). It is
|
|
115
|
+
overridable per-plane via `AEX_WORKSPACE_SUBMIT_RATE_PER_MIN` or per-workspace
|
|
116
|
+
via support.
|
|
117
|
+
|
|
118
|
+
The dashboard mutation actions below default as listed; each is overridable
|
|
119
|
+
per-plane via the matching `AEX_RATE_LIMIT_<ACTION>_PER_MINUTE` env var.
|
|
120
|
+
|
|
121
|
+
| Action | Default per minute | Source | Constant |
|
|
122
|
+
| --- | --- | --- | --- |
|
|
123
|
+
| Run cancel | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
|
|
124
|
+
| Run delete | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
|
|
125
|
+
| Signed output link | 120 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
|
|
126
|
+
| API key create | 10 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
|
|
127
|
+
| API key delete | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
|
|
128
|
+
|
|
129
|
+
### Introspecting your effective caps
|
|
130
|
+
|
|
131
|
+
`aex.whoami()` (CLI: `aex whoami`) returns a `limits` object carrying the
|
|
132
|
+
workspace's *effective* values for the caps above — `maxConcurrentRuns`,
|
|
133
|
+
`submitRatePerMinute`, `spendCapUsd`, plus the live `monthSpendUsd`,
|
|
134
|
+
`balanceUsd`, `balanceGraceFloorUsd`, and `paymentMethodStatus` — resolved by
|
|
135
|
+
the same code the admission gates use, so you can anticipate a `429`/`402`
|
|
136
|
+
before submitting. See [Authentication](authentication.md) and
|
|
137
|
+
[Errors](errors.md).
|
|
138
|
+
|
|
139
|
+
## Request Scope
|
|
140
|
+
|
|
141
|
+
| Limit | Value | Source | Raisable? | Constant |
|
|
142
|
+
| --- | --- | --- | --- | --- |
|
|
143
|
+
| Signed output URL TTL | 300 seconds | aex policy | Per-call via `expiresSeconds` | `REQUEST_PRESIGN_URL_DEFAULT_TTL_SECONDS` |
|
|
144
|
+
| Event-stream connection ticket TTL | 60 seconds | aex policy | Per-mint via `ttlMs` | `REQUEST_TICKET_DEFAULT_TTL_MS` |
|
package/docs/limits.md
CHANGED
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Limits
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Limits
|
|
6
|
-
|
|
7
|
-
aex runs autonomous agents on the hosted managed runtime. The SDK opens durable
|
|
8
|
-
sessions, sends turns, streams events, captures outputs, and exposes auth-gated
|
|
9
|
-
reads and downloads.
|
|
10
|
-
|
|
11
|
-
For what the product supports, see [Features](https://aex.dev/docs/features/).
|
|
12
|
-
For the current provider/model set, see the generated
|
|
13
|
-
[provider/runtime capability matrix](provider-runtime-capabilities.md).
|
|
14
|
-
|
|
15
|
-
## Current Defaults
|
|
16
|
-
|
|
17
|
-
| Area | Default |
|
|
18
|
-
| --- | --- |
|
|
19
|
-
| Workspace storage | 500 GB per workspace for captured outputs and workspace artifacts. aex-maintainer admin workspaces may be unlimited for internal dogfooding; this is not a customer entitlement. |
|
|
20
|
-
|
|
21
|
-
## Product Boundaries
|
|
22
|
-
|
|
23
|
-
| Area | Boundary |
|
|
24
|
-
| --- | --- |
|
|
25
|
-
| Runtime | New submissions run on the managed runtime. The `runtime` option selects a managed machine-size preset (`Sizes.*`); there is no alternative runtime backend. |
|
|
26
|
-
| Provider policy | Provider retention, training exclusion, HIPAA/BAA, data residency, abuse policy, and pricing belong to the selected provider account, endpoint, and contract. |
|
|
27
|
-
| Secrets | Provider keys, MCP credentials, and env secrets are caller-owned. aex excludes secret values from idempotency and uses the explicit secret surfaces described in [Secrets](secrets.md). |
|
|
28
|
-
| MCP servers | Remote MCP servers are customer-trusted systems. aex validates declarations and routes credentials; it does not make an untrusted MCP server safe. |
|
|
29
|
-
| Outputs | Captured outputs, events, and metadata are stored under the run record and downloaded through auth-gated routes. Output content is customer content. |
|
|
30
|
-
| Human review | Runs execute after submission. Cancellation is available, but aex does not pause a run for platform-mediated approval or interactive clarification. |
|
|
31
|
-
| Sessions | The durable product primitive is the session/run record. Sessions can be resumed by id and auto-suspend after the configured idle window; persistent named agent profiles and saved agent definitions are out of scope. |
|
|
32
|
-
| Deployment | The supported product is the hosted aex service plus the SDK and CLI. Alternate `baseUrl` values are for local, staging, or hosted aex API planes, not a self-host product promise. |
|
|
33
|
-
| Cost | BYOK provider-token charges accrue to the customer's provider account. aex records report-only telemetry for runtime and storage usage; free trials, billing-grade invoices, and public pricing documents are not shipped unless documented later. |
|
|
34
|
-
|
|
35
|
-
## Provider Policy Links
|
|
36
|
-
|
|
37
|
-
These links are starting points for provider-owned policy areas; they do not
|
|
38
|
-
create aex guarantees.
|
|
39
|
-
|
|
40
|
-
- Anthropic API data retention policy: <https://platform.claude.com/docs/en/manage-claude/api-and-data-retention>
|
|
41
|
-
- OpenAI API data controls: <https://platform.openai.com/docs/guides/your-data>
|
|
42
|
-
- Mistral privacy and API data handling: <https://docs.mistral.ai/admin/security-access/privacy>
|
|
43
|
-
- Gemini API data handling: <https://ai.google.dev/gemini-api/docs/logs-policy>
|
|
44
|
-
|
|
45
|
-
## Unsupported Claims
|
|
46
|
-
|
|
47
|
-
Do not describe aex as providing true self-host or customer-cloud deployment
|
|
48
|
-
support, provider-wide retention, HIPAA/BAA or data-residency guarantees, free
|
|
49
|
-
trials, a general-purpose sandbox for every downstream service, human-in-the-loop
|
|
50
|
-
approval checkpoints, or persistent agent identity.
|
|
1
|
+
---
|
|
2
|
+
title: Limits
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Limits
|
|
6
|
+
|
|
7
|
+
aex runs autonomous agents on the hosted managed runtime. The SDK opens durable
|
|
8
|
+
sessions, sends turns, streams events, captures outputs, and exposes auth-gated
|
|
9
|
+
reads and downloads.
|
|
10
|
+
|
|
11
|
+
For what the product supports, see [Features](https://aex.dev/docs/features/).
|
|
12
|
+
For the current provider/model set, see the generated
|
|
13
|
+
[provider/runtime capability matrix](provider-runtime-capabilities.md).
|
|
14
|
+
|
|
15
|
+
## Current Defaults
|
|
16
|
+
|
|
17
|
+
| Area | Default |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| Workspace storage | 500 GB per workspace for captured outputs and workspace artifacts. aex-maintainer admin workspaces may be unlimited for internal dogfooding; this is not a customer entitlement. |
|
|
20
|
+
|
|
21
|
+
## Product Boundaries
|
|
22
|
+
|
|
23
|
+
| Area | Boundary |
|
|
24
|
+
| --- | --- |
|
|
25
|
+
| Runtime | New submissions run on the managed runtime. The `runtime` option selects a managed machine-size preset (`Sizes.*`); there is no alternative runtime backend. |
|
|
26
|
+
| Provider policy | Provider retention, training exclusion, HIPAA/BAA, data residency, abuse policy, and pricing belong to the selected provider account, endpoint, and contract. |
|
|
27
|
+
| Secrets | Provider keys, MCP credentials, and env secrets are caller-owned. aex excludes secret values from idempotency and uses the explicit secret surfaces described in [Secrets](secrets.md). |
|
|
28
|
+
| MCP servers | Remote MCP servers are customer-trusted systems. aex validates declarations and routes credentials; it does not make an untrusted MCP server safe. |
|
|
29
|
+
| Outputs | Captured outputs, events, and metadata are stored under the run record and downloaded through auth-gated routes. Output content is customer content. |
|
|
30
|
+
| Human review | Runs execute after submission. Cancellation is available, but aex does not pause a run for platform-mediated approval or interactive clarification. |
|
|
31
|
+
| Sessions | The durable product primitive is the session/run record. Sessions can be resumed by id and auto-suspend after the configured idle window; persistent named agent profiles and saved agent definitions are out of scope. |
|
|
32
|
+
| Deployment | The supported product is the hosted aex service plus the SDK and CLI. Alternate `baseUrl` values are for local, staging, or hosted aex API planes, not a self-host product promise. |
|
|
33
|
+
| Cost | BYOK provider-token charges accrue to the customer's provider account. aex records report-only telemetry for runtime and storage usage; free trials, billing-grade invoices, and public pricing documents are not shipped unless documented later. |
|
|
34
|
+
|
|
35
|
+
## Provider Policy Links
|
|
36
|
+
|
|
37
|
+
These links are starting points for provider-owned policy areas; they do not
|
|
38
|
+
create aex guarantees.
|
|
39
|
+
|
|
40
|
+
- Anthropic API data retention policy: <https://platform.claude.com/docs/en/manage-claude/api-and-data-retention>
|
|
41
|
+
- OpenAI API data controls: <https://platform.openai.com/docs/guides/your-data>
|
|
42
|
+
- Mistral privacy and API data handling: <https://docs.mistral.ai/admin/security-access/privacy>
|
|
43
|
+
- Gemini API data handling: <https://ai.google.dev/gemini-api/docs/logs-policy>
|
|
44
|
+
|
|
45
|
+
## Unsupported Claims
|
|
46
|
+
|
|
47
|
+
Do not describe aex as providing true self-host or customer-cloud deployment
|
|
48
|
+
support, provider-wide retention, HIPAA/BAA or data-residency guarantees, free
|
|
49
|
+
trials, a general-purpose sandbox for every downstream service, human-in-the-loop
|
|
50
|
+
approval checkpoints, or persistent agent identity.
|
package/docs/mcp.md
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: MCP
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# MCP
|
|
6
|
-
|
|
7
|
-
MCP support is remote HTTPS/SSE only. Stdio MCP servers are rejected because aex is a remote session dispatcher, not a local process supervisor.
|
|
8
|
-
|
|
9
|
-
Rules:
|
|
10
|
-
|
|
11
|
-
- MCP servers are declared in the run request config (`mcpServers`).
|
|
12
|
-
- Runtime HITL is disabled.
|
|
13
|
-
- Tool policy must be configured before session start.
|
|
14
|
-
- Enabled MCP tools use `always_allow` provider permissions.
|
|
15
|
-
- `always_ask` is not used by aex MVP.
|
|
16
|
-
- Bearer/OAuth-style auth is carried by the `McpServer` instance (its `headers`); the SDK splits it into the vaulted secrets channel server-side.
|
|
17
|
-
|
|
18
|
-
Use allowlists for sensitive servers whenever possible.
|
|
19
|
-
|
|
20
|
-
## Large-payload responses
|
|
21
|
-
|
|
22
|
-
aex is a session dispatcher, not an MCP runtime. We intentionally do
|
|
23
|
-
**not** interpose on the transport between the model and an upstream MCP
|
|
24
|
-
server, so we cannot elide MCP responses or write them to the session
|
|
25
|
-
filesystem on the user's behalf. Anything an MCP tool returns lands
|
|
26
|
-
directly in the model's context.
|
|
27
|
-
|
|
28
|
-
For ingestion-style MCP servers that return large JSON blobs (search results,
|
|
29
|
-
catalogue dumps, bulk reads), prefer a skill that writes files instead of
|
|
30
|
-
putting the whole response in model context:
|
|
31
|
-
|
|
1
|
+
---
|
|
2
|
+
title: MCP
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# MCP
|
|
6
|
+
|
|
7
|
+
MCP support is remote HTTPS/SSE only. Stdio MCP servers are rejected because aex is a remote session dispatcher, not a local process supervisor.
|
|
8
|
+
|
|
9
|
+
Rules:
|
|
10
|
+
|
|
11
|
+
- MCP servers are declared in the run request config (`mcpServers`).
|
|
12
|
+
- Runtime HITL is disabled.
|
|
13
|
+
- Tool policy must be configured before session start.
|
|
14
|
+
- Enabled MCP tools use `always_allow` provider permissions.
|
|
15
|
+
- `always_ask` is not used by aex MVP.
|
|
16
|
+
- Bearer/OAuth-style auth is carried by the `McpServer` instance (its `headers`); the SDK splits it into the vaulted secrets channel server-side.
|
|
17
|
+
|
|
18
|
+
Use allowlists for sensitive servers whenever possible.
|
|
19
|
+
|
|
20
|
+
## Large-payload responses
|
|
21
|
+
|
|
22
|
+
aex is a session dispatcher, not an MCP runtime. We intentionally do
|
|
23
|
+
**not** interpose on the transport between the model and an upstream MCP
|
|
24
|
+
server, so we cannot elide MCP responses or write them to the session
|
|
25
|
+
filesystem on the user's behalf. Anything an MCP tool returns lands
|
|
26
|
+
directly in the model's context.
|
|
27
|
+
|
|
28
|
+
For ingestion-style MCP servers that return large JSON blobs (search results,
|
|
29
|
+
catalogue dumps, bulk reads), prefer a skill that writes files instead of
|
|
30
|
+
putting the whole response in model context:
|
|
31
|
+
|
|
32
32
|
1. Package the upstream helper as a Skill (`Skill.fromDir` / `Skill.fromUrl`)
|
|
33
33
|
and pass it via the top-level `skills` option. The skill can include a CLI
|
|
34
34
|
binary or script that the agent invokes with its bash tool.
|
|
35
|
-
2. Keep any upstream HTTPS credentials in `environment.secrets`.
|
|
36
|
-
3. Have the CLI write the full payload to the session filesystem. By default,
|
|
37
|
-
files it creates or modifies are captured automatically; pass
|
|
38
|
-
`outputs.allowedDirs` only when you want to narrow capture to specific roots.
|
|
39
|
-
Return only a small handle (path, item count, summary) to the model.
|
|
40
|
-
|
|
41
|
-
The agent sees the handle in context; the bytes ride out through
|
|
42
|
-
`download()` as a normal captured output.
|
|
43
|
-
|
|
44
|
-
If you genuinely want everything in context (small responses, code
|
|
45
|
-
search, etc.), use MCP. If the payload would blow your context budget,
|
|
46
|
-
the CLI-as-skill pattern is the supported answer — there is no platform
|
|
47
|
-
flag to elide MCP responses.
|
|
35
|
+
2. Keep any upstream HTTPS credentials in `environment.secrets`.
|
|
36
|
+
3. Have the CLI write the full payload to the session filesystem. By default,
|
|
37
|
+
files it creates or modifies are captured automatically; pass
|
|
38
|
+
`outputs.allowedDirs` only when you want to narrow capture to specific roots.
|
|
39
|
+
Return only a small handle (path, item count, summary) to the model.
|
|
40
|
+
|
|
41
|
+
The agent sees the handle in context; the bytes ride out through
|
|
42
|
+
`download()` as a normal captured output.
|
|
43
|
+
|
|
44
|
+
If you genuinely want everything in context (small responses, code
|
|
45
|
+
search, etc.), use MCP. If the payload would blow your context budget,
|
|
46
|
+
the CLI-as-skill pattern is the supported answer — there is no platform
|
|
47
|
+
flag to elide MCP responses.
|