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

Which provider answers the chat. "Use" switches immediately, with that provider's saved model. "Edit" loads it into the form below.

ProviderKeyModelPlan

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.