Source code for swarph_mesh.adapters

"""Provider adapters — registry + dispatch.

Phase 1 shipped Gemini (PLAN.md §3 ship-order #1). Phase 4 adds
DeepSeek (#2); subsequent Phase 4 PRs add Claude (#3), OpenAI (#4),
Grok (#5).

Adapters are singletons per provider — instantiated on first
request, reused for the rest of the process. This matches the
"adapter registry" shape from PLAN.md §4.
"""

from __future__ import annotations

from typing import Optional

from swarph_mesh.exceptions import UnknownProvider
from swarph_mesh.types import LLMAdapter

# Registry of instantiated singletons (one per provider name)
_REGISTRY: dict[str, LLMAdapter] = {}


[docs] def get_adapter(provider: str, *, api_key: Optional[str] = None) -> LLMAdapter: """Return the adapter for ``provider``, instantiating on first request. v0.3.0 ships ``"gemini"`` (Phase 1) and ``"deepseek"`` (Phase 4). Other providers raise :class:`UnknownProvider`; subsequent Phase 4 PRs add Claude / OpenAI / Grok. """ if provider in _REGISTRY: return _REGISTRY[provider] if provider == "gemini": from swarph_mesh.adapters.gemini import GeminiAdapter adapter = GeminiAdapter(api_key=api_key) _REGISTRY[provider] = adapter return adapter if provider == "deepseek": from swarph_mesh.adapters.deepseek import DeepSeekAdapter adapter = DeepSeekAdapter(api_key=api_key) _REGISTRY[provider] = adapter return adapter if provider == "claude": from swarph_mesh.adapters.claude import ClaudeAdapter adapter = ClaudeAdapter(api_key=api_key) _REGISTRY[provider] = adapter return adapter if provider == "gemini-cli": from swarph_mesh.adapters.gemini_cli import GeminiCLIAdapter adapter = GeminiCLIAdapter(api_key=api_key) _REGISTRY[provider] = adapter return adapter if provider == "antigravity": from swarph_mesh.adapters.antigravity import AntigravityAdapter adapter = AntigravityAdapter(api_key=api_key) _REGISTRY[provider] = adapter return adapter if provider == "openai": from swarph_mesh.adapters.openai import OpenAIAdapter adapter = OpenAIAdapter(api_key=api_key) _REGISTRY[provider] = adapter return adapter if provider == "grok": from swarph_mesh.adapters.grok import GrokAdapter adapter = GrokAdapter(api_key=api_key) _REGISTRY[provider] = adapter return adapter raise UnknownProvider( f"no adapter registered for provider {provider!r}. " "v0.5.0 ships all five Phase 4 adapters: gemini + deepseek + claude + " "openai + grok. Subsequent phases add MeshClient streaming + REPL " "(swarph-cli) per PLAN.md §13." )
[docs] def register_adapter(provider: str, adapter: LLMAdapter) -> None: """Programmatic adapter registration. Test fixtures use this to inject mocks; production consumers normally don't need it.""" _REGISTRY[provider] = adapter
[docs] def reset_registry() -> None: """Test-only: clear the registry. Not part of the public API.""" _REGISTRY.clear()
__all__ = ["get_adapter", "register_adapter", "reset_registry"]