[{"data":1,"prerenderedAt":675},["ShallowReactive",2],{"navigation_docs":3,"-agents-models-and-keys":320,"-agents-models-and-keys-surround":670},[4,35,69,109,133,193,228,262,305],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-ph-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-ph-rocket-launch",{"title":21,"path":22,"stem":23,"icon":24},"Concepts","\u002Fgetting-started\u002Fconcepts","1.getting-started\u002F3.concepts","i-ph-book-open",{"title":26,"path":27,"stem":28,"icon":29},"Install","\u002Fgetting-started\u002Finstall","1.getting-started\u002F4.install","i-ph-download-simple",{"title":31,"path":32,"stem":33,"icon":34},"What works today","\u002Fgetting-started\u002Fstatus","1.getting-started\u002F5.status","i-ph-list-checks",{"title":21,"icon":6,"path":36,"stem":37,"children":38,"page":6},"\u002Fconcepts","2.concepts",[39,44,49,54,59,64],{"title":40,"path":41,"stem":42,"icon":43},"Architecture","\u002Fconcepts\u002Farchitecture","2.concepts\u002F1.architecture","i-ph-planet",{"title":45,"path":46,"stem":47,"icon":48},"Jobs and durability","\u002Fconcepts\u002Fjobs","2.concepts\u002F2.jobs","i-ph-infinity",{"title":50,"path":51,"stem":52,"icon":53},"Routing","\u002Fconcepts\u002Frouting","2.concepts\u002F3.routing","i-ph-path",{"title":55,"path":56,"stem":57,"icon":58},"Security model","\u002Fconcepts\u002Fsecurity","2.concepts\u002F4.security","i-ph-shield-check",{"title":60,"path":61,"stem":62,"icon":63},"Tenants","\u002Fconcepts\u002Ftenants","2.concepts\u002F5.tenants","i-ph-buildings",{"title":65,"path":66,"stem":67,"icon":68},"Temporal","\u002Fconcepts\u002Ftemporal","2.concepts\u002F6.temporal","i-ph-clock",{"title":70,"icon":6,"path":71,"stem":72,"children":73,"page":6},"Run a fleet","\u002Ffleet","3.fleet",[74,79,84,89,94,99,104],{"title":75,"path":76,"stem":77,"icon":78},"Dev mode","\u002Ffleet\u002Fdev-mode","3.fleet\u002F1.dev-mode","i-ph-laptop",{"title":80,"path":81,"stem":82,"icon":83},"Run a cluster","\u002Ffleet\u002Fcluster","3.fleet\u002F2.cluster","i-ph-hard-drives",{"title":85,"path":86,"stem":87,"icon":88},"Join nodes","\u002Ffleet\u002Fjoin-nodes","3.fleet\u002F3.join-nodes","i-ph-plugs-connected",{"title":90,"path":91,"stem":92,"icon":93},"Manage nodes","\u002Ffleet\u002Fmanage-nodes","3.fleet\u002F4.manage-nodes","i-ph-list-bullets",{"title":95,"path":96,"stem":97,"icon":98},"Secrets","\u002Ffleet\u002Fsecrets","3.fleet\u002F5.secrets","i-ph-key",{"title":100,"path":101,"stem":102,"icon":103},"High availability","\u002Ffleet\u002Fhigh-availability","3.fleet\u002F6.high-availability","i-ph-copy",{"title":105,"path":106,"stem":107,"icon":108},"Upgrades, backups and restores","\u002Ffleet\u002Fupgrades","3.fleet\u002F7.upgrades","i-ph-arrows-clockwise",{"title":110,"icon":6,"path":111,"stem":112,"children":113,"page":6},"Use plugins","\u002Fplugins","4.plugins",[114,119,124,128],{"title":115,"path":116,"stem":117,"icon":118},"What a plugin is","\u002Fplugins\u002Foverview","4.plugins\u002F1.overview","i-ph-puzzle-piece",{"title":120,"path":121,"stem":122,"icon":123},"Install and update","\u002Fplugins\u002Finstall","4.plugins\u002F2.install","i-ph-package",{"title":125,"path":126,"stem":127,"icon":123},"Existing MCP packages","\u002Fplugins\u002Fpackages","4.plugins\u002F3.packages",{"title":129,"path":130,"stem":131,"icon":132},"The catalog","\u002Fplugins\u002Fcatalog","4.plugins\u002F4.catalog","i-ph-books",{"title":134,"icon":6,"path":135,"stem":136,"children":137,"page":6},"Build plugins","\u002Fbuild-plugins","5.build-plugins",[138,143,148,153,158,163,168,173,178,183,188],{"title":139,"path":140,"stem":141,"icon":142},"Your first plugin","\u002Fbuild-plugins\u002Ffirst-plugin","5.build-plugins\u002F1.first-plugin","i-ph-hammer",{"title":144,"path":145,"stem":146,"icon":147},"Harnesses","\u002Fbuild-plugins\u002Fharnesses","5.build-plugins\u002F10.harnesses","i-ph-cpu",{"title":149,"path":150,"stem":151,"icon":152},"Example: support triage","\u002Fbuild-plugins\u002Fexample-support-triage","5.build-plugins\u002F11.example-support-triage","i-ph-lifebuoy",{"title":154,"path":155,"stem":156,"icon":157},"Tools","\u002Fbuild-plugins\u002Ftools","5.build-plugins\u002F2.tools","i-ph-wrench",{"title":159,"path":160,"stem":161,"icon":162},"Agents","\u002Fbuild-plugins\u002Fagents","5.build-plugins\u002F3.agents","i-ph-robot",{"title":164,"path":165,"stem":166,"icon":167},"Skills","\u002Fbuild-plugins\u002Fskills","5.build-plugins\u002F4.skills","i-ph-graduation-cap",{"title":169,"path":170,"stem":171,"icon":172},"Develop and test","\u002Fbuild-plugins\u002Fdevelop-and-test","5.build-plugins\u002F5.develop-and-test","i-ph-flask",{"title":174,"path":175,"stem":176,"icon":177},"Publish and version","\u002Fbuild-plugins\u002Fpublish","5.build-plugins\u002F6.publish","i-ph-tag",{"title":179,"path":180,"stem":181,"icon":182},"Hooks","\u002Fbuild-plugins\u002Fhooks","5.build-plugins\u002F7.hooks","i-ph-anchor",{"title":184,"path":185,"stem":186,"icon":187},"Flows","\u002Fbuild-plugins\u002Fflows","5.build-plugins\u002F8.flows","i-ph-flow-arrow",{"title":189,"path":190,"stem":191,"icon":192},"Evals and quality gates","\u002Fbuild-plugins\u002Fevals","5.build-plugins\u002F9.evals","i-ph-seal-check",{"title":194,"icon":6,"path":195,"stem":196,"children":197,"page":6},"Run agents","\u002Fagents","6.agents",[198,203,208,213,218,223],{"title":199,"path":200,"stem":201,"icon":202},"Run jobs","\u002Fagents\u002Frun-jobs","6.agents\u002F1.run-jobs","i-ph-play",{"title":204,"path":205,"stem":206,"icon":207},"Models and keys","\u002Fagents\u002Fmodels-and-keys","6.agents\u002F2.models-and-keys","i-ph-sparkle",{"title":209,"path":210,"stem":211,"icon":212},"Delegation","\u002Fagents\u002Fdelegation","6.agents\u002F3.delegation","i-ph-git-fork",{"title":214,"path":215,"stem":216,"icon":217},"Contracts and limits","\u002Fagents\u002Fcontracts-and-limits","6.agents\u002F4.contracts-and-limits","i-ph-ruler",{"title":219,"path":220,"stem":221,"icon":222},"Runtime API","\u002Fagents\u002Fruntime-api","6.agents\u002F5.runtime-api","i-ph-plug",{"title":224,"path":225,"stem":226,"icon":227},"Approvals","\u002Fagents\u002Fapprovals","6.agents\u002F6.approvals","i-ph-hand-palm",{"title":229,"icon":6,"path":230,"stem":231,"children":232,"page":6},"Monitor","\u002Fmonitor","7.monitor",[233,238,243,248,253,258],{"title":234,"path":235,"stem":236,"icon":237},"Web UI","\u002Fmonitor\u002Fweb-ui","7.monitor\u002F0.web-ui","i-ph-monitor",{"title":239,"path":240,"stem":241,"icon":242},"Cost and usage","\u002Fmonitor\u002Fcost-and-usage","7.monitor\u002F1.cost-and-usage","i-ph-coins",{"title":244,"path":245,"stem":246,"icon":247},"Node health","\u002Fmonitor\u002Fnodes","7.monitor\u002F2.nodes","i-ph-heartbeat",{"title":249,"path":250,"stem":251,"icon":252},"Job history","\u002Fmonitor\u002Fhistory","7.monitor\u002F3.history","i-ph-clock-counter-clockwise",{"title":254,"path":255,"stem":256,"icon":257},"Tracing and metrics","\u002Fmonitor\u002Fobservability","7.monitor\u002F4.observability","i-ph-chart-line",{"title":259,"path":260,"stem":261,"icon":152},"Troubleshooting","\u002Fmonitor\u002Ftroubleshooting","7.monitor\u002F5.troubleshooting",{"title":263,"icon":6,"path":264,"stem":265,"children":266,"page":6},"Reference","\u002Freference","8.reference",[267,281,286,290,295,300],{"title":268,"icon":269,"path":270,"stem":271,"children":272,"page":6},"CLI","i-ph-terminal-window","\u002Freference\u002Fcli","8.reference\u002F1.cli",[273,277],{"title":274,"path":275,"stem":276},"orchestrator-zero","\u002Freference\u002Fcli\u002Forchestrator-zero","8.reference\u002F1.cli\u002F1.orchestrator-zero",{"title":278,"path":279,"stem":280},"orchestrator-zero-node","\u002Freference\u002Fcli\u002Forchestrator-zero-node","8.reference\u002F1.cli\u002F2.orchestrator-zero-node",{"title":282,"path":283,"stem":284,"icon":285},"oz0-plugin.yaml","\u002Freference\u002Fplugin-manifest","8.reference\u002F2.plugin-manifest","i-ph-file-code",{"title":287,"path":288,"stem":289,"icon":162},"Agent definition","\u002Freference\u002Fagent-definition","8.reference\u002F3.agent-definition",{"title":291,"path":292,"stem":293,"icon":294},"Ports","\u002Freference\u002Fports","8.reference\u002F4.ports","i-ph-network",{"title":296,"path":297,"stem":298,"icon":299},"Environment variables","\u002Freference\u002Fenvironment","8.reference\u002F5.environment","i-ph-brackets-curly",{"title":301,"path":302,"stem":303,"icon":304},"Files and directories","\u002Freference\u002Ffiles","8.reference\u002F6.files","i-ph-tree-structure",{"title":306,"icon":6,"path":307,"stem":308,"children":309,"page":6},"About","\u002Fabout","9.about",[310,315],{"title":311,"path":312,"stem":313,"icon":314},"Licensing","\u002Fabout\u002Flicensing","9.about\u002F1.licensing","i-ph-scales",{"title":316,"path":317,"stem":318,"icon":319},"About these docs","\u002Fabout\u002Fcontributing-docs","9.about\u002F2.contributing-docs","i-ph-pencil-simple",{"id":321,"title":204,"body":322,"description":663,"extension":664,"links":665,"meta":666,"navigation":667,"path":205,"seo":668,"stem":206,"__hash__":669},"docs\u002F6.agents\u002F2.models-and-keys.md",{"type":323,"value":324,"toc":655},"minimark",[325,334,339,347,399,458,483,487,530,541,545,555,559,591,600,604,632,636,643,651],[326,327,328,329,333],"p",{},"Every model call goes through the ",[330,331,332],"strong",{},"LLM gateway"," in the edge. It adds the tenant's API key, passes the call to the provider unchanged, streaming included, and records tokens and cost.",[335,336,338],"h2",{"id":337},"name-the-model","Name the model",[326,340,341,342,346],{},"In an agent, models are ",[343,344,345],"code",{},"\u003Cprovider>\u002F\u003Cmodel>",":",[348,349,355],"pre",{"className":350,"code":351,"filename":352,"language":353,"meta":354,"style":354},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","model:\n  primary: anthropic\u002Fclaude-sonnet-5-5\n  fallback: [anthropic\u002Fclaude-haiku-4-5]\n","agents\u002Freviewer.yaml","yaml","",[343,356,357,370,382],{"__ignoreMap":354},[358,359,362,366],"span",{"class":360,"line":361},"line",1,[358,363,365],{"class":364},"swJcz","model",[358,367,369],{"class":368},"sMK4o",":\n",[358,371,373,376,378],{"class":360,"line":372},2,[358,374,375],{"class":364},"  primary",[358,377,346],{"class":368},[358,379,381],{"class":380},"sfazB"," anthropic\u002Fclaude-sonnet-5-5\n",[358,383,385,388,390,393,396],{"class":360,"line":384},3,[358,386,387],{"class":364},"  fallback",[358,389,346],{"class":368},[358,391,392],{"class":368}," [",[358,394,395],{"class":380},"anthropic\u002Fclaude-haiku-4-5",[358,397,398],{"class":368},"]\n",[400,401,402,418],"table",{},[403,404,405],"thead",{},[406,407,408,412,415],"tr",{},[409,410,411],"th",{},"Provider",[409,413,414],{},"Gateway path",[409,416,417],{},"Key secret",[419,420,421,440],"tbody",{},[406,422,423,429,435],{},[424,425,426],"td",{},[343,427,428],{},"anthropic",[424,430,431,434],{},[343,432,433],{},"\u002Fllm\u002Fanthropic\u002F...",": Anthropic's Messages API, unchanged",[424,436,437],{},[343,438,439],{},"ANTHROPIC_API_KEY",[406,441,442,447,453],{},[424,443,444],{},[343,445,446],{},"openai",[424,448,449,452],{},[343,450,451],{},"\u002Fllm\u002Fopenai\u002F...",": an OpenAI-compatible API, chat completions and the Responses API",[424,454,455],{},[343,456,457],{},"OPENAI_API_KEY",[326,459,460,461,464,465,468,469,468,472,468,475,478,479,482],{},"Because the gateway passes calls through unchanged, provider features such as prompt caching and extended thinking work without translation. Its ",[343,462,463],{},"anthropic-*"," request headers, betas included, reach the provider, and the provider's rate-limit and retry headers come back: ",[343,466,467],{},"retry-after",", ",[343,470,471],{},"retry-after-ms",[343,473,474],{},"x-should-retry",[343,476,477],{},"anthropic-ratelimit-*"," and ",[343,480,481],{},"x-ratelimit-*",".",[335,484,486],{"id":485},"store-the-key-once","Store the key once",[348,488,493],{"className":489,"code":490,"filename":491,"language":492,"meta":354,"style":354},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","printf %s \"$ANTHROPIC_API_KEY\" | orchestrator-zero secret set ANTHROPIC_API_KEY\n","Terminal","bash",[343,494,495],{"__ignoreMap":354},[358,496,497,501,504,507,511,514,517,521,524,527],{"class":360,"line":361},[358,498,500],{"class":499},"s2Zo4","printf",[358,502,503],{"class":380}," %s",[358,505,506],{"class":368}," \"",[358,508,510],{"class":509},"sTEyZ","$ANTHROPIC_API_KEY",[358,512,513],{"class":368},"\"",[358,515,516],{"class":368}," |",[358,518,520],{"class":519},"sBMFI"," orchestrator-zero",[358,522,523],{"class":380}," secret",[358,525,526],{"class":380}," set",[358,528,529],{"class":380}," ANTHROPIC_API_KEY\n",[326,531,532,533,536,537,540],{},"The key is sealed with the master key and unsealed only in the edge. If a tenant has no key for a provider, the gateway answers ",[343,534,535],{},"412"," with the command that sets it. An agent with a fallback model on another provider falls back to it; when every model was refused, the job fails at once with ",[343,538,539],{},"MissingKey"," and that command, without retrying.",[335,542,544],{"id":543},"why-nodes-never-see-keys","Why nodes never see keys",[326,546,547,548,478,551,554],{},"Each node runs a local LLM proxy. The agent runtime and its plugins see ",[343,549,550],{},"ANTHROPIC_BASE_URL",[343,552,553],{},"OPENAI_BASE_URL"," pointing at it, with a per-start token as their API key. Unmodified SDKs work, the proxy forwards calls to the edge with the node's certificate, and a stolen laptop holds no provider key. When an edge cannot be reached, the proxy tries the next one; a call that an edge has already taken is never sent to a second edge, so a provider never runs it twice, and the activity's own retry decides what happens next.",[335,556,558],{"id":557},"point-the-gateway-somewhere-else","Point the gateway somewhere else",[348,560,562],{"className":489,"code":561,"filename":491,"language":492,"meta":354,"style":354},"orchestrator-zero server start --llm-anthropic-url https:\u002F\u002Fllm-proxy.internal \\\n  --llm-openai-url https:\u002F\u002Fvllm.internal:8000\n",[343,563,564,583],{"__ignoreMap":354},[358,565,566,568,571,574,577,580],{"class":360,"line":361},[358,567,274],{"class":519},[358,569,570],{"class":380}," server",[358,572,573],{"class":380}," start",[358,575,576],{"class":380}," --llm-anthropic-url",[358,578,579],{"class":380}," https:\u002F\u002Fllm-proxy.internal",[358,581,582],{"class":509}," \\\n",[358,584,585,588],{"class":360,"line":372},[358,586,587],{"class":380},"  --llm-openai-url",[358,589,590],{"class":380}," https:\u002F\u002Fvllm.internal:8000\n",[326,592,593,478,596,599],{},[343,594,595],{},"--llm-anthropic-url",[343,597,598],{},"--llm-openai-url"," point the gateway at a corporate proxy, a mirror, a test server, or an OpenAI-compatible server such as vLLM.",[335,601,603],{"id":602},"cost","Cost",[326,605,606,607,614,615,478,618,621,622,625,626,629,630,482],{},"The gateway reads usage from every response and stream and prices it with ",[608,609,613],"a",{"href":610,"rel":611},"https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fgenai-prices",[612],"nofollow","genai-prices",": Anthropic's ",[343,616,617],{},"message_start",[343,619,620],{},"message_delta"," events, the last chunk of a chat completion streamed with ",[343,623,624],{},"stream_options.include_usage",", and the Responses API's ",[343,627,628],{},"response.completed",". Tokens read from the cache are counted apart from new input tokens, so they are priced as cache reads. Each call is recorded with its job, agent, node and model. See ",[608,631,239],{"href":240},[335,633,635],{"id":634},"server-tools","Server tools",[326,637,638,639,642],{},"The gateway passes Anthropic's Messages API through as it is, so the provider's own server tools (web search, web fetch, code execution) work for the agents and harnesses that use them. Web searches are counted from the response's ",[343,640,641],{},"usage.server_tool_use"," and priced at $10 per 1,000 on top of tokens. Server tools work only with that provider's models, and the data they fetch leaves your environment; tools from plugins work with every model.",[644,645,646,647,650],"note",{},"Budgets per job tree and per tenant and month are in ",[608,648,214],{"href":649},"\u002Fagents\u002Fcontracts-and-limits#budgets",". Planned: local models a node calls directly with the usage reported, and more providers.",[652,653,654],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":354,"searchDepth":372,"depth":372,"links":656},[657,658,659,660,661,662],{"id":337,"depth":372,"text":338},{"id":485,"depth":372,"text":486},{"id":543,"depth":372,"text":544},{"id":557,"depth":372,"text":558},{"id":602,"depth":372,"text":603},{"id":634,"depth":372,"text":635},"How model calls reach providers through the edge's LLM gateway, and why nodes never hold a key.","md",null,{},{"icon":207},{"title":204,"description":663},"Fbv0wXTfe74h7mSManw-kZ1owaW5haoKd1rdtqaX3n0",[671,673],{"title":199,"path":200,"stem":201,"description":672,"icon":202,"children":-1},"Start an agent, follow it, cancel it and list what ran.",{"title":209,"path":210,"stem":211,"description":674,"icon":212,"children":-1},"Let an agent hand a task to another agent, on another machine, under the same job.",1791135412154]