PageSourceSearch

https://doc.routerly.ai/assets/js/a75f291f.41253559.js

js routerly.ai collected 2026-10-05 14:50:54 UTC 15,931 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkwebsite=globalThis.webpackChunkwebsite||[]).push([[6596],{2325(e,n,i){i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>t,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"dashboard/models","title":"Models","description":"The Models page lets you register, edit, clone, and remove LLM models. All models registered here become available for use in project routing configurations.","source":"@site/../docs/dashboard/models.md","sourceDirName":"dashboard","slug":"/dashboard/models","permalink":"/next/dashboard/models","draft":false,"unlisted":false,"editUrl":"https://github.com/Inebrio/Routerly/edit/main/../docs/dashboard/models.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Models","sidebar_position":3},"sidebar":"docsSidebar","previous":{"title":"Overview","permalink":"/next/dashboard/overview"},"next":{"title":"Projects","permalink":"/next/dashboard/projects"}}');var r=i(4848),d=i(8453);const l={title:"Models",sidebar_position:3},t="Dashboard: Models",o={},c=[{value:"Model List",id:"model-list",level:2},{value:"Filtering and Search",id:"filtering-and-search",level:3},{value:"Model List Columns",id:"model-list-columns",level:3},{value:"Adding a Model",id:"adding-a-model",level:3},{value:"Editing a Model",id:"editing-a-model",level:3},{value:"Catalog Tracking and Field Overrides",id:"catalog-tracking-and-field-overrides",level:4},{value:"Cloning a Model",id:"cloning-a-model",level:3},{value:"Disabling a Model",id:"disabling-a-model",level:3},{value:"Removing a Model",id:"removing-a-model",level:3},{value:"Model Discovery",id:"model-discovery",level:2}];function a(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"dashboard-models",children:"Dashboard: Models"})}),"\n",(0,r.jsx)(n.p,{children:"The Models page lets you register, edit, clone, and remove LLM models. All models registered here become available for use in project routing configurations."}),"\n",(0,r.jsx)(n.p,{children:"Health status is shown inline in the same table as configuration -- no separate tab is needed."}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h2,{id:"model-list",children:"Model List"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"Models page with provider filter, search, and merged config + health columns",src:i(5180).A+"",width:"1800",height:"987"})}),"\n",(0,r.jsx)(n.h3,{id:"filtering-and-search",children:"Filtering and Search"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Provider filter"})," -- dropdown to show models for a single provider (OpenAI, Anthropic, Ollama, etc.) or all providers."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Search"})," -- text search by model ID, filtered live as you type."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Results are paginated at 20 models per page."}),"\n",(0,r.jsx)(n.h3,{id:"model-list-columns",children:"Model List Columns"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Column"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"ID"})}),(0,r.jsx)(n.td,{children:"Provider model identifier"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Provider"})}),(0,r.jsx)(n.td,{children:"Provider badge"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Endpoint"})}),(0,r.jsx)(n.td,{children:"Base URL used for this model"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Input $/1M"})}),(0,r.jsx)(n.td,{children:"Input token price in USD"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Output $/1M"})}),(0,r.jsx)(n.td,{children:"Output token price in USD"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Cache $/1M"})}),(0,r.jsx)(n.td,{children:"Cache read price (if applicable)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Context Size"})}),(0,r.jsx)(n.td,{children:"Maximum context window tokens"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Status"})}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"Healthy"}),", ",(0,r.jsx)(n.code,{children:"Unavailable"})," -- based on recent error rate. Shows a neutral badge when no traffic has been recorded yet"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Error Rate (5M)"})}),(0,r.jsx)(n.td,{children:"Percentage of failed requests in the last 5 minutes"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"P95 Latency (5M)"})}),(0,r.jsx)(n.td,{children:"95th-percentile response time in the last 5 minutes"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Requests (1H)"})}),(0,r.jsx)(n.td,{children:"Total requests in the last hour"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Last Success"})}),(0,r.jsx)(n.td,{children:"Time of the most recent successful request"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Cooldown"})}),(0,r.jsx)(n.td,{children:"Remaining cooldown if the model triggered rate-limiting"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Health columns show a dash when no data is available for the window. The health data refreshes automatically every 30 seconds (visible in the subtitle bar)."}),"\n",(0,r.jsx)(n.p,{children:"Click any column header to sort."}),"\n",(0,r.jsx)(n.admonition,{title:"Redirected from /dashboard/health",type:"note",children:(0,r.jsxs)(n.p,{children:["The standalone Provider Health page has been merged into this page. ",(0,r.jsx)(n.code,{children:"/dashboard/health"})," redirects to ",(0,r.jsx)(n.code,{children:"/dashboard/models"}),"."]})}),"\n",(0,r.jsx)(n.h3,{id:"adding-a-model",children:"Adding a Model"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"+ Add Model"})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Fill in the form:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Model ID"})," -- the identifier sent to the provider (e.g. ",(0,r.jsx)(n.code,{children:"gpt-5-mini"}),")"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Provider"})," -- select from the dropdown"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"API Key"})," -- encrypted at rest; leave blank for Ollama / custom models without auth"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Base URL"})," -- optional override (useful for proxies or self-hosted models)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Context Window"})," -- pre-filled for known models"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Pricing"})," -- input/output/cache prices per 1M tokens; pre-filled for known models"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Pricing Tiers"})," -- add a tier for long-context pricing (e.g. Anthropic above 200k tokens)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Capabilities"})," -- check all that apply"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{title:"Adding from the catalog",type:"tip",children:(0,r.jsxs)(n.p,{children:["Use the ",(0,r.jsx)(n.strong,{children:"Model Discovery"})," page (navigate to ",(0,r.jsx)(n.strong,{children:"Models"}),", then click ",(0,r.jsx)(n.strong,{children:"Discover"}),") to browse the built-in catalog. Clicking ",(0,r.jsx)(n.strong,{children:"Add"})," next to any entry opens the new-model form with the ",(0,r.jsx)(n.strong,{children:"Provider"})," and ",(0,r.jsx)(n.strong,{children:"Model ID"})," already filled in, and pre-populates pricing and context window from the catalog entry. You only need to supply the API key."]})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"Add Model form opened from the catalog, with Provider and Model Preset pre-filled for gpt-4o and pricing auto-populated in the Pricing &amp; Context section",src:i(3506).A+"",width:"1800",height:"987"})}),"\n",(0,r.jsx)(n.h3,{id:"editing-a-model",children:"Editing a Model"}),"\n",(0,r.jsxs)(n.p,{children:["Click the ",(0,r.jsx)(n.strong,{children:"Edit"})," (pencil) icon next to a model. All fields except the Model ID are editable."]}),"\n",(0,r.jsx)(n.p,{children:"To update the API key, enter a new value -- Routerly re-encrypts it immediately."}),"\n",(0,r.jsx)(n.h4,{id:"catalog-tracking-and-field-overrides",children:"Catalog Tracking and Field Overrides"}),"\n",(0,r.jsx)(n.p,{children:"Models linked to the catalog show status badges on editable fields:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Auto"})," (green badge) \u2014 field is synced from the catalog; your edit will override it"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Override"})," (amber badge) \u2014 field is manually locked to your custom value; it will not auto-sync"]}),"\n",(0,r.jsx)(n.li,{children:"No badge \u2014 model is not in the catalog (local Ollama, custom endpoint) or field is always manual (API key, enabled status)"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"To override a catalog field:"}),' edit it normally. The badge changes to "Override" and the field is locked. An edit indicator appears showing the catalog default value.']}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"To reset an overridden field:"})," click the ",(0,r.jsx)(n.strong,{children:"Reset"})," button next to it. The field reverts to the catalog value and the override lock is removed. Auto-sync resumes."]}),"\n",(0,r.jsx)(n.p,{children:"The override status is saved with the model; if you edit the same model again, your locks persist."}),"\n",(0,r.jsx)(n.h3,{id:"cloning-a-model",children:"Cloning a Model"}),"\n",(0,r.jsxs)(n.p,{children:["Click the ",(0,r.jsx)(n.strong,{children:"Clone"})," icon to create a copy of a model entry. Useful when registering a fine-tuned variant that shares the same provider and pricing as a base model."]}),"\n",(0,r.jsxs)(n.p,{children:["Change the ",(0,r.jsx)(n.strong,{children:"Model ID"})," and ",(0,r.jsx)(n.strong,{children:"API Key"})," as needed, then save."]}),"\n",(0,r.jsx)(n.h3,{id:"disabling-a-model",children:"Disabling a Model"}),"\n",(0,r.jsxs)(n.p,{children:["Toggle the ",(0,r.jsx)(n.strong,{children:"Enabled"})," switch to ",(0,r.jsx)(n.code,{children:"off"})," to temporarily remove a model from routing without deleting it. Disabled models are visible in the list but are excluded from all routing decisions."]}),"\n",(0,r.jsx)(n.h3,{id:"removing-a-model",children:"Removing a Model"}),"\n",(0,r.jsxs)(n.p,{children:["Click the ",(0,r.jsx)(n.strong,{children:"Delete"})," (trash) icon. You will be asked to confirm."]}),"\n",(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsx)(n.p,{children:"Removing a model that is assigned to active project routing configurations will cause routing failures for those projects. Remove the model from all project routing configs before deleting it."})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h2,{id:"model-discovery",children:"Model Discovery"}),"\n",(0,r.jsxs)(n.p,{children:["Navigate to ",(0,r.jsx)(n.code,{children:"/dashboard/models/discover"})," (or click ",(0,r.jsx)(n.strong,{children:"Discover"})," on the Models page) to browse the built-in model catalog. The catalog lists known models from supported providers with their context window and published pricing."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"Model Discovery catalog showing provider filter and per-model Add buttons",src:i(2451).A+"",width:"1800",height:"987"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Column"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Model"})}),(0,r.jsx)(n.td,{children:"Model ID (sortable)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Provider"})}),(0,r.jsx)(n.td,{children:"Provider name (sortable)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Context"})}),(0,r.jsxs)(n.td,{children:["Maximum context window, e.g. ",(0,r.jsx)(n.code,{children:"128k"}),", ",(0,r.jsx)(n.code,{children:"1.0M"})," (sortable)"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Input /1M"})}),(0,r.jsxs)(n.td,{children:["Input price per 1,000,000 tokens; ",(0,r.jsx)(n.code,{children:"free"})," for zero-priced models (sortable)"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Output /1M"})}),(0,r.jsx)(n.td,{children:"Output price per 1,000,000 tokens (sortable)"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Click any column header to sort ascending; click again to reverse. All five columns are sortable."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Filters (two rows):"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Search"})," \u2014 filter by model ID or name substring"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Provider"})," \u2014 multi-select dropdown; leave empty to show all providers"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Context"})," \u2014 limit by context window size: All, <32k, 32k\u2013200k, 200k\u20131
1M, >1M"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Price /1M"})," \u2014 filter by input price tier: All, Free, <$1, $1\u2013$5, >$5"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Show"})," \u2014 All, Configured only (models already added to Routerly), Embedding only"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Reset filters"})," to clear all filters at once."]}),"\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Add"})," next to any model to open the new-model form with that model's details pre-filled. Pricing and context window are populated automatically from the catalog. You only need to supply the API key to complete registration."]})]})}function h(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},2451(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/screenshot-models-discover-73ea3148728c9a6fbc5e3f19de1d76c9.png"},3506(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/screenshot-models-new-prefilled-f01ae50b64f77c1e1e2744d22f1c41f0.png"},5180(e,n,i){i.d(n,{A:()=>s});const s=i.p+"assets/images/screenshot-models-05fd81f67194a5f67661d02a51ae70e2.png"},8453(e,n,i){i.d(n,{R:()=>l,x:()=>t});var s=i(6540);const r={},d=s.createContext(r);function l(e){const n=s.useContext(d);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(d.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.