Configuration tables¶
Every field of vessel.toml, declared tool files and deployment.toml, with its type, default and constraints.
These tables are generated from AstralVessel's pydantic models when the site is built. Unknown keys are refused in
every table. For what each setting does, see vessel.toml and
deployment.toml.
vessel.toml¶
Manifest¶
The top level of vessel.toml.
| Field | Type | Default | Constraints |
|---|---|---|---|
agent |
AgentSection | required | |
model |
ModelSection | required | |
tools |
ToolsSection | table below | |
sandbox |
SandboxSection | table below | |
output |
OutputSection | table below |
AgentSection¶
[agent]
| Field | Type | Default | Constraints |
|---|---|---|---|
name |
str | required | matches ^[a-z][a-z0-9-]{0,62}$ |
description |
str | required | |
version |
str | "0.1.0" |
|
examples |
list[str] | [] |
ModelSection¶
[model]
| Field | Type | Default | Constraints |
|---|---|---|---|
endpoint |
str | "env:VESSEL_MODEL_URL" |
|
model |
str | required | |
api_key |
str | "env:VESSEL_MODEL_KEY" |
|
temperature |
float | 0.2 |
|
max_steps |
int | 40 |
>= 1, <= 200 |
max_output_tokens |
int | 8192 |
>= 256 |
send_reasoning |
bool | false |
|
images |
bool | false |
ToolsSection¶
[tools]
| Field | Type | Default | Constraints |
|---|---|---|---|
builtin |
list[str] | [] |
|
declared |
list[str] | [] |
Also checked when the file loads:
- Every
builtinentry must be one ofread,grep,glob,list,bash,webfetch,websearch.
SandboxSection¶
[sandbox]
| Field | Type | Default | Constraints |
|---|---|---|---|
workdir |
str | "/workspace" |
|
mounts |
list[Mount] | [] |
|
deadline_seconds |
int | 600 |
>= 5, <= 3600 |
tool_timeout_seconds |
int | 60 |
>= 1, <= 600 |
tool_output_chars |
int | 20000 |
>= 1000, <= 200000 |
dockerfile |
str | None | none |
Also checked when the file loads:
dockerfilemust be inside the agent folder.
Mount¶
An entry of [sandbox] mounts.
| Field | Type | Default | Constraints |
|---|---|---|---|
source |
str | required | |
target |
str | required | |
read_only |
bool | true |
OutputSection¶
[output]
| Field | Type | Default | Constraints |
|---|---|---|---|
primitives |
bool | false |
|
files |
list["png" | "svg" | "csv" | "pdf"] | [] |
Declared tool files¶
DeclaredTool¶
| Field | Type | Default | Constraints |
|---|---|---|---|
name |
str | required | matches ^[a-z][a-z0-9_]{0,62}$ |
description |
str | required | |
command |
list[str] | None | none | |
service |
str | None | none | matches ^[a-z][a-z0-9-]{0,62}$ |
path |
str | None | none | matches ^/[A-Za-z0-9._~/-]{0,200}$ |
parameters |
dict[str, Any] | {"type": "object", "properties": {}} |
|
timeout_seconds |
int | None | none | |
input |
"json-stdin" | "args" | "json-stdin" |
|
scope |
"tools:read" | "tools:search" | "tools:files" | "tools:write" | "tools:system" | "tools:execute" | "tools:read" |
Also checked when the file loads:
- Exactly one of
commandorservice. - A service tool needs
path, with no..segment. - The name may not repeat another declared tool or a built-in tool.
deployment.toml¶
DeploymentFile¶
The top level of deployment.toml.
| Field | Type | Default | Constraints |
|---|---|---|---|
vessel |
VesselSection | table below | |
egress |
EgressSection | required | |
search |
SearchSection | table below | |
agents |
list[AgentEntry] | required | |
apps |
list[AppEntry] | [] |
|
issuers |
list[IssuerEntry] | [] |
Also checked when the file loads:
- At least one agent; agent ids are unique.
- At least one
[[apps]]or[[issuers]]. - App names are unique; issuer ids and issuer URLs are each unique.
- Every agent an app or issuer names must exist.
VesselSection¶
[vessel]
| Field | Type | Default | Constraints |
|---|---|---|---|
project |
str | "astralvessel" |
matches ^[a-z0-9][a-z0-9_-]{0,62}$ |
public_url |
str | "http://vessel:8700" |
|
front_subnet |
str | "172.31.247.0/24" |
|
front_address |
str | "172.31.247.10" |
|
task_ttl_hours |
float | 24 |
> 0 |
Also checked when the file loads:
front_addressmust be insidefront_subnet, andfront_subnetmust be a network address (172.31.247.0/24, not172.31.247.1/24).front_subnetmust be a /28 or larger, andfront_addressmust be in its lower half; other containers onfrontget addresses from the upper half.
EgressSection¶
[egress]
| Field | Type | Default | Constraints |
|---|---|---|---|
upstream_url |
str | required | |
upstream_key |
str | "env:VESSEL_UPSTREAM_MODEL_KEY" |
Also checked when the file loads:
upstream_urlmust be anhttp://orhttps://URL with a host and no spaces, orenv:NAMEwith a valid variable name.
SearchSection¶
[search]
| Field | Type | Default | Constraints |
|---|---|---|---|
provider |
"searxng" | "duckduckgo" | "searxng" |
AgentEntry¶
[[agents]]
| Field | Type | Default | Constraints |
|---|---|---|---|
id |
str | required | matches ^[a-z][a-z0-9-]{0,62}$ |
package |
str | required | |
sandbox |
SandboxProfile | table below | |
services |
dict[str, ServiceGrant] | {} |
|
prompt_append |
list[str] | [] |
|
model |
str | None | none | min length 1 |
Also checked when the file loads:
- The
serviceskeys must match the services the agent's tools name, no more and no fewer. - Each
prompt_appendfile must exist inside the agent folder.
SandboxProfile¶
[agents.sandbox]
| Field | Type | Default | Constraints |
|---|---|---|---|
mounts |
list[MountGrant] | [] |
|
memory |
str | "2g" |
|
cpus |
float | 2 |
> 0 |
pids |
int | 512 |
>= 32 |
scratch |
str | "256m" |
|
turn_disk |
str | None | none | |
user_disk |
str | None | none |
Also checked when the file loads:
- Each mount must be read-only, and the targets must match the agent's
[sandbox] mountsexactly. turn_diskdefaults to a quarter ofscratchanduser_diskto half; sizes look like64mor2g, and0 < turn_disk <= user_disk <= scratch.
MountGrant¶
An entry of [agents.sandbox] mounts.
| Field | Type | Default | Constraints |
|---|---|---|---|
target |
str | required | |
source |
str | required | |
read_only |
bool | true |
ServiceGrant¶
[agents.services.<name>]
| Field | Type | Default | Constraints |
|---|---|---|---|
url |
str | required | |
headers |
dict[str, str] | {} |
Also checked when the file loads:
- Header names may not start with
X-Vessel-. - A literal
urlmust start withhttp://orhttps://and carry no?or#.
AppEntry¶
[[apps]]
| Field | Type | Default | Constraints |
|---|---|---|---|
name |
str | required | matches ^[a-z][a-z0-9-]{0,62}$ |
key_sha256 |
str | required | |
agents |
list[str] | required |
IssuerEntry¶
[[issuers]]
| Field | Type | Default | Constraints |
|---|---|---|---|
id |
str | required | matches ^[a-z][a-z0-9-]{0,62}$ |
issuer |
str | required | |
audience |
str | required | |
jwks_url |
str | None | none | |
jwks_file |
str | None | none | |
authorized_parties |
list[str] | [] |
|
algorithms |
list[str] | ["RS256", "ES256", "EdDSA"] |
|
agents |
list[str] | required |
Also checked when the file loads:
- Exactly one of
jwks_urlorjwks_file. jwks_urlmust start withhttps://.algorithmsmust be non-empty and drawn fromRS256,RS384,RS512,PS256,ES256,ES384,EdDSA.