That token opens both endpoints. This applies to any image, including one you built
yourself from scratch: the platform injects these at container create, not the image.
Those four are the contract. A container’s environment carries other
AGENT37_-prefixed
variables that are runtime internals; they change without notice, so build against the four
above and nothing else.
A model
An OpenAI-compatible endpoint with exactly two routes:GET /v1/models and
POST /v1/chat/completions. Point any OpenAI-compatible client at it.
"default" is a fast, low-cost model we pick and keep current. GET /v1/models lists every
paid model you can name instead; it is free to call. Streaming works. Free models and models
without tool support are rejected, because agents need tools.
Integrations
A Composio MCP server, scoped to this instance’s own entity, at$AGENT37_COMPOSIO_MCP_URL with the same bearer token. It speaks streamable HTTP.
/mcp to whatever URL you give them. That lands on
https://api.agent37.com/mcp/composio/mcp, which is the same server, so register the URL as-is
either way.
It exposes a handful of meta-tools rather than hundreds of individual ones, so it costs very
little context: the agent searches the catalog for what it needs, then executes it. The tool
names and their behavior are Composio’s surface, documented in
Composio’s meta-tools reference.
Billing is ours and is simple: discovery (searching tools, fetching schemas) is free; executing
tools and managing connections bills per tool call, with a batch execute capped at 50 calls.
Wiring an agent to both
Two config blocks, using pi as the example. Neither contains a credential; both reference the environment variable instead:Budgets
Both endpoints draw on the instance budget and then the workspace wallet. LLM calls are metered at provider cost with no markup; Composio tool calls at $0.000114 each. Refusals are a402:
insufficient_balance is the other type, meaning the workspace wallet is empty rather than
the instance cap being reached.
Filesystem rules for a custom image
/home/node and /home/linuxbrew are persistent volumes bind-mounted over your image at
runtime. The volume is created empty, and nothing is ever copied out of the image into it, so
anything your image writes under those paths is unreachable from the running container.
This catches people twice, because npm’s default global prefix is under /home/node:
/usr/local, and put config your agent reads at startup somewhere outside
/home too, or have the entrypoint write it into the volume on every boot. Files your agent
creates at runtime under /home/node persist normally across restarts and image updates.