Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when the user wants to add a configurable AI chatbot/assistant to a web app - a help bubble in the corner, a support bot, or an in-game NPC dialog - with a custom persona, scope guardrails, and static knowledge, powered by Gipity's LLM service with no API keys.
.claude/skills/gipityai-chatbot/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -12% | 0% |
<!-- GENERATED from platform/docs/skills/chatbot.md by platform/scripts/sync-claude-plugin.ts - do not edit here. -->
> Gipity required. This skill needs the gipity CLI linked to a project. If gipity status errors or shows no project, run the setup flow in the gipity skill first (in Claude Code or Grok: /gipity:setup; in Codex or any other agent, follow the gipity skill's setup steps directly). > > This doc is shared across Gipity surfaces; where it names an agent tool, use the CLI equivalent: add → gipity add <name>, file_write/file_read/file_delete → edit files in the project directory directly (they auto-sync), project_deploy → gipity deploy dev, code_execute → gipity sandbox run. The live version of this doc: gipity skill read chatbot.
chatbot is a Gipity kit that drops a configurable AI assistant into any web app: a help bubble in the corner, a support bot, or an in-game NPC dialog. You give it a persona, optional scope guardrails (what it will and won't answer), and optional static knowledge; it streams answers from Gipity's LLM service. No API keys, no backend to write.
bashgipity add chatbot
The installer drops the kit into src/packages/chatbot/, wires the import map (import { mount } from '@gipity/chatbot'), and declares llm: owner_pays in your gipity.yaml so logged-out visitors can use the bot. Frontend-only: no migrations, no functions. Run gipity deploy dev to ship.
1) Bubble widget (default) - a <chatbot-widget> custom element, floating launcher in the corner. The launcher shows a 💬 emoji by default; set ui.launcherIcon to an image URL to replace it. Assistant replies render minimal inline markdown (bold, italic, code, fenced blocks) with everything else HTML-escaped, so markdown in persona/knowledge answers displays properly:
html<chatbot-widget id="bot"></chatbot-widget> <script type="module"> import { mount } from '@gipity/chatbot'; import config from './js/chatbot.config.js'; mount('#bot', config); </script>
2) Headless engine - bring your own UI (an in-game NPC dialog box, a custom panel):
jsimport { createChatbot } from '@gipity/chatbot'; import config from './js/chatbot.config.js'; const bot = createChatbot(config); bot.on('delta', (text) => myUi.append(text)); // streaming chunks bot.on('complete', () => myUi.stopThinking()); await bot.send('how do I fly the ship?');
Install scaffolds src/js/chatbot.config.js with every key present, commented, and pre-filled - persona, scope guardrails (with a worked refusal example), a knowledge placeholder, ui, model. Edit it in place; it is the config reference, so don't go looking for the shape elsewhere. Only persona.name and persona.instructions are required.
One thing worth knowing before you edit it: scope is what keeps the bot on-topic ("if someone asks something off-topic it should politely decline"). Fill allowed / refused / onRefusal, and keep at least one refusalExamples pair - the worked example is what makes the guardrail hold in character. (A stricter pre-classification step is on the roadmap.)
Give the bot facts to answer from. Two source types today:
{ type: 'text', content: '...' } - inline text, validated at config-load.{ type: 'url', url: 'https://...' } - fetched once when the engine starts.If the combined sources exceed maxTokens (default 20,000; estimate is chars / 4), the kit throws rather than silently truncating - trim the sources or raise the budget. File-based knowledge and RAG embeddings are on the roadmap; for now inline the content as a text source.
Colors come from CSS variables. theme: 'match-app' (the default) reads --primary from the host page, so the bot matches your app automatically (the templates' gipity-theme.css defines --primary). Override per-instance with ui.primaryColor. The widget uses Shadow DOM, so host CSS won't leak in.
When you drive the bot yourself with createChatbot(config):
jsbot.on('start', () => {}); // a send is starting bot.on('delta', (text) => {}); // streaming text chunk bot.on('message', (msg) => {}); // a full message landed in history bot.on('complete', (msg) => {}); // assistant response finished bot.on('usage', (u) => {}); // tokens / credits, when reported bot.on('reset', () => {}); // history cleared bot.on('error', (err) => {}); // something threw bot.on('knowledge_loaded', ({ tokens }) => {}); // a url source finished loading
Tool-calling (an explicit tools allowlist exists in the config but project-function calling lands in a later PR), voice (app-tts + app-audio), vision, image generation, and persisted per-user history (storage) are wired in later PRs - the config keys are present but inert today. Build against persona + scope + knowledge for now.
After wiring it up, gipity deploy dev and open the page - the launcher should appear in the corner; the greeting renders on first open and the starter chips show before the first message.
app-llm - the LLM service the chatbot calls under the hoodweb-app-basics / web-ui-patterns - building and styling the host pagedeploy - the deploy pipeline| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 10,219 | 7,379 | -28% | 1 | 1 | 0% | 2,334 | 2,888 | +24% | 0 | 0 | — |
case-02 | fail→pass | 12,715 | 5,005 | -61% | 1 | 1 | 0% | 2,456 | 2,579 | +5% | 0 | 0 | — |
case-03 | fail→pass | 12,246 | 5,667 | -54% | 1 | 1 | 0% | 2,320 | 2,585 | +11% | 0 | 0 | — |
case-04 | fail→pass | 8,709 | 1,510 | -83% | 1 | 1 | 0% | 1,581 | 1,701 | +8% | 0 | 0 | — |
case-05 | fail→pass | 11,070 | 2,501 | -77% | 1 | 1 | 0% | 2,172 | 1,904 | -12% | 0 | 0 | — |
case-06 | fail→pass | 11,262 | 3,249 | -71% | 1 | 1 | 0% | 2,146 | 2,124 | -1% | 0 | 0 | — |
case-07 | pass→pass | 13,638 | 7,509 | -45% | 1 | 1 | 0% | 2,848 | 2,513 | -12% | 0 | 0 | — |
case-08 | fail→pass | 13,112 | 1,473 | -89% | 1 | 1 | 0% | 2,495 | 1,763 | -29% | 0 | 0 | — |
case-09 | fail→pass | 13,149 | 1,856 | -86% | 1 | 1 | 0% | 2,481 | 1,851 | -25% | 0 | 0 | — |
case-10 | fail→pass | 8,995 | 3,008 | -67% | 1 | 1 | 0% | 1,762 | 1,982 | +12% | 0 | 0 | — |
case-11 | fail→pass | 12,799 | 3,375 | -74% | 1 | 1 | 0% | 2,238 | 2,146 | -4% | 0 | 0 | — |
case-12 | fail→pass | 12,655 | 1,865 | -85% | 1 | 1 | 0% | 2,767 | 1,777 | -36% | 0 | 0 | — |
case-13 | fail→pass | 9,631 | 3,790 | -61% | 1 | 1 | 0% | 1,847 | 2,169 | +17% | 0 | 0 | — |
case-14 | fail→pass | 16,116 | 1,514 | -91% | 1 | 1 | 0% | 3,096 | 1,734 | -44% | 0 | 0 | — |
case-15 | fail→pass | 14,145 | 8,310 | -41% | 1 | 1 | 0% | 2,697 | 2,993 | +11% | 0 | 0 | — |
case-16 | fail→pass | 9,622 | 2,531 | -74% | 1 | 1 | 0% | 2,057 | 2,013 | -2% | 0 | 0 | — |
case-17 | fail→pass | 10,228 | 2,169 | -79% | 1 | 1 | 0% | 2,174 | 1,851 | -15% | 0 | 0 | — |
case-18 | fail→pass | 8,506 | 2,000 | -76% | 1 | 1 | 0% | 1,629 | 1,878 | +15% | 0 | 0 | — |
case-19 | fail→pass | 13,033 | 1,520 | -88% | 1 | 1 | 0% | 2,903 | 1,730 | -40% | 0 | 0 | — |
case-20 | pass→pass | 10,585 | 8,236 | -22% | 1 | 1 | 0% | 2,618 | 3,336 | +27% | 0 | 0 | — |
case-21 | pass→pass | 7,909 | 4,510 | -43% | 1 | 1 | 0% | 1,797 | 2,348 | +31% | 0 | 0 | — |
case-22 | pass→pass | 8,765 | 7,555 | -14% | 1 | 1 | 0% | 1,966 | 3,082 | +57% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +82 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/3/2026 | +59% |
Other measured skills in the registry, with their headline benchmark lift.