[{"data":1,"prerenderedAt":698},["ShallowReactive",2],{"docs-\u002Fdocs\u002Ffeatures\u002Fmodels":3},{"id":4,"title":5,"body":6,"description":690,"extension":691,"meta":692,"navigation":693,"path":694,"seo":695,"stem":696,"__hash__":697},"docs\u002Fdocs\u002Ffeatures\u002Fmodels.md","Models & the model pool",{"type":7,"value":8,"toc":677},"minimark",[9,13,17,22,25,36,47,50,89,100,104,229,236,241,258,275,278,286,312,315,321,324,345,348,393,404,419,423,451,463,467,470,477,498,501,504,538,548,552,555,581,588,596,600,608,614,617,621,635,670,673],[10,11,5],"h1",{"id":12},"models-the-model-pool",[14,15,16],"p",{},"Slo works with OpenAI, Anthropic, Kimi For Coding and OpenRouter. You can switch models mid-session, set the reasoning level per model, give different sub-agents different models, and pool several so one hitting a limit doesn't stop your run.",[18,19,21],"h2",{"id":20},"switch-models","Switch models",[14,23,24],{},"In the TUI:",[26,27,33],"pre",{"className":28,"code":30,"language":31,"meta":32},[29],"language-text","\u002Fmodel                    list models, grouped by provider\n\u002Fmodel claude-opus-4-8    switch, and remember it for next time\n\u002Freasoning                show the current level and what this model supports\n\u002Freasoning medium         change it, and remember it\n\u002Fpreferences              show what's saved\n\u002Fpreferences clear        forget it and use the defaults next launch\n","text","",[34,35,30],"code",{"__ignoreMap":32},[14,37,38,39,42,43,46],{},"Each model in the list shows ",[34,40,41],{},"available"," or ",[34,44,45],{},"requires \u002Fauth",", so you can see which providers you're signed in to. You can't switch while a prompt is running.",[14,48,49],{},"For headless runs, pass it on the command line:",[26,51,55],{"className":52,"code":53,"language":54,"meta":32,"style":32},"language-bash shiki shiki-themes github-dark-high-contrast","slo run -p \"Review the diff\" --model claude-sonnet-4-6 --reasoning high\n","bash",[34,56,57],{"__ignoreMap":32},[58,59,62,66,70,74,77,80,83,86],"span",{"class":60,"line":61},"line",1,[58,63,65],{"class":64},"s_sBn","slo",[58,67,69],{"class":68},"sTRMh"," run",[58,71,73],{"class":72},"sCcAr"," -p",[58,75,76],{"class":68}," \"Review the diff\"",[58,78,79],{"class":72}," --model",[58,81,82],{"class":68}," claude-sonnet-4-6",[58,84,85],{"class":72}," --reasoning",[58,87,88],{"class":68}," high\n",[14,90,91,92,95,96,99],{},"The default model is ",[34,93,94],{},"gpt-5.4",". After you sign in to a new provider with ",[34,97,98],{},"\u002Fauth",", Slo switches to that provider's default.",[18,101,103],{"id":102},"models-you-can-pick","Models you can pick",[105,106,107,120],"table",{},[108,109,110],"thead",{},[111,112,113,117],"tr",{},[114,115,116],"th",{},"Provider",[114,118,119],{},"Models",[121,122,123,171,196,212],"tbody",{},[111,124,125,129],{},[126,127,128],"td",{},"OpenAI",[126,130,131,134,135,134,138,134,141,134,144,134,147,134,150,134,153,134,156,134,158,134,161,134,164,134,167,170],{},[34,132,133],{},"gpt-6.1-sol",", ",[34,136,137],{},"gpt-6-sol",[34,139,140],{},"gpt-6-luna",[34,142,143],{},"gpt-6-astra",[34,145,146],{},"gpt-5.6-terra",[34,148,149],{},"gpt-5.6-sol",[34,151,152],{},"gpt-5.6-luna",[34,154,155],{},"gpt-5.5",[34,157,94],{},[34,159,160],{},"gpt-5-codex",[34,162,163],{},"gpt-5.3-codex",[34,165,166],{},"gpt-5",[34,168,169],{},"o3"," and more",[111,172,173,176],{},[126,174,175],{},"Anthropic",[126,177,178,134,181,134,184,134,187,134,190,134,193],{},[34,179,180],{},"claude-opus-4-8",[34,182,183],{},"claude-opus-4-8-1m-context",[34,185,186],{},"claude-sonnet-4-6",[34,188,189],{},"claude-sonnet-4-6-1m-context",[34,191,192],{},"claude-haiku-4-5",[34,194,195],{},"claude-fable",[111,197,198,201],{},[126,199,200],{},"Kimi For Coding",[126,202,203,134,206,134,209],{},[34,204,205],{},"kimi-k3",[34,207,208],{},"kimi-for-coding",[34,210,211],{},"kimi-for-coding-highspeed",[111,213,214,217],{},[126,215,216],{},"OpenRouter",[126,218,219,220,223,224,228],{},"Any model your OpenRouter key can use, written ",[34,221,222],{},"openrouter:\u003Cmodel-id>",". See ",[225,226,216],"a",{"href":227},"#openrouter",".",[14,230,231,232,235],{},"Run ",[34,233,234],{},"\u002Fmodel"," for the full, current list.",[237,238,240],"h3",{"id":239},"gpt-6-luna-sol-and-61-sol","GPT-6 Luna, Sol and 6.1 Sol",[14,242,243,134,245,247,248,250,251,253,254,257],{},[34,244,140],{},[34,246,137],{}," and ",[34,249,133],{}," work with either kind of OpenAI sign-in: a ChatGPT subscription or a Platform API key. Set either up with ",[34,252,98],{},". Slo doesn't switch between the two on its own, and an ",[34,255,256],{},"OPENAI_API_KEY"," in your environment wins over a saved ChatGPT sign-in.",[14,259,260,261,264,265,267,268,271,272,228],{},"All three have a context window of about one million tokens and start at ",[34,262,263],{},"medium"," reasoning. ",[34,266,133],{}," always reasons a little, so ",[34,269,270],{},"\u002Freasoning off"," runs it at ",[34,273,274],{},"low",[18,276,216],{"id":277},"openrouter",[14,279,280,285],{},[225,281,216],{"href":282,"rel":283},"https:\u002F\u002Fopenrouter.ai",[284],"nofollow"," gives one API key access to models from many providers. Slo can use any model your key is allowed to call.",[287,288,289,299,305],"ol",{},[290,291,231,292,294,295,298],"li",{},[34,293,98],{},", pick ",[296,297,216],"strong",{}," and paste your API key. Slo checks the key before saving it.",[290,300,231,301,304],{},[34,302,303],{},"\u002Fmodel refresh"," to load the models your key can use.",[290,306,307,308,311],{},"Switch with the full name, ",[34,309,310],{},"openrouter:"," followed by the OpenRouter model ID.",[14,313,314],{},"Two to try:",[26,316,319],{"className":317,"code":318,"language":31,"meta":32},[29],"\u002Fmodel openrouter:typesafe\u002Fjev-router\n\u002Fmodel openrouter:deepseek\u002Fdeepseek-v4.1-flash\n",[34,320,318],{"__ignoreMap":32},[14,322,323],{},"Headless runs and schedules take the same names:",[26,325,327],{"className":52,"code":326,"language":54,"meta":32,"style":32},"slo run -p \"Summarise the working tree\" --model openrouter:deepseek\u002Fdeepseek-v4.1-flash\n",[34,328,329],{"__ignoreMap":32},[58,330,331,333,335,337,340,342],{"class":60,"line":61},[58,332,65],{"class":64},[58,334,69],{"class":68},[58,336,73],{"class":72},[58,338,339],{"class":68}," \"Summarise the working tree\"",[58,341,79],{"class":72},[58,343,344],{"class":68}," openrouter:deepseek\u002Fdeepseek-v4.1-flash\n",[14,346,347],{},"A few things to know:",[349,350,351,364,373,387],"ul",{},[290,352,353,359,360,363],{},[296,354,355,356,358],{},"The ",[34,357,310],{}," prefix decides the route."," ",[34,361,362],{},"openrouter:anthropic\u002F..."," goes through OpenRouter with your OpenRouter key, not through your Anthropic sign-in.",[290,365,366,369,370,372],{},[296,367,368],{},"The list depends on your key."," Slo only offers models that OpenRouter says your key can use. If a model you expect is missing or marked unavailable, run ",[34,371,303],{},". Opening the picker on its own doesn't update it.",[290,374,375,378,379,382,383,386],{},[296,376,377],{},"Reasoning controls vary."," When OpenRouter doesn't say what a model supports, ",[34,380,381],{},"\u002Freasoning"," shows ",[34,384,385],{},"provider default; controls unavailable",". That means the provider decides, not that reasoning is off.",[290,388,389,392],{},[296,390,391],{},"Output length."," If OpenRouter doesn't publish a model's output limit, Slo caps each reply at a safe size (normally 4,096 tokens) rather than guess.",[14,394,395,396,399,400,228],{},"For CI, set ",[34,397,398],{},"SLO_OPENROUTER_API_KEY"," instead of signing in. See ",[225,401,403],{"href":402},"\u002Fdocs\u002Fauthentication#openrouter","Authentication",[405,406,408],"note",{"kind":407},"warning",[14,409,410,411,414,415,228],{},"Seeing ",[34,412,413],{},"model_catalog_cache_load_failed"," after trying an early OpenRouter build? See ",[225,416,418],{"href":417},"\u002Fdocs\u002Freference\u002Ftroubleshooting#model_catalog_cache_load_failed","the model catalog gotcha",[18,420,422],{"id":421},"reasoning-levels","Reasoning levels",[14,424,425,426,134,429,134,432,134,434,134,436,247,439,442,443,446,447,450],{},"Levels are ",[34,427,428],{},"off",[34,430,431],{},"minimal",[34,433,274],{},[34,435,263],{},[34,437,438],{},"high",[34,440,441],{},"xhigh",". You can also say ",[34,444,445],{},"on"," for the model's default or ",[34,448,449],{},"max"," for the highest it supports. If you ask for a level a model doesn't have, Slo uses the closest one and tells you.",[14,452,453,454,456,457,459,460,462],{},"A rough guide: ",[34,455,438],{}," for specs, reviews and tricky debugging. ",[34,458,263],{}," for everyday code. ",[34,461,274],{}," when you're doing lots of small, obvious edits and want speed.",[18,464,466],{"id":465},"the-model-pool","The model pool",[14,468,469],{},"A pool is an ordered list of models that Slo treats as one. Every request goes to the first model that's available. If that model is rate limited, out of credit, or its provider has a wobble, Slo moves the request to the next one and keeps going.",[14,471,472,473,476],{},"Set it with ",[34,474,475],{},"SLO_MODEL_POOL",":",[26,478,480],{"className":52,"code":479,"language":54,"meta":32,"style":32},"export SLO_MODEL_POOL=\"gpt-5.4,claude-sonnet-4-6,kimi-for-coding\"\n",[34,481,482],{"__ignoreMap":32},[58,483,484,488,492,495],{"class":60,"line":61},[58,485,487],{"class":486},"sWyjQ","export",[58,489,491],{"class":490},"sMAXC"," SLO_MODEL_POOL",[58,493,494],{"class":486},"=",[58,496,497],{"class":68},"\"gpt-5.4,claude-sonnet-4-6,kimi-for-coding\"\n",[14,499,500],{},"You need to be signed in to every provider in the list, and the pool needs at least two models.",[14,502,503],{},"For finer control, use JSON and set how long a model sits out after a problem:",[26,505,507],{"className":52,"code":506,"language":54,"meta":32,"style":32},"export SLO_MODEL_POOL='[\n  {\"model_name\": \"claude-sonnet-4-6\", \"priority\": 1, \"cooldown_seconds\": 300, \"rate_limit_cooldown_seconds\": 30},\n  {\"model_name\": \"kimi-for-coding\", \"priority\": 2, \"cooldown_seconds\": 600, \"rate_limit_cooldown_seconds\": 60}\n]'\n",[34,508,509,520,526,532],{"__ignoreMap":32},[58,510,511,513,515,517],{"class":60,"line":61},[58,512,487],{"class":486},[58,514,491],{"class":490},[58,516,494],{"class":486},[58,518,519],{"class":68},"'[\n",[58,521,523],{"class":60,"line":522},2,[58,524,525],{"class":68},"  {\"model_name\": \"claude-sonnet-4-6\", \"priority\": 1, \"cooldown_seconds\": 300, \"rate_limit_cooldown_seconds\": 30},\n",[58,527,529],{"class":60,"line":528},3,[58,530,531],{"class":68},"  {\"model_name\": \"kimi-for-coding\", \"priority\": 2, \"cooldown_seconds\": 600, \"rate_limit_cooldown_seconds\": 60}\n",[58,533,535],{"class":60,"line":534},4,[58,536,537],{"class":68},"]'\n",[14,539,540,543,544,547],{},[34,541,542],{},"cooldown_seconds"," (default 300) applies when a model runs out of credit. ",[34,545,546],{},"rate_limit_cooldown_seconds"," (default 60) applies to rate limits and provider errors.",[237,549,551],{"id":550},"what-happens-under-load","What happens under load",[14,553,554],{},"Slo tries three things before giving up:",[287,556,557,566,572],{},[290,558,559,562,563,228],{},[296,560,561],{},"It paces itself."," Before sending, Slo estimates whether a request would break the model's rate window, and waits a moment if so. You'll see ",[34,564,565],{},"Waiting Ns for \u003Cmodel> local rate window",[290,567,568,571],{},[296,569,570],{},"It reroutes."," If a request fails before any output has streamed, the pool sends it to the next model.",[290,573,574,577,578,228],{},[296,575,576],{},"It retries."," If nothing visible has happened yet in the current step, Slo waits and tries again. You'll see ",[34,579,580],{},"Rate limited by \u003Cmodel>; retrying in Ns",[14,582,583,584,587],{},"If every model is cooling down and the retries run out, the run stops with ",[34,585,586],{},"All models in pool are in cooldown"," and the names of each model. Wait for the cooldowns, or add another model to the pool.",[405,589,591],{"kind":590},"tip",[14,592,593,595],{},[34,594,234],{}," switches a pooled session to a single model. Restart Slo to go back to the pool.",[18,597,599],{"id":598},"different-models-for-different-phases","Different models for different phases",[14,601,602,603,607],{},"In a ",[225,604,606],{"href":605},"\u002Fdocs\u002Ffeatures\u002Fdynamic-workflows","dynamic workflow",", each sub-agent can run its own model and reasoning level. Ask in plain English:",[609,610,611],"blockquote",{},[14,612,613],{},"\"Use dynamic workflows. Write the spec and do the final review with claude-opus-4-8 on high. Do the coding and tests with claude-sonnet-4-6 on medium.\"",[14,615,616],{},"The orchestrator assigns them per phase. A model name it doesn't recognise is rejected before any sub-agent starts, along with the list of valid names.",[18,618,620],{"id":619},"adjusting-the-catalog","Adjusting the catalog",[14,622,623,624,626,627,630,631,634],{},"To tweak a model's settings, such as hiding it from ",[34,625,234],{}," or changing its rate limits, create ",[34,628,629],{},"~\u002F.slo\u002Fglobal\u002Fmodel_catalog_overrides.json"," (or point ",[34,632,633],{},"SLO_MODEL_CATALOG_OVERRIDES_FILE"," somewhere else):",[26,636,640],{"className":637,"code":638,"language":639,"meta":32,"style":32},"language-json shiki shiki-themes github-dark-high-contrast","[{ \"model_name\": \"gpt-4o\", \"visible_in_picker\": false }]\n","json",[34,641,642],{"__ignoreMap":32},[58,643,644,647,651,654,657,659,662,664,667],{"class":60,"line":61},[58,645,646],{"class":490},"[{ ",[58,648,650],{"class":649},"sKpQp","\"model_name\"",[58,652,653],{"class":490},": ",[58,655,656],{"class":68},"\"gpt-4o\"",[58,658,134],{"class":490},[58,660,661],{"class":649},"\"visible_in_picker\"",[58,663,653],{"class":490},[58,665,666],{"class":72},"false",[58,668,669],{"class":490}," }]\n",[14,671,672],{},"Overrides change existing models. They can't add new ones.",[674,675,676],"style",{},"html pre.shiki code .s_sBn, html code.shiki .s_sBn{--shiki-default:#FFB757}html pre.shiki code .sTRMh, html code.shiki .sTRMh{--shiki-default:#ADDCFF}html pre.shiki code .sCcAr, html code.shiki .sCcAr{--shiki-default:#91CBFF}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 .sWyjQ, html code.shiki .sWyjQ{--shiki-default:#FF9492}html pre.shiki code .sMAXC, html code.shiki .sMAXC{--shiki-default:#F0F3F6}html pre.shiki code .sKpQp, html code.shiki .sKpQp{--shiki-default:#72F088}",{"title":32,"searchDepth":522,"depth":522,"links":678},[679,680,683,684,685,688,689],{"id":20,"depth":522,"text":21},{"id":102,"depth":522,"text":103,"children":681},[682],{"id":239,"depth":528,"text":240},{"id":277,"depth":522,"text":216},{"id":421,"depth":522,"text":422},{"id":465,"depth":522,"text":466,"children":686},[687],{"id":550,"depth":528,"text":551},{"id":598,"depth":522,"text":599},{"id":619,"depth":522,"text":620},"Pick a model, use OpenRouter, set how hard it thinks, and pool several so a rate limit reroutes the work instead of stopping it.","md",{},true,"\u002Fdocs\u002Ffeatures\u002Fmodels",{"title":5,"description":690},"docs\u002Ffeatures\u002Fmodels","Fs2eAejmWBLdECudUkbvw2qNkzOadXLx-o0RRkTux0M",1791641282713]