jean-router: contexte reel depuis llama-server + overrides

- Interroge llama-server:8080 pour le n_ctx du modele actif
- JEAN_CTX_OVERRIDES prioritaire si defini
- Fallback: Ollama matching → heuristique
- Plus de devinette, le contexte est precis
This commit is contained in:
Folzo
2026-08-02 10:25:51 +02:00
parent fcaad763da
commit 9439307e6a
+28 -6
View File
@@ -38,6 +38,7 @@ ENABLE_WOL = os.getenv("ENABLE_WOL", "false").lower() == "true"
TARGET_MAC = os.getenv("TARGET_MAC", os.getenv("PC_GAMING_MAC", "")) TARGET_MAC = os.getenv("TARGET_MAC", os.getenv("PC_GAMING_MAC", ""))
BROADCAST_IP = os.getenv("BROADCAST_IP", "192.168.1.255") BROADCAST_IP = os.getenv("BROADCAST_IP", "192.168.1.255")
WAKE_TIMEOUT = int(os.getenv("WAKE_TIMEOUT", "180")) WAKE_TIMEOUT = int(os.getenv("WAKE_TIMEOUT", "180"))
JEAN_CTX_OVERRIDES = json_mod.loads(os.getenv("JEAN_CTX_OVERRIDES", "{}"))
wol_in_progress = threading.Lock() wol_in_progress = threading.Lock()
jean_alive_cache = {"alive": False, "timestamp": 0} jean_alive_cache = {"alive": False, "timestamp": 0}
@@ -469,9 +470,29 @@ def _match_preset_to_ollama(preset_id: str):
def get_jean_metadata(): def get_jean_metadata():
"""Resout dynamiquement context_length et capabilities pour les presets Jean. """Resout dynamiquement context_length et capabilities pour les presets Jean.
1) Ollama matching → 2) Jean /v1/models → 3) heuristique""" 1) JEAN_CTX_OVERRIDES → 2) llama-server /v1/models → 3) Ollama matching → 4) heuristique"""
now = time.time()
# 1 — Overrides utilisateur (priorite max)
for pid, ctx in JEAN_CTX_OVERRIDES.items():
jean_ctx_cache[pid] = ctx
# 2 — llama-server direct (port 8080, modele actif)
try:
r = requests.get(f"http://{JEAN_WEB_HOST}:8080/v1/models", timeout=3)
if r.ok:
for m in r.json().get("data", []):
meta = m.get("meta", {})
ctx = meta.get("n_ctx") or m.get("max_model_len") or m.get("context_length")
if ctx:
# Associer ce ctx au preset actif (meme nom ou alias)
active = get_active_preset()
if active:
jean_ctx_cache[active["id"]] = int(ctx)
log.info(f"[Jean] ctx reel via llama-server: {active['id']}={ctx}")
except Exception:
pass
# 3 — Jean proxy /v1/models (via jean-proxy, pour le modele actif)
try: try:
url = f"http://{JEAN_PROXY_HOST}:{JEAN_PROXY_PORT}/v1/models" url = f"http://{JEAN_PROXY_HOST}:{JEAN_PROXY_PORT}/v1/models"
r = requests.get(url, timeout=2) r = requests.get(url, timeout=2)
@@ -480,7 +501,7 @@ def get_jean_metadata():
alias = m.get("id", "") alias = m.get("id", "")
meta = m.get("meta", {}) meta = m.get("meta", {})
n_ctx = meta.get("n_ctx") or m.get("max_model_len") n_ctx = meta.get("n_ctx") or m.get("max_model_len")
if n_ctx and alias: if n_ctx and alias and alias not in jean_ctx_cache:
jean_ctx_cache[alias] = int(n_ctx) jean_ctx_cache[alias] = int(n_ctx)
except Exception: except Exception:
pass pass
@@ -503,7 +524,9 @@ def get_jean_metadata():
ollama_name = matched_ollama.get("name", "").replace(":latest", "") if matched_ollama else None ollama_name = matched_ollama.get("name", "").replace(":latest", "") if matched_ollama else None
if pid not in jean_ctx_cache: if pid not in jean_ctx_cache:
if ollama_name and ollama_lookup.get(ollama_name, {}).get("context_length"): if pid in JEAN_CTX_OVERRIDES:
jean_ctx_cache[pid] = JEAN_CTX_OVERRIDES[pid]
elif ollama_name and ollama_lookup.get(ollama_name, {}).get("context_length"):
jean_ctx_cache[pid] = ollama_lookup[ollama_name]["context_length"] jean_ctx_cache[pid] = ollama_lookup[ollama_name]["context_length"]
else: else:
jean_ctx_cache[pid] = _guess_context_length(pid) jean_ctx_cache[pid] = _guess_context_length(pid)
@@ -1202,9 +1225,8 @@ h1{font-size:18px;color:var(--purple);margin-bottom:12px}
</div> </div>
<div class="card"> <div class="card">
<h2>⚡ Actions</h2> <h2>⚡ Actions</h2>
<button class="btn" onclick="action('refresh')">🔄 Refresh cache</button> <button class="btn" onclick="action('refresh');setTimeout(fetchStatus,800)">🔄 Actualiser modèles Jean + Ollama</button>
<button class="btn btn-danger" onclick="action('restart-jean')" title="Stop + Start Jean">🔁 Restart Jean</button> <button class="btn btn-danger" onclick="action('restart-jean')" title="Stop + Start Jean">🔁 Restart Jean</button>
<button class="btn" onclick="location.reload()">↻ Reload page</button>
<div style="margin-top:8px"> <div style="margin-top:8px">
<span class="badge badge-blue" id="wol-badge">WoL: -</span> <span class="badge badge-blue" id="wol-badge">WoL: -</span>
<span class="badge badge-green" id="cache-badge">Cache: -</span> <span class="badge badge-green" id="cache-badge">Cache: -</span>