mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-26 17:12:27 +03:00
docs(routing): LKGP sticks at provider level — align copy with routerStrategy contract (#11555)
Validated in a combined 4-PR batch worktree off release/v3.8.51 tip. Also removed a leftover changelog placeholder duplicate (0000-lkgp-doc-provider-stickiness.md, byte-identical content to the correctly-numbered 11555- fragment minus the PR link) — pushed to this branch. - Focused test: router-strategies.test.ts — part of batch's 60/60 node:test run - typecheck:core, file-size, changelog-integrity, complexity, cognitive-complexity, check:docs-counts-sync — all OK - Full-repo lint: 228 pre-existing dashboard react-hooks/* findings, unrelated to this diff Thanks for the docs-accuracy follow-through — aligning the LKGP copy with what routerStrategy.ts actually does (provider-level, not target/model) closes a real gap between prose and behavior.
This commit is contained in:
@@ -424,7 +424,7 @@ All **19** strategies — mix & match per combo step:
|
||||
<tr>
|
||||
<td align="center">16</td>
|
||||
<td nowrap><code>lkgp</code></td>
|
||||
<td>Last-Known-Good Path — sticky to the last successful target</td>
|
||||
<td>Last-Known-Good Path — pins to the last successful provider, then falls back to rules</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">17</td>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
- **docs(routing):** LKGP strategy copy now states provider-level stickiness and the explicit rules fallback instead of promising per-target pinning ([#11555](https://github.com/diegosouzapw/OmniRoute/pull/11555))
|
||||
@@ -827,7 +827,7 @@ Configure via **Dashboard → Settings → Routing**. The dashboard exposes the
|
||||
- `p2c` (Power of Two Choices)
|
||||
- `least-used` and `cost-optimized`
|
||||
- `auto` — score-driven across all candidates
|
||||
- `lkgp` (Last Known Good Provider) — sticks to the last successful model per session
|
||||
- `lkgp` (Last Known Good Provider) — pins to the last successful provider, then falls back to rules
|
||||
- `context-optimized` — picks the model with the largest free context window
|
||||
- `context-relay` — chains long-context models for follow-up turns
|
||||
|
||||
@@ -1088,15 +1088,15 @@ Access via **Dashboard → Health**. Real-time system health overview with 6 car
|
||||
|
||||
OmniRoute ships with a **score-driven auto-router** that picks the best model for each request across every connected provider — no combo to maintain. Just send the request with one of the `auto/*` prefixes and OmniRoute will assemble a virtual combo on the fly, scoring candidates on latency, cost, success rate, context fit, model fitness for the task, recent failures, quota, and circuit-breaker state.
|
||||
|
||||
| Prefix | Optimizes for |
|
||||
| -------------- | ----------------------------------------------------------------------------- |
|
||||
| `auto` | Balanced default (latency × cost × success rate) |
|
||||
| `auto/coding` | Coding tasks: prefers Claude, GPT-5, GLM, Kimi, Qwen Coder, DeepSeek coders |
|
||||
| `auto/cheap` | Lowest $/token, accepts higher latency |
|
||||
| `auto/fast` | Lowest latency, ignores cost |
|
||||
| `auto/offline` | Local-only providers (Ollama, vLLM, llama.cpp) — useful for air-gapped setups |
|
||||
| `auto/smart` | Reasoning quality first (Opus, GPT-5 xhigh, R1, GLM 5.1 reasoning) |
|
||||
| `auto/lkgp` | "Last Known Good Provider" — sticky to the most recently successful target |
|
||||
| Prefix | Optimizes for |
|
||||
| -------------- | ------------------------------------------------------------------------------------------- |
|
||||
| `auto` | Balanced default (latency × cost × success rate) |
|
||||
| `auto/coding` | Coding tasks: prefers Claude, GPT-5, GLM, Kimi, Qwen Coder, DeepSeek coders |
|
||||
| `auto/cheap` | Lowest $/token, accepts higher latency |
|
||||
| `auto/fast` | Lowest latency, ignores cost |
|
||||
| `auto/offline` | Local-only providers (Ollama, vLLM, llama.cpp) — useful for air-gapped setups |
|
||||
| `auto/smart` | Reasoning quality first (Opus, GPT-5 xhigh, R1, GLM 5.1 reasoning) |
|
||||
| `auto/lkgp` | "Last Known Good Provider" — pins to the last successful provider, then falls back to rules |
|
||||
|
||||
Example:
|
||||
|
||||
|
||||
@@ -280,7 +280,7 @@ OmniRoute's combo engine supports **19 routing strategies** (declared in `src/sh
|
||||
| `headroom` | Pick the target with the most remaining quota headroom |
|
||||
| `strict-random` | Random without deduplication of repeats |
|
||||
| `auto` | Use Auto Combo scoring (15-factor) — **recommended** |
|
||||
| `lkgp` | Last-Known-Good Path (sticky route to last successful target) |
|
||||
| `lkgp` | Last-Known-Good Path (pins to the last successful provider, then falls back to rules) |
|
||||
| `context-optimized` | Pick target with best fit for current context size |
|
||||
| `cache-optimized` | Reorder targets by prompt-cache affinity — the connection likeliest to already hold this request's cached prefix is tried first (`open-sse/services/combo/promptCacheAffinity.ts`, #8008) |
|
||||
| `fusion` 🧬 | Fan out to a panel of models in parallel, then synthesize one answer via a judge (see below) |
|
||||
|
||||
@@ -262,6 +262,34 @@ test("lkgp — lkgpEnabled:false delegates to rules", () => {
|
||||
assert.equal(d.strategy, "rules");
|
||||
});
|
||||
|
||||
test("lkgp — falls back to rules when the pool lacks the last known good provider", () => {
|
||||
const pool = [cand({ provider: "x" })];
|
||||
const context: RoutingContext = {
|
||||
taskType: "default",
|
||||
lastKnownGoodProvider: "y",
|
||||
};
|
||||
const d = getStrategy("lkgp").select(pool, context);
|
||||
const expected = getStrategy("rules").select(pool, context);
|
||||
assert.equal(d.strategy, expected.strategy);
|
||||
assert.equal(d.provider, expected.provider);
|
||||
assert.equal(d.model, expected.model);
|
||||
});
|
||||
|
||||
test("lkgp — keeps the first candidate among several targets of the pinned provider", () => {
|
||||
const pool = [
|
||||
cand({ provider: "shared", model: "shared/m1", connectionId: "conn-1" }),
|
||||
cand({ provider: "shared", model: "shared/m2", connectionId: "conn-2" }),
|
||||
];
|
||||
const d = getStrategy("lkgp").select(pool, {
|
||||
taskType: "default",
|
||||
lastKnownGoodProvider: "shared",
|
||||
});
|
||||
assert.equal(d.provider, "shared");
|
||||
assert.equal(d.model, "shared/m1");
|
||||
assert.equal(d.connectionId, "conn-1");
|
||||
assert.equal(d.candidatesConsidered, 1);
|
||||
});
|
||||
|
||||
// ── selectWithStrategy + registry ─────────────────────────────────────────────
|
||||
test("selectWithStrategy — dispatches by name", () => {
|
||||
const pool = [
|
||||
|
||||
Reference in New Issue
Block a user