@aexhq/sdk 0.24.0 → 0.25.1
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 +36 -125
- package/dist/_contracts/index.d.ts +0 -1
- package/dist/_contracts/index.js +0 -1
- package/dist/_contracts/models.js +1 -2
- package/dist/_contracts/operations.d.ts +13 -5
- package/dist/_contracts/operations.js +220 -10
- package/dist/_contracts/provider-support.d.ts +18 -29
- package/dist/_contracts/provider-support.js +3 -22
- package/dist/_contracts/proxy-protocol.d.ts +4 -2
- package/dist/_contracts/proxy-protocol.js +10 -3
- package/dist/_contracts/run-config.d.ts +28 -4
- package/dist/_contracts/run-config.js +10 -5
- package/dist/_contracts/run-cost.d.ts +3 -11
- package/dist/_contracts/run-cost.js +2 -57
- package/dist/_contracts/run-custody.d.ts +1 -52
- package/dist/_contracts/run-custody.js +3 -87
- package/dist/_contracts/run-retention.d.ts +1 -5
- package/dist/_contracts/run-retention.js +2 -14
- package/dist/_contracts/run-unit.d.ts +2 -2
- package/dist/_contracts/run-unit.js +3 -1
- package/dist/_contracts/runtime-security-profile.js +1 -1
- package/dist/_contracts/runtime-types.d.ts +38 -12
- package/dist/_contracts/side-effect-audit.d.ts +4 -5
- package/dist/_contracts/side-effect-audit.js +1 -4
- package/dist/_contracts/status.d.ts +3 -4
- package/dist/_contracts/status.js +3 -8
- package/dist/_contracts/submission.d.ts +68 -42
- package/dist/_contracts/submission.js +144 -30
- package/dist/bundle.d.ts +13 -0
- package/dist/bundle.js +51 -0
- package/dist/bundle.js.map +1 -1
- package/dist/cli.mjs +232 -58
- package/dist/cli.mjs.sha256 +1 -1
- package/dist/client.d.ts +25 -21
- package/dist/client.js +59 -15
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/tool.d.ts +41 -0
- package/dist/tool.js +138 -0
- package/dist/tool.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/concepts/agent-tools.md +53 -0
- package/docs/concepts/composition.md +43 -0
- package/docs/concepts/providers-and-runtimes.md +53 -0
- package/docs/concepts/runs.md +40 -0
- package/docs/credentials.md +8 -4
- package/docs/events.md +12 -0
- package/docs/limits.md +53 -0
- package/docs/outputs.md +58 -0
- package/docs/provider-runtime-capabilities.md +53 -55
- package/docs/public-surface.json +81 -0
- package/docs/quickstart.md +28 -105
- package/docs/release.md +1 -1
- package/docs/run-config.md +2 -2
- package/docs/secrets.md +123 -0
- package/docs/skills.md +3 -3
- package/docs/vision-skills.md +14 -19
- package/package.json +2 -2
- package/dist/_contracts/managed-key.d.ts +0 -101
- package/dist/_contracts/managed-key.js +0 -181
- package/docs/product-boundaries.md +0 -57
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Composition
|
|
3
|
+
description: The primitives used to assemble each run.
|
|
4
|
+
icon: Blocks
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
aex composes an agent from explicit per-run inputs. The SDK materializes local
|
|
8
|
+
bytes before submission and the platform mounts them into the managed runtime
|
|
9
|
+
before the first agent turn.
|
|
10
|
+
|
|
11
|
+
| Need | Primitive |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| Executable or instructional bundles | `Skill.fromPath`, `Skill.fromFiles`, `Skill.fromUrl`, `Skill.fromCatalog` |
|
|
14
|
+
| Agent instructions | `AgentsMd.fromPath`, `AgentsMd.fromContent` |
|
|
15
|
+
| Reference files and folders | `File.fromPath`, `File.fromBytes` |
|
|
16
|
+
| Remote tools | `McpServer.remote`, `McpServer.fromId` |
|
|
17
|
+
| Credentialed HTTP APIs | `ProxyEndpoint.none`, `bearer`, `basic`, `header`, `query` |
|
|
18
|
+
| Non-secret runtime settings | `environment.envVars`, `environment.packages`, `environment.networking` |
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { AgentsMd, File, McpServer, Models, ProxyEndpoint, Skill } from "@aexhq/sdk";
|
|
22
|
+
|
|
23
|
+
await aex.submit({
|
|
24
|
+
model: Models.CLAUDE_HAIKU_4_5,
|
|
25
|
+
prompt: "Use the attached docs and tools to produce a report.",
|
|
26
|
+
agentsMd: [AgentsMd.fromContent("Follow the repo conventions.")],
|
|
27
|
+
files: [await File.fromPath("./input")],
|
|
28
|
+
skills: [await Skill.fromPath("./skills/report-writer", { name: "report-writer" })],
|
|
29
|
+
mcpServers: [McpServer.remote({ name: "github", url: "https://example.com/mcp" })],
|
|
30
|
+
proxyEndpoints: [
|
|
31
|
+
ProxyEndpoint.bearer({
|
|
32
|
+
name: "internal-api",
|
|
33
|
+
baseUrl: "https://api.example.com",
|
|
34
|
+
allowMethods: ["GET"],
|
|
35
|
+
allowPathPrefixes: ["/v1/"]
|
|
36
|
+
})
|
|
37
|
+
],
|
|
38
|
+
secrets: { apiKey: process.env.ANTHROPIC_API_KEY! }
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Secrets stay out of reusable configs. Put provider keys, MCP auth, and proxy
|
|
43
|
+
auth in the `secrets` bundle on the concrete submit call.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Providers & runtimes
|
|
3
|
+
description: How provider selection maps to managed runtime execution.
|
|
4
|
+
icon: Network
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
aex exposes one submission shape across supported providers:
|
|
8
|
+
|
|
9
|
+
| Provider | Selector |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Anthropic | `Providers.ANTHROPIC` |
|
|
12
|
+
| DeepSeek | `Providers.DEEPSEEK` |
|
|
13
|
+
| OpenAI | `Providers.OPENAI` |
|
|
14
|
+
| Gemini | `Providers.GEMINI` |
|
|
15
|
+
| Mistral | `Providers.MISTRAL` |
|
|
16
|
+
| OpenRouter | `Providers.OPENROUTER` |
|
|
17
|
+
| Doubao | `Providers.DOUBAO` |
|
|
18
|
+
| Doubao China | `Providers.DOUBAO_CN` |
|
|
19
|
+
|
|
20
|
+
All submissions run on the managed runtime. Omit `runtime` or pass
|
|
21
|
+
`runtime: "managed"`; `runtime: "native"` is rejected before any runtime side
|
|
22
|
+
effect.
|
|
23
|
+
|
|
24
|
+
## Selection
|
|
25
|
+
|
|
26
|
+
### TypeScript
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import { Models, Providers } from "@aexhq/sdk";
|
|
30
|
+
|
|
31
|
+
await aex.submit({
|
|
32
|
+
provider: Providers.OPENAI,
|
|
33
|
+
model: Models.GPT_4_1,
|
|
34
|
+
prompt: "Summarise the attached files.",
|
|
35
|
+
secrets: { apiKey: process.env.OPENAI_API_KEY! }
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### CLI
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
aex run \
|
|
43
|
+
--api-token "$AEX_API_TOKEN" \
|
|
44
|
+
--provider openai \
|
|
45
|
+
--openai-api-key "$OPENAI_API_KEY" \
|
|
46
|
+
--model gpt-4.1 \
|
|
47
|
+
--prompt "Summarise the attached files." \
|
|
48
|
+
--follow
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Events, outputs, cleanup, and downloads use the same SDK and CLI surface for
|
|
52
|
+
every provider. For the exact supported model list, use the generated
|
|
53
|
+
[provider/runtime capability matrix](../provider-runtime-capabilities.md).
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Runs
|
|
3
|
+
description: The durable unit aex submits, observes, and archives.
|
|
4
|
+
icon: Play
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
A run is an immutable request to execute an autonomous agent task. The caller
|
|
8
|
+
submits the model, prompt, optional system message, composition primitives,
|
|
9
|
+
output policy, and one inline secrets bundle. aex snapshots the non-secret
|
|
10
|
+
inputs, holds secrets for the run lifecycle, dispatches through the managed
|
|
11
|
+
runtime, and records status, typed events, and outputs.
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { AgentExecutor, Models } from "@aexhq/sdk";
|
|
15
|
+
|
|
16
|
+
const aex = new AgentExecutor({ apiToken: process.env.AEX_API_TOKEN! });
|
|
17
|
+
|
|
18
|
+
const runId = await aex.submit({
|
|
19
|
+
provider: "anthropic",
|
|
20
|
+
model: Models.CLAUDE_HAIKU_4_5,
|
|
21
|
+
prompt: "Write the report and save it as a file.",
|
|
22
|
+
secrets: { apiKey: process.env.ANTHROPIC_API_KEY! }
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
for await (const event of aex.stream(runId)) {
|
|
26
|
+
console.log(event.type);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
await aex.wait(runId);
|
|
30
|
+
await aex.download(runId, { to: "./run.zip" });
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The same durable record backs SDK and CLI reads. Use `getRun`/`get`, `events`,
|
|
34
|
+
`stream`, `streamEnvelopes`, `wait`, `outputs`, and `download` to inspect the
|
|
35
|
+
run live or after completion.
|
|
36
|
+
|
|
37
|
+
Use `idempotencyKey` when retrying a submit from your own workflow. aex hashes
|
|
38
|
+
the normalized non-secret submission, so a retry with the same key and same body
|
|
39
|
+
returns the existing run while a mismatched body fails with an idempotency
|
|
40
|
+
conflict.
|
package/docs/credentials.md
CHANGED
|
@@ -4,7 +4,9 @@ title: Credentials
|
|
|
4
4
|
|
|
5
5
|
# Credentials
|
|
6
6
|
|
|
7
|
-
aex
|
|
7
|
+
aex treats provider keys, MCP credentials, and proxy endpoint auth as per-run
|
|
8
|
+
credentials. Reusable env secrets are documented separately in
|
|
9
|
+
[Secrets](secrets.md).
|
|
8
10
|
|
|
9
11
|
The caller passes a workspace-scoped SDK token and the provider key inline on every `submit` call. aex holds the bundle in run-scoped custody for the run lifecycle and attempts terminal cleanup/revocation for the aex-controlled references. MCP credentials and proxy endpoint auth values travel the same way.
|
|
10
12
|
|
|
@@ -100,7 +102,7 @@ node /mnt/session/uploads/aex/aex proxy stripe \
|
|
|
100
102
|
--response-mode headers_only
|
|
101
103
|
```
|
|
102
104
|
|
|
103
|
-
The CLI reads the per-run bearer from `/mnt/session/uploads/aex/run-token`, attaches the `X-Aex-Proxy-Protocol` header, and the
|
|
105
|
+
The CLI reads the per-run bearer from `/mnt/session/uploads/aex/run-token`, attaches the `X-Aex-Proxy-Protocol` header, and the hosted proxy injects the bearer/header/query/basic credential before dispatching the outbound call. Only the response (subject to `responseMode` and `maxResponseBytes`) reaches the container. `--response-mode` can only narrow below the policy ceiling.
|
|
104
106
|
|
|
105
107
|
Retries are declaration-based. Add `retry` to the endpoint policy when safe for that upstream; runs without `retry` keep single-attempt behavior. `maxAttempts` counts the initial request, and defaults apply only when `retry` is present: `maxAttempts: 3`, `initialDelayMs: 250`, `maxDelayMs: 5000`, `jitter: "full"`, `retryOnStatuses: [408, 425, 429, 500, 502, 503, 504]`, `retryOnMethods: ["GET", "HEAD"]`, and `respectRetryAfter: true`. There are no per-call `aex proxy` retry flags.
|
|
106
108
|
|
|
@@ -127,7 +129,7 @@ const runId = await aex.submit({
|
|
|
127
129
|
});
|
|
128
130
|
```
|
|
129
131
|
|
|
130
|
-
The keyless endpoint still routes through the aex managed proxy: every call is allow-listed, audited, and redacted. The
|
|
132
|
+
The keyless endpoint still routes through the aex managed proxy: every call is allow-listed, audited, and redacted. The hosted proxy injects no `Authorization` header and no query-string credential. Shipping a `proxyEndpointAuth` entry for a `none`-shape endpoint is rejected at submission time. Equivalent class-based form:
|
|
131
133
|
|
|
132
134
|
```ts
|
|
133
135
|
import { ProxyEndpoint } from "@aexhq/sdk";
|
|
@@ -144,7 +146,9 @@ ProxyEndpoint.none({
|
|
|
144
146
|
|
|
145
147
|
### Networking
|
|
146
148
|
|
|
147
|
-
When a run uses `limited` networking,
|
|
149
|
+
Networking is open by default. When a run explicitly uses `limited` networking,
|
|
150
|
+
the platform host must appear in `allowed_hosts`. aex injects it
|
|
151
|
+
automatically; for advance validation use:
|
|
148
152
|
|
|
149
153
|
```ts
|
|
150
154
|
const allowedHosts = buildPlatformAllowedHosts({
|
package/docs/events.md
CHANGED
|
@@ -88,6 +88,18 @@ run's last stream event, immediately after the durable record commits.
|
|
|
88
88
|
`settleConsistent` ends the stream on it; on a raw stream, detect it with
|
|
89
89
|
`isRunSettled(event)`.
|
|
90
90
|
|
|
91
|
+
## Temporary event archive links
|
|
92
|
+
|
|
93
|
+
For terminal runs, `eventArchiveLink(runId, options?)` returns a temporary direct URL to `events.jsonl`, the same redacted customer-visible event export used by `downloadEvents(runId)`.
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
const link = await aex.eventArchiveLink(runId, { expiresIn: "1h" });
|
|
97
|
+
const response = await fetch(link.url);
|
|
98
|
+
const jsonl = await response.text();
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
`expiresIn` accepts seconds or `"15m"`, `"1h"`, or `"1d"`; the default is `"1h"`. The URL is a reusable bearer URL until it expires, so treat it like a short-lived secret. Internal runtime, host, and provider diagnostics are not included in this export.
|
|
102
|
+
|
|
91
103
|
## Event shape
|
|
92
104
|
|
|
93
105
|
Events are typed as the discriminated `RunEvent` union for compatibility and as the versioned coordinator envelope for live consumers. aex records raw runtime/provider payloads **after** secret redaction and structural sanitization, so the bytes you see never contain the provider key, MCP credentials, or proxy bearer that were supplied to `submit`.
|
package/docs/limits.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Limits
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Limits
|
|
6
|
+
|
|
7
|
+
aex runs autonomous agents on the hosted managed runtime. The SDK and CLI submit
|
|
8
|
+
runs, stream events, capture outputs, and expose auth-gated reads and downloads.
|
|
9
|
+
|
|
10
|
+
For what the product supports, see [Features](https://aex.dev/docs/features/).
|
|
11
|
+
For the current provider/model set, see the generated
|
|
12
|
+
[provider/runtime capability matrix](provider-runtime-capabilities.md).
|
|
13
|
+
|
|
14
|
+
## Current Defaults
|
|
15
|
+
|
|
16
|
+
| Area | Default |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| Workspace storage | 50 GiB per workspace for captured outputs and workspace artifacts. aex-maintainer admin workspaces may be unlimited for internal dogfooding; this is not a customer entitlement. |
|
|
19
|
+
| Proxy request body | 10 MiB per proxy endpoint unless the endpoint declares a different `maxRequestBytes`. |
|
|
20
|
+
| Proxy timeout | 5 minutes per proxy endpoint unless the endpoint declares a different `timeoutMs`. |
|
|
21
|
+
| Proxy telemetry | Proxy calls emit report-only usage telemetry for call count, failed calls, request bytes, response bytes when known, and duration. Public proxy pricing is not shipped unless documented later. |
|
|
22
|
+
|
|
23
|
+
## Product Boundaries
|
|
24
|
+
|
|
25
|
+
| Area | Boundary |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| Runtime | New submissions run on the managed runtime. `runtime: "native"` is rejected. |
|
|
28
|
+
| Provider policy | Provider retention, training exclusion, HIPAA/BAA, data residency, abuse policy, and pricing belong to the selected provider account, endpoint, and contract. |
|
|
29
|
+
| Secrets | Provider keys, MCP credentials, proxy auth, and env secrets are caller-owned. aex excludes secret values from idempotency and uses the explicit secret surfaces described in [Secrets](secrets.md). |
|
|
30
|
+
| MCP servers | Remote MCP servers are customer-trusted systems. aex validates declarations and routes credentials; it does not make an untrusted MCP server safe. |
|
|
31
|
+
| Proxy endpoints | The proxy enforces declared host/path/method/auth policy for calls routed through it. Upstream side effects and data handling remain with the upstream service and customer. |
|
|
32
|
+
| Outputs | Captured outputs, events, and metadata are stored under the run record and downloaded through auth-gated routes. Output content is customer content. |
|
|
33
|
+
| Human review | Runs execute after submission. Cancellation is available, but aex does not pause a run for platform-mediated approval or interactive clarification. |
|
|
34
|
+
| Agent identity | The durable product primitive is the run record. Persistent agent profiles, stateful memory, reusable sessions, and saved agent definitions are out of scope. |
|
|
35
|
+
| 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. |
|
|
36
|
+
| Cost | BYOK provider-token charges accrue to the customer's provider account. aex records report-only telemetry for runtime, storage, and proxy usage; free trials, billing-grade invoices, and public pricing documents are not shipped unless documented later. |
|
|
37
|
+
|
|
38
|
+
## Provider Policy Links
|
|
39
|
+
|
|
40
|
+
These links are starting points for provider-owned policy areas; they do not
|
|
41
|
+
create aex guarantees.
|
|
42
|
+
|
|
43
|
+
- Anthropic API data retention policy: <https://platform.claude.com/docs/en/manage-claude/api-and-data-retention>
|
|
44
|
+
- OpenAI API data controls: <https://platform.openai.com/docs/guides/your-data>
|
|
45
|
+
- Mistral privacy and API data handling: <https://docs.mistral.ai/admin/security-access/privacy>
|
|
46
|
+
- Gemini API data handling: <https://ai.google.dev/gemini-api/docs/logs-policy>
|
|
47
|
+
|
|
48
|
+
## Unsupported Claims
|
|
49
|
+
|
|
50
|
+
Do not describe aex as providing true self-host or customer-cloud deployment
|
|
51
|
+
support, provider-wide retention, HIPAA/BAA or data-residency guarantees, free
|
|
52
|
+
trials, a general-purpose sandbox for every downstream service, human-in-the-loop
|
|
53
|
+
approval checkpoints, or persistent agent identity.
|
package/docs/outputs.md
CHANGED
|
@@ -77,6 +77,64 @@ const looseReport = await aex.downloadOutput(runId, { path: "report.txt", match:
|
|
|
77
77
|
console.log(looseReport.byteLength);
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
+
## Finding outputs
|
|
81
|
+
|
|
82
|
+
`listOutputs(runId, query?)` and its alias `outputs(runId, query?)` can filter the captured output list client-side. Use `findOutputs` when you want discovery to be explicit, or `findOutput` when exactly one file is expected:
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
const images = await aex.findOutputs(runId, { type: "image" });
|
|
86
|
+
const jsonReports = await aex.outputs(runId, {
|
|
87
|
+
dir: "reports",
|
|
88
|
+
extension: ".json"
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const report = await aex.findOutput(runId, {
|
|
92
|
+
filename: "summary.json",
|
|
93
|
+
contentType: "application/json"
|
|
94
|
+
});
|
|
95
|
+
if (report) {
|
|
96
|
+
const bytes = await aex.downloadOutput(runId, report);
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Query fields compose with AND semantics:
|
|
101
|
+
|
|
102
|
+
| Field | Match |
|
|
103
|
+
| --- | --- |
|
|
104
|
+
| `path` | Exact normalized output path. Leading `/` and `outputs/` are ignored. |
|
|
105
|
+
| `filename` | Basename match, as a string or `RegExp`. |
|
|
106
|
+
| `dir` / `recursive` | Directory prefix. `recursive` defaults to `true`; set `false` for direct children only. |
|
|
107
|
+
| `extension` | Case-insensitive extension, with or without a leading dot. |
|
|
108
|
+
| `contentType` | Exact content type or a prefix wildcard such as `image/*`. |
|
|
109
|
+
| `type` | High-level type: `text`, `json`, `image`, `audio`, `video`, `pdf`, `archive`, `binary`, or `unknown`. |
|
|
110
|
+
|
|
111
|
+
`findOutput` returns `null` when nothing matches and throws `RunStateError` when the query matches more than one output.
|
|
112
|
+
|
|
113
|
+
## Temporary output links
|
|
114
|
+
|
|
115
|
+
Use `outputLink(runId, selectorOrQuery, options?)` when another process, browser, media tag, or downloader needs a direct artifact URL instead of bytes buffered through the SDK. `createOutputLink` remains as the compatibility name.
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
const link = await aex.outputLink(
|
|
119
|
+
runId,
|
|
120
|
+
{ path: "reports/summary.json" },
|
|
121
|
+
{ expiresIn: "15m" }
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
console.log(link.url, link.expiresAt);
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Selectors can be an output id, an `Output` object, a path selector, or an `OutputQuery`. `expiresIn` accepts seconds or `"15m"`, `"1h"`, or `"1d"`; the default is `"1h"`.
|
|
128
|
+
|
|
129
|
+
The returned URL is a reusable bearer URL until it expires. Anyone who has it can read that artifact during the TTL. aex does not promise one-time use or early revocation for these direct artifact URLs.
|
|
130
|
+
|
|
131
|
+
For large files, `fetchOutput` mints the same temporary URL and returns the `Response` from fetching it directly, without adding the SDK API token to that second request:
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
const response = await aex.fetchOutput(runId, { type: "video", filename: /clip\.mp4$/ });
|
|
135
|
+
const stream = response.body;
|
|
136
|
+
```
|
|
137
|
+
|
|
80
138
|
## Lifecycle behaviour
|
|
81
139
|
|
|
82
140
|
`download()` works at any run state — it reads whatever the public endpoints currently expose, so the zip reflects the run as of the call:
|
|
@@ -4,54 +4,52 @@ title: Provider runtime capabilities
|
|
|
4
4
|
|
|
5
5
|
# Provider runtime capabilities
|
|
6
6
|
|
|
7
|
-
Generated from `packages/contracts/src/provider-support.ts`; runtime
|
|
7
|
+
Generated from `packages/contracts/src/provider-support.ts` and `packages/contracts/src/models.ts`; runtime routing is derived through `checkRuntimeSupported` and `selectRuntime` in `packages/contracts/src/submission.ts`.
|
|
8
8
|
|
|
9
9
|
Regenerate with `pnpm capabilities:generate`; check with `pnpm capabilities:check`.
|
|
10
10
|
|
|
11
11
|
Providers: [Anthropic](#anthropic) (`anthropic`), [DeepSeek](#deepseek) (`deepseek`), [OpenAI](#openai) (`openai`), [Gemini](#gemini) (`gemini`), [Mistral](#mistral) (`mistral`), [OpenRouter](#openrouter) (`openrouter`), [Doubao](#doubao) (`doubao`), [Doubao (China)](#doubao-cn) (`doubao-cn`). Runtime selectors: `managed`.
|
|
12
12
|
|
|
13
|
-
All new submissions run on the managed runtime. Public support
|
|
13
|
+
All new submissions run on the managed runtime. Public support is expressed as supported providers and supported model ids.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
## Supported models
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
| Provider | Wire value | Status | Docs | Evidence |
|
|
17
|
+
| Provider | Selector | Supported models | Docs | Evidence |
|
|
20
18
|
| --- | --- | --- | --- | --- |
|
|
21
|
-
| [Anthropic](#anthropic) | `anthropic` |
|
|
22
|
-
| [DeepSeek](#deepseek) | `deepseek` |
|
|
23
|
-
| [OpenAI](#openai) | `openai` |
|
|
24
|
-
| [Gemini](#gemini) | `gemini` |
|
|
25
|
-
| [Mistral](#mistral) | `mistral` |
|
|
26
|
-
| [OpenRouter](#openrouter) | `openrouter` |
|
|
27
|
-
| [Doubao](#doubao) | `doubao` |
|
|
28
|
-
| [Doubao (China)](#doubao-cn) | `doubao-cn` |
|
|
19
|
+
| [Anthropic](#anthropic) | `anthropic` | `claude-haiku-4-5`, `claude-3-5-haiku-latest`, `claude-3-5-sonnet-latest`, `claude-sonnet-4-6` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts); [Installed-SDK Anthropic live user test](../../../apps/user-tests/test/live/live-sdk-anthropic-managed.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
|
|
20
|
+
| [DeepSeek](#deepseek) | `deepseek` | `deepseek-v4-flash`, `deepseek-v4-pro`, `deepseek-chat`, `deepseek-reasoner` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts); [Installed-SDK DeepSeek live user test](../../../apps/user-tests/test/live/live-sdk-deepseek.test.ts); [Installed-SDK DeepSeek comprehensive live user matrix](../../../apps/user-tests/test/live/live-sdk-comprehensive.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
|
|
21
|
+
| [OpenAI](#openai) | `openai` | `gpt-4.1`, `gpt-4o-mini` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
22
|
+
| [Gemini](#gemini) | `gemini` | `gemini-2.0-flash`, `gemini-2.5-flash` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
23
|
+
| [Mistral](#mistral) | `mistral` | `mistral-large-latest`, `mistral-small-latest` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
24
|
+
| [OpenRouter](#openrouter) | `openrouter` | `gpt-4o-mini`, `gpt-4o`, `gemini-2.0-flash` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
25
|
+
| [Doubao](#doubao) | `doubao` | `doubao-seed-pro`, `doubao-seed-flash` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
26
|
+
| [Doubao (China)](#doubao-cn) | `doubao-cn` | `doubao-seed-pro`, `doubao-seed-flash` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
29
27
|
|
|
30
28
|
## Runtime routing
|
|
31
29
|
|
|
32
|
-
| Provider | Default provider | Auto route |
|
|
30
|
+
| Provider | Default provider | Auto route | Runtime selector |
|
|
31
|
+
| --- | --- | --- | --- |
|
|
32
|
+
| `anthropic` | yes | `managed` | [managed](#anthropic) |
|
|
33
|
+
| `deepseek` | no | `managed` | [managed](#deepseek) |
|
|
34
|
+
| `openai` | no | `managed` | [managed](#openai) |
|
|
35
|
+
| `gemini` | no | `managed` | [managed](#gemini) |
|
|
36
|
+
| `mistral` | no | `managed` | [managed](#mistral) |
|
|
37
|
+
| `openrouter` | no | `managed` | [managed](#openrouter) |
|
|
38
|
+
| `doubao` | no | `managed` | [managed](#doubao) |
|
|
39
|
+
| `doubao-cn` | no | `managed` | [managed](#doubao-cn) |
|
|
40
|
+
|
|
41
|
+
## Runtime evidence
|
|
42
|
+
|
|
43
|
+
| Provider | Runtime | Enforcement path | Evidence |
|
|
33
44
|
| --- | --- | --- | --- |
|
|
34
|
-
| `anthropic` |
|
|
35
|
-
| `deepseek` |
|
|
36
|
-
| `openai` |
|
|
37
|
-
| `gemini` |
|
|
38
|
-
| `mistral` |
|
|
39
|
-
| `openrouter` |
|
|
40
|
-
| `doubao` |
|
|
41
|
-
| `doubao-cn` |
|
|
42
|
-
|
|
43
|
-
## Runtime cell evidence
|
|
44
|
-
|
|
45
|
-
| Provider | Runtime | Status | Ownership | Enforcement path | Evidence |
|
|
46
|
-
| --- | --- | --- | --- | --- | --- |
|
|
47
|
-
| `anthropic` | `managed` | supported | supported | submission parser + managed dispatch | [Installed-SDK Anthropic live user test](../../../apps/user-tests/test/live/live-sdk-anthropic-managed.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
|
|
48
|
-
| `deepseek` | `managed` | supported | supported | submission parser + managed dispatch | [Installed-SDK DeepSeek live user test](../../../apps/user-tests/test/live/live-sdk-deepseek.test.ts); [Installed-SDK DeepSeek comprehensive live user matrix](../../../apps/user-tests/test/live/live-sdk-comprehensive.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
|
|
49
|
-
| `openai` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
50
|
-
| `gemini` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
51
|
-
| `mistral` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
52
|
-
| `openrouter` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
53
|
-
| `doubao` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
54
|
-
| `doubao-cn` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
45
|
+
| `anthropic` | `managed` | submission parser + managed dispatch | [Installed-SDK Anthropic live user test](../../../apps/user-tests/test/live/live-sdk-anthropic-managed.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
|
|
46
|
+
| `deepseek` | `managed` | submission parser + managed dispatch | [Installed-SDK DeepSeek live user test](../../../apps/user-tests/test/live/live-sdk-deepseek.test.ts); [Installed-SDK DeepSeek comprehensive live user matrix](../../../apps/user-tests/test/live/live-sdk-comprehensive.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
|
|
47
|
+
| `openai` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
48
|
+
| `gemini` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
49
|
+
| `mistral` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
50
|
+
| `openrouter` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
51
|
+
| `doubao` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
52
|
+
| `doubao-cn` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
|
|
55
53
|
|
|
56
54
|
## Validation errors
|
|
57
55
|
|
|
@@ -61,76 +59,76 @@ Status vocabulary: `supported`, `live-unverified`, `rejected`.
|
|
|
61
59
|
|
|
62
60
|
### Managed unsupported features
|
|
63
61
|
|
|
64
|
-
Provider-hosted skill refs (a `kind:"provider"` skill ref) are rejected because new runs dispatch to the managed runtime. Supply skill bytes through `Skill.fromFiles`, `Skill.fromPath`, `Skill.fromUrl`, or `Skill.fromCatalog`; each path normalizes to an asset that the platform snapshots into
|
|
62
|
+
Provider-hosted skill refs (a `kind:"provider"` skill ref) are rejected because new runs dispatch to the managed runtime. Supply skill bytes through `Skill.fromFiles`, `Skill.fromPath`, `Skill.fromUrl`, or `Skill.fromCatalog`; each path normalizes to an asset that the platform snapshots into durable run asset storage.
|
|
65
63
|
|
|
66
64
|
Notes:
|
|
67
65
|
|
|
68
|
-
-
|
|
66
|
+
- Supported models are the public SDK model ids accepted for each provider.
|
|
67
|
+
- Runtime routing describes how a validated submission is dispatched.
|
|
69
68
|
- `runtime: "native"` is not a runtime selector; the submission parser rejects it as an invalid enum value.
|
|
70
|
-
- `live-unverified` means the shape is accepted by code but does not yet have equal live user-test evidence.
|
|
71
69
|
|
|
72
70
|
## Provider anchors
|
|
73
71
|
|
|
74
72
|
### Anthropic
|
|
75
73
|
|
|
76
74
|
- Wire provider: `anthropic`
|
|
77
|
-
-
|
|
75
|
+
- Supported models: `claude-haiku-4-5`, `claude-3-5-haiku-latest`, `claude-3-5-sonnet-latest`, `claude-sonnet-4-6`
|
|
78
76
|
- Auto route: `managed`
|
|
79
|
-
- Docs: [
|
|
77
|
+
- Docs: [Secrets](secrets.md); [Events](events.md)
|
|
80
78
|
- Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts); [Installed-SDK Anthropic live user test](../../../apps/user-tests/test/live/live-sdk-anthropic-managed.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts)
|
|
81
79
|
|
|
82
80
|
### DeepSeek
|
|
83
81
|
|
|
84
82
|
- Wire provider: `deepseek`
|
|
85
|
-
-
|
|
83
|
+
- Supported models: `deepseek-v4-flash`, `deepseek-v4-pro`, `deepseek-chat`, `deepseek-reasoner`
|
|
86
84
|
- Auto route: `managed`
|
|
87
|
-
- Docs: [
|
|
85
|
+
- Docs: [Secrets](secrets.md); [Events](events.md)
|
|
88
86
|
- Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts); [Installed-SDK DeepSeek live user test](../../../apps/user-tests/test/live/live-sdk-deepseek.test.ts); [Installed-SDK DeepSeek comprehensive live user matrix](../../../apps/user-tests/test/live/live-sdk-comprehensive.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts)
|
|
89
87
|
|
|
90
88
|
### OpenAI
|
|
91
89
|
|
|
92
90
|
- Wire provider: `openai`
|
|
93
|
-
-
|
|
91
|
+
- Supported models: `gpt-4.1`, `gpt-4o-mini`
|
|
94
92
|
- Auto route: `managed`
|
|
95
|
-
- Docs: [
|
|
93
|
+
- Docs: [Secrets](secrets.md); [Events](events.md)
|
|
96
94
|
- Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
|
|
97
95
|
|
|
98
96
|
### Gemini
|
|
99
97
|
|
|
100
98
|
- Wire provider: `gemini`
|
|
101
|
-
-
|
|
99
|
+
- Supported models: `gemini-2.0-flash`, `gemini-2.5-flash`
|
|
102
100
|
- Auto route: `managed`
|
|
103
|
-
- Docs: [
|
|
101
|
+
- Docs: [Secrets](secrets.md); [Events](events.md)
|
|
104
102
|
- Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
|
|
105
103
|
|
|
106
104
|
### Mistral
|
|
107
105
|
|
|
108
106
|
- Wire provider: `mistral`
|
|
109
|
-
-
|
|
107
|
+
- Supported models: `mistral-large-latest`, `mistral-small-latest`
|
|
110
108
|
- Auto route: `managed`
|
|
111
|
-
- Docs: [
|
|
109
|
+
- Docs: [Secrets](secrets.md); [Events](events.md)
|
|
112
110
|
- Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
|
|
113
111
|
|
|
114
112
|
### OpenRouter
|
|
115
113
|
|
|
116
114
|
- Wire provider: `openrouter`
|
|
117
|
-
-
|
|
115
|
+
- Supported models: `gpt-4o-mini`, `gpt-4o`, `gemini-2.0-flash`
|
|
118
116
|
- Auto route: `managed`
|
|
119
|
-
- Docs: [
|
|
117
|
+
- Docs: [Secrets](secrets.md); [Events](events.md)
|
|
120
118
|
- Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
|
|
121
119
|
|
|
122
120
|
### Doubao
|
|
123
121
|
|
|
124
122
|
- Wire provider: `doubao`
|
|
125
|
-
-
|
|
123
|
+
- Supported models: `doubao-seed-pro`, `doubao-seed-flash`
|
|
126
124
|
- Auto route: `managed`
|
|
127
|
-
- Docs: [
|
|
125
|
+
- Docs: [Secrets](secrets.md); [Events](events.md)
|
|
128
126
|
- Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
|
|
129
127
|
|
|
130
128
|
### Doubao (China)
|
|
131
129
|
|
|
132
130
|
- Wire provider: `doubao-cn`
|
|
133
|
-
-
|
|
131
|
+
- Supported models: `doubao-seed-pro`, `doubao-seed-flash`
|
|
134
132
|
- Auto route: `managed`
|
|
135
|
-
- Docs: [
|
|
133
|
+
- Docs: [Secrets](secrets.md); [Events](events.md)
|
|
136
134
|
- Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"brand": "aex",
|
|
3
|
+
"productName": "Agent Executor",
|
|
4
|
+
"oneLine": "aex is an agent execution platform for launching autonomous agents from a simple TypeScript SDK and CLI.",
|
|
5
|
+
"description": "Submit typed runs, stream durable events, capture outputs, and compose agents with skills, files, MCP, proxy endpoints, and subagents across the managed runtime.",
|
|
6
|
+
"installCommand": "npm install @aexhq/sdk",
|
|
7
|
+
"examples": {
|
|
8
|
+
"typescriptLines": [
|
|
9
|
+
"import { AgentExecutor, Models, Providers } from \"@aexhq/sdk\";",
|
|
10
|
+
"",
|
|
11
|
+
"const aex = new AgentExecutor({ apiToken: process.env.AEX_API_TOKEN! });",
|
|
12
|
+
"",
|
|
13
|
+
"const runId = await aex.submit({",
|
|
14
|
+
" provider: Providers.ANTHROPIC,",
|
|
15
|
+
" model: Models.CLAUDE_HAIKU_4_5,",
|
|
16
|
+
" prompt: \"Write the report and save outputs.\",",
|
|
17
|
+
" secrets: { apiKey: process.env.ANTHROPIC_API_KEY! }",
|
|
18
|
+
"});",
|
|
19
|
+
"",
|
|
20
|
+
"for await (const event of aex.stream(runId)) console.log(event.type);",
|
|
21
|
+
"await aex.wait(runId);",
|
|
22
|
+
"await aex.download(runId, { to: \"./run.zip\" });"
|
|
23
|
+
],
|
|
24
|
+
"cliLines": [
|
|
25
|
+
"aex run \\",
|
|
26
|
+
" --api-token \"$AEX_API_TOKEN\" \\",
|
|
27
|
+
" --anthropic-api-key \"$ANTHROPIC_API_KEY\" \\",
|
|
28
|
+
" --model claude-haiku-4-5 \\",
|
|
29
|
+
" --prompt \"Write the report and save outputs.\" \\",
|
|
30
|
+
" --follow"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"providers": [
|
|
34
|
+
{ "id": "anthropic", "name": "Anthropic" },
|
|
35
|
+
{ "id": "deepseek", "name": "DeepSeek" },
|
|
36
|
+
{ "id": "openai", "name": "OpenAI" },
|
|
37
|
+
{ "id": "gemini", "name": "Gemini" },
|
|
38
|
+
{ "id": "mistral", "name": "Mistral" },
|
|
39
|
+
{ "id": "openrouter", "name": "OpenRouter" },
|
|
40
|
+
{ "id": "doubao", "name": "Doubao" },
|
|
41
|
+
{ "id": "doubao-cn", "name": "Doubao China" }
|
|
42
|
+
],
|
|
43
|
+
"featureAreas": [
|
|
44
|
+
{
|
|
45
|
+
"slug": "agent-runtime",
|
|
46
|
+
"href": "/docs/features/#agent-runtime",
|
|
47
|
+
"title": "Agent runtime",
|
|
48
|
+
"description": "Managed autonomous runs with filesystem read/edit, grep/glob/head/tail, open web fetch/search defaults, optional notebook tools, and post-hook repair."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"slug": "durable-infrastructure",
|
|
52
|
+
"href": "/docs/features/#durable-infrastructure",
|
|
53
|
+
"title": "Durable infrastructure",
|
|
54
|
+
"description": "Run records, status, wait/cancel/delete, idempotency, typed events, output capture, downloads, timeouts, and runtime sizes."
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"slug": "agent-composition",
|
|
58
|
+
"href": "/docs/features/#agent-composition",
|
|
59
|
+
"title": "Agent composition",
|
|
60
|
+
"description": "Skills, files, AGENTS.md, remote MCP servers, proxy endpoints, environment variables, packages, and networking controls."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"slug": "subagents",
|
|
64
|
+
"href": "/docs/features/#subagents",
|
|
65
|
+
"title": "Subagents",
|
|
66
|
+
"description": "Typed parent/child lineage for async child runs, output handoff, and bounded agent delegation."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"slug": "models-and-providers",
|
|
70
|
+
"href": "/docs/features/#models-and-providers",
|
|
71
|
+
"title": "Models and providers",
|
|
72
|
+
"description": "Anthropic, DeepSeek, OpenAI, Gemini, Mistral, OpenRouter, Doubao, and Doubao China behind one submission shape."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"slug": "typed-control-surface",
|
|
76
|
+
"href": "/docs/features/#typed-control-surface",
|
|
77
|
+
"title": "Typed control surface",
|
|
78
|
+
"description": "Strongly typed SDK inputs, CLI parity, BYOK secrets, scoped proxy auth, redaction, and output modes."
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|