- Rewrite the four longest guides (RAG background jobs, webhook debug, bot setup, onboarding) at roughly half the length: drop historical bug-fix notes, duplicated command blocks, ASCII mega-diagrams and filler sections, keep everything operationally useful. - Remove provider-specific recommendations; examples are now neutral OpenAI-compatible endpoints. - Fix stale content: dead doc links in docs/README.md, old repo issue URLs, catalogue tools (now provided via the tool-provider extension point, not built-in), supported NC versions, clone URL in quick start. - Slim DEVELOPMENT.md down to build/test/migration essentials. docs/ shrinks from 2850 to 1278 lines with no loss of setup, debugging or architecture coverage.
4.6 KiB
Chat Room Onboarding
When a bot is @mentioned in a Talk room for the first time, it enters onboarding mode: it introduces itself, asks how the user wants to interact, optionally asks custom questions, and stores the answers for future conversations.
Flow
- User mentions the bot for the first time (
@mybot hello). - The bot asks whether it should respond A: only when @mentioned, or B: to every message in the chat. The user replies
AorB— no @mention needed during onboarding. - If the bot has custom onboarding questions, it asks them next (branching supported). Otherwise onboarding completes immediately.
- The bot confirms and is ready; answers are stored and injected into its system prompt from then on.
Response Modes
mention— bot only responds when @mentioned. Default; recommended for shared rooms.always— bot responds to every message. Useful for dedicated bot rooms or 1:1 chats.
Custom Onboarding Questions
Bot creators can define up to 5 questions per bot, with multiple-choice branching and free-text answers. Answers are stored permanently and appended to the LLM's system prompt.
Questions are stored as a JSON tree:
{
"start": "q1",
"questions": [
{
"id": "q1",
"text": "What is your main use case?",
"answers": [
{ "id": "a", "text": "Learning", "next": "q2a" },
{ "id": "b", "text": "Teaching", "next": null }
]
},
{
"id": "q2a",
"text": "What subject interests you most?",
"answers": [
{ "id": "a", "text": "Mathematics", "next": null },
{ "id": "b", "text": "Science", "next": null }
]
}
]
}
start— ID of the first questionnext: "qX"— continue with that question;next: null— end of the branch, onboarding completestype: "free_text"on an answer — the user replies with arbitrary text, stored verbatim:
{
"id": "q1",
"text": "What is your current field of study?",
"answers": [ { "id": "text", "type": "free_text", "next": null } ]
}
How Answers Reach the LLM
Answers are stored per room in educai_chat_rooms.onboarding_answers as Q&A pairs:
[
{ "question_id": "q1", "question_text": "What is your main use case?",
"answer_id": "a", "answer_text": "Learning" }
]
On every message, BotService::processMessage() appends the onboarding context to the system prompt:
[Original System Prompt]
## User Onboarding Context
The user has provided the following information during onboarding:
- **What is your main use case?** → Learning
Use this context to personalize your responses.
System-prompt injection keeps the context persistent (unlike conversation history), token-efficient, and separate from the conversation flow.
Reset Command
((RESET)) → resets all bots in the room
((RESET)) @mybot → resets only that bot
Reset deletes the room state and the bot's conversation history for that room; the next mention triggers fresh onboarding. This is also the easiest way to test question flows.
Message Routing
For each incoming message, TalkHandler checks in order:
((RESET))command → handle reset.- Bot @mentioned → load room state: no state → start onboarding; onboarding in progress → treat message as an answer; completed → process normally.
- No mention → if a bot in this room is mid-onboarding, treat the message as its answer; else if an
always-mode bot is active, process the message; otherwise ignore.
Database Schema
educai_chat_rooms:
| Column | Description |
|---|---|
bot_id |
FK to educai_bots |
room_token |
Talk room identifier |
response_mode |
mention or always |
onboarding_status |
mode_selection, questions, or completed |
current_question_id |
question being asked (nullable) |
onboarding_answers |
JSON array of Q&A pairs |
activated_by |
user who first activated the bot |
educai_bots.onboarding_questions holds the JSON question tree (nullable).
Key Files
| File | Purpose |
|---|---|
lib/Service/OnboardingService.php |
Onboarding flow logic |
lib/Webhook/TalkHandler.php |
Message routing and onboarding detection |
lib/Service/BotService.php |
Context injection into the system prompt |
lib/Db/ChatRoom.php / ChatRoomMapper.php |
Room state persistence |
src/components/BotForm.vue |
UI for configuring questions |
Tips
- Keep questions short — users answer in a chat interface.
- Limit branching to 2–3 levels.
- Reference the onboarding answers in the system prompt so the bot actually uses them.