feat: provider-agnostische lokale LLM-Anbindung (Ollama-Support) #1

Closed
jkaindl wants to merge 0 commits from refs/pull/1/head into main
jkaindl commented 2026-07-07 18:06:44 +00:00 (Migrated from codeberg.org)

Was & Warum

Macht die lokale LLM-Anbindung provider-agnostisch und unterstützt damit Ollama neben LM Studio — ohne Provider-Setting/Enum. Endpoints bleiben freie URLs (Failover unverändert); der Client sondiert die nativen Metadaten-Endpunkte und nimmt, was antwortet. Muster geborgt aus markdown-presentation (Kit-first).

Spec: docs/superpowers/specs/2026-07-07-ollama-provider-agnostic-design.md
Plan: docs/superpowers/plans/2026-07-07-ollama-provider-agnostic.md

Änderungen (8 Commits)

  • Pure src/core/model-info.ts — LM-Studio- + Ollama-Parser, suppressParams, isAlwaysOnThinker (obsidian-frei, check:pure).
  • LmStudioClientLocalLlmClient (provider-agnostischer Name).
  • modelInfo()-Doppel-Sonde — LM Studio /api/v0/models → Fallback Ollama POST /api/show (model_info["<arch>.context_length"]).
  • Union-Thinking-Suppressionreasoning_effort:"none" + enable_thinking:false + reasoning_budget:0 (deckt Ollama/vLLM/llama.cpp/LM Studio; Ollama-Gotcha: reasoning_effort immer String).
  • CORS-Non-Stream-Fallback — Ollama ohne OLLAMA_ORIGINS verweigert den Stream; Client fällt einmal auf postJson mit stream:false zurück (CORS-frei via requestUrl), merkt sich streamRefused pro Lauf.
  • Always-on-Thinker-Erkennung (gpt-oss/harmony) — run.md-Frontmatter always_on_thinker: true + einmalige Notice, statt stiller Kontext-Verschwendung.
  • Doku — AGENTS.md (Smoke-Schritt), README (Ollama + Failover), CHANGELOG (Unreleased, undatiert).

Review & Tests

  • Subagent-Driven Development: jede Task TDD + zweistufiger Task-Review (Spec + Quality), alle „Pass".
  • Whole-Branch-Final-Review (Opus): 0 Critical, 1 Important + Minors.
    • Important #1 gefixt (bf57040): Non-Stream-Fallback klassifizierte eine erfolgreiche Antwort mit „context window"-Phrase fälschlich als Overflow (Ollamas Default-Pfad) — Reorder auf content-first + neuer Test; Re-Review „Fix confirmed".
    • Minor: README-Failover-Klausel restauriert; zwei inerte/optionale Findings dokumentiert.
  • 273 Tests grün, npm run gate exit 0 (lint + typecheck + test + check:pure + check:bundle). src/ weiterhin git-frei.

Offen (nicht in CI möglich)

  • Manueller Smoke gegen laufendes Ollama (http://localhost:11434/v1) + LM-Studio-Gegenprobe — AGENTS.md §Smoke, Gate vor Release/Store-Submission. Jays Aktion.

🤖 Generated with Claude Code

## Was & Warum Macht die lokale LLM-Anbindung **provider-agnostisch** und unterstützt damit **Ollama** neben LM Studio — **ohne** Provider-Setting/Enum. Endpoints bleiben freie URLs (Failover unverändert); der Client sondiert die nativen Metadaten-Endpunkte und nimmt, was antwortet. Muster geborgt aus `markdown-presentation` (Kit-first). Spec: `docs/superpowers/specs/2026-07-07-ollama-provider-agnostic-design.md` Plan: `docs/superpowers/plans/2026-07-07-ollama-provider-agnostic.md` ## Änderungen (8 Commits) - **Pure `src/core/model-info.ts`** — LM-Studio- + Ollama-Parser, `suppressParams`, `isAlwaysOnThinker` (obsidian-frei, `check:pure`). - **`LmStudioClient` → `LocalLlmClient`** (provider-agnostischer Name). - **`modelInfo()`-Doppel-Sonde** — LM Studio `/api/v0/models` → Fallback Ollama `POST /api/show` (`model_info["<arch>.context_length"]`). - **Union-Thinking-Suppression** — `reasoning_effort:"none"` + `enable_thinking:false` + `reasoning_budget:0` (deckt Ollama/vLLM/llama.cpp/LM Studio; Ollama-Gotcha: `reasoning_effort` immer String). - **CORS-Non-Stream-Fallback** — Ollama ohne `OLLAMA_ORIGINS` verweigert den Stream; Client fällt einmal auf `postJson` mit `stream:false` zurück (CORS-frei via `requestUrl`), merkt sich `streamRefused` pro Lauf. - **Always-on-Thinker-Erkennung** (gpt-oss/harmony) — `run.md`-Frontmatter `always_on_thinker: true` + einmalige Notice, statt stiller Kontext-Verschwendung. - **Doku** — AGENTS.md (Smoke-Schritt), README (Ollama + Failover), CHANGELOG (Unreleased, undatiert). ## Review & Tests - Subagent-Driven Development: jede Task TDD + zweistufiger Task-Review (Spec + Quality), alle „Pass". - Whole-Branch-Final-Review (Opus): 0 Critical, 1 Important + Minors. - **Important #1 gefixt** (`bf57040`): Non-Stream-Fallback klassifizierte eine erfolgreiche Antwort mit „context window"-Phrase fälschlich als Overflow (Ollamas Default-Pfad) — Reorder auf content-first + neuer Test; Re-Review „Fix confirmed". - Minor: README-Failover-Klausel restauriert; zwei inerte/optionale Findings dokumentiert. - **273 Tests grün, `npm run gate` exit 0** (lint + typecheck + test + check:pure + check:bundle). `src/` weiterhin git-frei. ## Offen (nicht in CI möglich) - **Manueller Smoke gegen laufendes Ollama** (`http://localhost:11434/v1`) + LM-Studio-Gegenprobe — AGENTS.md §Smoke, Gate vor Release/Store-Submission. Jays Aktion. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
jkaindl commented 2026-07-08 11:06:51 +00:00 (Migrated from codeberg.org)

Manuell via --no-ff nach main gemergt als 28d74dc.

Manueller Ollama-Smoke gegen gemma4:e4b grün (beide Beispiel-Crews ok), Gate grün (273 Tests). Schließe den PR.

Co-Authored-By: Claude Opus 4.8 (1M context)

Manuell via `--no-ff` nach `main` gemergt als `28d74dc`. Manueller Ollama-Smoke gegen `gemma4:e4b` grün (beide Beispiel-Crews `ok`), Gate grün (273 Tests). Schließe den PR. _Co-Authored-By: Claude Opus 4.8 (1M context)_

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
jkaindl/vault-crews!1
No description provided.