From c377791007a8dc1143b1f180ef72b5c379b52076 Mon Sep 17 00:00:00 2001 From: Elton Turing Date: Sat, 5 Sep 2026 09:30:50 +0200 Subject: [PATCH] =?UTF-8?q?llmrouter:=20ACL=20nur=20f=C3=BCr=20eigene=20Na?= =?UTF-8?q?men,=20Durchreiche=20pr=C3=BCft=20LiteLLM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- src/server.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/server.ts b/src/server.ts index 2aaede7..d42a07c 100644 --- a/src/server.ts +++ b/src/server.ts @@ -76,7 +76,19 @@ type Ziel = { alias: string; upstreamName: string; upstream: Upstream; model: st type Fehler = { fehler: string; status: number }; const OR = (): Upstream => config.upstreams.openrouter; +/** Bedient der Router diesen Namen selbst? Sonst Durchreiche -- und dann prueft LiteLLM die Rechte, nicht wir. */ +function eigenerName(name: string): boolean { + return name.startsWith("role/") || name.startsWith("openrouter/") || name.startsWith("alt/") || config.aliases[name] !== undefined; +} + async function zielBestimmen(angefragt: string, keyName: string): Promise { + if (!eigenerName(angefragt)) { + if (config.fallback !== undefined) { + const u = config.fallback.upstream; + return { alias: "(durchreiche)", upstreamName: u, upstream: config.upstreams[u], model: angefragt, effort: null, effortSetzen: false }; + } + return { fehler: `Unbekanntes Modell ${angefragt}`, status: 404 }; + } if (!erlaubt(acl.get(keyName) ?? [], angefragt)) return { fehler: `${keyName} darf ${angefragt} nicht rufen`, status: 403 }; let name = angefragt; if (name.startsWith("role/")) { @@ -100,12 +112,7 @@ async function zielBestimmen(angefragt: string, keyName: string): Promise