{"openapi":"3.1.0","info":{"title":"Rhumb API","version":"1","description":"Tells an app which AI model to call on the providers it has accounts with. `/v1` changes are additive only: new fields, parameters and values may appear, so ignore what you do not know."},"servers":[{"url":"https://rhumbdata.com"}],"security":[{"bearer":[]},{"apiKey":[]}],"paths":{"/v1/resolve":{"get":{"operationId":"resolve","summary":"Resolve a need to a model","description":"A structured need (a task or purpose, your providers, and constraints) to the model to call, with the same model on your other providers and the next alternatives. shape=team answers models in named roles (`team`), from a strategy preset or your own `roles`, under one budget for the whole team; shape=escalation answers an ordered list of steps (`escalation`), or one model plus the team to escalate to. A team or escalation is one call. Local runtimes (ollama, lmstudio, llama.cpp, mlx, webllm) are providers like any other: send the device's max_memory_gb, max_vram_gb and max_disk_gb with them, and a local answer carries its quantization, license and requirements (memory at the request's context). Local offerings are free, count as the cheap band, and their score has the quantization's penalty taken off. The same answer for the same catalog version, need and shape; cache it. Counted.\n\nExample: `GET /v1/resolve?task=text.chat&budget=cheap&providers=gemini,openrouter`","parameters":[{"name":"providers","in":"query","required":true,"description":"Required. Provider names you have accounts with, in order of preference for ties. Never keys. Comma-separated.","schema":{"type":"string"},"example":"gemini,openrouter"},{"name":"task","in":"query","required":false,"description":"A task, e.g. text.chat. Required unless purpose is given.","schema":{"type":"string"},"example":"text.chat"},{"name":"purpose","in":"query","required":false,"description":"A purpose preset id or alias, e.g. read-receipts.","schema":{"type":"string"}},{"name":"needs","in":"query","required":false,"description":"Required capabilities, optionally with a level: \"input.pdf:native\". Comma-separated.","schema":{"type":"string"}},{"name":"provider_terms","in":"query","required":false,"description":"Your terms per provider: \"openrouter:byok\", \"gemini:free_tier\", \"openai:discount:0.2\". Comma-separated.","schema":{"type":"string"}},{"name":"origin","in":"query","required":false,"description":"Model maker countries or groups: \"us\", \"eu\", \"not:cn\". Comma-separated.","schema":{"type":"string"}},{"name":"origin_strict","in":"query","required":false,"description":"Also require a fine-tune's base model maker to match.","schema":{"type":"string","enum":["true","false"]}},{"name":"budget","in":"query","required":false,"description":"Thirds of the market's prices for the task.","schema":{"type":"string","enum":["cheap","medium","premium"]},"example":"cheap"},{"name":"max_price","in":"query","required":false,"description":"Hard cap on the typical call, in USD, e.g. 0.002.","schema":{"type":"string"}},{"name":"optimize","in":"query","required":false,"description":"cost (default), quality or value.","schema":{"type":"string","enum":["cost","quality","value"]}},{"name":"quality_margin","in":"query","required":false,"description":"For optimize=cost: how far below the best score still counts (default 0.05).","schema":{"type":"string"}},{"name":"input_tokens","in":"query","required":false,"description":"Expected input tokens per call.","schema":{"type":"string","pattern":"^\\d+$"}},{"name":"output_tokens","in":"query","required":false,"description":"Expected output tokens per call.","schema":{"type":"string","pattern":"^\\d+$"}},{"name":"cached_input_tokens","in":"query","required":false,"description":"Input tokens served from the provider's cache.","schema":{"type":"string","pattern":"^\\d+$"}},{"name":"prompt_tokens","in":"query","required":false,"description":"Prompt size, for long-prompt price tiers.","schema":{"type":"string","pattern":"^\\d+$"}},{"name":"images","in":"query","required":false,"description":"Input images per call.","schema":{"type":"string","pattern":"^\\d+$"}},{"name":"output_images","in":"query","required":false,"description":"Generated images per call.","schema":{"type":"string","pattern":"^\\d+$"}},{"name":"resolution","in":"query","required":false,"description":"Image resolution key, e.g. \"1k\".","schema":{"type":"string"}},{"name":"pages","in":"query","required":false,"description":"PDF pages per call.","schema":{"type":"string","pattern":"^\\d+$"}},{"name":"audio_seconds","in":"query","required":false,"description":"Audio seconds per call.","schema":{"type":"string","pattern":"^\\d+$"}},{"name":"video_seconds","in":"query","required":false,"description":"Video seconds per call.","schema":{"type":"string","pattern":"^\\d+$"}},{"name":"min_quality","in":"query","required":false,"description":"Minimum quality score, 0–1.","schema":{"type":"string"}},{"name":"min_context","in":"query","required":false,"description":"Minimum context window in tokens.","schema":{"type":"string","pattern":"^\\d+$"}},{"name":"max_memory_gb","in":"query","required":false,"description":"Local runtimes: the device's memory in GB (10^9 bytes). A local offering fits when its weights, KV cache at the request's min_context (8,192 tokens when smaller) and runtime overhead fit. Cloud offerings are not limited.","schema":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"}},{"name":"max_vram_gb","in":"query","required":false,"description":"Local runtimes: GPU memory in GB, for a full offload (unified memory counts as both).","schema":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"}},{"name":"max_disk_gb","in":"query","required":false,"description":"Local runtimes: free disk in GB for the weights.","schema":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"}},{"name":"released_after","in":"query","required":false,"description":"YYYY-MM-DD.","schema":{"type":"string"}},{"name":"allow_preview","in":"query","required":false,"description":"Allow preview models (default false).","schema":{"type":"string","enum":["true","false"]}},{"name":"exclude","in":"query","required":false,"description":"Model ids, vendors, or provider:model pairs to leave out. Comma-separated.","schema":{"type":"string"}},{"name":"license","in":"query","required":false,"description":"Accepted open-weight licenses. Comma-separated.","schema":{"type":"string"}},{"name":"service_tier","in":"query","required":false,"schema":{"type":"string","enum":["standard","batch","flex","priority"]}},{"name":"currency","in":"query","required":false,"description":"Adds the typical call converted to this currency, e.g. EUR.","schema":{"type":"string"}},{"name":"shape","in":"query","required":false,"description":"single (default, or the purpose's), team (with strategy or roles) or escalation (a ladder of length steps, or one model then a team with strategy or roles).","schema":{"type":"string","enum":["single","team","escalation"]}},{"name":"strategy","in":"query","required":false,"description":"A team strategy preset: its roles and their rules.","schema":{"type":"string","enum":["debate","red-team","competitive","hierarchical","expert-panel","collaborative"]}},{"name":"roles","in":"query","required":false,"description":"Team roles: \"name:count\" pairs, comma-separated (lead:1,workers:4), or a JSON object of role name to { count, task, needs, min_quality, optimize, distinct_vendor_from, distinct_family, judges }. Overrides and extends the strategy's roles.","schema":{"type":"string"}},{"name":"length","in":"query","required":false,"description":"Escalation steps, 1–5 (default 3).","schema":{"type":"string","pattern":"^\\d+$"}},{"name":"synthesis","in":"query","required":false,"description":"Add a synthesizer role to the team.","schema":{"type":"string","enum":["true","false"]}},{"name":"origin_mix","in":"query","required":false,"description":"Team origin rules: \"eu:>=1\", \"cn:<=0\", \"us:=2\". Comma-separated.","schema":{"type":"string"}},{"name":"providers_distinct","in":"query","required":false,"description":"Every team member, or escalation step, on a different provider.","schema":{"type":"string","enum":["true","false"]}}],"responses":{"200":{"description":"The answer. Counts one call against the quota.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resolution"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/NoCandidate"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/v1/plan":{"post":{"operationId":"plan","summary":"Plan a request from its prompt and tags","description":"Reads a request (a prompt, tags and attachment types) into a need, then resolves it as /v1/resolve does. Facts come first (attachment types set input needs, the prompt's size sets min_context and usage), then tags (a synonym list for origin, budget, capabilities and purpose aliases), then the decision model for the rest; facts and `constraints` always win over the decision model, and `sources` says where each part came from. The decision model reads at most the first 4,000 tokens of the prompt within the decision budget (350 ms by default); on a timeout, an error or an invalid answer the local classifier reads it instead and `decision.fallback_used` is true, so the call never fails because of the decision model. `decision.model`: openai (default, OpenAI's Decisions API) or local (`allow_remote: false` also keeps the prompt on the server); test keys always read locally. The prompt is sent only to the decision model you choose and is never stored or logged; readings are cached for 24 hours under a keyed hash. With `shape: \"auto\"` the reading chooses the shape: a team (the request's strategy or roles, the purpose's, else red-team for an adversarial request and expert-panel otherwise) when `reading.ensemble_helps` is true, an escalation when `constraints` give a length, else one model. Counts as 5 calls against the quota, since each reading calls the decision model; errors and no_candidate are not counted.\n\nExample: `POST /v1/plan`","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRequest"},"example":{"prompt":"Extract the merchant, date, VAT and total from this receipt as JSON.","tags":["usa"],"attachments":[{"type":"image/jpeg","bytes":812000}],"decision":{"model":"openai"},"providers":["gemini","openrouter"]}}}},"responses":{"200":{"description":"The answer. Counts as 5 calls against the quota.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/NoCandidate"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/v1/models":{"get":{"operationId":"listModels","summary":"List models","description":"Candidates for a task on given providers, with capabilities, current prices and quality scores. Counted.\n\nExample: `GET /v1/models?task=text.chat&providers=openrouter&limit=20`","parameters":[{"name":"task","in":"query","required":false,"description":"Only models for this task.","schema":{"type":"string"},"example":"text.chat"},{"name":"providers","in":"query","required":false,"description":"Only offerings on these providers. Comma-separated.","schema":{"type":"string"},"example":"openrouter"},{"name":"needs","in":"query","required":false,"description":"Only offerings with these capabilities. Comma-separated.","schema":{"type":"string"}},{"name":"include_retired","in":"query","required":false,"description":"Include retired offerings (default false).","schema":{"type":"string","enum":["true","false"]}},{"name":"limit","in":"query","required":false,"description":"Page size, 1–500 (default 100).","schema":{"type":"string","pattern":"^\\d+$"},"example":"20"},{"name":"offset","in":"query","required":false,"description":"Models to skip (default 0).","schema":{"type":"string","pattern":"^\\d+$"}}],"responses":{"200":{"description":"The answer. Counts one call against the quota.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelsList"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/v1/models/{vendor}/{model}":{"get":{"operationId":"getModel","summary":"Get one model","description":"One model with every offering and its price revisions; `provider` and `at` give one offering's price in force at a time. Counted.\n\nExample: `GET /v1/models/google/gemini-3.5-flash-lite?provider=gemini&at=2026-06-01`","parameters":[{"name":"vendor","in":"path","required":true,"description":"The model maker, e.g. google.","schema":{"type":"string"},"example":"google"},{"name":"model","in":"path","required":true,"description":"The model name, e.g. gemini-3.5-flash-lite.","schema":{"type":"string"},"example":"gemini-3.5-flash-lite"},{"name":"provider","in":"query","required":false,"description":"Only this provider's offering.","schema":{"type":"string"},"example":"gemini"},{"name":"at","in":"query","required":false,"description":"ISO date or time: return the price revision in force then.","schema":{"type":"string"},"example":"2026-06-01"}],"responses":{"200":{"description":"The answer. Counts one call against the quota.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelDetail"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/v1/purposes":{"get":{"operationId":"listPurposes","summary":"List purpose presets","description":"Purpose presets usable as `purpose` in /v1/resolve. Free.\n\nExample: `GET /v1/purposes`","parameters":[],"responses":{"200":{"description":"The answer. Not counted against the quota.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurposesList"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/v1/vocabulary":{"get":{"operationId":"getVocabulary","summary":"Get the vocabulary","description":"The task, capability, level, provider, origin, budget, optimize and service tier names. Free.\n\nExample: `GET /v1/vocabulary`","parameters":[],"responses":{"200":{"description":"The answer. Not counted against the quota.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Vocabulary"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/v1/licenses":{"get":{"operationId":"getLicenses","summary":"Get data licenses","description":"The data sources behind the catalog and the notices to show with their data. Free.\n\nExample: `GET /v1/licenses`","parameters":[],"responses":{"200":{"description":"The answer. Not counted against the quota.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Licenses"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/v1/key":{"get":{"operationId":"getKey","summary":"Get the calling key","description":"The calling key's own id, kind, project, scopes and monthly cap, its per-minute rate, the account's quota and calls this period (a day for test keys), and its calls against its own cap. Needs the `usage:read` scope. Free.\n\nExample: `GET /v1/key`","parameters":[],"responses":{"200":{"description":"The answer. Not counted against the quota.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyInfo"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/v1/health":{"get":{"operationId":"health","summary":"Health check","description":"Whether the service is up, and the catalog's version and age. No key needed; not counted. Always 200 while the service answers: `status` is `degraded` when the catalog is older than 48 hours.","security":[],"responses":{"200":{"description":"The service is up (status ok or degraded).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Authorization: Bearer <key>."},"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"The key in an X-API-Key header."}},"schemas":{"Resolution":{"type":"object","properties":{"shape":{"type":"string","enum":["single","team","escalation"],"description":"single: `model`. team: `team`, with `model` its first role's first member. escalation: `escalation`, with `model` its first step."},"catalog_version":{"type":"string"},"need":{"type":"object","properties":{"task":{"type":"string"},"purpose":{"type":"string"},"needs":{"type":"array","items":{"type":"object","properties":{"capability":{"type":"string"},"level":{"type":"string"}},"required":["capability","level"]}},"providers":{"type":"array","items":{"type":"string"}},"provider_terms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"}},"required":["kind"],"additionalProperties":{}}}},"origin":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}},"strict":{"type":"boolean"}},"required":["include","exclude","strict"]},"budget":{"type":"string"},"max_price":{"type":"string"},"optimize":{"type":"string"},"quality_margin":{"type":"number"},"usage":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":["number","string"]}},"allow_preview":{"type":"boolean"},"exclude":{"type":"array","items":{"type":"string"}},"service_tier":{"type":"string"},"currency":{"type":"string"}},"required":["task","needs","providers","provider_terms","optimize","quality_margin","usage","allow_preview","exclude","service_tier"],"additionalProperties":{}},"model":{"type":"object","properties":{"id":{"type":"string","description":"Canonical model id, vendor/model."},"vendor":{"type":"string"},"origin":{"type":"string"},"provider":{"type":"string"},"provider_model_id":{"type":"string","description":"Use this as the model name in the provider's API."},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"released":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"typical_call":{"type":"string","description":"USD, after fees and your provider_terms."},"converted":{"type":"object","properties":{"currency":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."}},"required":["currency","typical_call"]},"unverified":{"type":"boolean"}},"required":["currency","per_1m","typical_call"]},"quality":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]},"quantization_penalty":{"type":"number","description":"Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."}},"required":["score","basis","measured_on","attribution","kind"]},"routing":{"description":"Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."}},"required":["id","vendor","provider","provider_model_id","status","capabilities","limits"]},"also_on":{"type":"array","items":{"type":"object","properties":{"provider":{"type":"string"},"provider_model_id":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."},"note":{"type":"string"}},"required":["provider","provider_model_id"]}},"alternatives":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Canonical model id, vendor/model."},"vendor":{"type":"string"},"origin":{"type":"string"},"provider":{"type":"string"},"provider_model_id":{"type":"string","description":"Use this as the model name in the provider's API."},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"released":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"typical_call":{"type":"string","description":"USD, after fees and your provider_terms."},"converted":{"type":"object","properties":{"currency":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."}},"required":["currency","typical_call"]},"unverified":{"type":"boolean"}},"required":["currency","per_1m","typical_call"]},"quality":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]},"quantization_penalty":{"type":"number","description":"Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."}},"required":["score","basis","measured_on","attribution","kind"]},"routing":{"description":"Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."}},"required":["id","vendor","provider","provider_model_id","status","capabilities","limits"]}},"reason":{"type":"string"},"warnings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"],"additionalProperties":{}}},"team":{"type":"object","properties":{"strategy":{"type":"string"},"roles":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"task":{"type":"string"},"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Canonical model id, vendor/model."},"vendor":{"type":"string"},"origin":{"type":"string"},"provider":{"type":"string"},"provider_model_id":{"type":"string","description":"Use this as the model name in the provider's API."},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"released":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"typical_call":{"type":"string","description":"USD, after fees and your provider_terms."},"converted":{"type":"object","properties":{"currency":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."}},"required":["currency","typical_call"]},"unverified":{"type":"boolean"}},"required":["currency","per_1m","typical_call"]},"quality":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]},"quantization_penalty":{"type":"number","description":"Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."}},"required":["score","basis","measured_on","attribution","kind"]},"routing":{"description":"Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."}},"required":["id","vendor","provider","provider_model_id","status","capabilities","limits"]}}},"required":["task","members"]},"description":"Role name → its task and members, in the roles' order."},"typical_call":{"type":"string","description":"The whole team's typical call in USD, when every member is priced."}},"required":["roles"],"description":"shape=team: the members by role."},"escalation":{"type":"object","properties":{"steps":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Canonical model id, vendor/model."},"vendor":{"type":"string"},"origin":{"type":"string"},"provider":{"type":"string"},"provider_model_id":{"type":"string","description":"Use this as the model name in the provider's API."},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"released":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"typical_call":{"type":"string","description":"USD, after fees and your provider_terms."},"converted":{"type":"object","properties":{"currency":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."}},"required":["currency","typical_call"]},"unverified":{"type":"boolean"}},"required":["currency","per_1m","typical_call"]},"quality":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]},"quantization_penalty":{"type":"number","description":"Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."}},"required":["score","basis","measured_on","attribution","kind"]},"routing":{"description":"Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."}},"required":["id","vendor","provider","provider_model_id","status","capabilities","limits"]},"description":"Cheapest first; each step clears a higher quality tier."},"team":{"type":"object","properties":{"strategy":{"type":"string"},"roles":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"task":{"type":"string"},"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Canonical model id, vendor/model."},"vendor":{"type":"string"},"origin":{"type":"string"},"provider":{"type":"string"},"provider_model_id":{"type":"string","description":"Use this as the model name in the provider's API."},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"released":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"typical_call":{"type":"string","description":"USD, after fees and your provider_terms."},"converted":{"type":"object","properties":{"currency":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."}},"required":["currency","typical_call"]},"unverified":{"type":"boolean"}},"required":["currency","per_1m","typical_call"]},"quality":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]},"quantization_penalty":{"type":"number","description":"Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."}},"required":["score","basis","measured_on","attribution","kind"]},"routing":{"description":"Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."}},"required":["id","vendor","provider","provider_model_id","status","capabilities","limits"]}}},"required":["task","members"]},"description":"Role name → its task and members, in the roles' order."},"typical_call":{"type":"string","description":"The whole team's typical call in USD, when every member is priced."}},"required":["roles"],"description":"Check then escalate: the team to escalate to."}},"required":["steps"],"description":"shape=escalation: the steps, and the team to escalate to."}},"required":["shape","catalog_version","need","model","also_on","alternatives","reason","warnings"]},"PlanRequest":{"type":"object","properties":{"providers":{"minItems":1,"type":"array","items":{"type":"string"},"description":"Required. Provider names, in order of preference for ties."},"prompt":{"type":"string","description":"The request to read. Sent only to the decision model you choose; never stored or logged."},"tags":{"maxItems":50,"type":"array","items":{"type":"string","maxLength":100},"description":"Free tags, e.g. [\"vision\", \"read receipts\", \"usa\", \"medium\"]."},"attachments":{"maxItems":20,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"MIME type, e.g. image/jpeg. Only type and size are sent, never the file."},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"pages":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"seconds":{"type":"number","minimum":0}},"required":["type","bytes"],"additionalProperties":false}},"decision":{"type":"object","properties":{"model":{"type":"string","enum":["openai","local","jev"],"description":"openai (default) or local; jev is for internal accounts only."},"allow_remote":{"type":"boolean","description":"false keeps the prompt on the server: the local classifier only."}},"additionalProperties":false},"device":{"type":"object","properties":{"memory_gb":{"type":"number","exclusiveMinimum":0},"vram_gb":{"type":"number","exclusiveMinimum":0},"disk_gb":{"type":"number","exclusiveMinimum":0}},"additionalProperties":false,"description":"The device's memory, GPU memory and free disk in GB, for local runtimes: facts that become max_memory_gb, max_vram_gb and max_disk_gb unless constraints set them."},"shape":{"type":"string","enum":["single","team","escalation","auto"],"description":"As in /v1/resolve, or auto: a team when the reading says several models would help (ensemble_helps), an escalation when the request gives length, else single."},"constraints":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Any /v1/resolve query parameter except providers, as strings; these win over the reading."}},"required":["providers"],"additionalProperties":false},"PlanResponse":{"type":"object","properties":{"shape":{"type":"string","enum":["single","team","escalation"],"description":"single: `model`. team: `team`, with `model` its first role's first member. escalation: `escalation`, with `model` its first step."},"catalog_version":{"type":"string"},"need":{"type":"object","properties":{"task":{"type":"string"},"purpose":{"type":"string"},"needs":{"type":"array","items":{"type":"object","properties":{"capability":{"type":"string"},"level":{"type":"string"}},"required":["capability","level"]}},"providers":{"type":"array","items":{"type":"string"}},"provider_terms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"}},"required":["kind"],"additionalProperties":{}}}},"origin":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}},"strict":{"type":"boolean"}},"required":["include","exclude","strict"]},"budget":{"type":"string"},"max_price":{"type":"string"},"optimize":{"type":"string"},"quality_margin":{"type":"number"},"usage":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":["number","string"]}},"allow_preview":{"type":"boolean"},"exclude":{"type":"array","items":{"type":"string"}},"service_tier":{"type":"string"},"currency":{"type":"string"}},"required":["task","needs","providers","provider_terms","optimize","quality_margin","usage","allow_preview","exclude","service_tier"],"additionalProperties":{}},"model":{"type":"object","properties":{"id":{"type":"string","description":"Canonical model id, vendor/model."},"vendor":{"type":"string"},"origin":{"type":"string"},"provider":{"type":"string"},"provider_model_id":{"type":"string","description":"Use this as the model name in the provider's API."},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"released":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"typical_call":{"type":"string","description":"USD, after fees and your provider_terms."},"converted":{"type":"object","properties":{"currency":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."}},"required":["currency","typical_call"]},"unverified":{"type":"boolean"}},"required":["currency","per_1m","typical_call"]},"quality":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]},"quantization_penalty":{"type":"number","description":"Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."}},"required":["score","basis","measured_on","attribution","kind"]},"routing":{"description":"Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."}},"required":["id","vendor","provider","provider_model_id","status","capabilities","limits"]},"also_on":{"type":"array","items":{"type":"object","properties":{"provider":{"type":"string"},"provider_model_id":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."},"note":{"type":"string"}},"required":["provider","provider_model_id"]}},"alternatives":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Canonical model id, vendor/model."},"vendor":{"type":"string"},"origin":{"type":"string"},"provider":{"type":"string"},"provider_model_id":{"type":"string","description":"Use this as the model name in the provider's API."},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"released":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"typical_call":{"type":"string","description":"USD, after fees and your provider_terms."},"converted":{"type":"object","properties":{"currency":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."}},"required":["currency","typical_call"]},"unverified":{"type":"boolean"}},"required":["currency","per_1m","typical_call"]},"quality":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]},"quantization_penalty":{"type":"number","description":"Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."}},"required":["score","basis","measured_on","attribution","kind"]},"routing":{"description":"Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."}},"required":["id","vendor","provider","provider_model_id","status","capabilities","limits"]}},"reason":{"type":"string"},"warnings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"],"additionalProperties":{}}},"team":{"type":"object","properties":{"strategy":{"type":"string"},"roles":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"task":{"type":"string"},"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Canonical model id, vendor/model."},"vendor":{"type":"string"},"origin":{"type":"string"},"provider":{"type":"string"},"provider_model_id":{"type":"string","description":"Use this as the model name in the provider's API."},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"released":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"typical_call":{"type":"string","description":"USD, after fees and your provider_terms."},"converted":{"type":"object","properties":{"currency":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."}},"required":["currency","typical_call"]},"unverified":{"type":"boolean"}},"required":["currency","per_1m","typical_call"]},"quality":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]},"quantization_penalty":{"type":"number","description":"Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."}},"required":["score","basis","measured_on","attribution","kind"]},"routing":{"description":"Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."}},"required":["id","vendor","provider","provider_model_id","status","capabilities","limits"]}}},"required":["task","members"]},"description":"Role name → its task and members, in the roles' order."},"typical_call":{"type":"string","description":"The whole team's typical call in USD, when every member is priced."}},"required":["roles"],"description":"shape=team: the members by role."},"escalation":{"type":"object","properties":{"steps":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Canonical model id, vendor/model."},"vendor":{"type":"string"},"origin":{"type":"string"},"provider":{"type":"string"},"provider_model_id":{"type":"string","description":"Use this as the model name in the provider's API."},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"released":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"typical_call":{"type":"string","description":"USD, after fees and your provider_terms."},"converted":{"type":"object","properties":{"currency":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."}},"required":["currency","typical_call"]},"unverified":{"type":"boolean"}},"required":["currency","per_1m","typical_call"]},"quality":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]},"quantization_penalty":{"type":"number","description":"Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."}},"required":["score","basis","measured_on","attribution","kind"]},"routing":{"description":"Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."}},"required":["id","vendor","provider","provider_model_id","status","capabilities","limits"]},"description":"Cheapest first; each step clears a higher quality tier."},"team":{"type":"object","properties":{"strategy":{"type":"string"},"roles":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"task":{"type":"string"},"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Canonical model id, vendor/model."},"vendor":{"type":"string"},"origin":{"type":"string"},"provider":{"type":"string"},"provider_model_id":{"type":"string","description":"Use this as the model name in the provider's API."},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"released":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"typical_call":{"type":"string","description":"USD, after fees and your provider_terms."},"converted":{"type":"object","properties":{"currency":{"type":"string"},"typical_call":{"type":"string","description":"A decimal number as a string; never a float."}},"required":["currency","typical_call"]},"unverified":{"type":"boolean"}},"required":["currency","per_1m","typical_call"]},"quality":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]},"quantization_penalty":{"type":"number","description":"Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."}},"required":["score","basis","measured_on","attribution","kind"]},"routing":{"description":"Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."}},"required":["id","vendor","provider","provider_model_id","status","capabilities","limits"]}}},"required":["task","members"]},"description":"Role name → its task and members, in the roles' order."},"typical_call":{"type":"string","description":"The whole team's typical call in USD, when every member is priced."}},"required":["roles"],"description":"Check then escalate: the team to escalate to."}},"required":["steps"],"description":"shape=escalation: the steps, and the team to escalate to."},"sources":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","enum":["fact","tag","decision","request","default"]},"description":"Need field → where it came from (fact, tag, decision, request, default)."},"reading":{"type":"object","properties":{"purpose":{"type":"string","description":"The purpose preset the request reads as."},"task":{"type":"string"},"category":{"type":"string"},"difficulty":{"type":"number","description":"1 (trivial) to 5 (expert)."},"stakes":{"type":"number","description":"1 (casual) to 5 (critical)."},"answer_shape":{"type":"string"},"domain":{"type":"string"},"needs_reasoning":{"type":"boolean"},"needs_tools":{"type":"boolean"},"needs_web":{"type":"boolean"},"ensemble_helps":{"type":"boolean","description":"Whether several models would help; with shape auto it picks a team."},"adversarial":{"type":"boolean"},"ambiguous":{"type":"boolean"},"budget":{"type":"string","description":"Read from tags the synonym list did not know."},"origin":{"type":"string","description":"Read from tags the synonym list did not know."}},"additionalProperties":{},"description":"The decision model's structured reading (never the prompt)."},"decision":{"type":"object","properties":{"model":{"type":"string","enum":["openai","local","jev"],"description":"The model that read the request (local when the prompt never left the server)."},"latency_ms":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"fallback_used":{"type":"boolean","description":"The local classifier answered instead of the model asked."},"fallback_reason":{"type":"string","enum":["timeout","error","invalid","unavailable","budget_exhausted"],"description":"Why the local classifier answered, when it did."},"cached":{"type":"boolean"}},"required":["model","latency_ms","fallback_used","cached"]}},"required":["shape","catalog_version","need","model","also_on","alternatives","reason","warnings","sources","reading","decision"]},"ModelsList":{"type":"object","properties":{"catalog_version":{"type":"string"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"models":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"vendor":{"type":"string"},"origin":{"type":"string"},"display_name":{"type":"string"},"tasks":{"type":"array","items":{"type":"string"}},"released":{"type":"string"},"offerings":{"type":"array","items":{"type":"object","properties":{"provider":{"type":"string"},"provider_model_id":{"type":"string"},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"retires_on":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"effective_from":{"type":"string"},"unverified":{"type":"boolean"}},"required":["currency","per_1m","effective_from"]},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs, at context_for_memory tokens."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."}},"required":["provider","provider_model_id","status","capabilities","limits"]}},"quality":{"type":"array","items":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]}},"required":["score","basis","measured_on","attribution","kind"]}}},"required":["id","vendor","display_name","tasks","offerings","quality"]}}},"required":["catalog_version","total","models"]},"ModelDetail":{"type":"object","properties":{"id":{"type":"string"},"vendor":{"type":"string"},"origin":{"type":"string"},"display_name":{"type":"string"},"tasks":{"type":"array","items":{"type":"string"}},"released":{"type":"string"},"offerings":{"type":"array","items":{"type":"object","properties":{"provider":{"type":"string"},"provider_model_id":{"type":"string"},"status":{"type":"string","enum":["preview","ga","deprecated","retired"]},"retires_on":{"type":"string"},"capabilities":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"level":{"type":"string","enum":["claimed","parsed","native","probed"]},"probed_on":{"type":"string"},"efforts":{"description":"Reasoning effort levels the offering accepts, for reasoning.","type":"array","items":{"type":"string"}}},"required":["level"]}},"limits":{"type":"object","properties":{"context":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_input":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_output":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dimensions":{"description":"Embedding vector length, as a probe measured it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"price":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"effective_from":{"type":"string"},"unverified":{"type":"boolean"}},"required":["currency","per_1m","effective_from"]},"quantization":{"type":"string","description":"Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."},"parameters_b":{"type":"number","description":"Local runtimes: parameters, in billions."},"requirements":{"type":"object","properties":{"memory_gb":{"type":"number","description":"Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."},"vram_gb":{"type":"number","description":"GPU memory for a full offload, at the same context."},"disk_gb":{"type":"number","description":"The weights' download size."},"context_for_memory":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."},"kv_bytes_per_token":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"KV cache bytes per further token of context."},"low_resource":{"type":"boolean","description":"WebLLM: runs on low-resource devices."}},"required":["memory_gb","context_for_memory"],"description":"Local runtimes: what the device needs, at context_for_memory tokens."},"license":{"type":"string","description":"Local runtimes: the weights' license, e.g. \"apache-2.0\"."},"prices":{"type":"array","items":{"type":"object","properties":{"currency":{"type":"string"},"per_1m":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","description":"A decimal number as a string; never a float."}},"effective_from":{"type":"string"},"source":{"type":"string"},"unverified":{"type":"boolean"}},"required":["currency","per_1m","effective_from","source"]}}},"required":["provider","provider_model_id","status","capabilities","limits","prices"]}},"quality":{"type":"array","items":{"type":"object","properties":{"score":{"type":"number"},"basis":{"type":"string","description":"<source>:<signal>, or curated."},"measured_on":{"type":"string"},"attribution":{"type":"string","description":"Show this wherever the score is shown."},"kind":{"type":"string","enum":["measured","estimated"]}},"required":["score","basis","measured_on","attribution","kind"]}},"catalog_version":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}}},"required":["id","vendor","display_name","tasks","offerings","quality","catalog_version","aliases"]},"PurposesList":{"type":"object","properties":{"catalog_version":{"type":"string"},"purposes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"description":{"type":"string"},"task":{"type":"string"},"needs":{"type":"array","items":{"type":"string"}},"quality":{"type":"array","items":{"type":"string"}},"usage":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":["number","string"]}},"aliases":{"type":"array","items":{"type":"string"}},"shape":{"type":"string","enum":["single","team","escalation"],"description":"The shape the purpose resolves to when the request does not say."}},"required":["id","description","task","needs","quality","usage","aliases"]}}},"required":["catalog_version","purposes"]},"Vocabulary":{"type":"object","properties":{"tasks":{"type":"array","items":{"type":"string"}},"capabilities":{"type":"array","items":{"type":"string"}},"levels":{"type":"array","items":{"type":"string"}},"providers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"display_name":{"type":"string"},"local":{"type":"boolean","description":"A runtime on the user's device (ollama, lmstudio, llama.cpp, mlx, webllm) rather than a cloud provider; send the device's limits with it."}},"required":["name","display_name"]}},"origin_groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"type":"string"}}},"budgets":{"type":"array","items":{"type":"string"}},"optimize":{"type":"array","items":{"type":"string"}},"service_tiers":{"type":"array","items":{"type":"string"}},"strategies":{"type":"array","items":{"type":"string"},"description":"Team strategy presets for strategy=."}},"required":["tasks","capabilities","levels","providers","origin_groups","budgets","optimize","service_tiers","strategies"]},"Licenses":{"type":"object","properties":{"catalog_version":{"type":"string"},"sources":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"name":{"type":"string"},"license":{"type":"string"},"url":{"type":"string"},"notice":{"type":"string"}},"required":["source","name","license","url","notice"]}}},"required":["catalog_version","sources"]},"Health":{"type":"object","properties":{"status":{"type":"string","enum":["ok","degraded"],"description":"ok, or degraded when the catalog is older than 48 hours (the API still answers from it)"},"catalog_version":{"description":"The catalog live keys are answered from","type":"string"},"catalog_age_hours":{"description":"Hours since that catalog was generated, to one decimal","type":"number"}},"required":["status"]},"KeyInfo":{"type":"object","properties":{"key":{"type":"object","properties":{"id":{"type":"string","description":"The key's id"},"kind":{"type":"string","enum":["live","test"],"description":"live or test"},"project_id":{"description":"The project the key belongs to; null for none","type":["string","null"]},"scopes":{"type":"array","items":{"type":"string"},"description":"What the key may call: resolve, plan, models, usage:read"},"monthly_cap":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"The key's own monthly call cap; null for none"}},"required":["id","kind","project_id","scopes","monthly_cap"]},"rate_per_minute":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Requests allowed a minute"},"quota":{"type":"object","properties":{"limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Counted calls allowed this period; null for unlimited"},"used":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Counted calls made this period"},"period_start":{"type":"string","description":"The period's first day, e.g. 2026-11-01 (a day for test keys)"},"resets_at":{"type":"string","description":"When the period resets, ISO 8601"}},"required":["limit","used","period_start","resets_at"],"description":"The account's quota this period (test keys: the day's test calls)"},"key_usage":{"anyOf":[{"type":"object","properties":{"used":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["used","limit"]},{"type":"null"}],"description":"Calls against the key's monthly cap; null when it has none"}},"required":["key","rate_per_minute","quota","key_usage"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":"string"},"allowed":{"type":"array","items":{"type":"string"}}},"required":["code","message"],"additionalProperties":{}}},"required":["error"]},"NoCandidate":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","const":"no_candidate"},"message":{"type":"string"},"catalog_version":{"type":"string"},"eliminated":{"type":"array","items":{"type":"object","properties":{"constraint":{"type":"string"},"before":{"type":"number"},"after":{"type":"number"}},"required":["constraint","before","after"]}},"nearest_miss":{"type":"object","properties":{"id":{"type":"string"},"provider":{"type":"string"},"provider_model_id":{"type":"string"},"failed":{"type":"string"}},"required":["id","provider","provider_model_id","failed"]},"role":{"type":"string","description":"For a team: the role no candidate was left for."}},"required":["code","message","catalog_version","eliminated"]}},"required":["error"]}},"headers":{"RateLimit-Limit":{"description":"Requests allowed a minute for this key.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the per-minute window resets.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Counted calls allowed this period (a day for test keys), or \"unlimited\".","schema":{"type":"string"}},"X-Quota-Remaining":{"description":"Counted calls left this period, or \"unlimited\".","schema":{"type":"string"}},"X-Quota-Reset":{"description":"When the quota period resets.","schema":{"type":"string","format":"date-time"}},"X-Overage-Used":{"description":"Calls past the quota this period, billed as overage. Sent only while overage is on (Scale).","schema":{"type":"integer"}},"X-Overage-Limit":{"description":"Overage calls the account's spend cap allows this period. Sent only while overage is on (Scale).","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait; sent with rate_limited only.","schema":{"type":"integer"}}},"responses":{"BadRequest":{"description":"invalid_request (an unknown name or a malformed value: `field` and `allowed` say which) or key_in_query (keys go in a header, never the URL).","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_request":{"summary":"invalid_request","value":{"error":{"code":"invalid_request","message":"Unknown task \"text.chit\"","field":"task","allowed":["text.chat","text.embed"]}}},"key_in_query":{"summary":"key_in_query","value":{"error":{"code":"key_in_query","message":"API keys are not accepted in the query string; send them in the Authorization header. Rotate a key that was put in a URL."}}}}}}},"Unauthorized":{"description":"missing_api_key (no key sent) or invalid_api_key (unknown, disabled, revoked or expired).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missing_api_key":{"summary":"missing_api_key","value":{"error":{"code":"missing_api_key","message":"Send your API key as `Authorization: Bearer <key>`"}}},"invalid_api_key":{"summary":"invalid_api_key","value":{"error":{"code":"invalid_api_key","message":"The API key is not valid"}}}}}}},"Forbidden":{"description":"account_suspended; insufficient_scope (the key lacks the scope the endpoint needs: `required_scope` names it); ip_not_allowed (the key's IP allowlist does not include the caller); wrong_key_kind (a management key, which calls only the key-management API); or (POST /v1/plan) decision_model_not_allowed: `decision.model=jev` is for internal accounts only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"account_suspended":{"summary":"account_suspended","value":{"error":{"code":"account_suspended","message":"This account is suspended"}}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":{"code":"insufficient_scope","message":"This key lacks the `resolve` scope this endpoint needs","required_scope":"resolve"}}},"ip_not_allowed":{"summary":"ip_not_allowed","value":{"error":{"code":"ip_not_allowed","message":"This key may not be used from this IP address"}}},"wrong_key_kind":{"summary":"wrong_key_kind","value":{"error":{"code":"wrong_key_kind","message":"Management keys only call the key-management API (/api/v1/manage); use a live or test key here"}}},"decision_model_not_allowed":{"summary":"decision_model_not_allowed","value":{"error":{"code":"decision_model_not_allowed","message":"decision.model=jev is available to internal accounts only; use openai or local","field":"decision.model","allowed":["openai","local"]}}}}}}},"NotFound":{"description":"model_not_found: no model with that id or alias.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"model_not_found":{"summary":"model_not_found","value":{"error":{"code":"model_not_found","message":"No model google/nope","field":"id"}}}}}}},"PayloadTooLarge":{"description":"request_too_large: request bodies are limited to 64 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"request_too_large":{"summary":"request_too_large","value":{"error":{"code":"request_too_large","message":"Request bodies are limited to 64 KB"}}}}}}},"NoCandidate":{"description":"no_candidate: nothing on your providers meets the need. Says how many candidates each constraint removed, and the nearest miss. Not counted against the quota.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoCandidate"}}}},"TooManyRequests":{"description":"rate_limited (the per-minute rate; Retry-After says when to try again) or quota_exhausted (the period's calls are used up; no Retry-After, `resets_at` and `upgrade_url` instead).","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Quota-Limit":{"$ref":"#/components/headers/X-Quota-Limit"},"X-Quota-Remaining":{"$ref":"#/components/headers/X-Quota-Remaining"},"X-Quota-Reset":{"$ref":"#/components/headers/X-Quota-Reset"},"X-Overage-Used":{"$ref":"#/components/headers/X-Overage-Used"},"X-Overage-Limit":{"$ref":"#/components/headers/X-Overage-Limit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"rate_limited","value":{"error":{"code":"rate_limited","message":"Rate limit of 10 requests a minute reached"}}},"quota_exhausted":{"summary":"quota_exhausted","value":{"error":{"code":"quota_exhausted","message":"Your plan's 1,000 calls for this period are used up","resets_at":"2026-12-01T00:00:00.000Z","upgrade_url":"https://rhumbdata.com/app/billing"}}}}}}}}}}