Support bot — admin

Settings on the right, the live chat on the left. Everything is stored in the bot's SQLite database; keys are only ever shown masked. The API for embedding the chat in another website is documented at the bottom.
Loading…

Providers

Keys and models per provider. "Edit" loads one into the form below. Which ones answer the chat, and in what order, is set in Fallback order; "Use first" moves a provider to the top of it.

ProviderKeyModelPlan

Fallback order

The chat asks the first provider; if it fails (error, timeout, empty answer) the next one takes over, within one 55-second budget. Providers without a key are skipped. Drag rows or use ↑ ↓, then save.

    Provider settings —

    Leave blank for the preset. Custom = any OpenAI-compatible endpoint.
    Used by the cost table's "your plan" column.

    Generation

    Applies to every provider.

    Blank = provider default. Claude Sonnet 5.5 and OpenAI gpt-5 reject a temperature.
    "low" lets Sonnet/Haiku 5.5 skip thinking on simple questions. Blank for Claude 4.5 and older.
    Only for reasoning models (OpenAI gpt-5 / o-series; Gemini 2.5 "none"). Leave blank otherwise.
    How much of the conversation the bot remembers. Each message adds input tokens to every turn.

    Hand-off

    When the bot cannot answer from the context, the chat shows this message and these buttons instead of the model's wording. Empty links are hidden.

    Leave empty to show the model's own wording instead.

    FAQ

    Shown as buttons under the chat. A click answers with this text instantly — no model call, no cost. Still recorded in the conversation history and counted by the rate limits.

    Security

    reCAPTCHA v3 scores every message invisibly. Below the minimum score the chat shows the v2 "I'm not a robot" checkbox (if v2 keys are set); a passed checkbox trusts that conversation for 10 minutes. Keys come from google.com/recaptcha/admin — v3 and v2 are separate key pairs. Google accepts domains only (no IPs): with a bare IP, turn off "Verify the origin of reCAPTCHA solutions" in the key settings.

    0.0 = bot, 1.0 = human. Google's default is 0.5.

    Allowed website origins (CORS for the public chat API)

    Websites that may call the chat API from a browser. * = any site. Server-to-server calls are not affected. The admin API is never exposed to other sites.

    Rate limits (answered messages; 0 = off)

    Context (knowledge)

    Everything the bot is allowed to answer from. Sent with every message (cached where the provider supports it).

    Conversations

    Every message, user and assistant, including refused ones (rate limit, captcha, provider error).

    Last messageFirst questionAnsweredRefusedHand-offsIP

    API usage

    One row per model call (chat answers and admin tests), with the token counts the provider reported and the estimated cost at the prices in src/pricing.ts. FAQ answers make no call and do not appear here.

    Provider · modelCallsErrorsInputCache readCache writeOutputThinkingNeuronsAvg promptAvg timeEst. cost

    Recent calls

    TimeSourceModelInputCache R/WOutputNeuronsmsCostStatus

    Cost comparison

    Estimated from the current context size, measured per tokenizer. Prices as published on 2026-10-13 (USD per million tokens); always confirm on the provider's pricing page.

    ModelInput tok/msg$ / message1,000 messages1,000 conversationsPer monthYour plan

    API for integration

    Public endpoints (/api/*) are what another website uses — they return the conversation only. Admin endpoints (/api/admin/*) need the x-api-key-admin-chatbot header. Every operation has a Try it form. (OpenAPI 3.1 — import into Swagger UI or Postman).

    Quickest: embed the ready-made widget

    
        

    Flow

    1. GET /api/info on load → FAQ buttons, and reCAPTCHA keys if enabled.
    2. Generate one UUID v4 chatId per conversation and keep it (e.g. sessionStorage); GET /api/chat/history re-renders it after a reload.
    3. FAQ click → POST /api/faq/answer. Typed question → POST /api/chat with only the new message (plus a reCAPTCHA v3 token when enabled).
    4. 403 with captcha: "v2" → show the v2 checkbox and resend with captchaV2Token. 429 → show the message and wait.
    5. handoff: true → render handoffLinks as buttons.