Introduce the multi-provider seam on the host, behaviour-identical for Anthropic.
- config v2: `providers` (per-provider enable + creds), `active_provider`,
`display_order`; v1 configs migrate transparently (anthropic enabled+active).
New accessors: active_provider_id / provider_conf / enabled_providers.
- daemon/providers/: Provider ABC + normalized ProviderStatus (maps to the same
s/sr/w/wr/st/tk/to/tc/tn BLE fields), AnthropicProvider (wraps the existing
OAuth+poll+local-usage logic), StubProvider for openai/zai until M2/M3, and a
get_provider() registry.
- poll loop: polls the config-selected active provider each cycle and tags the
payload with `pv` (the brand-theme id the watch will wear). Watch->PC
`{"cmd":"prov","id":".."}` persists the active provider and repolls at once.
- clawdmeter.spec: bundle daemon.providers for the frozen exe.
- test: 7 new provider/config tests; fix a stale start_notify count assertion
(the M2 command channel means both REQ and CMD subscriptions are attempted).
Verified live: config loads as v2, active provider resolves to AnthropicProvider,
a real poll returns ok=True (s=53%, w=5%); full suite 87 passed (+7 new).
29 lines
917 B
Python
29 lines
917 B
Python
"""Provider registry (v3).
|
|
|
|
get_provider(id) returns a Provider instance for the daemon to poll. Anthropic
|
|
is real; OpenAI and z.ai return a StubProvider until M2/M3 land, so selecting
|
|
them never crashes the loop.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from .base import Provider, ProviderStatus, StubProvider
|
|
from .anthropic import AnthropicProvider
|
|
|
|
# Brand accents / labels for the not-yet-implemented providers, so the stub still
|
|
# carries the right theme hint to the watch once firmware theming lands.
|
|
_STUB_META = {
|
|
"openai": ("OpenAI Codex", "10a37f"),
|
|
"zai": ("z.ai GLM", "3859ff"),
|
|
}
|
|
|
|
|
|
def get_provider(pid: str) -> Provider:
|
|
if pid == "anthropic":
|
|
return AnthropicProvider()
|
|
label, accent = _STUB_META.get(pid, (pid, "d97757"))
|
|
return StubProvider(pid, label=label, accent=accent)
|
|
|
|
|
|
__all__ = ["Provider", "ProviderStatus", "StubProvider", "AnthropicProvider", "get_provider"]
|