feat(metrics): lokaler LLM-Verbrauch + Claude-Ersparnis in Diagnostic
metrics.jsonl-Eintraege tragen jetzt 'source' (claude|local|fast-path). - log_local_call(): echte usage-Tokens vom Adapter (prompt/completion), sonst chars/4-Schaetzung. Geloggt pro Tool-Runde im lokalen Fast-Lane. - log_fast_path(): reiner Skill, 0 Prompt-Tokens — gesparter Claude-Call. - aggregate() liefert zusaetzlich by_source (calls/tokens_in/tokens_out). Alt-Eintraege ohne source zaehlen als claude (rueckwaerts-kompatibel). Diagnostic Gehirn-Tab: neue Card "Lokales LLM & Claude-Ersparnis" — pro Fenster (1h/5h/24h/30d) gesparte Claude-Calls (local + fast-path) und lokale Token-Last (eigene HW, kein Quota) + Info-Block. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -30,6 +30,7 @@ from memory import Embedder, VectorStore, MemoryPoint
|
||||
from prompts import build_system_prompt, IDENTITY_SEED, IDENTITY_ANCHOR, looks_like_identity_break
|
||||
from proxy_client import ProxyClient, Message as ProxyMessage
|
||||
import router as router_mod
|
||||
import metrics
|
||||
from local_llm import local_llm_chat
|
||||
import skills as skills_mod
|
||||
import triggers as triggers_mod
|
||||
@@ -1220,6 +1221,13 @@ class Agent:
|
||||
if local_only:
|
||||
return f"[Lokales LLM nicht erreichbar: {res.get('error', 'unbekannt')}]"
|
||||
return None
|
||||
# Metric: dieser lokale Call (echte usage-Tokens wenn der Adapter sie
|
||||
# liefert). Erfasst pro Tool-Runde — mehrere Runden = mehrere Calls.
|
||||
try:
|
||||
metrics.log_local_call(res.get("model") or local_model, messages,
|
||||
res.get("content") or "", res.get("usage"))
|
||||
except Exception:
|
||||
pass
|
||||
tcs = res.get("tool_calls")
|
||||
if tcs:
|
||||
messages.append({"role": "assistant",
|
||||
@@ -1325,6 +1333,11 @@ class Agent:
|
||||
self.conversation.add("assistant", fast_reply, project_id=active_project_id)
|
||||
if active_project_id:
|
||||
projects_mod.touch_project(active_project_id)
|
||||
# Metric: Fast-Path spart einen ganzen Claude-Call zum Nulltarif.
|
||||
try:
|
||||
metrics.log_fast_path(fast_reply)
|
||||
except Exception:
|
||||
pass
|
||||
# Fast-Path = reiner Steuerbefehl → NICHT vorlesen (speak=False).
|
||||
# System-Flag statt <voice>-Tag: robust, unabhaengig vom Skill-Inhalt.
|
||||
return fast_reply, "fast-path", False
|
||||
|
||||
Reference in New Issue
Block a user