Providers and sign-in
Mercury routes a session’s model to the provider that owns its identifier. Each provider has its own API, credentials and refusals.
Provider access
- OpenAI: A ChatGPT subscription sign-in or an API key.
- Anthropic: One Anthropic row on
/logins(in the chat card and on the first-run sign-in screen alike) with Anthropic Console (browser sign-in, which mints an API key, awaits its save and never reuses a closed flow) and an Anthropic API key for usage-based billing (masked paste, checked againstGET /v1/models?limit=1before saving, prompting for the workspace ID from Console → Settings → Workspaces when the key is organisation-scoped so every Messages, token-counting and catalogue request carriesanthropic-workspace-id, and reporting a refused key in the field without storing it). Switching between saved Anthropic account slots ([s]) applies to new requests only: a turn or crewmate in flight keeps the credential it started with and recovers by re-resolving without failing on a 401. - OpenRouter: One credential for the whole catalogue, by OAuth or an API key. The OpenRouter routing policy row in
/configchooses strict, balanced or open routing; balanced is on from the start, with data collection denied, every request parameter required, fallbacks on and zero data retention off. Therouting.openrouter.*settings hold the same choices. - Google: Sign in with Google to use your account’s plan quota, or use an API key or your own OAuth client through six guided steps to bill a Google Cloud project. The key resolver takes
GOOGLE_API_KEYbeforeGEMINI_API_KEY. - Hugging Face: A device-code sign-in (
/logins huggingface, requestingopenid profile inference-api write-endpointsfor identity, Inference Providers calls and Inference Endpoints management) or a stored Hub token (HF_TOKENtakes precedence). - Moonshot: A device-code sign-in or an API key.
- Z.AI: A GLM Coding Plan subscription key or a general pay-as-you-go API key, through
/logins zaiorZAI_API_KEY. A key stored through/logins zaicarries the plan it was checked under; a key supplied throughZAI_API_KEYor a key command uses the planZAI_KEY_PLANnames (codingorgeneral), and whenZAI_KEY_PLANis unset Mercury learns the plan once per process from the key’s models list (checking the general basehttps://api.z.ai/api/paas/v4first, then the GLM Coding Plan basehttps://api.z.ai/api/coding/paas/v4) and corrects it if a chat refusal names the other plan. - DeepSeek: An API key from the DeepSeek platform, through
/logins deepseekorDEEPSEEK_API_KEY. - xAI: A Grok subscription sign-in (SuperGrok or X Premium), or an API key, through
/logins xai.XAI_API_KEYandXAI_MANAGEMENT_API_KEYpin the keys from the environment, and/logins xaiadds the management key after the inference key. - Meta: Sign in with Meta (a Muse Code subscription, a device code in your browser) or a pay-as-you-go Model API key, through
/logins meta,/logins muse,MODEL_API_KEYorMETA_API_KEY. Sign in with Meta exchanges the device code against Meta’s OIDC endpoints (auth.meta.com/oidc/device/authorization/and/oidc/device/token/) under Muse Code’s public client id, sends the resulting account token once toapi.meta.ai/muse-code/keyto mint the subscription’s API key (and on bounded/usagereads for the plan’s tier and usage windows), and sends only the minted key on every model request toapi.meta.ai/v1. A pasted Model API key orMODEL_API_KEY/META_API_KEYbills pay-as-you-go. - Mistral: An API key, through
/logins mistralorMISTRAL_API_KEY. The picker lists the account’s own models (with recorded rows includingmistral-large-4,mistral-medium-3-5,mistral-small-2603,mistral-large-2512, the three Ministral 3 sizes,codestral-2508, and Z.aizai-glm-5-3andzai-glm-5-3-flashat 1M-token context withlow,highandmaxeffort onzai-glm-5-3), and an Admin API key added beside the key (/logins mistralafter the inference key, orMISTRAL_ADMIN_API_KEY) turns on the organisation usage meter. - Nous Portal: Sign in with your Nous Portal account (an OAuth device-code approval in your browser) or paste an API key made at
portal.nousresearch.com, through/logins nousorNOUS_API_KEY, for the Portal’s model gateway, which serves models from several companies under the Portal’s own identifiers (nous/<vendor>/<model>)./usageshows the Portal’s plan and usable credits, and/accountsshows and removes the sign-in or stored key. - OpenCode Zen: An API key from
opencode.ai/console, through/logins zen(opencode) orOPENCODE_API_KEY. The gateway’s models run aszen/<id>across its chat-completions shape (includingMistral Large 4with a 524,288-token window) and its Responses shape (includingGPT,Grok,Muse SparkandMuse Wonderrows), and/usageshows the session’s spend and an OpenCode Go plan’s windows. - MiniMax: An API key (a pay-as-you-go Open Platform key or an M Plan Subscription Key) through
/logins minimaxorMINIMAX_API_KEY, checked onGET /v1/modelsbefore it is stored. Runs M-series text models (MiniMax-M3,MiniMax-M3.1-Flashwith 1M-token context, image input,$0.15input /$0.015cached /$0.60output per million tokens and tunablelowthroughmaxeffort,MiniMax-M3.1-Flash-Previewon the M Plan, andMiniMax-M2.7; bare wordminimax) withreasoning_split: trueand per-model thinking controls;/usageshows session spend and, for an M Plan key, the plan’s 5-hour and weekly windows per model. A pay-as-you-go Open Platform key stored through/logins minimaxalso serves namedvideoProvider.<name>generators (kindset tominimax,modelset toMiniMax-H3orMiniMax-H3-Max, optionalbaseUrldefaulting toapi.minimax.ioover HTTPS) configured in user or project settings for the Video tool. - Together AI: An API key through
/logins together,TOGETHER_API_KEYorTOGETHER_AI_API_KEY, checked onGET /v1/modelsbefore it is stored. Serves a live catalogue of open-weights chat models undertogether/<org>/<model>(bare wordtogether) withprompt_cache_keysession affinity, model-specific reasoning controls, and recorded vision flags and prices (includingGLM 5.3 Flash,DeepSeek V4.1 Flash,DeepSeek V4.1 Flash 1017,Qwen3.8 2.4T,Qwen3.8 Flash,Qwen3.7 Max,Qwen3.7 Plus,Qwen3.6 Plus,Qwen3.5 9B,Qwen3.5 397B-A17B,MiniMax M3.1 Flash,Muse Spark Open 816B,Muse Glimmer 30B,Inkling,Ternary Bonsai 27BandTev1 4B Experimental). - Cohere: An API key through
/logins cohere,COHERE_API_KEYorCO_API_KEY, checked onGET /compatibility/v1/modelsbefore it is stored. Runs Command, North and Aya chat models (command-*,north-*,c4ai-aya-*,tiny-aya-*; bare wordcohere) with structured JSON output andreasoning_effort(highornone) on reasoning rows. - Groq: An API key from
console.groq.com/keys, through/logins groqorGROQ_API_KEY. Live text models use qualified ids such asgroq/openai/gpt-oss-120b(bare wordgroq), with per-model reasoning format and effort and observed rate limits in/usage. - Cerebras: An API key from
cloud.cerebras.ai, through/logins cerebrasorCEREBRAS_API_KEY. Live text models use qualified ids such ascerebras/gpt-oss-120b(bare wordcerebras), with reasoning effort and a stable conversation cache key. - Fireworks AI: An API key from
app.fireworks.ai/api-keys, through/logins fireworksorFIREWORKS_API_KEY. Live text models use qualifiedfireworks/<model-id>resource ids (including short aliases such asfireworks/kimi-k3,fireworks/accounts/fireworks/models/minimax-m3p1-flashwith 1,040,000 context and image input,muse-spark-open,deepseek-v4p1-flash-1017, and the image-capable Fire Pass routerfireworks/kimi-fast-latest; bare wordfireworks), with top-level reasoning effort, session-affinity prompt caching and observed TPM limits in/usage. - Melious AI: An API key from
melious.ai/account/api/keys(withinference.modelsandinference.chatscopes), through/logins meliousorMELIOUS_API_KEY. Live chat models run asmelious/<model-id>, including:speed,:price,:ecoand:batchrouting variants (balanced by default), with reasoning effort (includingmax) and EUR request costs and limits in/usage. - OrcaRouter: A device-code sign-in or an API key from
orcarouter.ai/console/token, through/logins orcarouterorORCAROUTER_API_KEY. Models run asorcarouter/<vendor>/<model>ororcarouter/<alias>(and named routers asorcarouter/orcarouter/<name>, includingorcarouter/orcarouter/auto), with reasoning effort, session affinity and per-request cost reporting in/usage. - Qwen: A QwenCloud API key (
qwencloud.com: Token Plan or pay-as-you-go) or an Alibaba Cloud Model Studio API key (modelstudio.alibabacloud.com: pay-as-you-go, Token Plan or Coding Plan), connected through/logins qwenorDASHSCOPE_API_KEY. Each key is checked on its own endpoint before it is stored: a key beginningsk-sp-probes the QwenCloud Token Plan endpoint (token-plan.maas.qwencloudapi.com/compatible-mode/v1) and the Model Studio Coding Plan endpoints (coding-intl.dashscope.aliyuncs.com/v1, thencoding.dashscope.aliyuncs.com/v1), while any other key probes the QwenCloud pay-as-you-go endpoint (maas.qwencloudapi.com/compatible-mode/v1) and the Model Studio regional and Token Plan endpoints (International Singapore, China Beijing, China Hong Kong, and the Token Plan in Singapore and Beijing;DASHSCOPE_BASE_URLpins an endpoint directly andDASHSCOPE_WORKSPACE_IDadds workspace-dedicated domains). Qwen’s status and/modelrows name the console a key belongs to (QwenCloudorModel Studio) from the endpoint that accepted it, or both while none has. A plan key lists the plan’s documented models withQwen3.8 Maxfirst and the plan’s Auto row (qwen-auto, sent asauto), and a pay-as-you-go endpoint merges its live text model list with dated pins (sending a pinned id absent from the live list for the bound endpoint’s console to decide). The family wordqwenrunsQwen3.8 Maxwherever it is a row, and requests sendenable_thinking,preserve_thinking,reasoning_effort(low,medium,xhigh) on the Qwen3.8 rows, orthinking_budgetfrommodels.<id>.thinkingBudget. - Local servers: No sign-in. A discovered server, such as Ollama, LM Studio, vLLM or llama.cpp, is served at each model’s own base URL, or with an optional key in
MERCURY_LOCAL_API_KEY. - Custom endpoints: Configured under
compatProvider.<name>in user, launch or managed-policy settings (baseUrl,label,keyCommand,models,headers,sessionAffinityHeader, anddialect:chat-completions,responses,ollama,lmstudio,vllm,sglangorllamacpp), or registered through/llmhostandmercury host(compat/pod-<id>/<model>,compat/box-<name>/<model>orcompat/<name>/<model>)./logins compat/<name>stores a key for that endpoint alone,MERCURY_COMPAT_<NAME>_API_KEYoverrides it from the environment, and models run ascompat/<name>/<id>(a single default endpoint usescompat/<id>and honoursMERCURY_COMPAT_API_KEY,MERCURY_COMPAT_BASE_URL,MERCURY_COMPAT_LABELandMERCURY_COMPAT_MODELS). Customcompat/endpoints using theresponsesdialect send the session’sprompt_cache_keyin/v1/responsesrequests. Keyless named endpoints (compat/<name>/<model>) work as the default model for new and/clearsessions.
Expired sign-ins
A claude.ai or ChatGPT sign-in is checked once when Mercury opens and
whenever /health runs: a sign-in past its expiry is renewed through its
refresh grant, and one the provider refuses shows as <Family> sign-in expired on the boot screen's Logins row and in /health before a first
prompt is sent. A prompt that still meets an expired sign-in is not lost: the
error line paints, its words come back to the composer, and they are sent
again on their own once /logins lands a credential (or /model moves the
session to a signed-in family) while the composer holds them unchanged.
Local model servers
/localsetup pulls a GGUF from Hugging Face into the Bank, starts a GGUF already in the Bank, or sets up Ollama and connects to running servers, with nothing pre-chosen (Esc keeps your current model and stops only a server the dialog started):
- Hugging Face (
/localsetup→ Hugging Face, or/localsetup author/model-GGUFdirectly): Lists each complete GGUF quantisation (split GGUF files grouped as one choice) with its download size and projected memory for the largest fitting32k,64k,128kor256kwindow (never above the model’s trained maximum, calculated from the GGUF header’s attention geometry and anymmprojvision projector weights; a file without enough header information cannot be started here). After you choose the quantisation and anymmprojprojector,/localsetupasks before downloading into the Bank (~/mercury-model-bankwhen no Bank folder is configured yet), resumes interrupted downloads, checks file sizes and SHA-256 hashes against the repository manifest (using your/logins huggingfacesign-in for gated repositories), shows thellama-servercommand and memory requirement (using Mercury’s locally builtllama.cppengine when present, thenllama-serveronPATHor Homebrew, and passing--spec-type draft-mtpwhen the model carries NextN/MTP tensors), checks available memory before loading, startsllama-serveron127.0.0.1:8080as thelocal-ggufproject service, selectslocal/<GGUF filename without .gguf>and checks a short reply. - Bank (
/localsetup→ Bank): Lists GGUF models registered by Bank downloads, hashes the files again before starting, and runs the samellama-serversetup without downloading./llmhostshares the same Bank. - Ollama or a running server (
/localsetup→ Ollama / running server): Discovers Ollama, LM Studio, vLLM or llama.cpp, finds or installs and starts Ollama when needed, lists the server’s existing models alongside the Qwen 3.5 family and the MoE coding tagqwen3.6:35b-a3b-codingsized against your machine’s memory (on a Linux or Windows machine with a discrete graphics card reading the card’s own memory fromnvidia-smi,rocm-smior Ollama’s Windowsserver.log, and asking which model to use when LM Studio, vLLM or llama.cpp lists more than one), pulls the chosen model with live progress, sets its window from cache geometry and available memory, selects it and checks a reply.
MERCURY_LOCAL_PROBE_TARGETS controls discovery (none disables it; without a custom probe list, Mercury remembers servers started by the GGUF dialog). Wherever local models are named and no local server answers, the same setup option appears: the model picker’s LOCAL section (where s opens the dialog), the home screen, the /config Local row and the /usage local block. Selecting the last row on the first-run sign-in screen opens the model picker on the home screen when a local server has a model. The server runs on after Mercury exits.
A Local Server page under /config shows the server’s settings (models kept loaded, parallel slots, keep-alive, context length) beside what it is running with and how it was launched; the values live under local.server in settings. A change is applied only after a review of the exact lines and the restart, and a choice that would not fit the machine is refused with the memory figures.
On a machine with less than 16 GiB of memory, a manually selected local window that fits but leaves little memory gets a warning and a smaller-window suggestion. The warning applies when less than a tenth of usable memory, or less than 1 GiB, would remain. Auto still chooses the largest window that fits.
Mercury waits for a local model while its server answers. The status row says when the first byte is expected, from the model’s size and the measured pace, extends the wait while the server still answers, says when the server has stopped answering, and a request is capped at two hours. Switching to a local Ollama model loads it and ingests its prompt before your first word and keeps it warm across a pause. An already loaded model is reused when its served window fits the chosen setting; changing that window can require a reload. A request to a local model carries only the tools the model needs; the rest stay a search away. When a local model writes a tool call as text markup (<tool_call>, <arg_key>/<arg_value>, call:name{…} or [TOOL_CALLS]name[ARGS]{…}), Mercury runs the tool while leaving partial, malformed or quoted shapes as text, and preserves the local server’s prompt cache across tool steps. When a local model’s server declares no native tool support, Mercury renders the tool catalogue into the system text as JSON, reads <tool_call> blocks holding {name, arguments} through the local markup readers, and returns results as <tool_result> blocks.
Run or connect a model: /llmhost and mercury host
Open /llmhost in the foreground chat. Its popup opens on Which model? with 32 shipped models across 78 recipes (assets/host/recipes.json version 2, with 32 weight manifests in assets/host/weights.json), a live Hugging Face search line (model name, e.g. deepseek, qwen, glm), and mouse-wheel scrolling that moves the selected popup row one notch at a time while keeping the chat behind it still. /model also includes searchable run it → /llmhost actions (run it on this Mac → when a model fits a local Mac) that open the chosen model’s screen directly, and opening /model or /llmhost on a read-only configuration directory ignores EACCES, EPERM and EROFS when creating the host state directory so the picker opens cleanly.
On Which model?, Machines I'm paying for and Vendor keys sit at the top above MODELS. The cursor opens on the cheapest in-stock model (or a running or local-fitting model when one exists), and MODELS sorts rows by where they can run right now: already running on your machine, fits one of your saved computers, in stock at the lowest hourly price across connected providers, then out of stock or unconnected, followed by lowest hourly price and model name. Below MODELS, Which model? includes My computers, Bank · your weights, Refresh stock and prices, and More options → (Rent a GPU (Runpod, Vast.ai, Lambda, Hugging Face, Hyperstack, Verda, DigitalOcean), A box I can reach by SSH, A server that's already running, One of my computers, Bank · your weights, and Private recipes · none · choose a file →). Selecting Private recipes from More options → or a private model screen opens Which private recipes file? (Private recipes · <path> · <N> rows · replaces the shipped list): enter an absolute path (using the saved path in <config>/host/recipes-file.json, MERCURY_HOST_RECIPES_FILE or <config>/host/private-recipes.json in that precedence order), validate the JSON and recipe fields, preview the models before Use this file, and save the choice in <config>/host/recipes-file.json so Which model? refreshes immediately with private tags. Every connection path reads the served models and context windows, checks a reply, and registers the provider for /model and /logins.
Typing on Which model? filters the MODELS list immediately, and after 3 characters and 450 ms queries Hugging Face (pipeline_tag=text-generation, sort=downloads, up to 20 results under HUGGING FACE · <N> results, showing the repository, parameter count, format, download count, licence, and restricted status in words). Selecting a Hugging Face row reads its paginated file tree at one revision and config.json (proactively refreshing an expired /logins huggingface OAuth token and retrying Hub requests once on HTTP 401, or using HF_TOKEN), checks GGUF shard headers via HTTP range requests against the 163 architectures, 314 tensor names and 35 supported ggml tensor types of the prebuilt llama.cpp engine (assets/host/llamacpp-engine.json at llama.cpp 184f6536, which also records the container image digest and CUDA architectures 100;103;120) along with tensor dimensions (up to 4), multi-shard split.count, split.no and split.tensors.count consistency and duplicate tensor names, and checks safetensors quant_method values against vLLM’s supported quantisations (refusing unknown GGUF architectures, tensor families or tensor types, invalid shard splits, EXL2/EXL3, and unsupported quantisations before any rental or watch). It then derives an in-session recipe: llama.cpp for complete GGUF quant shard sets (preferring Q4_K_M or the 4-bit family, 4 parallel slots, retaining the repository’s declared context window) or vLLM for safetensors (vllm/vllm-openai:v0.32.0, CUDA 13.0, --max-model-len from config.max_position_embeddings), sized with a 1.2× memory margin across 1, 2, 4 or 8 GPUs (H100 80 GB, H200 141 GB, B200 180 GB, B300 288 GB).
Selecting a shipped or derived model opens its screen with the selected values and actions:
QUALITY: The recipe’s quantization or precision variants (such as 4-bit GGUF, NVFP4, FP8, MXFP8 or BF16), the required GPU count and memory, the lowest current hourly price, and the context window (Choose quality →switches variants).CONVERSATIONS × CONTEXT: How the GPU-memory token budget splits across parallel conversations (for example4 conversations × 131,072 tokens).THINKING: The default reasoning level, which you can adjust per request at any time with/effort.WEIGHTS: The download size from Hugging Face, local bank status (banked ✓ on <folder>ornot banked), kept Runpod or Vast.ai volume readiness, and saved first-boot upload settings.
Below those four lines are the actions: switch to a machine already running at no extra cost, rent an in-stock GPU across all seven providers (Runpod, Vast.ai, Lambda, Hugging Face, Hyperstack, Verda and DigitalOcean) sorted cheapest first (with datacenter, community host or host tags on Vast.ai rows and confirmations, sorting Vast.ai machines with recorded tunnel link drops under <config>/host/reliability/ below unaffected machines while keeping them selectable), start on a fitting computer you own, open the Bank screen, Watch stock or No stock · watch, Replace key / Remove key controls for connected API-key providers (Sign out with /logins huggingface for Hugging Face), Connect <vendor> → rows for unconfigured providers, Choose quality →, and Private recipes.
The Bank screen (Bank · your weights) and kept weights volumes
Open Bank · your weights from Which model?, More options → or a model screen without needing a GPU provider key until mirroring or deleting a volume. Mercury discovers or asks for a bank folder (<config>/host/bank.json, ~/mercury-model-bank, ~/models, /Volumes/*/mercury-model-bank, /mnt/*/mercury-model-bank, plus Change folder on the Bank screen), recognises existing folders by the model identity in SHA256SUMS or config.json, loads <config>/host/private-recipes.json automatically across terminals, keeps banked Hugging Face models in the Bank table across sessions, and stores each model in <bank>/<namespace>--<repo> with a SHA256SUMS manifest. The Bank summary line shows the folder path, free space, banked model count and size, and any kept volumes’ monthly rate, above a five-column table (MODEL, SIZE, BANKED, CHECK and VOLUME, where CHECK shows failed · v when a file check failed and Enter opens the path, error and volume detail).
Five single-key actions fit on one line on the Bank table and on a model screen (b bank or b bank again when banked, v verify, m mirror, d drop, k keep safe; pressing b, v, m, d or k on a model screen works before moving the selection cursor):
b(bank): Downloads the model’s weights in the background (hf downloadwithHF_TOKENwhen signed in so restricted repositories download) and checks hashes againstSHA256SUMSat$0.00.v(verify): Re-checks every file on disk againstSHA256SUMSand any manifest digests at$0.00.m(mirror): Mirrors a shipped, derived or banked private recipe’s manifest onto a Runpod network volume ($0.07/GB/monthup to 1,000 GB,$0.05/GB/monthabove, withPrepare nowvia the cheapest single-node pod in stock orAt the next rental), a Runpod global volume ($0.09/GB/month + IOPS), or a machine-bound Vast.ai volume (Vast.ai volume · keep on one Vast.ai machine · per GB-month at the machine's rate). A Vast.ai volume is prepared via the cheapest fitting instance on that machine, mounted at/workspace/mercury-weightswith SGLang, DeepGEMM, FlashInfer, TorchInductor, Triton, CUDA and vLLM kernel caches stored on the volume so compiled kernels can be reused on later boots, and listed underMachines I'm paying forwithddelete andwwatch for that machine (wrefreshes price and waits specifically for the machine that holds the volume).d(drop): Deletes the kept Runpod or Vast.ai weights volume after confirmation while leaving your local bank untouched.k(keep safe): Copies and checks a banked model (including config and tokenizer files) onto another mounted drive, mirrors it to a volume, or saves a first-boot upload of your local bank to Vast.ai and Lambda rentals at your measured upload speed.
When you rent a model with a kept Runpod or Vast.ai volume, warm startup checks file sizes, modification times, the first and last 64 MB, and eight seeded 1 MB samples per large file against SAMPLES.json in a few seconds (with Verify fully for a full SHA-256 check on demand) and starts the engine without re-downloading weights. Volumes show their monthly storage billing even when no instance is running and prompt whether to keep or delete the volume when you terminate an attached rental.
Rent a GPU across Runpod, Vast.ai, Lambda, Hugging Face, Hyperstack, Verda and DigitalOcean
- Connect a GPU provider from a model screen,
Vendor keysonWhich model?, orMore options →→Rent a GPU: paste a Runpod (console.runpod.io/user/credentials), Vast.ai, Lambda, Hyperstack or DigitalOcean API key, or VerdaClient ID:Client Secret, into the masked field (checked against the provider’s instance list and saved in Mercury’s0600credential store, withReplace key / Remove keycontrols on the model screen), or use your saved/logins huggingfacesign-in (openid profile inference-api write-endpoints) for Hugging Face Inference Endpoints (Sign out with /logins huggingfaceon the model screen). Hugging Face Inference Endpoints creates a private, single-replica endpoint on fitting hardware at the live catalogue’s hourly price that reachesREADYover HTTPS without SSH, supports pause, resume and confirmed deletion, names the required Inference Endpoints token permission and settings URL onHTTP 403, and shows the rate-limit reset time and/logins huggingfaceremedy onHTTP 429. Hyperstack registers Mercury’s SSH public key in the selected environment, bills per minute including a public IP charge, and uses local/workspacestorage deleted on termination; Verda and DigitalOcean register the SSH key on the account; Verda prepays 10-minute compute increments with unused time refunded and charges separately for its root disk (permanently deleted and confirmed absent on termination); DigitalOcean bills per second with a 5-minute minimum, includes local disk, and lists on-demand H100 and H200 sizes; powering off these instances does not end compute billing. - Choose a model and GPU shape. Mercury reads live stock and hourly prices for every GPU and node in the recipe across the 78 shipped recipes and 32 models in
assets/host/recipes.json(version 2):GLM-5.3-Flash,Nemotron 3.5 Super VL 120B(including NVFP4 on1× RTX PRO 6000),Qwen3.8-27B,DeepSeek-V4.1-Flash-1017(with--chunked-prefill-sizeset to2048on4× B200with--mem-fraction-static 0.78,4096on4× B300and4× GB300, andkvBytesPerTokenof11,624bytes/token for 1M-token context),GLM-5.3(FP8 and BF16),Kimi K3,Qwen3.8-2.4T-A95B(FP8 and NVFP4),DeepSeek V4 Pro,MiMo-V2.6-Pro-RL,Mistral Large 3 675B, and the 45 frontier open-weights recipes (Beam 1.0 501B-A23Bin FP8 and NVFP4,Hy4-preview 770Bin MXFP8 and BF16 with--context-length 262144,Step 5 Preview 604B-A27B,MiniMax-M3 427B-A23Bin MXFP8 and BF16,Inkling 975BandInkling-Small 266Bin NVFP4,Nemotron 3 Ultra 550B-A55Bin NVFP4 and BF16,LongCat-2.0 1.8T,Ling-3.1-flash 572B,Qwen3.8-Flash-Next 180B-A6B,MiMo-V2.6-Flash-RL 309B-A15B,gpt-oss-120bon1× H100or1× H200withvllm/vllm-openai:v0.32.0, andGemma 4 31B), each with its vendor launch flags, tool-call parser, context window, reasoning effort levels, licence summary and file manifest. Trillion-parameter recipes include multi-node Runpod Instant Clusters and display total hourly compute, per-node disk allocations, weight download sizes, estimated download times at 0.5 to 1 GB/s per node, and model-licence disclosures. - Choose
Tuneon the rental confirmation screen (optional) to adjust quantization,conversations × contextsplits against the visible GPU-memory budget (12 GB per GPU engine reserve plus KV cache bytes per token), and default thinking level before confirming a rental. - Confirm the hourly price and weights source. Nothing is rented until you select the confirmation row and press
Enter. Confirmation states the model, GPU shape, hourly rate, weights source,Tunesummary, storage terms (Runpod disk storage is named per GB-month, and multi-node Runpod cluster confirmations omit the single-podStopstorage sentence), deletion consequences and SSH-key notices. SelectingWeightsonConfirm the hourly price(or a stock-watch confirmation) lets you chooseHugging Face, aPrivate repository(checking shard paths, byte sizes and SHA-256 digests against the recipe manifest and downloading on the rented machine with your/logins huggingfacesign-in before removing the token file), This computer’s Bank (uploading your local bank over SSH while compute bills during the transfer), or aKept volumeon Runpod or Vast.ai (with unavailable choices stating what action is needed). If a vendor refuses placement (HTTP 400or410), Mercury returns to the GPU shape list and reports that no pod or cluster was created and nothing bills (<vendor> could not place <shape> · $<rate>/hr · no <pod|cluster> was created · nothing bills). If a selected Vast.ai machine is taken before creation (no_such_ask), Mercury refreshes stock and presents the next machine behind a new price confirmation (staying on the volume’s machine when a Vast.ai volume is attached), and a Vast.ai SSH-key failure before creation reports that no instance was created and nothing bills (reading Vast.ai’s SSH-key list in both bare and wrapped array shapes). Both shippedllama.cppGGUF recipes (GLM-5.3-Flashwithmmproj-F16.ggufandNemotron 3.5 Super VL 120Bwithmmproj-BF16.gguf) download and check their vision projector alongside the model shards and pass--mmprojtollama-serveron the updated prebuilt CUDA 13llama.cppimage (built atllama.cpp184f6536), skipping source compilation during pod setup and enabling image prompts and theComputertool on rented and SSH-hosted GGUF servers. - Background preparation, cross-provider stock watches, setup pauses and the two-hour sweep. A detached background worker creates or registers the SSH key, provisions the instance, cluster or endpoint, prepares the chosen
Weightssource (downloading weights on the machine · <X> of <Y> GB), starts the engine on remote loopback, opens a local SSH tunnel, registerscompat/pod-<id>/<model>, checks a reply, and whenreadyswitches the live session that started the rental tocompat/pod-<id>/<model>(keeping your saved default model in user settings unchanged and recording the session’s previous model soTerminateor the two-hour idle sweep restores it) while/llmhostcan be closed withEsc(retaining the selected recipe row, its weight manifest, the chosenWeightssource and a private reference to your foreground Hugging Face token or relative-path credential command across processes, and keeping background host notices saved across a restart until consumed, where a host notice paints its row without starting a model turn).Watch stockpolls every connected provider (Runpod, Vast.ai, Lambda, Hugging Face, Hyperstack, Verda and DigitalOcean) every 5 seconds for up to 12 hours ($0.00 billed while watchingunder Machines I’m paying for, with aCancelaction) and rents the first fitting shape at or below your hourly ceiling. Transient vendor read errors (HTTP 429,5xxand network timeouts) during setup and reads after manualStop,Terminateand weights-disk deletion retry for up to 4 minutes with exponential backoff and live retry status on the row before pausing. No setup or runtime check ever terminates a rented machine on its own: when a rental or Runpod cluster hits an engine exit or out-of-memory error while loading weights (reading the engine’s own first non-warning error line from the currentMERCURY_STEP starting enginemark onward and any unused-tensor count from the fullengine.log, never treating[W...],*Warning,WARNorWARNINGlines as engine death), 10 minutes of engine log silence past the setup budget (applying the 10-minute log-progress grace only after the engine prints new log lines), a weight download stall under 1 GB in 10 minutes or past the download deadline, SSH key refusals past the setup deadline (on a running Vast.ai instance that refuses SSH through the deadline, Mercury first attaches its SSH public key to the instance and retries for up to 4 minutes before pausing), five failed tunnel reconnects after setup (recorded under<config>/host/reliability/), or a cluster node fault (with cluster placement reads carrying their own retry budget past the placement window so an unplaced cluster reportsdid not bring all <N> nodes up with SSH within <M> min), Mercury pauses the record with the machine running, closes the local tunnel, and posts one notice naming the cause, the machine, the hourly rate still billing, andResumeorTerminatein/llmhost. When a running rental’s engine exits after setup, Mercury reads the engine’s startup token plan and last prefill or decode batch fromengine.log, pauses the rental with the machine up and weights on disk, and answers chat requests immediately with the context tokens held versus the recipe budget and theResumeorTuneremedy; onResume setup, Mercury reopens the tunnel on the same local port and reuses a still-answering engine (or restarts from the weights already on disk) without re-downloading weights. A background sweep every 5 minutes automatically terminates a rental only after 2 hours with no completed model request (orTunereload) or 2 hours in an unanswered pause, confirms its absence from the vendor’s instance list, removes the/modelentry, restores the renting session’s previous model, and leaves any kept weights volume untouched while naming its monthly charge.
Manage, Tune in place, Stop or Terminate a rental
Open /llmhost → Machines I’m paying for to inspect live rentals, clusters, Runpod and Vast.ai volumes and active stock watches across all connected providers. Machines I’m paying for counts live vendor instances only (including starting, booting, error and terminating instances in spend estimates), names each provider’s answer (none, no instances, no endpoints or unread), and labels each row by its vendor (Runpod pod, Vast.ai instance, Lambda instance, HF endpoint, Hyperstack instance, Verda instance or DigitalOcean instance, with each row’s state, hourly rate and spend estimate). On a machine’s controls screen, the header shows the hourly rate, live elapsed time since placement and spend so far ($<rate>/hr · <elapsed> elapsed · ~$<spend> so far + storage). Vendor read errors collapse to one summary line at the top of a screen (with details on Enter): an HTTP 401 or HTTP 403 on Runpod or Vast.ai halts only the failed read operation (volumes, stock or machines) so a refused weights-disk read keeps your running machines listed (weights disks unread; storage may still bill), while Hugging Face halts all reads for that token until the credential changes. Vast.ai instance listing uses /api/v1/instances/ with full pagination (and reports an update notice on HTTP 410), Runpod and Vast.ai refuse an incomplete or truncated instance page before claiming an instance is terminated, Lambda walks paginated instance lists past 50 instances, and Runpod log tails decode Server-Sent Events log lines and surface HTTP 422 validation fields:
Tune(Runpod single-nodellama.cpppods): Recognises the prebuiltllama-serverbinary, adjustsconversations × contextor default thinking, and reloads the runningllama-serverin place without re-downloading weights, with automatic rollback to the previous launch script if the reload fails.Stop/Pause: Releases GPU compute on Runpod and Vast.ai pods (storage continues to bill while stopped) or pauses a Hugging Face Inference Endpoint (withResumeto start it again; Lambda instances and Runpod clusters have no Stop operation and bill until termination).Terminate: Deletes the pod, cluster, instance or endpoint after confirmation, confirms its absence from the vendor’s instance list, reports the compute spend (~$<spend> + storage), restores the renting session to its previous model, and removes its model registration from/modeleven when the local pod record is missing (and opening/llmhostcleans up endpoints whose pods have ended).LogsandResume setup: Read the engine or vendor log tail (holding theLogspage with a frozen clock untilEscreturns to the machine controls) or restart a stalled setup job.
Multi-node clusters and in-place Tune reloads are Runpod-only; kept weights volumes exist on Runpod and Vast.ai; selecting a Runpod-only option for Vast.ai or Lambda explains that boundary without making a request.
Own-computer model servers: My computers and mercury host
Open /llmhost → My computers (or More options → → One of my computers), or run mercury host from the command line:
mercury host status [box]
mercury host recipes [box]
mercury host add <name> --ssh <host> --os darwin|linux|windows [--user <user>] [--port <port>] [--key <path>]
mercury host start <box|this-computer> <recipe> (--bank <folder> | --download <folder>) [--yes]
mercury host stop <box>
mercury host restart <box>
mercury host logs <box>
mercury host uninstall <box>
Mercury checks this computer or a saved SSH computer across macOS, Linux and Windows, picks an Ollama or GGUF recipe that fits its memory, checks any local weight bank against SHA256SUMS before startup (supporting both sharded and complete single-file GGUF or safetensors banks on mercury host start --bank and SSH boxes, or confirming a download), prints each setup phase as it begins (verifying the bank, installing Ollama or building llama.cpp, downloading weights, installing the login service, pulling the model and waiting for the engine to load) on the terminal and the /llmhost computer screen, installs and starts a user login service (launchd on macOS, systemd --user on Linux, Windows Scheduled Task on Windows) bound to loopback, opens a persistent SSH forwarder for remote computers, and registers compat/box-<name>/<model> for every session sharing the configuration home. The computer screen and mercury host status show the engine, model, reported busy slots and last measured token rate. Stopping the service keeps the model row visible in /model as box <name> · engine stopped (/llmhost starts it) without prompting for an API key, and uninstall removes Mercury’s service definition without deleting downloaded weights.
SSH computers, running servers, /effort and streaming
Under More options → → A box I can reach by SSH, enter a host and user or an SSH config alias; Mercury runs nvidia-smi over SSH, lists recipes that fit the detected GPUs, checks a local weight folder (including any required mmproj vision projector) or downloads from Hugging Face into /workspace after confirmation, binds the engine to remote loopback and opens a local SSH tunnel. Under More options → → A server that's already running, enter an OpenAI-compatible API base (a bare server address gets /v1 appended), confirm or pick the server dialect (SGLang, vLLM, llama.cpp, Ollama, LM Studio, chat completions or Responses; SGLang discovery reads GET /model_info before falling back to /get_model_info, and llama.cpp router-mode servers receive ?model= on /props, /slots and /metrics), enter an optional masked key (stored in Mercury’s credential store, never in a settings file), pick a model showing its served window, and run the reply check to register compat/<name>/<model> (default compat/llmhost/<model>).
Endpoints are saved under compatProvider.<name> in user settings with their API base, label, dialect, sessionAffinityHeader: "x-session-id" on SGLang, and models["compat/<name>/<model>"].contextWindow and supported efforts (an explicit per-model contextWindow in settings takes precedence over the server’s reported window):
- Reasoning and
/effort:/effortlists and sends each model’s supported reasoning levels (low,high,maxon GLM-5.3, GLM-5.3-Flash, DeepSeek V4.1/V4 Pro and Kimi K3;low,medium,xhighon Qwen3.8; named thinking values from/api/showon Ollama, with cold Ollama launches reading the model’s capability catalogue before the first request so the first turn sends your chosen/effort), sendingchat_template_kwargs.reasoning_effortonllama.cppand top-levelreasoning_effortonvLLM,SGLang,OllamaandKimi K3. SGLang requests also sendchat_template_kwargs.thinking(truewhen session thinking is on,falsewhen off) alongsidechat_template_kwargs.clear_thinking: falseso models such asDeepSeek-V4.1-Flashreason by default when no/effortis set and honour thinking off, and SGLang, vLLM, llama.cpp and Kimi K3 conversations preserve assistantreasoning_contentacross tool turns and continuations. If a server rejects a reasoning parameter or value, Mercury keeps your selected/effortand thinking and reports the server remedy instead of retrying at default effort. - Vision projectors, tool schemas and engine refusals: A
llama.cppserver running without a vision projector reports that--mmprojis missing instead of marking the model text-only, and sending an image to a text-only or projector-less endpoint displays a notice naming the remedy. TheComputertool sends a flat one-levelsequencestep schema sollama.cppaccepts all 75 tool schemas without$referrors, and an incompatible custom or MCP tool schema onllama.cpprefuses the request before dispatch without removing any tool from the roster. Whenllama.cpp,vLLM,SGLang,OllamaorLM Studioreturns an HTTP 4xx/5xx refusal, Mercury names the cause and the server flag to fix it. - Slot affinity, prefix cache, prefill speed and live stream status: On
llama.cppservers reporting multiple slots inGET /props, sessions coordinate distinctid_slotassignments across Mercury processes sharing a config home (withcache_prompt: true, keeping their slot through context compaction and crewmate turns), and shipped recipes enablellama.cppprompt caching,vLLMprefix caching andSGLangcache reporting. During prompt ingestion and streaming on self-hosted, OpenAI-compatible and Gemini endpoints, Mercury usesllama.cppandSGLang/metricsprefill speeds to extend the first-byte allowance and polls server liveness instead of timing out after 30 seconds, the turn spinner shows its verb, elapsed time,↓token count,~<N> tok/soutput rate and retry or reconnect count, and the context compaction row showscompacting context,↓ ~<tokens>, the progress bar and elapsed time (while context compaction retries keep your selected thinking and/effortsettings). - Unreachable custom endpoints, session fallback and headless/SDK parity: Keyless endpoints retry in place without opening an unrelated sign-in screen, unreachable custom endpoints show
Retry this server →andRemove this endpoint →in/model,/clearor session resume when the previous chat’s model cannot be reached starts the fresh chat on the default model with a one-line notice naming the unreachable model and/model(and unavailablecompatmodel refusals point to/llmhostand/model), customcompat/endpoints using theresponsesdialect send the session’sprompt_cache_keyin/v1/responsesrequests, andmercury run --model local|compat|huggingfaceand both SDKs (sdk/andsdk-py/) resolve those family names against your configured endpoints and retain a recordedcompat/<endpoint>/<model>across cold and warm session resume.
Sign in to a provider
Run /logins, select a provider from the list, and sign in in your browser or paste an API key.
Mercury records when the credential landed in the sign-in ledger and can start sessions on that provider’s usable models. The receipt names the account that signed in, the transcript’s sign-in line reads Login successful with the account after it, and the Logins card and the home screen’s chip show it at once. Setting view.accountIdentity to false takes every address, username and key tail off the screens for a recording and leaves the account word; the Logins screen, /accounts and the health report still name the account.
/logins opens the same card the first run shows, and the key-entry cards name where to obtain each key. Pasting a wrong API key or denied device code at /logins is refused at the door before anything is stored, showing the service’s own words: Anthropic (checked on GET /v1/models?limit=1 and prompting for a workspace ID when the key is organisation-scoped), OpenAI’s device-code sign-in (posting under /api/accounts/deviceauth/, treating deviceauth_authorization_pending as pending, honouring slow_down, and failing on the first poll when denied or expired), xAI (HTTP 400 Incorrect API key provided), Gemini (HTTP 400 API_KEY_INVALID, keeping any key stored before and reporting auth-invalid), OpenRouter (checked on authenticated GET /api/v1/key), MiniMax (base_resp 1004 and 2049 on /v1/token_plan/remains), Z.AI (checked on the selected plan’s models list before storing), Qwen (checked on the QwenCloud or Model Studio endpoints before storing), Mistral, OpenCode Zen, Together AI and Cohere. When a stored sign-in or API key has lapsed or been refused by the service, /logins, mercury auth list, mercury auth status, mercury auth status <family> and /health read one refusal record and print the same status, timestamp, service message and reconnect command (<credential> refused (HTTP <status>: <message>) at <timestamp> · /logins <family> reconnects, or update <ENV_VAR> for an environment-pinned key) until you reconnect. From the command line, mercury auth login [<family>], mercury auth list, mercury auth status [<family>], mercury auth logout [<family>] and mercury auth mint manage authentication across all 22 provider families, and mercury models [--json] prints the models the signed-in accounts reach. In settings, credentials.keyCommand supplies an Anthropic API key from a shell command, and credentials.keyCommands.<family> maps any provider family (openai, openrouter, orcarouter, gemini, moonshot, deepseek, xai, meta, mistral, nous, zen, minimax, together, cohere, groq, melious, cerebras, fireworks, qwen, huggingface, local, zai, anthropic, or compat/<name>) to a shell command supplying its API key (10-second timeout, cached for the process, 30-second failure backoff, invalidated on HTTP 401 with one retry, and gated on workspace trust when defined in project settings). A sign-in row on the Session Concourse or in a model picker opens Logins on that row’s family, and Esc returns to the picker that opened it.
Sign in to Gemini
The Gemini card offers Sign in with Google for your account’s plan quota, an API key (opening the AI Studio key page and taking the key by one paste), or your own OAuth client; the last two use Google Cloud project billing.
To connect your own OAuth client:
- Create a Google Cloud project.
- Enable the Gemini API on it.
- Set up the consent screen for testing, with your own Google address as a test user.
- Create an OAuth client for a desktop app.
- Paste the client id. It is kept, so the next sign-in starts at the last step.
- Sign in to your Google account in the browser, past the unverified-app screen.
When sign-in is refused, the card returns to the step that needs attention. Both your own OAuth client and Gemini API-key sessions use Google’s native generation endpoint and preserve signed response parts between tool calls and when resuming (when a reply’s signature arrives after the answer text, the blocks settle as the thinking block followed by the text block so the stop reason lands on the answer). The latest sign-in action is the active Gemini source; /logins and /usage name any stored source that is not active, and Enter on its row makes it active without re-entering it. Google refusals display Google’s reason. If Google reports that it is busy, Mercury retries with the same increasing delay used for other providers; see Credential changes and refusals.
Inspect provider accounts
Run /accounts to see every connected account and API key across all providers. Each provider header carries the provider’s name, and the rows beneath it list each sign-in with its kind, identity and masked key tail, without showing secret values. You can keep up to two saved Anthropic accounts and two saved OpenAI accounts at once (environment-variable keys do not count toward that limit), while a provider with no limit shows how many sign-ins it holds beside its name.
An environment-pinned key takes precedence for the process and cannot be edited in /accounts. Removing a slot routes to the store that owns it. Sign in once per company and keep different providers connected at the same time; the accounts board shows which sign-in each session uses.
Session defaults
The default provider is the provider of the most recent sign-in. A fresh, unpinned session starts on that provider’s newest model the credential can use. The default skips a gated row, and a provider with no usable row falls through to the next most recent sign-in.
/model: Says which model was picked and why;/model defaultclears the saved choice./defaultprovider: Makes a provider the most recent sign-in by your choice, as an entry in the same ledger.MERCURY_MODEL: Pins a model ahead of the computed default.
With no sign-in anywhere there is no default: the home screen and /model say so and point at /logins.
Credential changes and refusals
A sign-in or a removal tells every runner the daemon hosts to read the account again. A usage-limit verdict is trusted only for the account that observed it and reads as unknown once the signed-in account is another. The verdict lapses at the reset the reply named, or after a bounded span when it named none. An expired sign-in is reported as an expired sign-in, and the notice names the sign-in command, /logins anthropic for the Anthropic provider. An unrecognised 4xx response from Anthropic shows the HTTP status and the provider’s own sentence on the transcript row while keeping the raw JSON envelope in the debug log.
A subscription that reports a usage window gets two warnings as it fills, at 80 and 90 percent, as words in the chat; the provider’s own refusal stays the only mechanical stop. The model is told the same only when the engine.usageNotice setting is on; until you turn it on, the meters and the warning stay yours alone. A nearby spending limit appears in the same notice.
On the Anthropic connection, an authentication refusal skips the retry backoff. Mercury attempts credential recovery once when the active sign-in or key helper can refresh the credential. A changed credential gets one immediate retry. A failed refresh, an unchanged credential or another authentication refusal ends the request. The blocker names the account when known and the sign-in command, or the environment variable or helper that supplied the rejected credential.
An expired OpenRouter OAuth key leaves a valid stored API key in force: model calls and the credits read use the stored key, and the failed key is named. Refusals show OpenRouter’s own message, or the HTTP status when no body is returned. A refusal is called expired only when the provider says it is.
When a provider answers that it is busy, Mercury sends the request again on a growing wait for about a minute before the red error. The first thirty seconds stay quiet, then a retry line shows the wait and the count, and the red line, when it comes, says how many retries it took and how long. An answer that arrives inside the wait has one calm line above it naming the provider, and Esc ends the wait at once. A rate limit that names its own wait follows the same schedule, using that wait in place of the step. If a provider stays overloaded after a minute of retries, any running crewmate pauses and probes after 30 seconds, every minute for ten minutes, and then every five minutes for up to one hour, resuming automatically when the provider answers. On an API key the refusal shows only once the retries are spent, and it proposes the fallback model when one was named. A network outage on any provider takes its own bounded reconnect steps outside the retry budget, counts as no fault, and the status row says it is reconnecting; MERCURY_RECONNECT_BUDGET_MINUTES bounds the wait.
When a usage window closes and you confirm a handoff card to another signed-in provider, the session runs on that backup provider until your original provider’s usage window is observed to reset. One amber sentence above the composer says so for two minutes after the switch, and again whenever the facts it states change, with /model as the way back; MERCURY_FAILOVER_LINE_MS sets that window in milliseconds. The strip’s model segment keeps a short amber mark beside the served model while the session runs on the backup provider. In settings, engine.backups (or --backup-model <id> on the command line, which heads the list) names an ordered list of backup engines: when the active engine’s provider is overloaded past the retry ladder, unreachable, refusing its sign-in after a refresh, or no longer serving the model, the turn hops to the first backup engine, then the next, each tried once per turn, and states the hop in one line.
On hosted providers, the wait for the first response byte is sized to the prompt and named in the notice. A connection that sends headers and then goes silent is retried without cutting off a model that is still thinking. A reply cut mid-stream is retried. On the Anthropic connection, Mercury shows a stream-cut notice and reissues the reply once on a fresh connection. Hosted requests use HTTP/1.1 by default; on the OpenAI API-key road, setting routing.openai.transport to websocket keeps one WebSocket connection per conversation that sends only the new input against the previous response and falls back to HTTP on any connection or stream fault before the response begins.
New OpenAI sessions can reuse the provider’s cached tools and system prompt shared with other sessions in the same project. Moonshot’s K3-series models (kimi-k3.1-pro, kimi-k3.1-pro-highspeed, kimi-k3, k3.1-pro, k3.1-pro-highspeed, k3, k3-256k) and kimi-for-coding, DeepSeek deepseek-flash, and self-hosted compat/ endpoints (vllm, sglang, llamacpp, ollama, lmstudio and rented pod- endpoints) defer tools at the end of messages: a request carries the tools it needs, and admitting another tool appends its definition as a system row so the initial tools array and cached prompt prefix stay unchanged.
A provider whose credential does not resolve refuses with text that names where to sign in or store a key. An undiscovered local model refuses with the probe route. A routed request stays on its provider. When a provider reaches its usage window, crewmates targeting that capped provider are also refused instead of failing over to another provider, while crewmates targeting other signed-in providers can still run. A refused API-key creation shows the provider’s own sentence. On Z.AI, glm-5.3-flash, glm-5.3-flashx and the glm-4.6v and glm-4.5v rows accept images, while a conversation that carries an image reaches a text-only GLM model as an [image] note, and Z.AI’s wording for an image it refuses is understood so the next request goes out without the image.
Read plan usage
Every provider’s usage block names its account beneath the title, on the vitals rail and in /usage. When the session model runs on a rented GPU (compat/pod-<id>/<model>), /usage shows the rental’s machine identity, hourly rate, elapsed time since placement and compute spend so far ($<rate>/hr · <elapsed> elapsed, $<spend> so far + storage). The vitals rail’s Anthropic usage rows update from the session’s own replies as you work, the plan tier is re-read when usage is read, and when an HTTP 429 closes a per-model usage window, /usage, the vitals rail and mercury usage display that window’s name, reset time and bound model alongside the account figures and clear it once its reset passes. Moonshot plans, MiniMax M Plan keys and Z.AI Coding Plan keys show their usage windows and resets. Z.AI and MiniMax M Plan keys show five-hour and weekly windows; a pay-as-you-go key says it has no usage endpoint to read. A Gemini API key or your own OAuth client gets no usage, quota or credit figure from Google, so /usage says so in one line beside this session’s token totals (and any model on the Gemini slot for which Google reports no quota reads <model>: no quota reported for this model · used this session); for your own OAuth client it names the Cloud console’s Quotas page for the Generative Language API or Google AI Studio. An expired sign-in is refreshed when usage is read, and the OpenAI card and popup use the same reading. From the shell, mercury usage and mercury usage --json print the same reading without opening a chat, and mercury usage --history (--days <N>, --project, --json) reports local input tokens, output tokens, cache-hit rate, estimated USD and unpriced turns across saved transcripts grouped by UTC day, model and project without contacting providers (see Automation).
Every sign-in has a credits line beside its usage meter. Where the provider reports a balance, the line shows that figure and when it was read. Where it does not, Mercury says so, and session spend appears as its own figure. A Kimi sign-in shows its Extra Usage balance beside its plan windows. An OpenRouter key shows its remaining credit under the key cap, and below a $10 floor /usage names the remaining amount and the credits page. A window that reads reached says what carries the requests from there in the provider’s own words: an Anthropic subscription on extra usage names its figure, a ChatGPT sign-in says how many credits are left, and a provider that states nothing about it is named as not stating it.
A Grok subscription shows its included weekly pool and purchased credits. For an xAI API key, an optional management key entered through /logins xai adds the team’s prepaid balance, billing-cycle usage and any postpaid limit. Those are team figures, and this session’s spend appears separately; the inference key works without a management key.
Jev can use a TypeSafe key configured through /jev, or OpenRouter access enabled with /jev or on (an OpenRouter HTTP 401 on a Jev request records the sign-in refusal so it shows in /logins). Each connection has its own key, spend meter and cap, /jev shows which is active, and /usage shows the evaluator row only when the config home holds an evaluator key or a call was made in the session.