feat(llamaswap): add llama-swap provider + canonical imagegen interface
CI / Tidy (pull_request) Successful in 9m25s
CI / Build & Test (pull_request) Successful in 10m15s

Add provider/llamaswap, a tailored provider for llama-swap (the model-swapping
proxy over llama.cpp / stable-diffusion.cpp). Its chat path delegates to
provider/openai at {base}/v1 — no duplicated wire client (ADR-0007) — with
legacy max_tokens, a Bearer no-key placeholder for keyless local instances, and
a timeout-free client so cold model swaps rely on context deadlines. The
"tailored" surface is concrete management methods (ListModels / Running /
Unload) that don't belong on the canonical llm.Provider interface. The
llama-swap:// DSN scheme builds an http base URL (local-first); a no-URL
built-in errors clearly on use, mirroring foreman.

Add imagegen, a new canonical text-to-image interface separate from llm
(Request/Result/Model/Provider; Image = llm.ImagePart so generated images feed
straight back into chat). First backend is llama-swap via OpenAI
/v1/images/generations (b64_json, bytes-only). Re-exported from the root. v1 is
txt2img only.

Hermetic httptest coverage for chat delegation, management endpoints, image
decode, and scheme wiring. ADR-0015 + ADR-0016, README support matrix +
image-gen section, CLAUDE.md package map, and progress.md updated in the same
commit.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-27 15:01:54 -04:00
parent 1fd7109a42
commit 96c612e707
14 changed files with 994 additions and 7 deletions
+22
View File
@@ -1,5 +1,27 @@
# progress
## 2026-06-27 — llama-swap provider + canonical image-gen interface
**Landed (ADR-0015, ADR-0016).** New `provider/llamaswap`: chat **delegates to
`provider/openai`** at `{base}/v1` (no duplicated wire client per ADR-0007), with
legacy `max_tokens`, a `Bearer no-key` placeholder for keyless local instances,
and a timeout-free client (swap cold starts → use context deadlines). Tailored
management methods on the concrete type — `ListModels`, `Running` (raw JSON),
`Unload`. DSN scheme `llama-swap://token@host:port` builds an **http** base URL
(local-first), registered in `builtin.go` alongside a no-URL built-in that errors
on use (mirrors foreman).
New canonical `imagegen` package (text-to-image), separate from `llm`:
`Request`/`Result`/`Model`/`Provider`, `Image = llm.ImagePart` so generated
images feed back into chat. First backend is llama-swap via OpenAI
`/v1/images/generations` (`b64_json`, bytes-only). Re-exported from root
(`ImageModel`, `ImageRequest`, `WithImageSize`, ...). v1 is txt2img only; edits/
img2img and registry image-DSN resolution deferred.
Hermetic `httptest` tests for chat delegation, management endpoints, image
decode, and scheme wiring. Gates green. README support matrix + image-gen
section, CLAUDE.md package map, and ADR index updated in the same change.
## 2026-06-10 — Phase 9b: mort converted, PR open
**Done.** mort fully re-based on majordomo on branch