Zuletzt aktualisiert:

Handoff an Finsight: Claude Code CLI + Agent-SDK auf der Max-Subscription — Fakten, Fallen, Zitate

Von: StratoClaude (Silverscale-VPS-Session), 30.08.2026 · Für: Finsight (Doku-Archiv/ Wissensbasis mit Chat-Interface, das im Hintergrund Dennis' Claude-Max-Sub nutzt). Zweck: Alles, was wir über den Betrieb von claude -p und claude-agent-sdk auf der Sub hart wissen — jede Aussage mit Quellenanker (M = selbst gemessen am 30.08.2026, H = CLI-Hilfetext 2.1.251, S = SDK-Quellcode 0.2.148, D = Anthropic-Doku, B = Benchmark-Report). Nicht-Verifiziertes ist als solches markiert. Primärquelle für die Zahlen: https://silverscale-docs.dennisfisch.de/dev/benchmark-claude-code-2026-08.html (B).


1. Auth — was auf der Sub geht und was nicht

Fakt Quelle
Die CLI ist per claude.ai-OAuth eingeloggt; claude auth status → loggedIn: true, authMethod: claude.ai, apiProvider: firstParty. M
Credentials liegen in ~/.claude/.credentials.json → claudeAiOauth mit accessToken, refreshToken, expiresAt, refreshTokenExpiresAt, scopes, subscriptionType, rateLimitTier. Die CLI erneuert den Access-Token selbst. M (Dateistruktur), Erneuerung: beobachtet, nicht im Code geprüft
Das Python-SDK claude-agent-sdk nutzt diesen Login mit — keine ANTHROPIC_API_KEY nötig. Alle vier aktuellen Modelle liefen damit (s. §3). M
--bare ist API-Key-only. Hilfetext: „Anthropic auth is strictly ANTHROPIC_API_KEY or apiKeyHelper via --settings (OAuth and keychain are never read)." Mit CLAUDE_CODE_OAUTH_TOKEN per Env trotzdem „Not logged in · Please run /login". → Für Sub-Betrieb nie --bare. H, M
Ohne --bare (z. B. --setting-sources project,local) greift der OAuth-Login normal. M
Dennis' Regel: API-Token-Abrechnung ist ausgeschlossen („API Tokens ist indiskutabel teuer und wird 100 % abgelehnt"), SDK auf der Sub ist gewollt; eine Policy-Prüfung wurde ausdrücklich nicht gewünscht. Dennis, 30.08.2026

2. Das Usage-Fenster (5 h / 7 Tage) abfragen

GET https://api.anthropic.com/api/oauth/usage
Authorization: Bearer <accessToken aus ~/.claude/.credentials.json>
anthropic-beta: oauth-2025-04-20

Antwort (Auszug): five_hour.utilization (Prozent), five_hour.resets_at (ISO, UTC), seven_day.utilization, seven_day.resets_at, extra_usage.is_enabled. Das ist derselbe Endpoint, den /usage in der CLI zeigt. (M — am 30.08. mehrfach abgefragt: 72 → 78 → 84 %.)

Für ein Chat-Interface: vor teuren Aktionen abfragen und dem Nutzer zeigen; bei > 90 % degradieren (kleineres Modell / kürzerer Kontext), nicht blind weiterfeuern.

3. Modelle auf der Sub (30.08.2026)

Modell-ID Läuft auf Sub Nominal $/Trivial-Call via -p ⁽¹⁾ Bemerkung
claude-haiku-4-5-20251001 ja 0,035 schnellster TTFT (0,7 s im Warm-Pool), aber schwächste Qualität, 3/68 JSON-Verstöße
claude-sonnet-5 ja 0,157 bestes Preis/Leistungs-Gefühl im Test
claude-opus-5 ja 0,278 Text sehr gut, Sehen (Foto-Schätzung) am schlechtesten
claude-fable-5 ja 0,408 Text sehr gut (MdAPE 4,0 %), langsamster TTFT (1,4 s), 1 JSON-Verstoß

⁽¹⁾ total_cost_usd aus dem -p-Ergebnis für „Antworte nur: ok" — getrieben von 17–39k Cache-Create-Tokens (Claude-Code-System-Prompt), nicht vom Output. Auf der Sub kein Geld, aber das ehrlichste Verbrauchsmaß. (M)

Die CLI-Kurznamen haiku/sonnet/opus werden auf aktuelle Modelle aufgelöst; die modelUsage-Map im Ergebnis nennt die exakte ID. (M)

4. Latenz-Anatomie — wo die Sekunden sitzen (M, B §4)

Pfad Init bis erstes Token Wall Text (~180 Tok out) Wall Foto
claude -p (ein Prozess je Aufruf) ~4 s 5,6–7,4 s 6–8 s 9–14 s (Bild via Read-Tool = Extra-Turn)
SDK query() (ein Prozess je Aufruf) ~1 s CLI-Start + ~3 s Lazy-Init 4,1–4,8 s 6,4–7,7 s 8,5–10,3 s
SDK ClaudeSDKClient, erste Nachricht einer Session – ~2,6 s ~2,7 s (trivial) –
SDK ClaudeSDKClient, Folge-Nachricht (Session warm) 0 0,7–1,4 s 2,9–4,2 s 5,0–6,2 s
Referenz Gemini 3.7-flash via OpenRouter 0 ~0,5 s 2,3 s 4,8 s

Kernaussagen: - Der „CLI startet schneller"-Tweet (@ClaudeDevs, 29.08.) betrifft den interaktiven Start (Tippen vor Sandbox/MCP). Headless -p hat unverändert ~4 s Overhead pro Prozess (Juni 2026: ~4 s; 30.08.: 3,9 s). (M, Tweet-Text von Dennis) - Für ein Chat-Interface ist die persistente Session der einzige richtige Weg: erste Antwort ~2,7 s, danach TTFT unter 1,5 s. Ein Prozess pro Nachricht wäre 5–8 s. - Der Unterschied Folge-Turn vs. Gemini liegt in der Generierung (Claude ~1–2 s langsamer bei ~150–200 Tokens), nicht mehr im Init.

5. Tokens, Cache und das Kontext-Problem (M, B §5)

6. SDK — die relevanten Bausteine (S, claude-agent-sdk 0.2.148)

7. CLI -p — die relevanten Flags (H, 2.1.251)

--output-format stream-json --verbose (Events system/init, assistant, result), --include-partial-messages, --input-format stream-json, --model, --effort, --max-thinking-tokens (Env MAX_THINKING_TOKENS=0 schaltet Denken aus — M), --system-prompt / --append-system-prompt (+ -file-Varianten), --tools, --allowedTools (variadisch — -- vor dem Prompt setzen, sonst schluckt es den Prompt; M aus ai_jobs.py), --json-schema, --max-turns, --resume <id> / -c / --session-id <uuid> / --fork-session, --no-session-persistence, --setting-sources user,project,local, --bare (s. §1, nicht für Sub), --permission-mode, --exclude-dynamic-system-prompt-sections. --verbose ist für stream-json Pflicht. Transkript-Falle: ohne --no-session-persistence schreibt jeder Headless--p-Aufruf ein volles Transkript inkl. User-Prompt/Dokumenttext nach ~/.claude/projects/<cwd-slug>/<session>.jsonl (Argus-Befund: 72 Transkripte mit Familienpost bei Finsight; bei Silverscale am 30.08. geprüft: Benchmark lief mit Flag, Prod-Fallback nachgezogen). Für Chat-Sessions gilt dasselbe via SDK: extra_args={"no-session-persistence": None} — es sei denn, das Transkript ist gewollt (Resume). Ergebnis-JSON (--output-format json): result, duration_ms, duration_api_ms, total_cost_usd, usage{…}, modelUsage{<id>:…}, is_error, session_id. (M)

8. Qualität — was die Modelle können (B §3, gegen Herstellerwahrheit gemessen)

9. Empfehlungen für Finsights Chat-Interface (abgeleitet, nicht gemessen)

  1. Ein ClaudeSDKClient pro Unterhaltung, beim Öffnen des Chats verbinden und mit einer Mini-Nachricht vorwärmen (nimmt die ~2,7 s der ersten Nachricht aus dem Nutzerpfad). Folge-Antworten dann mit < 1,5 s TTFT.
  2. include_partial_messages=True und Deltas an die UI streamen — gefühlte Latenz ist der TTFT, nicht die Wall-Clock.
  3. system_prompt als eigener String (klein) statt claude_code-Preset, tools auf das Nötige begrenzen, setting_sources=None — jedes Ballast-Token wird pro Turn neu gelesen.
  4. Kontext im Blick: usage.cache_read_input_tokens pro Antwort loggen; ab ~40–50k Session zusammenfassen/neu starten. Nie Nutzer/Threads in einer Session mischen (session_id isoliert nicht).
  5. Modellwahl: Sonnet 5 als Default (Qualität ≈ Opus/Fable im Text-Test, halber Verbrauch, schneller), Opus/Fable auf Nachfrage; Haiku nur für Klassifikation/Routing.
  6. Vor teuren Aktionen /api/oauth/usage abfragen; bei > 90 % 5-h degradieren.
  7. Nie --bare; nie API-Key setzen (sonst zahlt die API, nicht die Sub). no-session-persistence bewusst entscheiden: an = keine Transkripte auf Platte, aus = Resume möglich, aber Nutzertexte liegen unter ~/.claude/projects/.
  8. Wenn ein Bild in den Kontext muss: Block statt Read-Tool; danach den Kontext bewusst kurz halten — das Bild wird bei jedem Folge-Turn mitgelesen.

10. Offen / nicht verifiziert


Rohdaten: app/data/ai-bench/claude-2026-08-30.jsonl (Silverscale-VPS, gitignored), Harness bench_claude.py, Smoke-Skripte im Session-Scratchpad. Vorgänger: benchmark-claude-sub-vs-gemini.md (07.06.2026), BENCHMARK-OPENROUTER-2026-06-06.md.