[{"data":1,"prerenderedAt":1728},["ShallowReactive",2],{"docs-nav":3,"docs-\u002Fdocs\u002Fproviders":78},[4,9,13,16,21,26,30,34,38,42,46,50,53,58,62,66,69,74],{"path":5,"title":6,"navTitle":6,"group":7,"order":8},"\u002Fdocs\u002Fcommands","Other commands","Guide",999,{"path":10,"title":11,"navTitle":12,"group":7,"order":8},"\u002Fdocs\u002Fcompaction","Context and compaction","Context & compaction",{"path":14,"title":15,"navTitle":15,"group":7,"order":8},"\u002Fdocs\u002Fconfiguration","Configuration",{"path":17,"title":18,"navTitle":18,"group":19,"order":20},"\u002Fdocs\u002Fenvironment","Environment variables","Reference",11,{"path":22,"title":23,"navTitle":23,"group":24,"order":25},"\u002Fdocs\u002Fflags","Flag reference","CLI",8,{"path":27,"title":28,"navTitle":28,"group":7,"order":29},"\u002Fdocs","Introduction",1,{"path":31,"title":32,"navTitle":32,"group":7,"order":33},"\u002Fdocs\u002Finstallation","Installation",2,{"path":35,"title":36,"navTitle":36,"group":19,"order":37},"\u002Fdocs\u002Fproviders","Providers",10,{"path":39,"title":40,"navTitle":40,"group":7,"order":41},"\u002Fdocs\u002Fquickstart","Quickstart",3,{"path":43,"title":44,"navTitle":45,"group":7,"order":8},"\u002Fdocs\u002Freleases","Releases and upgrading","Releases",{"path":47,"title":48,"navTitle":49,"group":7,"order":8},"\u002Fdocs\u002Frun","The run command","Running an audit",{"path":51,"title":52,"navTitle":52,"group":7,"order":8},"\u002Fdocs\u002Fsecurity","Security model",{"path":54,"title":55,"navTitle":56,"group":24,"order":57},"\u002Fdocs\u002Fsessions","Sessions and forking","Sessions",6,{"path":59,"title":60,"navTitle":61,"group":7,"order":8},"\u002Fdocs\u002Fskills-roles","Skills and roles","Skills & roles",{"path":63,"title":64,"navTitle":64,"group":19,"order":65},"\u002Fdocs\u002Ftools","Tool reference",12,{"path":67,"title":68,"navTitle":68,"group":7,"order":8},"\u002Fdocs\u002Ftroubleshooting","Troubleshooting",{"path":70,"title":71,"navTitle":72,"group":24,"order":73},"\u002Fdocs\u002Ftui","The interactive TUI","Interactive TUI",9,{"path":75,"title":76,"navTitle":77,"group":7,"order":8},"\u002Fdocs\u002Fweb-eval","Dashboard and evaluation","Dashboard & evaluation",{"id":79,"title":36,"body":80,"description":1722,"extension":1723,"group":19,"meta":1724,"navTitle":36,"navigation":156,"order":37,"path":35,"seo":1725,"stem":1726,"__hash__":1727},"docs\u002Fdocs\u002Fproviders.md",{"type":81,"value":82,"toc":1705},"minimark",[83,87,96,101,194,200,208,245,249,334,346,368,372,377,383,506,516,520,527,784,797,824,832,836,873,882,886,958,961,988,999,1013,1017,1026,1095,1109,1113,1116,1149,1156,1162,1165,1223,1229,1233,1236,1310,1324,1525,1550,1556,1566,1569,1573,1587,1685,1692,1696,1701],[84,85,36],"h1",{"id":86},"providers",[88,89,90,91,95],"p",{},"locac talks to a model over one of four ",[92,93,94],"strong",{},"wire protocols",". A \"provider\" is one of those protocol\nadapters plus a base URL and an API key, which is why pointing locac at a self-hosted vLLM is the\nsame operation as pointing it at Anthropic, only with different values.",[97,98,100],"h2",{"id":99},"two-ways-to-name-a-model","Two ways to name a model",[102,103,108],"pre",{"className":104,"code":105,"language":106,"meta":107,"style":107},"language-bash shiki shiki-themes vitesse-dark","# 1. A built-in provider, by name\nlocac run \"…\" --provider anthropic --model claude-opus-4-8\n\n# 2. Any endpoint, by protocol + URL\nlocac run \"…\" --api openai-completions --base-url https:\u002F\u002Fyour-host\u002Fv1 --model your-model\n","bash","",[109,110,111,119,152,158,164],"code",{"__ignoreMap":107},[112,113,115],"span",{"class":114,"line":29},"line",[112,116,118],{"class":117},"sux-A","# 1. A built-in provider, by name\n",[112,120,121,125,129,133,136,139,143,146,149],{"class":114,"line":33},[112,122,124],{"class":123},"sCK9x","locac",[112,126,128],{"class":127},"s7rlk"," run",[112,130,132],{"class":131},"sNJcY"," \"",[112,134,135],{"class":127},"…",[112,137,138],{"class":131},"\"",[112,140,142],{"class":141},"sXjYR"," --provider",[112,144,145],{"class":127}," anthropic",[112,147,148],{"class":141}," --model",[112,150,151],{"class":127}," claude-opus-4-8\n",[112,153,154],{"class":114,"line":41},[112,155,157],{"emptyLinePlaceholder":156},true,"\n",[112,159,161],{"class":114,"line":160},4,[112,162,163],{"class":117},"# 2. Any endpoint, by protocol + URL\n",[112,165,167,169,171,173,175,177,180,183,186,189,191],{"class":114,"line":166},5,[112,168,124],{"class":123},[112,170,128],{"class":127},[112,172,132],{"class":131},[112,174,135],{"class":127},[112,176,138],{"class":131},[112,178,179],{"class":141}," --api",[112,181,182],{"class":127}," openai-completions",[112,184,185],{"class":141}," --base-url",[112,187,188],{"class":127}," https:\u002F\u002Fyour-host\u002Fv1",[112,190,148],{"class":141},[112,192,193],{"class":127}," your-model\n",[88,195,196,199],{},[109,197,198],{},"--model"," is always required. Give neither form and locac refuses to start:",[102,201,206],{"className":202,"code":204,"language":205,"meta":107},[203],"language-text","Provide either --provider \u003Cname> --model \u003Cid>, or --api \u003Capi> --base-url \u003Curl> --model \u003Cid>.\n","text",[109,207,204],{"__ignoreMap":107},[88,209,210,211,214,215,218,219,222,223,218,226,229,230,232,233,236,237,240,241,244],{},"The same two shapes exist in ",[109,212,213],{},"~\u002F.locac\u002Fconfig.json"," as ",[109,216,217],{},"provider"," + ",[109,220,221],{},"model",", or ",[109,224,225],{},"api",[109,227,228],{},"baseUrl"," +\n",[109,231,221],{},". A third form, ",[109,234,235],{},"customProvider",", names a saved endpoint from the config's ",[109,238,239],{},"providers[]","\narray, which expands to the second form before resolution. See\n",[242,243,15],"a",{"href":14},".",[97,246,248],{"id":247},"wire-protocols","Wire protocols",[250,251,252,271],"table",{},[253,254,255],"thead",{},[256,257,258,265,268],"tr",{},[259,260,261,264],"th",{},[109,262,263],{},"--api"," value",[259,266,267],{},"Request shape",[259,269,270],{},"Notes",[272,273,274,288,305,321],"tbody",{},[256,275,276,282,285],{},[277,278,279],"td",{},[109,280,281],{},"anthropic-messages",[277,283,284],{},"Anthropic Messages",[277,286,287],{},"Auth style is selectable; see below",[256,289,290,295,298],{},[277,291,292],{},[109,293,294],{},"openai-completions",[277,296,297],{},"OpenAI Chat Completions",[277,299,300,301,304],{},"The adapter appends ",[109,302,303],{},"\u002Fchat\u002Fcompletions"," to your base URL",[256,306,307,312,315],{},[277,308,309],{},[109,310,311],{},"openai-responses",[277,313,314],{},"OpenAI Responses",[277,316,317,318],{},"Carries a reasoning budget as ",[109,319,320],{},"reasoning.effort",[256,322,323,328,331],{},[277,324,325],{},[109,326,327],{},"ollama-chat",[277,329,330],{},"Ollama chat",[277,332,333],{},"Local, no API key",[88,335,336,341,342,345],{},[92,337,338,340],{},[109,339,281],{}," is not Claude-only."," Amazon Bedrock, Google Vertex, z.ai, DeepSeek, Moonshot\nand any local server exposing ",[109,343,344],{},"\u002Fv1\u002Fmessages"," speak it too.",[88,347,348,353,354,357,358,361,362,365,366,244],{},[92,349,350,352],{},[109,351,294],{}," base URLs must include the version segment"," the server expects (",[109,355,356],{},"\u002Fv1",",\n",[109,359,360],{},"\u002Fopenai\u002Fv1",", ",[109,363,364],{},"\u002Fapi\u002Fv1","), because the adapter appends only ",[109,367,303],{},[97,369,371],{"id":370},"built-in-providers","Built-in providers",[373,374,376],"h3",{"id":375},"anthropic-compatible","Anthropic-compatible",[88,378,379,380,244],{},"All auth with a bearer token except native Anthropic, which uses ",[109,381,382],{},"x-api-key",[250,384,385,406],{},[253,386,387],{},[256,388,389,394,397,400,403],{},[259,390,391],{},[109,392,393],{},"--provider",[259,395,396],{},"Default base URL",[259,398,399],{},"Base-URL override",[259,401,402],{},"API key",[259,404,405],{},"Context",[272,407,408,433,458,482],{},[256,409,410,415,420,425,430],{},[277,411,412],{},[109,413,414],{},"anthropic",[277,416,417],{},[109,418,419],{},"https:\u002F\u002Fapi.anthropic.com",[277,421,422],{},[109,423,424],{},"ANTHROPIC_BASE_URL",[277,426,427],{},[109,428,429],{},"ANTHROPIC_API_KEY",[277,431,432],{},"200,000",[256,434,435,440,445,450,455],{},[277,436,437],{},[109,438,439],{},"zai",[277,441,442],{},[109,443,444],{},"https:\u002F\u002Fapi.z.ai\u002Fapi\u002Fanthropic",[277,446,447],{},[109,448,449],{},"ZAI_BASE_URL",[277,451,452],{},[109,453,454],{},"ZAI_API_KEY",[277,456,457],{},"128,000",[256,459,460,465,470,475,480],{},[277,461,462],{},[109,463,464],{},"deepseek",[277,466,467],{},[109,468,469],{},"https:\u002F\u002Fapi.deepseek.com\u002Fanthropic",[277,471,472],{},[109,473,474],{},"DEEPSEEK_BASE_URL",[277,476,477],{},[109,478,479],{},"DEEPSEEK_API_KEY",[277,481,457],{},[256,483,484,489,494,499,504],{},[277,485,486],{},[109,487,488],{},"moonshot",[277,490,491],{},[109,492,493],{},"https:\u002F\u002Fapi.moonshot.ai\u002Fanthropic",[277,495,496],{},[109,497,498],{},"MOONSHOT_BASE_URL",[277,500,501],{},[109,502,503],{},"MOONSHOT_API_KEY",[277,505,457],{},[88,507,508,509,511,512,515],{},"The three non-Anthropic vendors are pinned to ",[92,510,457],{}," rather than inheriting the 200,000\ndefault, and the direction of that error is deliberate. Claiming a window a model does not have is\nthe one mistake that kills a run outright: compaction believes it has tens of thousands of tokens of\nheadroom, never fires, and the provider rejects the request. 128k is the floor across each vendor's\ncurrent lineup. Under-claiming costs only some early elision, and if your model is bigger you can raise it\nper-model with the config's ",[109,513,514],{},"models{}"," map.",[373,517,519],{"id":518},"openai-compatible","OpenAI-compatible",[88,521,522,523,526],{},"All use ",[109,524,525],{},"Authorization: Bearer","; there is no auth-scheme knob for this protocol.",[250,528,529,543],{},[253,530,531],{},[256,532,533,537,539,541],{},[259,534,535],{},[109,536,393],{},[259,538,396],{},[259,540,399],{},[259,542,402],{},[272,544,545,567,589,611,633,655,676,697,718,740,762],{},[256,546,547,552,557,562],{},[277,548,549],{},[109,550,551],{},"openai",[277,553,554],{},[109,555,556],{},"https:\u002F\u002Fapi.openai.com\u002Fv1",[277,558,559],{},[109,560,561],{},"OPENAI_BASE_URL",[277,563,564],{},[109,565,566],{},"OPENAI_API_KEY",[256,568,569,574,579,584],{},[277,570,571],{},[109,572,573],{},"groq",[277,575,576],{},[109,577,578],{},"https:\u002F\u002Fapi.groq.com\u002Fopenai\u002Fv1",[277,580,581],{},[109,582,583],{},"GROQ_BASE_URL",[277,585,586],{},[109,587,588],{},"GROQ_API_KEY",[256,590,591,596,601,606],{},[277,592,593],{},[109,594,595],{},"openrouter",[277,597,598],{},[109,599,600],{},"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1",[277,602,603],{},[109,604,605],{},"OPENROUTER_BASE_URL",[277,607,608],{},[109,609,610],{},"OPENROUTER_API_KEY",[256,612,613,618,623,628],{},[277,614,615],{},[109,616,617],{},"together",[277,619,620],{},[109,621,622],{},"https:\u002F\u002Fapi.together.xyz\u002Fv1",[277,624,625],{},[109,626,627],{},"TOGETHER_BASE_URL",[277,629,630],{},[109,631,632],{},"TOGETHER_API_KEY",[256,634,635,640,645,650],{},[277,636,637],{},[109,638,639],{},"xai",[277,641,642],{},[109,643,644],{},"https:\u002F\u002Fapi.x.ai\u002Fv1",[277,646,647],{},[109,648,649],{},"XAI_BASE_URL",[277,651,652],{},[109,653,654],{},"XAI_API_KEY",[256,656,657,662,667,672],{},[277,658,659],{},[109,660,661],{},"deepseek-openai",[277,663,664],{},[109,665,666],{},"https:\u002F\u002Fapi.deepseek.com\u002Fv1",[277,668,669],{},[109,670,671],{},"DEEPSEEK_OPENAI_BASE_URL",[277,673,674],{},[109,675,479],{},[256,677,678,683,688,693],{},[277,679,680],{},[109,681,682],{},"moonshot-openai",[277,684,685],{},[109,686,687],{},"https:\u002F\u002Fapi.moonshot.ai\u002Fv1",[277,689,690],{},[109,691,692],{},"MOONSHOT_OPENAI_BASE_URL",[277,694,695],{},[109,696,503],{},[256,698,699,704,709,714],{},[277,700,701],{},[109,702,703],{},"moonshot-openai-cn",[277,705,706],{},[109,707,708],{},"https:\u002F\u002Fapi.moonshot.cn\u002Fv1",[277,710,711],{},[109,712,713],{},"MOONSHOT_OPENAI_CN_BASE_URL",[277,715,716],{},[109,717,503],{},[256,719,720,725,730,735],{},[277,721,722],{},[109,723,724],{},"vllm",[277,726,727],{},[109,728,729],{},"http:\u002F\u002Flocalhost:8000\u002Fv1",[277,731,732],{},[109,733,734],{},"VLLM_BASE_URL",[277,736,737],{},[109,738,739],{},"VLLM_API_KEY",[256,741,742,747,752,757],{},[277,743,744],{},[109,745,746],{},"lmstudio",[277,748,749],{},[109,750,751],{},"http:\u002F\u002Flocalhost:1234\u002Fv1",[277,753,754],{},[109,755,756],{},"LMSTUDIO_BASE_URL",[277,758,759],{},[109,760,761],{},"LMSTUDIO_API_KEY",[256,763,764,769,774,779],{},[277,765,766],{},[109,767,768],{},"ollama-openai",[277,770,771],{},[109,772,773],{},"http:\u002F\u002Flocalhost:11434\u002Fv1",[277,775,776],{},[109,777,778],{},"OLLAMA_OPENAI_BASE_URL",[277,780,781],{},[109,782,783],{},"OLLAMA_API_KEY",[88,785,786,787,789,790,793,794,244],{},"Defaults for this family: context window ",[92,788,457],{},", output cap ",[92,791,792],{},"8,192",", reasoning ",[92,795,796],{},"off",[88,798,799,800,361,803,806,807,810,811,814,815,819,820,823],{},"The three local servers carry a placeholder key (",[109,801,802],{},"local",[109,804,805],{},"lm-studio"," and ",[109,808,809],{},"ollama"," respectively)\nused when their ",[109,812,813],{},"*_API_KEY"," variable is unset. They accept any value, but some of them return 400 on\na ",[816,817,818],"em",{},"missing"," ",[109,821,822],{},"Authorization"," header, so locac always sends one.",[88,825,826,827,829,830,244],{},"Note that DeepSeek and Moonshot appear twice. Each vendor exposes both an Anthropic-shaped and an\nOpenAI-shaped endpoint; pick whichever protocol you prefer. Both read the same ",[109,828,479],{}," \u002F\n",[109,831,503],{},[373,833,835],{"id":834},"ollama-native","Ollama (native)",[250,837,838,852],{},[253,839,840],{},[256,841,842,846,848,850],{},[259,843,844],{},[109,845,393],{},[259,847,396],{},[259,849,399],{},[259,851,402],{},[272,853,854],{},[256,855,856,860,865,870],{},[277,857,858],{},[109,859,809],{},[277,861,862],{},[109,863,864],{},"http:\u002F\u002Flocalhost:11434",[277,866,867],{},[109,868,869],{},"OLLAMA_HOST",[277,871,872],{},"none",[88,874,875,876,878,879,881],{},"Context window 8,192, output cap 2,048, cost zero. This is the native ",[109,877,327],{}," protocol; the\n",[109,880,768],{}," row above is the same server through its OpenAI-compatible surface.",[97,883,885],{"id":884},"authentication","Authentication",[250,887,888,901],{},[253,889,890],{},[256,891,892,895,898],{},[259,893,894],{},"Protocol",[259,896,897],{},"Header",[259,899,900],{},"Configurable",[272,902,903,921,934,947],{},[256,904,905,909,916],{},[277,906,907],{},[109,908,281],{},[277,910,911,913,914],{},[109,912,382],{}," (default) or ",[109,915,525],{},[277,917,918],{},[109,919,920],{},"--auth-scheme x-api-key|bearer",[256,922,923,927,931],{},[277,924,925],{},[109,926,294],{},[277,928,929],{},[109,930,525],{},[277,932,933],{},"No. Uniform across every server",[256,935,936,940,944],{},[277,937,938],{},[109,939,311],{},[277,941,942],{},[109,943,525],{},[277,945,946],{},"No",[256,948,949,953,955],{},[277,950,951],{},[109,952,327],{},[277,954,872],{},[277,956,957],{},"n\u002Fa",[88,959,960],{},"Key resolution, highest precedence first:",[962,963,964,971,985],"ol",{},[965,966,967,970],"li",{},[109,968,969],{},"--api-key"," on the command line",[965,972,973,976,977,980,981,984],{},[109,974,975],{},"apiKey"," in the config file, either literal or a ",[109,978,979],{},"\"$VAR\""," \u002F ",[109,982,983],{},"\"${VAR}\""," reference expanded at run time",[965,986,987],{},"The provider's own environment variable from the tables above",[88,989,990,991,994,995,998],{},"An unset ",[109,992,993],{},"$VAR"," reference resolves to ",[816,996,997],{},"nothing"," rather than to an empty string, so the run fails\nloudly instead of sending a blank credential.",[1000,1001,1002],"blockquote",{},[88,1003,1004,1005,1008,1009,1012],{},"The key is never written to a finding, a transcript, a session record or a log, and never reaches\nthe dashboard; the web UI is handed the placeholder ",[109,1006,1007],{},"•••• redacted ••••"," instead. The one place it\ndoes appear is ",[109,1010,1011],{},"locac config show",", which prints the effective configuration including a literal\nkey. Do not paste that output anywhere.",[97,1014,1016],{"id":1015},"output-token-field","Output-token field",[88,1018,1019,1021,1022,1025],{},[109,1020,294],{}," servers disagree about which field caps output. OpenAI's o-series and GPT-5.x\nreject ",[109,1023,1024],{},"max_tokens"," outright, while most other servers implement only that one. locac resolves it\nlike this:",[250,1027,1028,1038],{},[253,1029,1030],{},[256,1031,1032,1035],{},[259,1033,1034],{},"Model",[259,1036,1037],{},"Field sent",[272,1039,1040,1054,1065,1082],{},[256,1041,1042,1048],{},[277,1043,1044,1045,1047],{},"The built-in ",[109,1046,551],{}," provider",[277,1049,1050,1053],{},[109,1051,1052],{},"max_completion_tokens"," (pinned)",[256,1055,1056,1061],{},[277,1057,1058,1059,1047],{},"Every other built-in ",[109,1060,294],{},[277,1062,1063],{},[109,1064,1024],{},[256,1066,1067,1074],{},[277,1068,1069,1070,1073],{},"A custom ",[109,1071,1072],{},"--api openai-completions"," endpoint",[277,1075,1076,1078,1079],{},[109,1077,1052],{},", because a custom model defaults to ",[109,1080,1081],{},"reasoning: true",[256,1083,1084,1091],{},[277,1085,1086,1087,1090],{},"…with ",[109,1088,1089],{},"reasoning: false"," in its config entry",[277,1092,1093],{},[109,1094,1024],{},[88,1096,1097,1098,1101,1102,1104,1105,1108],{},"So the ",[109,1099,1100],{},"reasoning"," flag on a custom model is the switch: it says \"this is a reasoning model\", and\nits only effect is choosing between the two output-cap fields. If your self-hosted server rejects\n",[109,1103,1052],{},", set ",[109,1106,1107],{},"\"reasoning\": false"," on that model.",[97,1110,1112],{"id":1111},"reasoning-effort","Reasoning effort",[88,1114,1115],{},"Only two adapters carry a reasoning budget:",[250,1117,1118,1126],{},[253,1119,1120],{},[256,1121,1122,1124],{},[259,1123,894],{},[259,1125,1037],{},[272,1127,1128,1139],{},[256,1129,1130,1134],{},[277,1131,1132],{},[109,1133,294],{},[277,1135,1136],{},[109,1137,1138],{},"reasoning_effort",[256,1140,1141,1145],{},[277,1142,1143],{},[109,1144,311],{},[277,1146,1147],{},[109,1148,320],{},[88,1150,1151,361,1153,1155],{},[109,1152,281],{},[109,1154,327],{}," and anything added later carry no such field, so setting a level\nagainst them is refused rather than silently dropped:",[102,1157,1160],{"className":1158,"code":1159,"language":205,"meta":107},[203],"locac: reasoning effort \"high\" ignored — anthropic-messages does not carry a reasoning budget.\n",[109,1161,1159],{"__ignoreMap":107},[88,1163,1164],{},"Two vocabularies exist, on purpose:",[1166,1167,1168,1194],"ul",{},[965,1169,1170,1189,1190,1193],{},[92,1171,1172,1175,1176,1179,1180,361,1183,361,1186,244],{},[109,1173,1174],{},"--effort"," and the TUI's ",[109,1177,1178],{},"\u002Feffort"," menu offer exactly ",[109,1181,1182],{},"low",[109,1184,1185],{},"medium",[109,1187,1188],{},"high"," A picker has to\nproduce a value that lands on whatever endpoint happens to be configured, and those three are what\nevery OpenAI-compatible server implements. Offering ",[109,1191,1192],{},"xhigh"," would promise a level that 400s on\nvLLM, LM Studio, Groq, OpenRouter and Together.",[965,1195,1196,1206,1207,1210,1211,361,1214,806,1216,1219,1220,1222],{},[92,1197,1198,1201,1202,1205],{},[109,1199,1200],{},"reasoningEffort"," in ",[109,1203,1204],{},"config.json"," accepts any lowercase token"," matching\n",[109,1208,1209],{},"^[a-z][a-z0-9-]{0,15}$",", so ",[109,1212,1213],{},"minimal",[109,1215,1192],{},[109,1217,1218],{},"max"," all pass. There you are naming one endpoint you built\nand understand, so your own file is the authority. The charset is narrow because that string lands\nin the TUI footer (where a control byte garbles the frame), back into ",[109,1221,1204],{},", and on the\nwire.",[88,1224,1225,1226,1228],{},"A level that arrived from the config still shows up as a row in the ",[109,1227,1178],{}," menu, so the picker\ncan never contradict the badge drawn above it.",[97,1230,1232],{"id":1231},"custom-endpoints","Custom endpoints",[88,1234,1235],{},"Anything that speaks one of the four protocols works. On the command line:",[102,1237,1239],{"className":104,"code":1238,"language":106,"meta":107,"style":107},"locac run \"…\" \\\n  --api openai-completions \\\n  --base-url http:\u002F\u002F10.0.0.7:8000\u002Fv1 \\\n  --api-key '$MY_LAB_KEY' \\\n  --model qwen3-coder-480b \\\n  --context-window 262144\n",[109,1240,1241,1256,1265,1275,1291,1301],{"__ignoreMap":107},[112,1242,1243,1245,1247,1249,1251,1253],{"class":114,"line":29},[112,1244,124],{"class":123},[112,1246,128],{"class":127},[112,1248,132],{"class":131},[112,1250,135],{"class":127},[112,1252,138],{"class":131},[112,1254,1255],{"class":141}," \\\n",[112,1257,1258,1261,1263],{"class":114,"line":33},[112,1259,1260],{"class":141},"  --api",[112,1262,182],{"class":127},[112,1264,1255],{"class":141},[112,1266,1267,1270,1273],{"class":114,"line":41},[112,1268,1269],{"class":141},"  --base-url",[112,1271,1272],{"class":127}," http:\u002F\u002F10.0.0.7:8000\u002Fv1",[112,1274,1255],{"class":141},[112,1276,1277,1280,1283,1286,1289],{"class":114,"line":160},[112,1278,1279],{"class":141},"  --api-key",[112,1281,1282],{"class":131}," '",[112,1284,1285],{"class":127},"$MY_LAB_KEY",[112,1287,1288],{"class":131},"'",[112,1290,1255],{"class":141},[112,1292,1293,1296,1299],{"class":114,"line":166},[112,1294,1295],{"class":141},"  --model",[112,1297,1298],{"class":127}," qwen3-coder-480b",[112,1300,1255],{"class":141},[112,1302,1303,1306],{"class":114,"line":57},[112,1304,1305],{"class":141},"  --context-window",[112,1307,1309],{"class":1308},"sxA9i"," 262144\n",[88,1311,1312,1313,1315,1316,1319,1320,1323],{},"Saved in ",[109,1314,213],{}," as a named provider, selectable with ",[109,1317,1318],{},"--custom-provider"," or from the\nTUI's ",[109,1321,1322],{},"\u002Fmodel"," menu:",[102,1325,1329],{"className":1326,"code":1327,"language":1328,"meta":107,"style":107},"language-json shiki shiki-themes vitesse-dark","{\n  \"providers\": [\n    {\n      \"name\": \"lab-vllm\",\n      \"api\": \"openai-completions\",\n      \"baseUrl\": \"http:\u002F\u002F10.0.0.7:8000\u002Fv1\",\n      \"apiKey\": \"$MY_LAB_KEY\",\n      \"models\": [\n        { \"id\": \"qwen3-coder-480b\", \"contextWindow\": 262144, \"reasoningEffort\": \"xhigh\" }\n      ]\n    }\n  ]\n}\n","json",[109,1330,1331,1337,1354,1359,1380,1398,1417,1436,1449,1504,1509,1514,1519],{"__ignoreMap":107},[112,1332,1333],{"class":114,"line":29},[112,1334,1336],{"class":1335},"s_pn2","{\n",[112,1338,1339,1343,1346,1348,1351],{"class":114,"line":33},[112,1340,1342],{"class":1341},"s6USN","  \"",[112,1344,86],{"class":1345},"sm68I",[112,1347,138],{"class":1341},[112,1349,1350],{"class":1335},":",[112,1352,1353],{"class":1335}," [\n",[112,1355,1356],{"class":114,"line":41},[112,1357,1358],{"class":1335},"    {\n",[112,1360,1361,1364,1367,1369,1371,1373,1376,1378],{"class":114,"line":160},[112,1362,1363],{"class":1341},"      \"",[112,1365,1366],{"class":1345},"name",[112,1368,138],{"class":1341},[112,1370,1350],{"class":1335},[112,1372,132],{"class":131},[112,1374,1375],{"class":127},"lab-vllm",[112,1377,138],{"class":131},[112,1379,357],{"class":1335},[112,1381,1382,1384,1386,1388,1390,1392,1394,1396],{"class":114,"line":166},[112,1383,1363],{"class":1341},[112,1385,225],{"class":1345},[112,1387,138],{"class":1341},[112,1389,1350],{"class":1335},[112,1391,132],{"class":131},[112,1393,294],{"class":127},[112,1395,138],{"class":131},[112,1397,357],{"class":1335},[112,1399,1400,1402,1404,1406,1408,1410,1413,1415],{"class":114,"line":57},[112,1401,1363],{"class":1341},[112,1403,228],{"class":1345},[112,1405,138],{"class":1341},[112,1407,1350],{"class":1335},[112,1409,132],{"class":131},[112,1411,1412],{"class":127},"http:\u002F\u002F10.0.0.7:8000\u002Fv1",[112,1414,138],{"class":131},[112,1416,357],{"class":1335},[112,1418,1420,1422,1424,1426,1428,1430,1432,1434],{"class":114,"line":1419},7,[112,1421,1363],{"class":1341},[112,1423,975],{"class":1345},[112,1425,138],{"class":1341},[112,1427,1350],{"class":1335},[112,1429,132],{"class":131},[112,1431,1285],{"class":127},[112,1433,138],{"class":131},[112,1435,357],{"class":1335},[112,1437,1438,1440,1443,1445,1447],{"class":114,"line":25},[112,1439,1363],{"class":1341},[112,1441,1442],{"class":1345},"models",[112,1444,138],{"class":1341},[112,1446,1350],{"class":1335},[112,1448,1353],{"class":1335},[112,1450,1451,1454,1456,1459,1461,1463,1465,1468,1470,1473,1475,1478,1480,1482,1485,1487,1489,1491,1493,1495,1497,1499,1501],{"class":114,"line":73},[112,1452,1453],{"class":1335},"        {",[112,1455,132],{"class":1341},[112,1457,1458],{"class":1345},"id",[112,1460,138],{"class":1341},[112,1462,1350],{"class":1335},[112,1464,132],{"class":131},[112,1466,1467],{"class":127},"qwen3-coder-480b",[112,1469,138],{"class":131},[112,1471,1472],{"class":1335},",",[112,1474,132],{"class":1341},[112,1476,1477],{"class":1345},"contextWindow",[112,1479,138],{"class":1341},[112,1481,1350],{"class":1335},[112,1483,1484],{"class":1308}," 262144",[112,1486,1472],{"class":1335},[112,1488,132],{"class":1341},[112,1490,1200],{"class":1345},[112,1492,138],{"class":1341},[112,1494,1350],{"class":1335},[112,1496,132],{"class":131},[112,1498,1192],{"class":127},[112,1500,138],{"class":131},[112,1502,1503],{"class":1335}," }\n",[112,1505,1506],{"class":114,"line":37},[112,1507,1508],{"class":1335},"      ]\n",[112,1510,1511],{"class":114,"line":20},[112,1512,1513],{"class":1335},"    }\n",[112,1515,1516],{"class":114,"line":65},[112,1517,1518],{"class":1335},"  ]\n",[112,1520,1522],{"class":114,"line":1521},13,[112,1523,1524],{"class":1335},"}\n",[88,1526,1527,1528,218,1530,1533,1534,1536,1537,793,1539,1542,1543,1546,1547,1549],{},"Defaults applied to a fully custom ",[109,1529,263],{},[109,1531,1532],{},"--base-url"," model: context window ",[92,1535,432],{},", output\ncap ",[92,1538,792],{},[92,1540,1541],{},"on",", cost ",[92,1544,1545],{},"zero",". Set ",[109,1548,1477],{}," per model, because it drives compaction\npressure, and it is the one value locac cannot infer for an endpoint it has never seen.",[373,1551,1553],{"id":1552},"finishreasonoptional",[109,1554,1555],{},"finishReasonOptional",[88,1557,1558,1559,1562,1563,1565],{},"Some proxies never send ",[109,1560,1561],{},"finish_reason",". locac normally reads its absence as a truncated stream and\nretries, which against such an endpoint means retrying every turn. Setting ",[109,1564,1555],{},"\non a custom model turns that detection off for it.",[88,1567,1568],{},"Only set it if the endpoint genuinely never sends the field. It is the signal that catches a proxy\nsilently cutting off a long reasoning turn, and turning it off costs you that.",[97,1570,1572],{"id":1571},"cost-accounting","Cost accounting",[88,1574,1575,1576,1578,1579,1582,1583,1586],{},"Every built-in provider ships with ",[92,1577,1545],{}," cost rates, so the footer's ",[109,1580,1581],{},"$"," segment stays hidden\nuntil you supply real numbers. Rates are per ",[92,1584,1585],{},"million"," tokens, in a custom provider's model entry:",[102,1588,1590],{"className":1326,"code":1589,"language":1328,"meta":107,"style":107},"{ \"id\": \"your-model\", \"cost\": { \"input\": 3, \"output\": 15, \"cacheRead\": 0.3, \"cacheWrite\": 3.75 } }\n",[109,1591,1592],{"__ignoreMap":107},[112,1593,1594,1597,1599,1601,1603,1605,1607,1610,1612,1614,1616,1619,1621,1623,1626,1628,1631,1633,1635,1638,1640,1642,1645,1647,1649,1652,1654,1656,1659,1661,1663,1666,1668,1670,1673,1675,1677,1680,1683],{"class":114,"line":29},[112,1595,1596],{"class":1335},"{",[112,1598,132],{"class":1341},[112,1600,1458],{"class":1345},[112,1602,138],{"class":1341},[112,1604,1350],{"class":1335},[112,1606,132],{"class":131},[112,1608,1609],{"class":127},"your-model",[112,1611,138],{"class":131},[112,1613,1472],{"class":1335},[112,1615,132],{"class":1341},[112,1617,1618],{"class":1345},"cost",[112,1620,138],{"class":1341},[112,1622,1350],{"class":1335},[112,1624,1625],{"class":1335}," {",[112,1627,132],{"class":1341},[112,1629,1630],{"class":1345},"input",[112,1632,138],{"class":1341},[112,1634,1350],{"class":1335},[112,1636,1637],{"class":1308}," 3",[112,1639,1472],{"class":1335},[112,1641,132],{"class":1341},[112,1643,1644],{"class":1345},"output",[112,1646,138],{"class":1341},[112,1648,1350],{"class":1335},[112,1650,1651],{"class":1308}," 15",[112,1653,1472],{"class":1335},[112,1655,132],{"class":1341},[112,1657,1658],{"class":1345},"cacheRead",[112,1660,138],{"class":1341},[112,1662,1350],{"class":1335},[112,1664,1665],{"class":1308}," 0.3",[112,1667,1472],{"class":1335},[112,1669,132],{"class":1341},[112,1671,1672],{"class":1345},"cacheWrite",[112,1674,138],{"class":1341},[112,1676,1350],{"class":1335},[112,1678,1679],{"class":1308}," 3.75",[112,1681,1682],{"class":1335}," }",[112,1684,1503],{"class":1335},[88,1686,1687,1688,1691],{},"Cost is reported, never acted on: no budget is denominated in dollars, and ",[109,1689,1690],{},"locac eval ab"," reports\neach arm's token cost but never scores it.",[97,1693,1695],{"id":1694},"next","Next",[88,1697,1698,1700],{},[242,1699,18],{"href":17}," lists every variable named above, plus the ones that\ncontrol the shell, the editor and colour output.",[1702,1703,1704],"style",{},"html pre.shiki code .sux-A, html code.shiki .sux-A{--shiki-default:#758575DD}html pre.shiki code .sCK9x, html code.shiki .sCK9x{--shiki-default:#80A665}html pre.shiki code .s7rlk, html code.shiki .s7rlk{--shiki-default:#C98A7D}html pre.shiki code .sNJcY, html code.shiki .sNJcY{--shiki-default:#C98A7D77}html pre.shiki code .sXjYR, html code.shiki .sXjYR{--shiki-default:#C99076}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 .sxA9i, html code.shiki .sxA9i{--shiki-default:#4C9A91}html pre.shiki code .s_pn2, html code.shiki .s_pn2{--shiki-default:#666666}html pre.shiki code .s6USN, html code.shiki .s6USN{--shiki-default:#B8A96577}html pre.shiki code .sm68I, html code.shiki .sm68I{--shiki-default:#B8A965}",{"title":107,"searchDepth":41,"depth":41,"links":1706},[1707,1708,1709,1714,1715,1716,1717,1720,1721],{"id":99,"depth":33,"text":100},{"id":247,"depth":33,"text":248},{"id":370,"depth":33,"text":371,"children":1710},[1711,1712,1713],{"id":375,"depth":41,"text":376},{"id":518,"depth":41,"text":519},{"id":834,"depth":41,"text":835},{"id":884,"depth":33,"text":885},{"id":1015,"depth":33,"text":1016},{"id":1111,"depth":33,"text":1112},{"id":1231,"depth":33,"text":1232,"children":1718},[1719],{"id":1552,"depth":41,"text":1555},{"id":1571,"depth":33,"text":1572},{"id":1694,"depth":33,"text":1695},"Every built-in provider with its base URL, API-key variable and auth scheme, the four wire protocols, and how to point locac at any endpoint that speaks one of them.","md",{},{"title":36,"description":1722},"docs\u002Fproviders","abDb7TBO8P1eBzQGimqcaowaV0Vy8ANfJU402Pir0Jo",1786794387761]