Command Inbox
Developer Guide

AI providers

OpenAI-first chain, embeddings, re-embed jobs, and fallback behavior

Command Inbox uses the Vercel AI SDK with two providers: OpenAI (default) and Gemini (fallback).

Provider configuration

Defined in src/lib/ai/providers.ts:

ProviderChat modelEmbedding modelDimensions
openai (default)gpt-5-nanotext-embedding-3-small768
gemini (fallback)gemini-2.5-flashtext-embedding-004768

User selection persists in localStorage: command-inbox-ai-provider-v2.

Provider chain

getProviderChain() in src/lib/ai/with-fallback.ts returns [primary, fallback]:

  1. Try OpenAI first for chat, classify, draft, embed
  2. On rate limit or quota error, retry with Gemini
  3. If both fail, feature-specific fallback applies

Features using AI

FeatureOpenAI pathFallback behavior
Webhook classificationclassify + embedGemini, then log error
Draft generationAI draft HTMLTemplate draft if both fail
Semantic searchQuery embeddingGemini embed
Agent chatstreamText + toolsGemini; no template fallback
Meeting confirmation draftAI HTMLTemplate draft

Embeddings and provider tracking

Each classifications row stores:

  • embedding — 768-dim pgvector
  • embedding_provideropenai or gemini

Semantic search filters by the active provider so vectors are compared apples-to-apples.

Re-embed job

When the user switches embedding provider in the UI:

  1. POST /api/inbox/reembed { "provider": "openai" | "gemini" }
  2. Background job re-embeds all classifications for that user
  3. Activity banner shows progress
  4. Search uses new vectors when complete

Statuses:

StatusMeaning
runningJob already in progress
nothing-to-doAll rows already on target provider
startedJob kicked off with total count

Implementation: src/lib/embeddings/reembed-inbox.ts

Rate limiting

src/lib/ai/rate-limit.ts provides lightweight in-memory rate limiting for AI calls during development bursts.

Env requirements

At least one of:

OPENAI_API_KEY=
GOOGLE_GENERATIVE_AI_API_KEY=

assertPhase2Env() enforces this for AI-dependent routes.

Quota troubleshooting

SymptomFix
Drafts say "template" sourceAI failed — add credits to OpenAI or Gemini
Agent returns 503No valid AI keys
Empty semantic search after switchWait for re-embed job