Standard-Opus auf claude-opus-4-7 festlegen (statt CLI-Default)
Dieser Commit ist enthalten in:
@@ -67,7 +67,7 @@ Erstelle ein strukturiertes Briefing auf {output_language} mit folgenden Abschni
|
||||
Verwende durchgehend Inline-Quellenverweise [1], [2], [3] etc. im Text.
|
||||
|
||||
## ZUSAMMENFASSUNG
|
||||
Kompakte Übersicht als Aufzählung (4-8 Bullet Points mit "- "). Jeder Punkt fasst einen Kernaspekt des Themas in 1-2 Sätzen zusammen. Der Leser soll nach dieser Sektion das Wesentliche erfasst haben, ohne den Rest lesen zu müssen.
|
||||
Kompakte Übersicht als Aufzählung (4-8 Bullet Points mit "- "). Jeder Punkt fasst einen Kernaspekt des Themas in 1-2 Sätzen zusammen. Der Leser soll nach dieser Sektion das Wesentliche erfasst haben, ohne den Rest lesen zu müssen. WICHTIG: Die ZUSAMMENFASSUNG besteht AUSSCHLIESSLICH aus Bullet Points. KEIN Fliesstext vor, zwischen oder nach den Bullet Points. Detaillierte Ausführungen gehören in die anderen Sektionen (HINTERGRUND, AKTUELLE LAGE etc.).
|
||||
|
||||
## HINTERGRUND
|
||||
Historischer Kontext, relevante Vorgeschichte
|
||||
@@ -178,6 +178,7 @@ WICHTIG zur Sektion ZUSAMMENFASSUNG:
|
||||
- Falls das bisherige Briefing eine Sektion "## ÜBERBLICK" hat, benenne sie in "## ZUSAMMENFASSUNG" um
|
||||
- Die ZUSAMMENFASSUNG muss als Aufzählung formatiert sein (4-8 Bullet Points mit "- "). Jeder Punkt fasst einen Kernaspekt in 1-2 Sätzen zusammen
|
||||
- Falls der bisherige ÜBERBLICK Fliesstext ist, wandle ihn in Bullet Points um
|
||||
- KEIN Fliesstext vor, zwischen oder nach den Bullet Points. Die ZUSAMMENFASSUNG besteht AUSSCHLIESSLICH aus Bullet Points. Detaillierte Ausführungen gehören in die anderen Sektionen
|
||||
## AKTEURE
|
||||
## AKTUELLE LAGE
|
||||
## EINSCHÄTZUNG
|
||||
|
||||
@@ -4,7 +4,7 @@ import contextvars
|
||||
import json
|
||||
import logging
|
||||
from dataclasses import dataclass
|
||||
from config import CLAUDE_PATH, CLAUDE_TIMEOUT, CLAUDE_MODEL_FAST
|
||||
from config import CLAUDE_PATH, CLAUDE_TIMEOUT, CLAUDE_MODEL_FAST, CLAUDE_MODEL_STANDARD
|
||||
|
||||
# ContextVar fuer Cancel-Event: Wird vom Orchestrator gesetzt,
|
||||
# call_claude prueft automatisch darauf -- kein Durchreichen noetig.
|
||||
@@ -56,11 +56,10 @@ async def call_claude(prompt: str, tools: str | None = "WebSearch,WebFetch", mod
|
||||
Args:
|
||||
prompt: Der Prompt fuer Claude
|
||||
tools: Kommagetrennte erlaubte Tools (None = keine Tools, --max-turns 1)
|
||||
model: Optionales Modell (z.B. CLAUDE_MODEL_FAST fuer Haiku). None = CLI-Default (Opus).
|
||||
model: Optionales Modell (z.B. CLAUDE_MODEL_FAST fuer Haiku). None = CLAUDE_MODEL_STANDARD (Opus 4.7).
|
||||
"""
|
||||
cmd = [CLAUDE_PATH, "-p", "-", "--output-format", "json"]
|
||||
if model:
|
||||
cmd.extend(["--model", model])
|
||||
effective_model = model or CLAUDE_MODEL_STANDARD
|
||||
cmd = [CLAUDE_PATH, "-p", "-", "--output-format", "json", "--model", effective_model]
|
||||
if tools:
|
||||
cmd.extend(["--allowedTools", tools])
|
||||
else:
|
||||
|
||||
@@ -32,6 +32,7 @@ CLAUDE_TIMEOUT = 1800 # Sekunden (30 Min - Lage-Updates mit vielen Artikeln bra
|
||||
# Claude Modelle
|
||||
CLAUDE_MODEL_FAST = "claude-haiku-4-5-20251001" # Für einfache Aufgaben (Feed-Selektion)
|
||||
CLAUDE_MODEL_MEDIUM = "claude-sonnet-4-6" # Für qualitätskritische Aufgaben (Netzwerkanalyse)
|
||||
CLAUDE_MODEL_STANDARD = "claude-opus-4-7" # Standard-Opus für Recherche, Analyse, Faktencheck
|
||||
|
||||
# Ausgabesprache (Lagebilder, Faktenchecks, Zusammenfassungen)
|
||||
OUTPUT_LANGUAGE = "Deutsch"
|
||||
|
||||
@@ -606,6 +606,9 @@ const App = {
|
||||
}
|
||||
} catch (e) { /* Kein kritischer Fehler */ }
|
||||
|
||||
// Heartbeat: periodischer Status-Abgleich als Sicherheitsnetz
|
||||
this._statusSyncInterval = setInterval(() => this.syncRefreshStatus(), 60000);
|
||||
|
||||
// Zuletzt ausgewählte Lage wiederherstellen
|
||||
const savedId = localStorage.getItem('selectedIncidentId');
|
||||
if (savedId) {
|
||||
@@ -2241,6 +2244,44 @@ async handleRefresh() {
|
||||
UI.showToast('Recherche abgebrochen.', 'info');
|
||||
},
|
||||
|
||||
/**
|
||||
* Gleicht den lokalen Refresh-Status mit dem Server ab.
|
||||
* Bereinigt verwaiste Status-Anzeigen, die durch verpasste WebSocket-Nachrichten entstehen.
|
||||
*/
|
||||
async syncRefreshStatus() {
|
||||
if (this._refreshingIncidents.size === 0) return;
|
||||
try {
|
||||
const data = await API.getRefreshingIncidents();
|
||||
const serverRefreshing = new Set(data.refreshing || []);
|
||||
const serverQueued = new Set(data.queued || []);
|
||||
const serverAll = new Set([...serverRefreshing, ...serverQueued]);
|
||||
|
||||
// Finde lokal als refreshing/queued markierte IDs, die serverseitig nicht mehr laufen
|
||||
const stale = [];
|
||||
this._refreshingIncidents.forEach(id => {
|
||||
if (!serverAll.has(id)) stale.push(id);
|
||||
});
|
||||
|
||||
if (stale.length > 0) {
|
||||
console.log('Status-Sync: Bereinige verwaiste Refreshes:', stale);
|
||||
stale.forEach(id => {
|
||||
this._refreshingIncidents.delete(id);
|
||||
this._updateSidebarDot(id);
|
||||
UI._removeSidebarRefreshStatus(id);
|
||||
delete UI._progressState[id];
|
||||
if (id === this.currentIncidentId) {
|
||||
this._updateRefreshButton(false);
|
||||
UI.hideProgress(id);
|
||||
}
|
||||
});
|
||||
UI._reindexQueuePositions();
|
||||
this.renderSidebar();
|
||||
}
|
||||
} catch (e) {
|
||||
// Netzwerkfehler ignorieren, naechster Zyklus probiert erneut
|
||||
}
|
||||
},
|
||||
|
||||
minimizeProgress() {
|
||||
UI.minimizeProgress(this.currentIncidentId);
|
||||
},
|
||||
|
||||
@@ -716,7 +716,10 @@ const UI = {
|
||||
if (!text) return '<span style="color:var(--text-disabled);">Noch keine Zusammenfassung.</span>';
|
||||
let sources = [];
|
||||
try { sources = JSON.parse(sourcesJson || '[]'); } catch(e) {}
|
||||
let html = this.escape(text);
|
||||
// Nur Bullet-Point-Zeilen behalten, Fliesstext herausfiltern
|
||||
const bulletLines = text.split("\n").filter(line => line.trim().startsWith("- "));
|
||||
const bulletText = bulletLines.length > 0 ? bulletLines.join("\n") : text;
|
||||
let html = this.escape(bulletText);
|
||||
// Bullet points
|
||||
html = html.replace(/^- (.+)$/gm, '<li>$1</li>');
|
||||
html = html.replace(/(<li>.*<\/li>\n?)+/gs, '<ul style="margin:4px 0 4px 18px;line-height:1.7;">$&</ul>');
|
||||
|
||||
@@ -34,6 +34,10 @@ const WS = {
|
||||
console.log('WebSocket verbunden');
|
||||
this.reconnectDelay = 2000;
|
||||
this._startPing();
|
||||
// Nach Reconnect: Refresh-Status mit Server abgleichen
|
||||
if (typeof App !== 'undefined' && App.syncRefreshStatus) {
|
||||
App.syncRefreshStatus();
|
||||
}
|
||||
return;
|
||||
}
|
||||
try {
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren