-
Notifications
You must be signed in to change notification settings - Fork 20
Open
Description
Description
Mallory currently uses Anthropic’s SDK (ANTHROPIC_API_KEY) for AI chat.
Add support for OpenAI (OPENAI_API_KEY) and let users choose the provider per chat session (Anthropic ↔ OpenAI). Keep backward compatibility and make the system extensible for future providers.
Project specification & scope
Backend
- Identify where Anthropic is used (likely
apps/server/*, chat endpoint). - Create a provider abstraction layer (e.g.
apps/server/lib/ai/):- Define a common interface (
chat,streamif required).
- Define a common interface (
- Implement providers:
openai.ts— implement interface using theopenainpm package.anthropic.ts— refactor existing Anthropic usage (@anthropic-ai/sdk) to implement the same interface.
- Add provider registry and selector:
getAIClient(providerName: string). - Update
/api/chat:- Accept
provider: "openai" | "anthropic"in request body (fallback to default env). - Route requests through
getAIClient(provider).
- Accept
- Update environment:
- Add
OPENAI_API_KEYto.env.example. - Keep
ANTHROPIC_API_KEYfor backwards compatibility.
- Add
Frontend
- Add a UI control (dropdown/toggle) to select provider per session.
- Show active provider in the UI (e.g., badge:
Powered by GPT-4o/Powered by Claude). - Send selected provider to backend in chat request payload.
Testing
- Unit tests for provider modules (with mocked API responses).
- Integration tests for
/api/chatrouting with providers mocked. - E2E test verifying frontend provider selection flows to backend and returns responses.
- Error & fallback tests (optional).
Docs
- Update
README.mdand.env.example:- Document
OPENAI_API_KEYandANTHROPIC_API_KEY. - Show example payload:
{ provider: "openai" }. - Note model name mapping and provider-specific caveats.
- Document
Optional / Extras
- Fallback logic: if selected provider errors/outage, optionally retry with other provider (configurable).
- Instrumentation: log provider used, latency, errors.
- Add more providers later (Mistral, Gemini) using same interface.
Acceptance criteria
- Server has a provider abstraction layer.
-
openaiprovider implemented;OPENAI_API_KEYsupported. -
anthropicprovider refactored to same interface. -
/api/chatacceptsproviderand routes requests accordingly. - Frontend allows user to select provider and sends selection to backend.
- Tests cover both provider code paths.
-
README.mdand.env.exampleupdated. - (Optional) Fallback logic implemented and documented.
Metadata
Metadata
Assignees
Labels
No labels