llm-adapters — Architecture
The @mnemose/llm-adapters package provides native, multi-vendor LLM adapters behind the @freeside-collective/agent-runtime ApiClient surface. Unlike @mnemose/llm-provider (a text-only port not on the agent tool-use path), this package produces the ApiClient instances the agent loop actually streams through.
Responsibilities
- Resolve an
ApiClientfrom an LLM provider config (provider kind, secret ref, model) viacreateApiClient(config, deps) - Implement per-vendor adapters that translate the agent-runtime request stream into vendor SDK calls
- Resolve secrets from Secret Manager via the
secretsdependency and cloud credentials viacloudCredentials
Key Components
| File | Role |
|---|---|
src/registry.ts | createApiClient() — dispatches to the correct adapter by providerKind |
src/adapters/anthropic.ts | Anthropic Messages API adapter |
src/adapters/vertex.ts | Vertex AI (Gemini) adapter |
src/adapters/openai-compat.ts | OpenAI-compatible endpoint adapter (OpenAI, OpenRouter, Azure OpenAI, …) |
src/adapters/bedrock.ts | AWS Bedrock adapter (Anthropic on Bedrock) |
src/adapters/azure.ts | Azure OpenAI adapter |
src/adapters/_translate.ts | Shared request/response translation helpers |
src/config.ts | Shared config types (BaseLlmConfig, LlmProviderKind) |
Dependencies
@mnemose/domain—LlmProviderConfigZod schemas (secret ref, model, provider kind)@mnemose/cloud-adapters— secret resolution + cloud credentials- vendor SDKs (
@anthropic-ai/sdk, OpenAI SDK, etc.) behind each adapter
Data Flow
agent loop (services/loop-host) ↓ createApiClient(providerConfig, { secrets, cloudCredentials }) ↓ client.stream(request, tools) → AsyncIterable<AssistantEvent> ↓ vendor SDK call (Anthropic / Vertex / OpenAI / Bedrock / Azure)