managarten/packages/shared-llm/src/tiers.ts
Till JS a33857fa39 feat(llm): add BYOK tier + 4 provider adapters (OpenAI, Anthropic, Gemini, Mistral)
Phase 1-3 of BYOK support. Introduces a 5th LLM tier 'byok' that
routes to user-provided API keys via direct browser fetches.

shared-llm additions:
- LlmTier extended with 'byok' (rank 3, between mana-server and cloud)
- ByokBackend: LlmBackend implementation that delegates key lookup
  to an app-provided resolver callback, then dispatches to the right
  provider adapter
- 4 provider adapters:
  - OpenAI (gpt-5, gpt-4o, o1 family)
  - Anthropic (Claude Opus/Sonnet/Haiku 4.6) with CORS header
  - Gemini (2.5 Pro/Flash) — REST API with different message format
  - Mistral — OpenAI-compatible, reuses shared openai-compat adapter
- Pricing table for 20+ models with USD per 1M tokens
- estimateCost() + formatCost() helpers

Keys stay device-local (IndexedDB in next phase). Browser-direct
fetches mean keys never touch Mana's server.

Updates two existing tier maps (memoro DetailView, SourceBadge) to
include the new tier.

Planning doc at docs/architecture/BYOK_PLAN.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:06:48 +02:00

54 lines
1.9 KiB
TypeScript

/**
* Tier definitions for the Mana LLM orchestrator.
*
* Five tiers, ordered from most-private to least-private:
*
* none — Deterministic parsers / heuristics. No LLM at all.
* Always available. Zero cost. Quality varies by task.
*
* browser — Gemma 4 E2B running in the user's browser via WebGPU
* (@mana/local-llm). 100% on-device. Requires the
* ~500 MB model to be downloaded once and ~2 GB VRAM.
*
* mana-server — services/mana-llm + Ollama on our own infrastructure
* (currently the Mac Mini, gemma3:4b by default).
* Data leaves the device but stays in our control.
*
* byok — User-provided API keys (OpenAI, Anthropic, Gemini,
* Mistral). Browser-direct fetches. Data goes to a
* third-party account the user manages. User controls
* the provider's privacy/retention policy directly.
*
* cloud — services/mana-llm proxied to a third-party provider
* (Google Gemini, configured via google_api_key in the
* mana-llm service env). Mana-managed, charges Mana
* credits. Data goes to the third party via Mana.
*/
export type LlmTier = 'none' | 'browser' | 'mana-server' | 'byok' | 'cloud';
export const TIER_RANK: Record<LlmTier, number> = {
none: 0,
browser: 1,
'mana-server': 2,
byok: 3,
cloud: 4,
};
export const ALL_TIERS: readonly LlmTier[] = ['none', 'browser', 'mana-server', 'byok', 'cloud'];
/** Human-readable label, kept here so backends/UI agree on naming. */
export function tierLabel(tier: LlmTier): string {
switch (tier) {
case 'none':
return 'Lokal (ohne KI)';
case 'browser':
return 'Auf deinem Gerät';
case 'mana-server':
return 'Mana-Server';
case 'byok':
return 'Dein API-Key';
case 'cloud':
return 'Google Gemini';
}
}