From de4d95a3921faea121fc49e4d1935c815a42d7bf Mon Sep 17 00:00:00 2001 From: duffyduck Date: Fri, 10 Jul 2026 22:17:38 +0200 Subject: [PATCH] feat(diagnostic): Model-Tier-Liste aus /shared/config/models.json (editierbar ohne Code) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit handleModels liest die kuratierte Tier-Liste jetzt pro Request aus /shared/config/models.json statt sie hart zu codieren. Neue Tier-Namen oder angepasste Beschreibungen sind damit eine reine Datei-Aenderung — kein Code-Edit, kein Proxy-Neubau, kein Neustart (Datei bearbeiten → im Diagnostic „↻ Aktualisieren"). - Fehlt/kaputt die Datei: eingebaute Defaults greifen und werden einmalig als models.json angelegt, damit es was zu editieren gibt. - ids bleiben MODEL_MAP-kompatibel (extractModel), Validierung: nicht-leeres Array mit String-id, sonst Fallback auf Defaults. - UI-Hinweis auf den Dateipfad ergaenzt. - Load/Seed-Logik simuliert verifiziert. Co-Authored-By: Claude Opus 4.8 (1M context) --- diagnostic/index.html | 3 ++ proxy-patches/routes.js | 80 ++++++++++++++++++++++++++++------------- 2 files changed, 58 insertions(+), 25 deletions(-) diff --git a/diagnostic/index.html b/diagnostic/index.html index 97cf45b..4287dd3 100644 --- a/diagnostic/index.html +++ b/diagnostic/index.html @@ -885,6 +885,9 @@ ARIA laeuft ueber dein Claude-Max-Abo (CLI) — waehlbar ist der Tier (Opus/Sonnet/Haiku), nicht eine feste Version. Die CLI nimmt automatisch das jeweils aktuelle Modell des Tiers. +

+ Die Auswahlliste kommt aus /shared/config/models.json — dort kannst du + Tiers/Beschreibungen anpassen (kein Neustart noetig, danach „↻ Aktualisieren").
Aktives Model: diff --git a/proxy-patches/routes.js b/proxy-patches/routes.js index acc558a..4c5e2c3 100644 --- a/proxy-patches/routes.js +++ b/proxy-patches/routes.js @@ -19,6 +19,7 @@ */ import { v4 as uuidv4 } from "uuid"; import http from "http"; +import fs from "fs"; import { ClaudeSubprocess } from "../subprocess/manager.js"; import { openaiToCli } from "../adapter/openai-to-cli.js"; import { cliResultToOpenai, createDoneChunk, } from "../adapter/cli-to-openai.js"; @@ -452,35 +453,64 @@ async function handleNonStreamingResponse(res, subprocess, cliInput, requestId) * * Returns available models */ +// Kuratierte Tier-Liste. ARIA laeuft ueber das Claude-Max-Abo via CLI — +// waehlbar ist der TIER (opus/sonnet/haiku), nicht eine feste Modellversion; +// die CLI loest den Alias aufs aktuelle Modell des Tiers auf. Die id-Strings +// muessen von openai-to-cli.js extractModel() erkannt werden (MODEL_MAP). +// +// Quelle: /shared/config/models.json — damit neue Tier-Namen oder angepasste +// Beschreibungen eine reine DATEI-Aenderung sind (kein Code-Edit, kein Neubau, +// kein Neustart: handleModels liest pro Request neu; einfach die Datei +// bearbeiten und im Diagnostic „Aktualisieren" druecken). Fehlt/kaputt die +// Datei, greifen die eingebauten Defaults; die Datei wird dann einmalig mit +// diesen Defaults angelegt, damit es was zu editieren gibt. +const MODELS_FILE = process.env.ARIA_MODELS_FILE || "/shared/config/models.json"; +const DEFAULT_MODELS = [ + { id: "claude-sonnet-4", tier: "sonnet", display_name: "Sonnet (aktuell: Sonnet 5)", + description: "Schnell & gut — Standard fuer den Alltag." }, + { id: "claude-opus-4", tier: "opus", display_name: "Opus (aktuell: Opus 4.8)", + description: "Langsamer, aber am schlausten — fuer schwere/lange Aufgaben." }, + { id: "claude-haiku-4", tier: "haiku", display_name: "Haiku (aktuell: Haiku 4.5)", + description: "Sehr schnell & guenstig, kleinerer Kontext — fuer einfache Tasks." }, +]; + +function _loadModels() { + try { + const raw = fs.readFileSync(MODELS_FILE, "utf-8"); + const arr = JSON.parse(raw); + if (Array.isArray(arr) && arr.length && arr.every(m => m && typeof m.id === "string")) { + return arr; + } + console.error("[aria-models] models.json ungueltig — nutze Defaults"); + } catch (_) { + // Datei fehlt (oder unlesbar) → Defaults + einmalig seeden zum Editieren + try { + fs.mkdirSync("/shared/config", { recursive: true }); + if (!fs.existsSync(MODELS_FILE)) { + fs.writeFileSync(MODELS_FILE, JSON.stringify(DEFAULT_MODELS, null, 2)); + console.error("[aria-models] models.json mit Defaults angelegt:", MODELS_FILE); + } + } catch (e) { + console.error("[aria-models] Seeden fehlgeschlagen:", e && e.message); + } + } + return DEFAULT_MODELS; +} + export function handleModels(_req, res) { - // ARIA laeuft ueber das Claude-Max-Abo via CLI — waehlbar ist der TIER - // (opus/sonnet/haiku), nicht eine feste Modellversion. Die CLI loest den - // Alias auf das AKTUELLE Modell des Tiers auf. Die id-Strings muessen von - // openai-to-cli.js extractModel() erkannt werden (MODEL_MAP). display_name/ - // tier/description sind ARIA-Zusatzfelder fuers Diagnostic-Dropdown. const created = Math.floor(Date.now() / 1000); + const models = _loadModels(); res.json({ object: "list", - data: [ - { - id: "claude-sonnet-4", object: "model", owned_by: "anthropic", created, - tier: "sonnet", - display_name: "Sonnet (aktuell: Sonnet 5)", - description: "Schnell & gut — Standard fuer den Alltag.", - }, - { - id: "claude-opus-4", object: "model", owned_by: "anthropic", created, - tier: "opus", - display_name: "Opus (aktuell: Opus 4.8)", - description: "Langsamer, aber am schlausten — fuer schwere/lange Aufgaben.", - }, - { - id: "claude-haiku-4", object: "model", owned_by: "anthropic", created, - tier: "haiku", - display_name: "Haiku (aktuell: Haiku 4.5)", - description: "Sehr schnell & guenstig, kleinerer Kontext — fuer einfache Tasks.", - }, - ], + data: models.map(m => ({ + id: m.id, + object: "model", + owned_by: "anthropic", + created, + tier: m.tier || m.id, + display_name: m.display_name || m.id, + description: m.description || "", + })), }); } /**