ZTS Docs
AI

AI integration

Multi-provider chat, agents, and user-scoped API keys in the Zero To Shipped boilerplate.

Zero To Shipped ships an AI chat feature built on the Vercel AI SDK (v6). Users bring their own provider API keys; the app stores them in user preferences, not in server .env files.

Stack at a glance

LayerPackage / pathRole
Core AI@zts/ai (packages/ai)Language models, ToolLoopAgent, built-in tools
Provider catalog@zts/sharedProvider list, model catalog, preference keys
Chat APIapps/web/src/app/api/chat/route.tsStreaming agent responses, persistence
Chat UIapps/web/src/components/ai/*useChat, provider picker, workspace
SettingsSettings → AI tabEnable providers, paste keys per user
Mobile demoapps/mobile/src/features/chat/ChatPanel.tsxMinimal useChat example

Enable chat

Set in root .env:

NEXT_PUBLIC_ENABLE_CHAT_PAGE=true

The /chat route and nav entry are gated on this flag. Users still need to configure at least one provider in Settings → AI before sending messages.

How it fits together

flowchart TB
  UI[Chat UI useChat]
  API["POST /api/chat"]
  Agent[ToolLoopAgent @zts/ai]
  Prefs[User preferences aiProviderKey*]
  LLM[createLanguageModel]
  Tools[Built-in + tRPC tools]
  UI --> API
  API --> Prefs
  API --> LLM
  API --> Agent
  Agent --> Tools
  LLM --> Provider[OpenAI / Anthropic / Gemini / ...]
  1. User selects provider + model in the chat header (from configured providers).
  2. POST /api/chat resolves the API key from preferences and builds a language model.
  3. A ToolLoopAgent runs with built-in demo tools and optional tRPC-derived tools.
  4. The response streams back via createAgentUIStreamResponse; messages persist to the database.

Topics

PageWhat you'll learn
ProvidersCatalog, enabled providers, user keys, model + intelligence settings
ChatUI components, chat rows, streaming API contract, mobile notes
AgentsToolLoopAgent, built-in tools, tRPC-as-tools, extending the agent

MCP vs in-app AI

Do not confuse the two agent surfaces:

  • MCP — external tools for Cursor (/api/mcp), driven by apiExposure() on tRPC procedures.
  • In-app chat agent — product feature at /chat, driven by @zts/ai and POST /api/chat.

Package imports

import {
  createLanguageModel,
  createZtsAgent,
  resolveUserAiProvider,
} from "@zts/ai";
 
import { ENABLED_AI_PROVIDERS, AI_PROVIDERS } from "@zts/shared/config/ai-providers";
import { listConfiguredAiProviders } from "@zts/shared/ai/list-configured-providers";

See packages/ai/package.json for subpath exports used in tests and tree-shaking.

  • Env — feature flags including NEXT_PUBLIC_ENABLE_CHAT_PAGE
  • Database — chat and message tables
  • Monorepo layout — where packages/ai lives

On this page