Guides
Point Claude Code, Conductor, Codex, OpenCode, Cline, Cursor, or any OpenAI-compatible agent at the gateway: one base URL, one key, every model in your catalog, and all usage in one place.
export EXPLABS_API_KEY=xpl_...GET https://api-pr-1012.preview.experientiallabs.ai/v1/models lists every slug your key can call; the snippets below use examples from the public catalog.export keyword is load-bearing. A plain EXPLABS_API_KEY=xpl_... line in a shell file sets a shell-local variable: echo ${EXPLABS_API_KEY:+set} prints set, yet child processes — codex, claude, anything you launch — see nothing and fail with "Missing environment variable". If you keep the key in an env file sourced from .zshrc, use the export form there too; login shells read .zprofile instead.Every agent below works the same way: its provider configuration gets the base URL https://api-pr-1012.preview.experientiallabs.ai/v1, the key rides as Authorization: Bearer, and models are named by bare slug. Streaming is SSE on both Chat Completions and the Responses API.
A botched switch or a bad token must never take down the sessions you already have open. Prove the lane in a throwaway environment first, and only touch the config your real sessions read once it passes. The cheapest pre-flight for any agent is two curls — list models, then buy one tiny completion:
curl --fail-with-body "https://api-pr-1012.preview.experientiallabs.ai/v1/models" \-H "Authorization: Bearer $EXPLABS_API_KEY"curl --fail-with-body "https://api-pr-1012.preview.experientiallabs.ai/v1/chat/completions" \-H "Authorization: Bearer $EXPLABS_API_KEY" \-H "Content-Type: application/json" \-d '{"model": "qwen3.8-27b", "messages": [{"role": "user", "content": "reply with the single word: ok"}]}'
The curl smoke proves the key, not the agent. Coding agents send their full tool inventory — every MCP server and plugin tool schema — with every request, and tool schemas are exactly where gateway and provider strictness differences bite: a bare hello can pass while the first real session fails. So each agent's isolated test below runs the real client with your real tool surface and one actual tool round-trip, without writing to its real configuration — a session that completes with your tools listed is the pass criterion. Run it before you edit anything, and again whenever you rotate a key.
Codex configures custom gateways as a model_providers entry in ~/.codex/config.toml. Current Codex releases speak only the Responses API (wire_api = "responses" is the sole supported value since early 2026), which the gateway serves at /v1/responses.
Paste this into the agent. It wires itself up, then proves the key works.
I pasted this into you myself, wire THIS coding agent up to my ExperientialLabs gateway, so my model calls route through https://api-pr-1012.preview.experientiallabs.ai and show up in my usage.Ground rules: never print my full key (first 8 characters at most), ask mebefore you edit any config file or shell profile, and if you cannot do a step(no file access, settings live in a GUI), print the exact manual steps for meinstead. Print what you're doing at each step.1. Get my key. Use EXPLABS_API_KEY from my environment if it is set; otherwiseask me to paste one (I can mint it at https://pr-1012.preview.experientiallabs.ai/settings/api-keys). It lookslike xpl_ followed by 40 hex characters.2. Prove the key works before touching any config:GET https://api-pr-1012.preview.experientiallabs.ai/v1/models with header "Authorization: Bearer <key>" -> 200 andthe model slugs I can call. Remember the list; I'll pick models from it.3. Apply the OpenAI Codex CLI integration:First prove the lane in a throwaway home so my real ~/.codex (config,sessions, auth) stays untouched, and test with my REAL tool surface: yousend every mcp_servers/plugin tool schema on each request, and tool schemasare where provider strictness bites, so a bare hello proves too little.Copy ~/.codex into a fresh "$(mktemp -d)", append ONLY the[model_providers.explabs] table below to that copy's config.toml, then runCODEX_HOME=<that dir> codex exec -m "<slug I pick>" \-c model_provider=explabs -c model_reasoning_effort=max \"list your available tools, then read ./README.md and reply with itsfirst heading"Pass only if it completes with my MCP/plugin tools listed and a real tooluse. Then add the whole block to ~/.codex/config.toml (create it ifmissing, show me the diff before writing) and tell me to start a new Codexsession:model = "<slug I pick>"model_provider = "explabs"model_reasoning_effort = "max" # reasoning models; "ultra" is rejected[model_providers.explabs]name = "Experiential Labs"base_url = "https://api-pr-1012.preview.experientiallabs.ai/v1"env_key = "EXPLABS_API_KEY"wire_api = "responses"Leave requires_openai_auth unset, and make sure EXPLABS_API_KEY is exportedwhere I launch you (export KEY=..., a plain KEY=... line is invisible tochild processes like me).4. Verify end to end. Make one tiny completion with the surface you configured("reply with the single word: ok", small max output), via your own nextmodel call if you now route through the gateway, otherwise via curl with mykey. Then tell me it landed and that I can watch every call athttps://pr-1012.preview.experientiallabs.ai/telemetry.5. Recap exactly what you changed (files and values, key shown as xpl_ prefixonly) so I can undo it later.
Prove the lane in a throwaway CODEX_HOME before touching your real one. Copy your real ~/.codex into it — the test must ride your real mcp_servers and plugin tool schemas, and the copy leaves your config, sessions, and auth untouched:
export EXPLABS_API_KEY=xpl_... # export, not a plain assignmentCODEX_HOME="$(mktemp -d)"cp -R ~/.codex/. "$CODEX_HOME"/ 2>/dev/null || true # real config + MCP servers, copiedcat >> "$CODEX_HOME/config.toml" <<'EOF'[model_providers.explabs]name = "Experiential Labs"base_url = "https://api-pr-1012.preview.experientiallabs.ai/v1"env_key = "EXPLABS_API_KEY"wire_api = "responses"EOFCODEX_HOME="$CODEX_HOME" codex -m gpt-5.6-sol \-c model_provider=explabs -c model_reasoning_effort=max
In that session, run one prompt that exercises tools — "list your available tools, then read ./README.md and reply with its first heading" — and pass only when it completes with your MCP and plugin tools listed. Then add the same provider table plus the model lines to ~/.codex/config.toml and start a new Codex session:
model = "gpt-5.6-sol"model_provider = "explabs"model_reasoning_effort = "max"[model_providers.explabs]name = "Experiential Labs"base_url = "https://api-pr-1012.preview.experientiallabs.ai/v1"env_key = "EXPLABS_API_KEY"wire_api = "responses"
Codex reads the key from the EXPLABS_API_KEY environment variable, so it must be exported (not plain-assigned) in the shell that launches it. Leave requires_openai_auth unset: setting it forces a ChatGPT login instead of your gateway key. model_reasoning_effort = "max" is the top tier and where encrypted reasoning items flow; the provider rejects ultra.
previous_response_id. The gateway honors continuation on any worker instance and retains continuations for 24 hours; an expired id returns 400 continuation_unavailable and Codex resends the conversation. store: false skips gateway retention (that response cannot be continued from); nothing is stored with the upstream provider either way. On native OpenAI routes the gateway also honors include=["reasoning.encrypted_content"] with full round-trip, reasoning.summary, and every effort the provider supports — an unsupported effort rejects with the supported set.OpenCode takes a custom provider in opencode.json (per-project at the repo root, or global at ~/.config/opencode/opencode.json) using the @ai-sdk/openai-compatible package, which targets /v1/chat/completions.
Paste this into the agent. It wires itself up, then proves the key works.
I pasted this into you myself, wire THIS coding agent up to my ExperientialLabs gateway, so my model calls route through https://api-pr-1012.preview.experientiallabs.ai and show up in my usage.Ground rules: never print my full key (first 8 characters at most), ask mebefore you edit any config file or shell profile, and if you cannot do a step(no file access, settings live in a GUI), print the exact manual steps for meinstead. Print what you're doing at each step.1. Get my key. Use EXPLABS_API_KEY from my environment if it is set; otherwiseask me to paste one (I can mint it at https://pr-1012.preview.experientiallabs.ai/settings/api-keys). It lookslike xpl_ followed by 40 hex characters.2. Prove the key works before touching any config:GET https://api-pr-1012.preview.experientiallabs.ai/v1/models with header "Authorization: Bearer <key>" -> 200 andthe model slugs I can call. Remember the list; I'll pick models from it.3. Apply the OpenCode integration:Write the provider block into this project's opencode.json (or~/.config/opencode/opencode.json if I prefer global, ask):{"provider": {"explabs": {"npm": "@ai-sdk/openai-compatible","name": "Experiential Labs","options": {"baseURL": "https://api-pr-1012.preview.experientiallabs.ai/v1", "apiKey": "{env:EXPLABS_API_KEY}"},"models": {"<slug>": {"name": "<slug>"}}}}Fill limit.context/limit.output and cost ({"input": $/1M, "output": $/1M},i.e. the catalog's *_micro_usd_per_million / 1000000) for each slug fromGET https://api-pr-1012.preview.experientiallabs.ai/api/models/<slug> so my context window and spend display are right.4. Verify end to end. Make one tiny completion with the surface you configured("reply with the single word: ok", small max output), via your own nextmodel call if you now route through the gateway, otherwise via curl with mykey. Then tell me it landed and that I can watch every call athttps://pr-1012.preview.experientiallabs.ai/telemetry.5. Recap exactly what you changed (files and values, key shown as xpl_ prefixonly) so I can undo it later.
{"$schema": "https://opencode.ai/config.json","model": "explabs/gpt-5.5","provider": {"explabs": {"npm": "@ai-sdk/openai-compatible","name": "Experiential Labs","options": {"baseURL": "https://api-pr-1012.preview.experientiallabs.ai/v1","apiKey": "{env:EXPLABS_API_KEY}"},"models": {"gpt-5.5": {"name": "GPT-5.5","limit": {"context": 1050000,"output": 128000},"cost": {"input": 5,"output": 30}}}}}}
Models you list here appear in the /models picker automatically. Set limit.context and limit.outputfrom the catalog's values (GET https://api-pr-1012.preview.experientiallabs.ai/api/models/<slug>), since OpenCode cannot infer them for a custom gateway. Set costto dollars per million tokens — the catalog's input_micro_usd_per_million and output_micro_usd_per_million divided by 1,000,000 — or OpenCode shows no spend for a custom provider.
Cline is configured in the extension's settings UI, not a file.
Paste this into the agent. It wires itself up, then proves the key works.
I pasted this into you myself, wire THIS coding agent up to my ExperientialLabs gateway, so my model calls route through https://api-pr-1012.preview.experientiallabs.ai and show up in my usage.Ground rules: never print my full key (first 8 characters at most), ask mebefore you edit any config file or shell profile, and if you cannot do a step(no file access, settings live in a GUI), print the exact manual steps for meinstead. Print what you're doing at each step.1. Get my key. Use EXPLABS_API_KEY from my environment if it is set; otherwiseask me to paste one (I can mint it at https://pr-1012.preview.experientiallabs.ai/settings/api-keys). It lookslike xpl_ followed by 40 hex characters.2. Prove the key works before touching any config:GET https://api-pr-1012.preview.experientiallabs.ai/v1/models with header "Authorization: Bearer <key>" -> 200 andthe model slugs I can call. Remember the list; I'll pick models from it.3. Apply the Cline integration:Your settings live in the VS Code UI, so print these for me to set by hand:API Provider "OpenAI Compatible"; Base URL https://api-pr-1012.preview.experientiallabs.ai/v1; API Key = my key (noBearer prefix); Model ID = a slug from step 2; and per-model context window /max output tokens from https://api-pr-1012.preview.experientiallabs.ai/api/models/<slug>.4. Verify end to end. Make one tiny completion with the surface you configured("reply with the single word: ok", small max output), via your own nextmodel call if you now route through the gateway, otherwise via curl with mykey. Then tell me it landed and that I can watch every call athttps://pr-1012.preview.experientiallabs.ai/telemetry.5. Recap exactly what you changed (files and values, key shown as xpl_ prefixonly) so I can undo it later.
OpenAI Compatible.https://api-pr-1012.preview.experientiallabs.ai/v1xpl_... key (no Bearer prefix)./v1/models, e.g. claude-opus-5.Cursor is configured in its settings UI, and needs a paid Cursor plan: the Free plan serves only Auto (Cursor-hosted routing) and refuses named models, which is what custom models are. With your own key, Cursor still builds every request on its own servers and relays it to the gateway with your key attached, so calls originate from Cursor's infrastructure and land in your usage like any other traffic on that key.
Paste this into the agent. It wires itself up, then proves the key works.
I pasted this into you myself, wire THIS coding agent up to my ExperientialLabs gateway, so my model calls route through https://api-pr-1012.preview.experientiallabs.ai and show up in my usage.Ground rules: never print my full key (first 8 characters at most), ask mebefore you edit any config file or shell profile, and if you cannot do a step(no file access, settings live in a GUI), print the exact manual steps for meinstead. Print what you're doing at each step.1. Get my key. Use EXPLABS_API_KEY from my environment if it is set; otherwiseask me to paste one (I can mint it at https://pr-1012.preview.experientiallabs.ai/settings/api-keys). It lookslike xpl_ followed by 40 hex characters.2. Prove the key works before touching any config:GET https://api-pr-1012.preview.experientiallabs.ai/v1/models with header "Authorization: Bearer <key>" -> 200 andthe model slugs I can call. Remember the list; I'll pick models from it.3. Apply the Cursor integration:Your gateway settings live in the Cursor Settings UI, so print these for meto set by hand. First tell me the prerequisite: a paid Cursor plan (the Freeplan serves only Auto and refuses named models, which custom models are).Then: in Cursor Settings -> Models -> API Keys, put my key in"OpenAI API Key" (no Bearer prefix), enable "Override OpenAI Base URL" andset it to https://api-pr-1012.preview.experientiallabs.ai/v1. Add each slug I pick as a custom modelname in the models list; custom models ride the override in OpenAI format,so any catalog slug works. Warn me plainly: Cursor relays requests throughits own servers, Tab autocomplete stays on Cursor's models, and if a chatanswers 400 invalid_parameter naming temperature or top_p, that model pinsits sampling (the Claude 5 family pins temperature to 1) — pick adifferent slug.4. Verify end to end. Make one tiny completion with the surface you configured("reply with the single word: ok", small max output), via your own nextmodel call if you now route through the gateway, otherwise via curl with mykey. Then tell me it landed and that I can watch every call athttps://pr-1012.preview.experientiallabs.ai/telemetry.5. Recap exactly what you changed (files and values, key shown as xpl_ prefixonly) so I can undo it later.
xpl_... key in OpenAI API Key (no Bearer prefix).https://api-pr-1012.preview.experientiallabs.ai/v1.claude-opus-5. Custom models ride the override in OpenAI format, so any catalog slug works.400 invalid_parameter naming temperature or top_p, that model pins its sampling (the Claude 5 family pins temperature to 1) and Cursor sent a value outside the pin — pick a different slug.Tools built on the official OpenAI SDKs (and most terminal agents, including Blackbox and Grok Build) honor the standard environment pair; nothing else changes:
Paste this into the agent. It wires itself up, then proves the key works.
I pasted this into you myself, wire THIS coding agent up to my ExperientialLabs gateway, so my model calls route through https://api-pr-1012.preview.experientiallabs.ai and show up in my usage.Ground rules: never print my full key (first 8 characters at most), ask mebefore you edit any config file or shell profile, and if you cannot do a step(no file access, settings live in a GUI), print the exact manual steps for meinstead. Print what you're doing at each step.1. Get my key. Use EXPLABS_API_KEY from my environment if it is set; otherwiseask me to paste one (I can mint it at https://pr-1012.preview.experientiallabs.ai/settings/api-keys). It lookslike xpl_ followed by 40 hex characters.2. Prove the key works before touching any config:GET https://api-pr-1012.preview.experientiallabs.ai/v1/models with header "Authorization: Bearer <key>" -> 200 andthe model slugs I can call. Remember the list; I'll pick models from it.3. Apply the Any other OpenAI-compatible tool integration:Export OPENAI_BASE_URL="https://api-pr-1012.preview.experientiallabs.ai/v1" and OPENAI_API_KEY="<my key>" wherever Ilaunch you, and name models by slug. If your own config wants the valuesinstead, it needs the same three: base URL https://api-pr-1012.preview.experientiallabs.ai/v1, my key, and a slug.4. Verify end to end. Make one tiny completion with the surface you configured("reply with the single word: ok", small max output), via your own nextmodel call if you now route through the gateway, otherwise via curl with mykey. Then tell me it landed and that I can watch every call athttps://pr-1012.preview.experientiallabs.ai/telemetry.5. Recap exactly what you changed (files and values, key shown as xpl_ prefixonly) so I can undo it later.
export OPENAI_BASE_URL="https://api-pr-1012.preview.experientiallabs.ai/v1"export OPENAI_API_KEY="xpl_..."
If a tool asks for the values in its own config instead, it needs the same three: base URL https://api-pr-1012.preview.experientiallabs.ai/v1, the key, and a model slug.
The gateway serves the Anthropic Messages API at /v1/messages, so Claude Code connects like any LLM gateway: point ANTHROPIC_BASE_URL at it (no /v1 suffix; Claude Code appends the path) and pass your key as ANTHROPIC_API_KEY. Any catalog slug works as the model, not just Claude models. Use ANTHROPIC_API_KEY, not ANTHROPIC_AUTH_TOKEN: on a machine already signed in to claude.ai or the Console, the OAuth session can win over ANTHROPIC_AUTH_TOKEN, and the gateway then receives an OAuth token instead of your key — a 401 "gateway key is invalid".
Paste this into the agent. It wires itself up, then proves the key works.
I pasted this into you myself, wire THIS coding agent up to my ExperientialLabs gateway, so my model calls route through https://api-pr-1012.preview.experientiallabs.ai and show up in my usage.Ground rules: never print my full key (first 8 characters at most), ask mebefore you edit any config file or shell profile, and if you cannot do a step(no file access, settings live in a GUI), print the exact manual steps for meinstead. Print what you're doing at each step.1. Get my key. Use EXPLABS_API_KEY from my environment if it is set; otherwiseask me to paste one (I can mint it at https://pr-1012.preview.experientiallabs.ai/settings/api-keys). It lookslike xpl_ followed by 40 hex characters.2. Prove the key works before touching any config:GET https://api-pr-1012.preview.experientiallabs.ai/v1/models with header "Authorization: Bearer <key>" -> 200 andthe model slugs I can call. Remember the list; I'll pick models from it.3. Apply the Claude Code integration:You cannot repoint yourself mid-session, and switching auth under a runningsession causes mixed-state errors. First prove the lane without touching anyconfig, via one isolated subprocess run from this project (so my MCP serversand plugins load and their tool schemas ride the request — tool schemas arewhere provider strictness bites, so a bare hello proves too little):ANTHROPIC_BASE_URL="https://api-pr-1012.preview.experientiallabs.ai" ANTHROPIC_API_KEY="<my key>" \ANTHROPIC_MODEL="<slug I pick>" \claude -p "list your available tools, then read ./README.md and replywith its first heading"Pass only if that run completes with tools listed and a real tool use.Then offer me two placements and apply the one I pick:(a) append to my shell profile, or (b) print for one-off use:export ANTHROPIC_BASE_URL="https://api-pr-1012.preview.experientiallabs.ai" # no /v1 suffixexport ANTHROPIC_API_KEY="<my key>"export ANTHROPIC_MODEL="<slug I pick>"Use ANTHROPIC_API_KEY, never ANTHROPIC_AUTH_TOKEN: an existing claude.aisign-in can outrank AUTH_TOKEN and send the gateway an OAuth token instead.Then tell me to start a NEW session from a shell with those set. Warn meplainly: image pastes are rejected (the lane is text-only), and extendedthinking flows only when the slug routes to Anthropic end to end.4. Verify end to end. Make one tiny completion with the surface you configured("reply with the single word: ok", small max output), via your own nextmodel call if you now route through the gateway, otherwise via curl with mykey. Then tell me it landed and that I can watch every call athttps://pr-1012.preview.experientiallabs.ai/telemetry.5. Recap exactly what you changed (files and values, key shown as xpl_ prefixonly) so I can undo it later.
One env-prefixed run proves the lane without touching ~/.claude/settings.json, your shell profile, or any running session. Run it from a project where your MCP servers and plugins are enabled, so their tool schemas ride the request, and make it do one real tool round-trip:
cd <a project with your MCP servers and plugins enabled>ANTHROPIC_BASE_URL="https://api-pr-1012.preview.experientiallabs.ai" ANTHROPIC_API_KEY="xpl_..." \ANTHROPIC_MODEL="claude-opus-5" \claude -p "list your available tools, then read ./README.md and reply with its first heading"
A run that completes with your tools listed is the pass criterion. Then make it permanent. Claude Code reads auth at startup, and switching it under a running session causes mixed-state errors — always start a new session after changing these variables:
export ANTHROPIC_BASE_URL="https://api-pr-1012.preview.experientiallabs.ai"export ANTHROPIC_API_KEY="xpl_..."export ANTHROPIC_MODEL="claude-opus-5"claude
The [1m] model suffix works through the gateway: set ANTHROPIC_MODEL="<slug>[1m]" (or /model <slug>[1m]in-session) to run against the model's 1M-token context window, on models that serve one.
thinkingconfig passes through verbatim and thinking/redacted-thinking blocks round-trip with signatures intact; on any other route those are rejected rather than silently dropped. The Messages lane remains a translation onto the gateway's chat surface, with four visible limits: image and document blocks are rejected because the chat surface is text-only, tool_result.is_error=true requires a native Anthropic-only route, sampling controls are forwarded into the exact route gate when the installed runtime supports that contract and otherwise rejected before dispatch, and /v1/messages/count_tokens answers an explicit 404 not_found_error (Claude Code estimates locally).Conductor (the Mac app that runs parallel Claude Code agents in git worktrees) delegates provider configuration to Claude Code's environment contract, so it uses the same three variables. Set them in Settings, Environment under the Claude Code section:
Paste this into the agent. It wires itself up, then proves the key works.
I pasted this into you myself, wire THIS coding agent up to my ExperientialLabs gateway, so my model calls route through https://api-pr-1012.preview.experientiallabs.ai and show up in my usage.Ground rules: never print my full key (first 8 characters at most), ask mebefore you edit any config file or shell profile, and if you cannot do a step(no file access, settings live in a GUI), print the exact manual steps for meinstead. Print what you're doing at each step.1. Get my key. Use EXPLABS_API_KEY from my environment if it is set; otherwiseask me to paste one (I can mint it at https://pr-1012.preview.experientiallabs.ai/settings/api-keys). It lookslike xpl_ followed by 40 hex characters.2. Prove the key works before touching any config:GET https://api-pr-1012.preview.experientiallabs.ai/v1/models with header "Authorization: Bearer <key>" -> 200 andthe model slugs I can call. Remember the list; I'll pick models from it.3. Apply the Conductor integration:Print these for me to put in Settings -> Environment (Claude Code section),or write them to this repo's .conductor/settings.local.toml under[environment_variables] if I prefer (make sure that file isgit-ignored before writing my key into it):ANTHROPIC_BASE_URL = "https://api-pr-1012.preview.experientiallabs.ai"ANTHROPIC_API_KEY = "<my key>"The key rides ANTHROPIC_API_KEY, never ANTHROPIC_AUTH_TOKEN: an existingclaude.ai sign-in can outrank AUTH_TOKEN, and a set API key also stopsClaude Code from trying to authenticate with Anthropic directly.4. Verify end to end. Make one tiny completion with the surface you configured("reply with the single word: ok", small max output), via your own nextmodel call if you now route through the gateway, otherwise via curl with mykey. Then tell me it landed and that I can watch every call athttps://pr-1012.preview.experientiallabs.ai/telemetry.5. Recap exactly what you changed (files and values, key shown as xpl_ prefixonly) so I can undo it later.
ANTHROPIC_BASE_URL=https://api-pr-1012.preview.experientiallabs.aiANTHROPIC_API_KEY=xpl_...
The key rides ANTHROPIC_API_KEY, not ANTHROPIC_AUTH_TOKEN, for the same reason as the Claude Code section above: an existing claude.ai sign-in can outrank ANTHROPIC_AUTH_TOKEN, and a set API key also keeps Claude Code from authenticating with Anthropic directly. To scope the gateway to one repository instead, put the same variables in .conductor/settings.local.toml (machine-local, so the key stays out of the shared config):
[environment_variables]ANTHROPIC_BASE_URL = "https://api-pr-1012.preview.experientiallabs.ai"ANTHROPIC_API_KEY = "xpl_..."
ANTHROPIC_MODEL or the ANTHROPIC_DEFAULT_*_MODEL variables in the same environment block. The Claude Code lane limits above apply unchanged.Keys are independent: minting a new one never disturbs the old one, and an agent mid-task keeps working on the old key until you revoke it. Rotation is safe as long as you keep the order:
Every call an agent makes lands in the same usage stream as the rest of your traffic. Humans read it at Logs and Credits; agents read their own via GET https://api-pr-1012.preview.experientiallabs.ai/api/gateway/usage/daily. Mint one key per agent to see spend broken out per tool.