create-fedi-app
Modules

ai-assistant

Optional module — free-form AI chat using Vercel AI SDK with Anthropic, OpenAI, Groq, or Ollama providers.

Unmetered AI assistant without Lightning payments. Uses the same provider factory as ai-chat-gated but skips the payment gate.

Files added

FilePurpose
lib/ai/providers.tsProvider factory (shared pattern with ai-chat-gated)
components/ai/AssistantProvider.tsxChat context wrapper
components/ai/Assistant.tsxStreaming chat UI
app/api/assistant/route.tsPOST — streamText without payment
app/demo/assistant/page.tsxDemo page

Dependencies

  • ai, @ai-sdk/react, react-markdown
  • @ai-sdk/anthropic, @ai-sdk/openai, @ai-sdk/groq, ollama-ai-provider

Environment variables

KeyRequiredDescription
AI_PROVIDERyesanthropic | openai | groq | ollama
AI_API_KEYyes*Provider API key
AI_MODELnoModel override (e.g. claude-sonnet-4-6)
AI_BASE_URLnoCustom endpoint for Ollama

Provider selection

lib/ai/providers.ts reads AI_PROVIDER and returns the matching @ai-sdk/* model:

// Simplified
export function getModel() {
  switch (process.env.AI_PROVIDER) {
    case 'anthropic': return anthropic(process.env.AI_MODEL ?? 'claude-sonnet-4-6');
    case 'openai': return openai(process.env.AI_MODEL ?? 'gpt-4o');
    case 'groq': return groq(process.env.AI_MODEL ?? 'llama-3.3-70b-versatile');
    case 'ollama': return ollama(process.env.AI_MODEL ?? 'llama3.2');
  }
}

API route

POST /api/assistant

Standard Vercel AI SDK streaming endpoint. No payment verification.

import { streamText } from 'ai';
import { getModel } from '@/lib/ai/providers';

export async function POST(req: Request) {
  const { messages } = await req.json();
  const result = streamText({ model: getModel(), messages });
  return result.toDataStreamResponse();
}

Assistant component

Uses @ai-sdk/react useChat hook connected to /api/assistant. Markdown rendering via react-markdown.

Demo route

/demo/assistant — full chat interface. Requires valid AI_API_KEY in .env.local.

Combining with payments

For sats-per-message, use ai-chat-gated instead. You can run both modules — gated for premium model, assistant for free tier.

On this page