v0.23.0
localharness becomes genuinely model-agnostic — Gemini and Claude, on
platform $LH credits, from both the CLI and the browser, with no per-user
provider key. Live end-to-end.
Added
- Anthropic backend (second
ConnectionStrategy).src/backends/anthropic/
implements the Claude Messages API behind the sameConnection/
ConnectionStrategyseam as Gemini — the harness is model-agnostic by
construction.Agent::start_anthropic(AnthropicAgentConfig::new(key)), models
claude-haiku-4-5-20251001(default) /claude-sonnet-4-6/claude-opus-4-8.
Gated behind a newanthropicCargo feature — additive (off by default, no new
deps, default build + Gemini backend untouched). Streaming SSE, tool calling,
thinking, compaction all mapped to the neutral types; 23 canned-fixture tests. - Multi-provider credit proxy. The proxy routes by path (Gemini
/v1beta/models/<m>:<method>, Anthropic/v1/messages), holds both platform
keys, and meters per-model$LH(Gemini flat; haiku 0.01 / sonnet 0.05 / opus
0.20). One redeemed-invite balance calls EITHER provider, no provider key;
BYOK-either is the fallback. Gemini path byte-identical. - Model selectors. CLI:
call --model <id>routesclaude-*to the Anthropic
backend. Browser: a Gemini/Haiku/Sonnet/Opus dropdown in the Agent admin tab
(src/app/model.rs, persisted to.lh_model);chat.rsbranches the session
to the right backend through the proxy.
Changed
- Shed the "antigravity SDK port" framing. Described as a model-agnostic agent
SDK (Gemini today; pluggable backends) acrosslib.rs/ README /llms.txt/
CLAUDE.md / Cargo;content.rs/types.rsreframed as provider-neutral;
antig::mcp→localharness::mcp.
Fixed
--as <name>parses anywhere in the arg list (was first-arg only — broke
probe --deep --as <name>).- Cross-backend
callhistory keyed per backend (__<target>.<backend>.bin)
so Gemini/Claude threads to one target don't collide; an incompatible load warns
and starts fresh instead of failing the call. - Clean fs errors — compile/publish/persona map raw
os error 2→
file not found: <path>. - Anthropic turn errors surface instead of an empty success (a failed Claude
turn returns the real error, e.g. low-balance).
Internal
design/model-agnostic.md(the multi-model → local-model → coding-model →
cluster arc) anddocs/SOP-QA-001-autonomous-feedback.md(an ISO-9001 QA
feedback procedure).