[{"data":1,"prerenderedAt":1179},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fv2\u002Fapi\u002Fengines":3},{"id":4,"title":5,"body":6,"description":1172,"extension":1173,"meta":1174,"navigation":62,"path":1175,"seo":1176,"stem":1177,"__hash__":1178},"docs\u002Fdocs\u002Fv2\u002Fapi\u002Fengines.md","engines",{"type":7,"value":8,"toc":1164},"minimark",[9,12,21,98,218,230,234,237,294,300,309,313,316,394,397,405,408,414,417,420,460,469,475,490,534,537,540,543,609,612,630,636,640,648,724,733,739,754,758,766,800,810,816,859,870,876,962,967,973,1073,1080,1091,1140,1157,1160],[10,11,5],"h1",{"id":5},[13,14,15,16,20],"p",{},"An engine is what powers the loop. One field in ",[17,18,19],"code",{},"axon.config.ts",", swappable without\ntouching agent code:",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-ts shiki shiki-themes dark-plus","import { Axon } from \"@arcforge\u002Fengines\"\n\nexport default defineAgent({\n    engine: Axon(),\n})\n","ts","",[17,29,30,57,64,80,92],{"__ignoreMap":27},[31,32,35,39,43,47,50,53],"span",{"class":33,"line":34},"line",1,[31,36,38],{"class":37},"sYbnZ","import",[31,40,42],{"class":41},"sTNBD"," { ",[31,44,46],{"class":45},"s3F5K","Axon",[31,48,49],{"class":41}," } ",[31,51,52],{"class":37},"from",[31,54,56],{"class":55},"sKc5r"," \"@arcforge\u002Fengines\"\n",[31,58,60],{"class":33,"line":59},2,[31,61,63],{"emptyLinePlaceholder":62},true,"\n",[31,65,67,70,73,77],{"class":33,"line":66},3,[31,68,69],{"class":37},"export",[31,71,72],{"class":37}," default",[31,74,76],{"class":75},"sCudf"," defineAgent",[31,78,79],{"class":41},"({\n",[31,81,83,86,89],{"class":33,"line":82},4,[31,84,85],{"class":45},"    engine:",[31,87,88],{"class":75}," Axon",[31,90,91],{"class":41},"(),\n",[31,93,95],{"class":33,"line":94},5,[31,96,97],{"class":41},"})\n",[99,100,101,117],"table",{},[102,103,104],"thead",{},[105,106,107,111,114],"tr",{},[108,109,110],"th",{},"Engine",[108,112,113],{},"Inference runs",[108,115,116],{},"You pay",[118,119,120,138,154,170,186,202],"tbody",{},[105,121,122,132,135],{},[123,124,125],"td",{},[126,127,129],"a",{"href":128},"#axon",[17,130,131],{},"Axon()",[123,133,134],{},"Managed",[123,136,137],{},"Your Axon balance",[105,139,140,148,151],{},[123,141,142],{},[126,143,145],{"href":144},"#codex",[17,146,147],{},"Codex()",[123,149,150],{},"OpenAI",[123,152,153],{},"Your ChatGPT subscription",[105,155,156,164,167],{},[123,157,158],{},[126,159,161],{"href":160},"#openrouter",[17,162,163],{},"OpenRouter()",[123,165,166],{},"OpenRouter",[123,168,169],{},"OpenRouter directly, no markup",[105,171,172,180,183],{},[123,173,174],{},[126,175,177],{"href":176},"#cerebras",[17,178,179],{},"Cerebras()",[123,181,182],{},"Cerebras",[123,184,185],{},"Cerebras directly",[105,187,188,196,199],{},[123,189,190],{},[126,191,193],{"href":192},"#ollama",[17,194,195],{},"Ollama()",[123,197,198],{},"Your machine",[123,200,201],{},"Nothing",[105,203,204,212,215],{},[123,205,206],{},[126,207,209],{"href":208},"#mock",[17,210,211],{},"Mock()",[123,213,214],{},"Nowhere",[123,216,217],{},"Nothing — it's for tests",[13,219,220,221,224,225,229],{},"Whatever the config says, ",[17,222,223],{},"*"," in the terminal overrides the model for the current\nsession. See ",[126,226,228],{"href":227},"\u002Fdocs\u002Fv2\u002Ftui\u002Fmodels","Models",".",[231,232,46],"h2",{"id":233},"axon",[13,235,236],{},"The default. If you are signed in it works with no configuration, billed against your\nAxon balance.",[22,238,240],{"className":24,"code":239,"language":26,"meta":27,"style":27},"import { Axon } from \"@arcforge\u002Fengines\"\n\nengine: Axon()\nengine: Axon({ model: \"claude-sonnet-4-6\" })\n",[17,241,242,256,260,274],{"__ignoreMap":27},[31,243,244,246,248,250,252,254],{"class":33,"line":34},[31,245,38],{"class":37},[31,247,42],{"class":41},[31,249,46],{"class":45},[31,251,49],{"class":41},[31,253,52],{"class":37},[31,255,56],{"class":55},[31,257,258],{"class":33,"line":59},[31,259,63],{"emptyLinePlaceholder":62},[31,261,262,266,269,271],{"class":33,"line":66},[31,263,265],{"class":264},"sqDPy","engine",[31,267,268],{"class":41},": ",[31,270,46],{"class":75},[31,272,273],{"class":41},"()\n",[31,275,276,278,280,282,285,288,291],{"class":33,"line":82},[31,277,265],{"class":264},[31,279,268],{"class":41},[31,281,46],{"class":75},[31,283,284],{"class":41},"({ ",[31,286,287],{"class":45},"model:",[31,289,290],{"class":55}," \"claude-sonnet-4-6\"",[31,292,293],{"class":41}," })\n",[13,295,296,299],{},[17,297,298],{},"model"," is optional — omit it for the account default, or name any model in the Axon\ncatalogue, which includes everything reachable through OpenRouter.",[13,301,302,303,229],{},"No key management: authentication derives from your signed-in session. Top up from the\naccount page at ",[126,304,308],{"href":305,"rel":306},"https:\u002F\u002Faxon.arclabs.it",[307],"nofollow","axon.arclabs.it",[231,310,312],{"id":311},"codex","Codex",[13,314,315],{},"OpenAI's Codex, over OAuth. Requires a ChatGPT Plus or Pro subscription — there is no API\nkey, and Axon takes nothing.",[22,317,319],{"className":24,"code":318,"language":26,"meta":27,"style":27},"import { Codex } from \"@arcforge\u002Fengines\"\n\nengine: Codex()\nengine: Codex({\n    model:  \"gpt-5.5\",      \u002F\u002F default\n    effort: \"medium\",       \u002F\u002F low | medium | high | xhigh\n})\n",[17,320,321,335,339,349,359,374,389],{"__ignoreMap":27},[31,322,323,325,327,329,331,333],{"class":33,"line":34},[31,324,38],{"class":37},[31,326,42],{"class":41},[31,328,312],{"class":45},[31,330,49],{"class":41},[31,332,52],{"class":37},[31,334,56],{"class":55},[31,336,337],{"class":33,"line":59},[31,338,63],{"emptyLinePlaceholder":62},[31,340,341,343,345,347],{"class":33,"line":66},[31,342,265],{"class":264},[31,344,268],{"class":41},[31,346,312],{"class":75},[31,348,273],{"class":41},[31,350,351,353,355,357],{"class":33,"line":82},[31,352,265],{"class":264},[31,354,268],{"class":41},[31,356,312],{"class":75},[31,358,79],{"class":41},[31,360,361,364,367,370],{"class":33,"line":94},[31,362,363],{"class":45},"    model:",[31,365,366],{"class":55},"  \"gpt-5.5\"",[31,368,369],{"class":41},",      ",[31,371,373],{"class":372},"sOLPB","\u002F\u002F default\n",[31,375,377,380,383,386],{"class":33,"line":376},6,[31,378,379],{"class":45},"    effort:",[31,381,382],{"class":55}," \"medium\"",[31,384,385],{"class":41},",       ",[31,387,388],{"class":372},"\u002F\u002F low | medium | high | xhigh\n",[31,390,392],{"class":33,"line":391},7,[31,393,97],{"class":41},[13,395,396],{},"Connect once from the terminal:",[22,398,403],{"className":399,"code":401,"language":402},[400],"language-text",":provider codex connect\n:provider codex disconnect\n","text",[17,404,401],{"__ignoreMap":27},[13,406,407],{},"That opens a browser to approve. The connection refreshes itself, so it holds until you\ndisconnect deliberately.",[13,409,410,413],{},[17,411,412],{},"effort"," controls reasoning depth on models that support it — higher costs latency and\ntokens. Omit it for non-reasoning models.",[231,415,166],{"id":416},"openrouter",[13,418,419],{},"Your own key, 100+ models across providers, charged at OpenRouter's rates with no Axon\nmarkup.",[22,421,423],{"className":24,"code":422,"language":26,"meta":27,"style":27},"import { OpenRouter } from \"@arcforge\u002Fengines\"\n\nengine: OpenRouter({ model: \"openai\u002Fgpt-4o\" })\n",[17,424,425,439,443],{"__ignoreMap":27},[31,426,427,429,431,433,435,437],{"class":33,"line":34},[31,428,38],{"class":37},[31,430,42],{"class":41},[31,432,166],{"class":45},[31,434,49],{"class":41},[31,436,52],{"class":37},[31,438,56],{"class":55},[31,440,441],{"class":33,"line":59},[31,442,63],{"emptyLinePlaceholder":62},[31,444,445,447,449,451,453,455,458],{"class":33,"line":66},[31,446,265],{"class":264},[31,448,268],{"class":41},[31,450,166],{"class":75},[31,452,284],{"class":41},[31,454,287],{"class":45},[31,456,457],{"class":55}," \"openai\u002Fgpt-4o\"",[31,459,293],{"class":41},[13,461,462,463,468],{},"Get a key at ",[126,464,467],{"href":465,"rel":466},"https:\u002F\u002Fopenrouter.ai\u002Fkeys",[307],"openrouter.ai\u002Fkeys",", then:",[22,470,473],{"className":471,"code":472,"language":402},[400],":provider openrouter connect\n:provider openrouter disconnect\n",[17,474,472],{"__ignoreMap":27},[13,476,477,479,480,483,484,489],{},[17,478,298],{}," is an OpenRouter ID in ",[17,481,482],{},"provider\u002Fmodel-name"," form, as listed on\n",[126,485,488],{"href":486,"rel":487},"https:\u002F\u002Fopenrouter.ai\u002Fmodels",[307],"openrouter.ai\u002Fmodels",":",[22,491,493],{"className":24,"code":492,"language":26,"meta":27,"style":27},"OpenRouter({ model: \"anthropic\u002Fclaude-sonnet-4-6\" })\nOpenRouter({ model: \"google\u002Fgemini-2.5-pro\" })\nOpenRouter({ model: \"meta-llama\u002Fllama-3.3-70b-instruct\" })\n",[17,494,495,508,521],{"__ignoreMap":27},[31,496,497,499,501,503,506],{"class":33,"line":34},[31,498,166],{"class":75},[31,500,284],{"class":41},[31,502,287],{"class":45},[31,504,505],{"class":55}," \"anthropic\u002Fclaude-sonnet-4-6\"",[31,507,293],{"class":41},[31,509,510,512,514,516,519],{"class":33,"line":59},[31,511,166],{"class":75},[31,513,284],{"class":41},[31,515,287],{"class":45},[31,517,518],{"class":55}," \"google\u002Fgemini-2.5-pro\"",[31,520,293],{"class":41},[31,522,523,525,527,529,532],{"class":33,"line":66},[31,524,166],{"class":75},[31,526,284],{"class":41},[31,528,287],{"class":45},[31,530,531],{"class":55}," \"meta-llama\u002Fllama-3.3-70b-instruct\"",[31,533,293],{"class":41},[13,535,536],{},"The key is stored in your account vault, so it holds across sessions and a deployed agent\nuses the same connection.",[231,538,182],{"id":539},"cerebras",[13,541,542],{},"Hosted inference built for speed. Reach for it when latency and throughput matter and the\nworkload suits open-weight models.",[22,544,546],{"className":24,"code":545,"language":26,"meta":27,"style":27},"import { Cerebras } from \"@arcforge\u002Fengines\"\n\nengine: Cerebras({ model: \"gpt-oss-120b\" })\nengine: Cerebras({ model: \"gpt-oss-120b\", temperature: 0.2 })\n",[17,547,548,562,566,583],{"__ignoreMap":27},[31,549,550,552,554,556,558,560],{"class":33,"line":34},[31,551,38],{"class":37},[31,553,42],{"class":41},[31,555,182],{"class":45},[31,557,49],{"class":41},[31,559,52],{"class":37},[31,561,56],{"class":55},[31,563,564],{"class":33,"line":59},[31,565,63],{"emptyLinePlaceholder":62},[31,567,568,570,572,574,576,578,581],{"class":33,"line":66},[31,569,265],{"class":264},[31,571,268],{"class":41},[31,573,182],{"class":75},[31,575,284],{"class":41},[31,577,287],{"class":45},[31,579,580],{"class":55}," \"gpt-oss-120b\"",[31,582,293],{"class":41},[31,584,585,587,589,591,593,595,597,600,603,607],{"class":33,"line":82},[31,586,265],{"class":264},[31,588,268],{"class":41},[31,590,182],{"class":75},[31,592,284],{"class":41},[31,594,287],{"class":45},[31,596,580],{"class":55},[31,598,599],{"class":41},", ",[31,601,602],{"class":45},"temperature:",[31,604,606],{"class":605},"sDGX8"," 0.2",[31,608,293],{"class":41},[13,610,611],{},"Needs a key in the agent's environment:",[22,613,617],{"className":614,"code":615,"language":616,"meta":27,"style":27},"language-bash shiki shiki-themes dark-plus","CEREBRAS_API_KEY=csk-...\n","bash",[17,618,619],{"__ignoreMap":27},[31,620,621,624,627],{"class":33,"line":34},[31,622,623],{"class":45},"CEREBRAS_API_KEY",[31,625,626],{"class":41},"=",[31,628,629],{"class":55},"csk-...\n",[13,631,632,633,635],{},"For a deployed agent set it as a runtime secret rather than committing it. ",[17,634,298],{}," is a\nCerebras model ID — see the Cerebras console for what is currently available.",[231,637,639],{"id":638},"ollama","Ollama",[13,641,642,643,647],{},"Local inference. No API cost, and nothing leaves the machine. Requires\n",[126,644,639],{"href":645,"rel":646},"https:\u002F\u002Follama.com",[307]," installed; Axon manages the server lifecycle.",[22,649,651],{"className":24,"code":650,"language":26,"meta":27,"style":27},"import { Ollama } from \"@arcforge\u002Fengines\"\n\nengine: Ollama({ model: \"qwen2.5:7b\" })\nengine: Ollama({\n    model: \"qwen2.5:7b\",\n    host:  \"http:\u002F\u002Flocalhost:11434\",   \u002F\u002F default\n})\n",[17,652,653,667,671,688,698,707,720],{"__ignoreMap":27},[31,654,655,657,659,661,663,665],{"class":33,"line":34},[31,656,38],{"class":37},[31,658,42],{"class":41},[31,660,639],{"class":45},[31,662,49],{"class":41},[31,664,52],{"class":37},[31,666,56],{"class":55},[31,668,669],{"class":33,"line":59},[31,670,63],{"emptyLinePlaceholder":62},[31,672,673,675,677,679,681,683,686],{"class":33,"line":66},[31,674,265],{"class":264},[31,676,268],{"class":41},[31,678,639],{"class":75},[31,680,284],{"class":41},[31,682,287],{"class":45},[31,684,685],{"class":55}," \"qwen2.5:7b\"",[31,687,293],{"class":41},[31,689,690,692,694,696],{"class":33,"line":82},[31,691,265],{"class":264},[31,693,268],{"class":41},[31,695,639],{"class":75},[31,697,79],{"class":41},[31,699,700,702,704],{"class":33,"line":94},[31,701,363],{"class":45},[31,703,685],{"class":55},[31,705,706],{"class":41},",\n",[31,708,709,712,715,718],{"class":33,"line":376},[31,710,711],{"class":45},"    host:",[31,713,714],{"class":55},"  \"http:\u002F\u002Flocalhost:11434\"",[31,716,717],{"class":41},",   ",[31,719,373],{"class":372},[31,721,722],{"class":33,"line":391},[31,723,97],{"class":41},[13,725,726,728,729,732],{},[17,727,298],{}," is the name as it appears in ",[17,730,731],{},"ollama list"," — anything you have pulled.",[13,734,735,736,738],{},"The route appears in ",[17,737,223],{}," as soon as the daemon answers. Models are listed with their\ndownload size and whether they suit your hardware; selecting one you do not have pulls it\nwith progress in the palette. Or pull directly:",[22,740,742],{"className":614,"code":741,"language":616,"meta":27,"style":27},"ollama pull qwen2.5:7b\n",[17,743,744],{"__ignoreMap":27},[31,745,746,748,751],{"class":33,"line":34},[31,747,638],{"class":75},[31,749,750],{"class":55}," pull",[31,752,753],{"class":55}," qwen2.5:7b\n",[231,755,757],{"id":756},"mock","Mock",[13,759,760,761,765],{},"A deterministic engine for tests. It replaces the inference step and ",[762,763,764],"strong",{},"nothing else"," —\nthe full loop still runs, tools execute, the session log accumulates, stop conditions\nfire. Production behaviour without a model call.",[22,767,769],{"className":24,"code":768,"language":26,"meta":27,"style":27},"import { Mock } from \"@arcforge\u002Fengines\u002Fmock\"\n\nengine: Mock()\n",[17,770,771,786,790],{"__ignoreMap":27},[31,772,773,775,777,779,781,783],{"class":33,"line":34},[31,774,38],{"class":37},[31,776,42],{"class":41},[31,778,757],{"class":45},[31,780,49],{"class":41},[31,782,52],{"class":37},[31,784,785],{"class":55}," \"@arcforge\u002Fengines\u002Fmock\"\n",[31,787,788],{"class":33,"line":59},[31,789,63],{"emptyLinePlaceholder":62},[31,791,792,794,796,798],{"class":33,"line":66},[31,793,265],{"class":264},[31,795,268],{"class":41},[31,797,757],{"class":75},[31,799,273],{"class":41},[13,801,802,803,805,806,809],{},"Bare ",[17,804,211],{}," echoes the last user message back. That is what a fresh ",[17,807,808],{},"axon init"," boots\nwith, before an engine is configured.",[13,811,812,815],{},[762,813,814],{},"Response map."," Patterns match case-insensitively as substrings against the last user\nmessage; no match falls back to echo.",[22,817,819],{"className":24,"code":818,"language":26,"meta":27,"style":27},"engine: Mock({\n    \"hello\":         \"Hi there!\",\n    \"sprint status\": \"Two issues remain in review.\",\n})\n",[17,820,821,831,843,855],{"__ignoreMap":27},[31,822,823,825,827,829],{"class":33,"line":34},[31,824,265],{"class":264},[31,826,268],{"class":41},[31,828,757],{"class":75},[31,830,79],{"class":41},[31,832,833,836,838,841],{"class":33,"line":59},[31,834,835],{"class":55},"    \"hello\"",[31,837,489],{"class":45},[31,839,840],{"class":55},"         \"Hi there!\"",[31,842,706],{"class":41},[31,844,845,848,850,853],{"class":33,"line":66},[31,846,847],{"class":55},"    \"sprint status\"",[31,849,489],{"class":45},[31,851,852],{"class":55}," \"Two issues remain in review.\"",[31,854,706],{"class":41},[31,856,857],{"class":33,"line":82},[31,858,97],{"class":41},[13,860,861,862,865,866,869],{},"A reply is a ",[762,863,864],{},"step",": spoken text ends the wake, or ",[17,867,868],{},"run()"," executes code so the loop\ncontinues and the model sees the result.",[13,871,872,875],{},[762,873,874],{},"Sequences."," An array plays one step per tick, in order; once exhausted the last step\nrepeats.",[22,877,879],{"className":24,"code":878,"language":26,"meta":27,"style":27},"import { Mock, run } from \"@arcforge\u002Fengines\u002Fmock\"\n\nengine: Mock({\n    \"review the file\": [\n        run(`fs.read(\"src\u002Findex.ts\")`),   \u002F\u002F tick 1: act\n        \"The file looks correct.\",         \u002F\u002F tick 2: see the result, speak\n    ],\n})\n",[17,880,881,900,904,914,924,941,952,957],{"__ignoreMap":27},[31,882,883,885,887,889,891,894,896,898],{"class":33,"line":34},[31,884,38],{"class":37},[31,886,42],{"class":41},[31,888,757],{"class":45},[31,890,599],{"class":41},[31,892,893],{"class":45},"run",[31,895,49],{"class":41},[31,897,52],{"class":37},[31,899,785],{"class":55},[31,901,902],{"class":33,"line":59},[31,903,63],{"emptyLinePlaceholder":62},[31,905,906,908,910,912],{"class":33,"line":66},[31,907,265],{"class":264},[31,909,268],{"class":41},[31,911,757],{"class":75},[31,913,79],{"class":41},[31,915,916,919,921],{"class":33,"line":82},[31,917,918],{"class":55},"    \"review the file\"",[31,920,489],{"class":45},[31,922,923],{"class":41}," [\n",[31,925,926,929,932,935,938],{"class":33,"line":94},[31,927,928],{"class":75},"        run",[31,930,931],{"class":41},"(",[31,933,934],{"class":55},"`fs.read(\"src\u002Findex.ts\")`",[31,936,937],{"class":41},"),   ",[31,939,940],{"class":372},"\u002F\u002F tick 1: act\n",[31,942,943,946,949],{"class":33,"line":376},[31,944,945],{"class":55},"        \"The file looks correct.\"",[31,947,948],{"class":41},",         ",[31,950,951],{"class":372},"\u002F\u002F tick 2: see the result, speak\n",[31,953,954],{"class":33,"line":391},[31,955,956],{"class":41},"    ],\n",[31,958,960],{"class":33,"line":959},8,[31,961,97],{"class":41},[13,963,964,966],{},[17,965,868],{}," executes real code in the real capsule under the agent's real policy. The result\ncommits to the session log and re-enters the loop on the next tick — exactly the path a\nreal model's tool call takes. That is what makes multi-step flows, failure handling and\npolicy rejections deterministically testable.",[13,968,969,972],{},[762,970,971],{},"Function form"," for full control:",[22,974,976],{"className":24,"code":975,"language":26,"meta":27,"style":27},"engine: Mock(async (req) => {\n    const last = req.messages.at(-1)?.content ?? \"\"\n    return `You said: ${last}`\n})\n",[17,977,978,1007,1049,1069],{"__ignoreMap":27},[31,979,980,982,984,986,988,992,995,998,1001,1004],{"class":33,"line":34},[31,981,265],{"class":264},[31,983,268],{"class":41},[31,985,757],{"class":75},[31,987,931],{"class":41},[31,989,991],{"class":990},"scz_3","async",[31,993,994],{"class":41}," (",[31,996,997],{"class":45},"req",[31,999,1000],{"class":41},") ",[31,1002,1003],{"class":990},"=>",[31,1005,1006],{"class":41}," {\n",[31,1008,1009,1012,1016,1019,1021,1023,1026,1028,1031,1034,1037,1040,1043,1046],{"class":33,"line":59},[31,1010,1011],{"class":990},"    const",[31,1013,1015],{"class":1014},"s9McN"," last",[31,1017,1018],{"class":41}," = ",[31,1020,997],{"class":45},[31,1022,229],{"class":41},[31,1024,1025],{"class":45},"messages",[31,1027,229],{"class":41},[31,1029,1030],{"class":75},"at",[31,1032,1033],{"class":41},"(-",[31,1035,1036],{"class":605},"1",[31,1038,1039],{"class":41},")?.",[31,1041,1042],{"class":45},"content",[31,1044,1045],{"class":41}," ?? ",[31,1047,1048],{"class":55},"\"\"\n",[31,1050,1051,1054,1057,1060,1063,1066],{"class":33,"line":66},[31,1052,1053],{"class":37},"    return",[31,1055,1056],{"class":55}," `You said: ",[31,1058,1059],{"class":990},"${",[31,1061,1062],{"class":45},"last",[31,1064,1065],{"class":990},"}",[31,1067,1068],{"class":55},"`\n",[31,1070,1071],{"class":33,"line":82},[31,1072,97],{"class":41},[13,1074,1075,1076,1079],{},"Return a string to speak, or ",[17,1077,1078],{},"run(code)"," to act.",[13,1081,1082,1085,1086,1090],{},[762,1083,1084],{},"Output grammar."," You never choose one. A step describes ",[1087,1088,1089],"em",{},"intent",", and Mock writes it in\nwhichever dialect the agent's brain rendered, read from the contract block in the request:",[99,1092,1093,1105],{},[102,1094,1095],{},[105,1096,1097,1099,1102],{},[108,1098,864],{},[108,1100,1101],{},"classic",[108,1103,1104],{},"sfc",[118,1106,1107,1124],{},[105,1108,1109,1114,1119],{},[123,1110,1111],{},[17,1112,1113],{},"\"some text\"",[123,1115,1116],{},[17,1117,1118],{},"\u003Ctext>",[123,1120,1121],{},[17,1122,1123],{},"\u003Ctemplate>",[105,1125,1126,1130,1135],{},[123,1127,1128],{},[17,1129,1078],{},[123,1131,1132],{},[17,1133,1134],{},"\u003Ctypescript>",[123,1136,1137],{},[17,1138,1139],{},"\u003Cscript>",[13,1141,1142,1143,1146,1147,1149,1150,1152,1153,1156],{},"This is why one ",[17,1144,1145],{},"Mock({ ... })"," works against any cognet — the steps are about behaviour,\nnot syntax. It also means Mock exercises structured output for real: a ",[17,1148,868],{}," step becomes\nthe ",[17,1151,1139],{}," a declared ",[17,1154,1155],{},"output"," type is checked against.",[13,1158,1159],{},"Mock streams spoken text by chunking words with small delays, so tests iterate the stream\nexactly as they would a real engine.",[1161,1162,1163],"style",{},"html pre.shiki code .sYbnZ, html code.shiki .sYbnZ{--shiki-default:#C586C0}html pre.shiki code .sTNBD, html code.shiki .sTNBD{--shiki-default:#D4D4D4}html pre.shiki code .s3F5K, html code.shiki .s3F5K{--shiki-default:#9CDCFE}html pre.shiki code .sKc5r, html code.shiki .sKc5r{--shiki-default:#CE9178}html pre.shiki code .sCudf, html code.shiki .sCudf{--shiki-default:#DCDCAA}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 pre.shiki code .sqDPy, html code.shiki .sqDPy{--shiki-default:#C8C8C8}html pre.shiki code .sOLPB, html code.shiki .sOLPB{--shiki-default:#6A9955}html pre.shiki code .sDGX8, html code.shiki .sDGX8{--shiki-default:#B5CEA8}html pre.shiki code .scz_3, html code.shiki .scz_3{--shiki-default:#569CD6}html pre.shiki code .s9McN, html code.shiki .s9McN{--shiki-default:#4FC1FF}",{"title":27,"searchDepth":59,"depth":59,"links":1165},[1166,1167,1168,1169,1170,1171],{"id":233,"depth":59,"text":46},{"id":311,"depth":59,"text":312},{"id":416,"depth":59,"text":166},{"id":539,"depth":59,"text":182},{"id":638,"depth":59,"text":639},{"id":756,"depth":59,"text":757},"An engine is what powers the loop. One field in axon.config.ts, swappable without\ntouching agent code:","md",{},"\u002Fdocs\u002Fv2\u002Fapi\u002Fengines",{"title":5,"description":1172},"docs\u002Fv2\u002Fapi\u002Fengines","WZxkaLYaOVDkOm72kKLBKpTWEO8EVFS8tUUahbJWRME",1786899562191]