# AI features in your app

> Chatbots, generated content, summaries, and images inside the apps you build: the pattern, the costs, and the guardrails.

Vaulter uses AI to build your app; this page is about your app using AI itself: a support assistant, generated descriptions, summarized documents, images on demand. The pattern is one connector plus one clear prompt, and the costs work differently than you might expect.

## The shape of every AI feature

Connect an AI provider ([OpenAI](/docs/integrations/openai), Anthropic, or Google Gemini) with your API key, then describe the feature by its job:

- **A chat assistant:**
  > Add an assistant tab where signed-in users ask questions about their own bookings and get answers based on their data. Keep answers short and friendly, and show a typing indicator while it responds.
- **Content generation:**
  > On the product form, add a "write description" button that generates a product description from the name, category, and bullet points, which I can edit before saving.
- **Summarizing:**
  > When a user uploads a document to their case, generate a three-sentence summary and show it on the case card.
- **Image generation:**
  > On the listing form, add a "generate image" button that creates an illustration from the listing title and style notes, using OpenAI, and saves the chosen one to the listing.

In every case, say **whose data** the AI may see ("their own bookings") the way you would for any [data privacy](/docs/data/data-privacy) decision, and say what the user can do with the output (edit, regenerate, save).

## The costs, honestly

Three separate meters, and only one of them is Vaulter tokens:

1. **Building the feature** costs Vaulter tokens once, like any feature.
2. **Every AI call your app makes** is billed by the provider to **your** API key, forever, in preview and production alike. A popular free-to-use AI feature is you buying AI for the public; decide on purpose whether that is your business model.
3. **Vaulter's [guardrails](/docs/integrations/limits-and-scope)** are your brakes: the 60-per-minute rate limit is automatic, and the owner spend quota is the one to set deliberately before publishing an AI feature to strangers. Also consider gating the feature behind [sign-in](/docs/auth/add-sign-in) or a [paid plan in your own app](/docs/integrations/stripe-payments), which turns an open tap into a metered one.

## Expectations worth setting

- **Latency is real.** Model calls take seconds, not milliseconds, and the answer arrives whole rather than typing itself out word by word. Ask for the interface to show clear progress while it waits, and prefer designs built on short answers; a long essay makes the wait feel longer.
- **Outputs vary.** The same request produces different phrasings on different runs, for the [same reason the build agent's do](/docs/building/why-ai-behaves-this-way). For generated content, an edit-before-save step keeps you in control of what your app publishes.
- **Pick the model per job.** Cheap, fast models are right for descriptions and summaries; reserve the expensive ones for the assistant that carries your product. Name your choice in the prompt, and revisit it when your provider ships new models.

## Frequently asked

#### Which provider should I connect?

Any of the three majors handles chat, and the differences at this level are mostly price and taste. Practical answer: the one you already have an account and billing set up with. OpenAI is the common default and the one with image generation on the same key.

#### Can the assistant answer from my app's own content?

Yes, and say so explicitly: "answer using the help articles stored in the app, and say 'I don't know' rather than inventing an answer". Grounding it in your data and permitting "I don't know" are the two lines that most improve real-world quality.

#### What happens if my provider key hits its spending limit?

Calls fail and the feature shows its error state (ask for a friendly one). Your app otherwise keeps working. Between the provider's own budget controls and Vaulter's owner quota, set the layer you want to hit first.
