{"product":"Agent Mystro","summary":"An OpenAI-compatible endpoint that classifies each request and routes it to the model that has earned that kind of work, learned per customer from that customer's own blind picks.","interface":{"protocol":"OpenAI Chat Completions","endpoint":"/v1/chat/completions","streaming":true,"tool_calling":true,"drop_in":"Point any OpenAI SDK at this base URL and change the API key.","deployment":"Runs on Cloudflare Workers, so the routing decision happens at a point of presence near the caller rather than in a single region. The classifier is in-process and makes no network call, so routing adds no upstream round trip of its own."},"mcp":{"endpoint":"/mcp","transport":"MCP Streamable HTTP, stateless: POST JSON-RPC 2.0 messages, no SSE stream, no session to resume. GET returns 405.","protocol_version":"2025-06-18","tools":[{"name":"mystro_classify","calls_a_provider":false},{"name":"mystro_route","calls_a_provider":false},{"name":"mystro_models","calls_a_provider":false}],"auth":"Same bearer key as /v1. initialize, notifications/initialized, ping, and tools/list all answer without a key (discovery and liveness); every tools/call requires Authorization: Bearer mk_live_....","not_shipping":"A tool that executes a completion, and a council MCP tool, are both designed and not claimed until built."},"pricing":{"free":{"usd_per_month":0,"tokens_routed_included":1000000,"council_runs_included":3,"note":"Population defaults only. No per-customer learned routing. Includes 3 council runs, lifetime."},"pro":{"usd_per_month":19,"tokens_routed_included":5000000,"usd_per_million_overage":0.2,"note":"Includes the taste engine: blind picks bend routing toward this customer, and GET /v1/gain reports what it bought. Councils are included without a run limit; council tokens meter into the same pool as any call."},"inference":"Not resold. Customers pay their providers directly and we take no percentage of token spend."},"key_model":{"mode":"BYOK","description":"Customers supply their own provider API keys. We never resell inference; we charge for routing.","keys_at_rest":"AES-256-GCM, per-customer key derived by HKDF from a secret held in Cloudflare Worker Secrets.","verification":"Every key is validated against the provider before it is stored."},"task_types":[{"id":"draft_cold","label":"Cold drafting","measured":true,"unrouted":false,"evidence":"Blind battery of 10 new-message briefs: Gemini one-shot 5, Claude-then-GPT edit 3, GPT one-shot 0.","population_prior":{"google:pro":1.2576094803481088,"chain:claude_then_gpt":0.4954694283012121,"anthropic:opus":0.03383404872599316,"openai:flagship":-1.7869129573753142}},{"id":"draft_reply","label":"Replies and threaded responses","measured":true,"unrouted":false,"evidence":"Blind battery of 10 incoming messages with intent: Claude-draft-then-GPT-edit 6, Gemini 4, both solo arms 0.","population_prior":{"chain:claude_then_gpt":1.889985998987029,"google:pro":1.154536438736394,"openai:flagship":-1.5222612188617115,"anthropic:opus":-1.5222612188617115}},{"id":"page_gui","label":"Web pages and interfaces","measured":true,"unrouted":false,"evidence":"Blind battery of 10 page briefs: GPT one-shot 8, Gemini 1, Claude 1.","population_prior":{"openai:flagship":2.0464014147469642,"google:pro":-1.0232007073734821,"anthropic:opus":-1.0232007073734821}},{"id":"code","label":"Code and orchestration","measured":false,"unrouted":false,"evidence":"No dedicated battery yet. Default follows the measured orchestration lane; treated as a weak prior and marked as such.","population_prior":{"anthropic:opus":0.35,"openai:flagship":0,"google:pro":-0.35}},{"id":"research","label":"Live research","measured":true,"unrouted":false,"evidence":"Blind battery of 10 checkable questions graded against the record: Claude with web search 5, GPT 3, Gemini 2, Perplexity 0. Accuracy 10/10 for Claude and Gemini.","population_prior":{"anthropic:opus":0.6619718278896708,"openai:flagship":-0.10016822415722593,"google:pro":-0.5618036037324449}},{"id":"math_finance","label":"Finance and arithmetic","measured":true,"unrouted":true,"evidence":"Blind battery of 10 briefs including four setup traps: every arm scored 10/10 on accuracy and explanation picks fell inside the noise margin. No routing default is warranted.","population_prior":{"anthropic:opus":0,"openai:flagship":0,"google:pro":0}},{"id":"extraction","label":"Document extraction","measured":true,"unrouted":true,"evidence":"Auto-graded against ground truth on 6 synthetic documents: GPT 30/30, Gemini 30/30, Claude 29/30. Clean-document extraction is saturated.","population_prior":{"anthropic:opus":0,"openai:flagship":0,"google:pro":0}},{"id":"reasoning","label":"Analysis and reasoning","measured":false,"unrouted":false,"evidence":"No dedicated battery yet. Falls back to the population default and is flagged as unmeasured.","population_prior":{"anthropic:opus":0.35,"openai:flagship":0,"google:pro":-0.35}},{"id":"other","label":"Unclassified","measured":false,"unrouted":false,"evidence":"No battery. Population default applies until the customer supplies picks.","population_prior":{"anthropic:opus":0,"openai:flagship":0,"google:pro":0}}],"multi_model":{"claim":"Models from different families, working in concert, measurably beat any single model on some work. Different labs train on different data with different habits, and that difference in perspective is raw material.","shipping_today":"Two in-concert capabilities. The chain arm (Claude drafts, GPT edits), servable like any model when the customer holds both keys: it won the reply battery outright, 6 of 10 blind briefs against zero for either solo arm (b7), and took 3 of 10 cold-drafting briefs (b1). And POST /v1/council, mode rank: 2 to 5 named options fan out to one seat per provider family the customer holds a key for (minimum two), each seat votes independently on its own shuffled option order (recorded per vote), and the response returns the ranking, the full per-seat vote table, the strongest dissent, an itemized per-seat cost on the customer's own keys, and whether the customer's own blind picks broke a near-tie. The same council runs in the browser at /app/council for signed-in customers, and a result can be published, opt-in and revocable, at a public link (/c/{token}) that carries the question, the votes and the verdict, never the cost.","not_shipping":"Council modes beyond rank (verdict on a single question, critique of one artifact, judge-written synthesis) and an MCP council tool are designed and are not claimed until built."},"method":{"classifier":"Deterministic weighted-signal scorer over the request text. Sub-millisecond, zero cost per request, and every firing signal is returned in the response.","routing":"Bradley-Terry latent strengths per task type and arm.","learning":"One online gradient step per blind pick, learning rate 0.35.","cold_start":"Bayesian shrinkage toward measured population priors with kappa 6, so a customer's first picks cannot overturn a ten-brief battery and their fiftieth can.","lineage":"Method follows the published RouteLLM line of work (matrix factorisation and preference-trained routers, Apache 2.0)."},"evidence":{"batteries":[{"code":"b1","task_type":"draft_cold","briefs":10,"wins":{"google:pro":5,"chain:claude_then_gpt":3,"anthropic:opus":2,"openai:flagship":0},"decoded":"2026-07-25","blind":true},{"code":"b2","task_type":"page_gui","briefs":10,"wins":{"openai:flagship":8,"google:pro":1,"anthropic:opus":1},"decoded":"2026-07-25","blind":true},{"code":"b7","task_type":"draft_reply","briefs":10,"wins":{"chain:claude_then_gpt":6,"google:pro":4,"openai:flagship":0,"anthropic:opus":0},"decoded":"2026-07-25","blind":true},{"code":"b8","task_type":"research","briefs":10,"wins":{"anthropic:opus":5,"openai:flagship":3,"google:pro":2},"decoded":"2026-07-25","blind":true}],"how_run":"Each battery presented N briefs, outputs shuffled and stripped of provenance tells, judged blind by a human, then decoded against an offline key."},"methodology":["Population priors come from a single expert judge across ten briefs per battery, outputs shuffled and decoded against an offline key. Every response carries the sample size behind its prior so you can weigh it yourself.","Two task types are deliberately unrouted: finance arithmetic and clean-document extraction both saturated in testing, so they route on cost and each response says so.","Code and general reasoning have no dedicated battery, so their priors carry an unmeasured flag in every response rather than a confidence figure.","Cost figures are estimates from published list prices, used to enforce spend caps. Your provider dashboard is the billing source of truth.","Google requests use Google's OpenAI-compatible surface, which silently ignores parameters it does not support. Anthropic requests use the native Messages API precisely to avoid that class of silent degradation.","Prompt-variation lift (varying the prompt rather than the model) is not measured here and is not claimed.","Three providers, measured. A routing claim is only as strong as the blind evidence behind each arm, so every arm on this surface has a battery behind it.","The population prior is learned across customers, which is what makes it improve over time.","The council ships one mode: rank over 2 to 5 named options, callable at POST /v1/council and in the browser at /app/council. A council fans out on the customer's own keys, so it costs roughly seats-many times a single call, which the response itemizes per seat.","Routing priors refresh when a battery is re-run. Every response names the run and the date its prior came from."],"privacy":{"prompt_retention":"off","logging":"Request logs carry a fixed vocabulary of ids, counts, and enum values. There is no field in the log record that can hold prompt or completion text.","deletion":"DELETE /v1/account removes all keys, picks, and routing state.","key_rotation":"POST /v1/account/rotate mints a new API key under the same customer id (spend history, provider keys, and taste all stay put) and invalidates the old one immediately. The new key is shown once and cannot be retrieved again."},"verify_yourself":["GET /v1/routing/health shows live model resolution per provider, including whether each answer came from live discovery or a dated fallback pin.","Every chat response carries a mystro block naming the task type, the signals that fired, the evidence behind the default, and how much of the decision was yours.","GET /v1/taste/scorecard shows your pick counts and how far your routing has moved from the population default."]}