Files
stack/docs/scratchpads/m3-001-provider-adapter.md
Jason Woltje e95c70d329
Some checks failed
ci/woodpecker/push/ci Pipeline failed
feat(M3-001): refactor ProviderService into IProviderAdapter pattern (#306)
Co-authored-by: Jason Woltje <jason@diversecanvas.com>
Co-committed-by: Jason Woltje <jason@diversecanvas.com>
2026-03-21 21:16:45 +00:00

2.3 KiB

M3-001 Provider Adapter Pattern — Scratchpad

Objective

Refactor ProviderService into an IProviderAdapter pattern without breaking existing Ollama flow.

Plan

  1. Add IProviderAdapter interface and supporting types to @mosaic/types provider package
  2. Create apps/gateway/src/agent/adapters/ directory with:
    • provider-adapter.interface.ts — IProviderAdapter + ProviderHealth + CompletionParams + CompletionEvent
    • ollama.adapter.ts — extract existing Ollama logic
  3. Refactor ProviderService:
    • Accept IProviderAdapter[] (injected via DI token)
    • registerAll() / listModels() aggregates from all adapters
    • getAdapter(name) — lookup by name
    • healthCheckAll() — check all adapters
    • Keep Pi ModelRegistry wiring (required by AgentService)
  4. Wire up in AgentModule

Key Findings

Pi SDK Compatibility

  • Pi SDK uses ModelRegistry as central registry; ProviderService wraps it
  • ModelRegistry.registerProvider() is the integration point — adapters call this
  • Pi doesn't have a native "IProviderAdapter" concept — adapters are a Mosaic abstraction on top
  • The createAgentSession() call in AgentService uses modelRegistry: this.providerService.getRegistry()
  • OllamaAdapter should call registry.registerProvider('ollama', {...}) same as today
  • CompletionParams/CompletionEvent: Pi SDK streams via AgentSession.prompt(), not raw completion — IProviderAdapter.createCompletion() is for future direct use; for now stub or leave as interface-only — ASSUMPTION: createCompletion is reserved for future M3+ work; Pi SDK owns the actual streaming

Implementation Notes

  • ESM: use .js extensions in all imports
  • NestJS: use @Inject() explicitly
  • Keep RoutingService working — it only uses providerService.listAvailableModels()
  • Keep AgentService working — it uses providerService.getRegistry(), findModel(), getDefaultModel(), listAvailableModels()

Progress

  • Add types to @mosaic/types
  • Create adapters/ directory
  • Create IProviderAdapter interface file
  • Create OllamaAdapter
  • Refactor ProviderService
  • Update AgentModule
  • Run tests
  • Run quality gates

Risks

  • Pi SDK doesn't natively support IProviderAdapter — adapters are a layer on top
  • createCompletion() is architecturally sound but requires Pi session bypass (future work)