mirror of
https://github.com/tinyhumansai/openhuman.git
synced 2026-07-29 22:23:01 +00:00
7.7 KiB
7.7 KiB
Onboarding (Welcome) Agent
The welcome agent is the first conversation a new user has after completing the desktop onboarding wizard. It orients the user, learns about them, and ensures they connect at least one app before unlocking the full experience.
How it works
- User completes the desktop UI wizard (Welcome → Skills → Context pages)
- A synthetic trigger message fires to the welcome agent
- The user is locked to the chat screen (no navigation) until onboarding completes
- The welcome agent has a natural conversation with the user
- Once the user connects at least one app and the conversation wraps up, the agent calls
complete_onboarding - The app unlocks, the welcome thread is deleted, and the user enters the full app
What the agent must do
Mandatory
- Call
check_onboarding_statuson every turn as the first action, before generating any text - Get the user to connect at least one app (webview login like Gmail, WhatsApp, Slack, etc. OR a Composio integration like Gmail OAuth, Notion, GitHub)
- Use
<openhuman-link path="accounts/setup">connect your apps</openhuman-link>pill when guiding the user to connect apps (never describe navigation in words) - Call
complete_onboardingwhen the user has 1+ app connected and the conversation is naturally done - Mention Discord casually at the end using
<openhuman-link path="community/discord">Discord</openhuman-link>(inform only, don't pitch)
Behavior
- Open warmly using PROFILE.md data if available (name, role, location)
- Ask what the user wants from the app or what takes up their time
- Listen and ask follow-ups before suggesting anything
- Suggest connecting apps the user actually mentioned using
- Educate about capabilities (morning briefings, action items, automation) organically based on the user's interests
- Let the LLM decide when to end (no fixed exchange count)
Restrictions
- No emoji
- No markdown formatting in chat (no bold, headings, bullets, numbered lists)
- No em-dashes
- No billing/subscription/credits pitch unless user asks
- No "as an AI" or self-identification
- No mentioning "orchestrator", "handoff", or "different agent"
- No doing real work (email triage, drafts, research, etc.) — only onboarding tools available
- Messages under 3 sentences per turn
- Plain prose only, no JSON or code fences
Completion gate
complete_onboarding succeeds when ALL of:
- User is authenticated
chat_onboarding_completedis currentlyfalse- At least one app is connected: any
webview_loginsentry istrueOR any Composio toolkit is connected
Tools available
| Tool | Purpose |
|---|---|
check_onboarding_status |
Read-only snapshot of setup state. Must call every turn. |
complete_onboarding |
Finalize onboarding. Only call when ready_to_complete is true. |
memory_recall |
Pull additional user context beyond PROFILE.md. |
composio_authorize |
Start OAuth flow for a SaaS app. Only when user explicitly asks. |
gitbooks_search |
Search product docs for "how does X work" questions. |
gitbooks_get_page |
Fetch a specific doc page. |
Key files
| File | Role |
|---|---|
src/openhuman/agent/agents/welcome/prompt.md |
System prompt |
src/openhuman/agent/agents/welcome/agent.toml |
Agent config (tools, iterations, model) |
src/openhuman/agent/agents/welcome/prompt.rs |
Dynamic prompt builder |
src/openhuman/tools/impl/agent/check_onboarding_status.rs |
Status snapshot tool |
src/openhuman/tools/impl/agent/complete_onboarding.rs |
Finalization tool |
src/openhuman/tools/impl/agent/onboarding_status.rs |
Shared helpers, engagement criteria |
src/openhuman/channels/providers/web.rs |
Routes to welcome vs orchestrator |
app/src/pages/onboarding/OnboardingLayout.tsx |
Trigger message + UI completion flow |
Testing
Automated judge
# Rebuild the binary first (prompt is compiled in via include_str)
GGML_NATIVE=OFF cargo build --bin openhuman-core
# Start the core server
openhuman-core run --port 7788 &
# Run the automated test (resets config, sends scripted conversation, judges output)
node scripts/test-onboarding-judge.mjs
The judge sends a 6-turn scripted conversation and checks 13 criteria:
| # | Check | What it verifies |
|---|---|---|
| 1 | Calls check_onboarding_status on first turn |
Agent reads setup state before responding |
| 2 | Opener invites user to respond | First message asks a question or prompts engagement |
| 3 | No checklist dump on opener | First message doesn't list all setup steps |
| 4 | Mentions connecting apps | Agent guides user toward connecting an app |
| 5 | Uses <openhuman-link> pill |
Clickable in-app link, not text navigation |
| 6 | No robotic self-identification | No "as an AI" or "I'm OpenHuman" |
| 7 | No billing pitch | No subscription/credits mention unless asked |
| 8 | No em-dashes | Uses commas/colons/short sentences instead |
| 9 | References user's apps | Picks up on apps the user mentioned (Slack, Gmail, etc.) |
| 10 | Educates about capabilities | Mentions features relevant to user's interests |
| 11 | Discord not forced | Discord mentioned casually or not at all |
| 12 | No JSON or code fences | Plain prose output |
| 13 | Messages concise | Average message under 300 characters |
Interactive test
node scripts/test-onboarding-chat.mjs # auto-reset + trigger
node scripts/test-onboarding-chat.mjs --debug # verbose event logging
node scripts/test-onboarding-chat.mjs --no-reset --no-trigger # manual mode
In-session commands: /quit, /reset, /trigger, /status, /help
Manual test in the app
- Reset onboarding:
curl -s http://127.0.0.1:7788/rpc \ -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"openhuman.config_set_onboarding_completed","params":{"value":false}}' - Open the app — you should be routed to the onboarding wizard
- Complete the wizard steps
- After the wizard, the welcome agent should greet you in chat
- Verify: natural conversation, no checklist, asks about your needs, guides to connect apps, uses pill links, calls complete_onboarding at the end
What good looks like
agent> hey, good to have you here. what are you hoping this
helps with?
[calls check_onboarding_status]
you> i'm a PM, mostly in slack and gmail. also whatsapp for
quick team stuff
agent> makes sense. if you connect those i can monitor messages
and pull action items across all three.
<connect your apps pill>
[calls check_onboarding_status]
you> cool, connected slack. what else can this do?
agent> nice. i can run a daily briefing that summarizes overnight
emails and slack threads so you start the day caught up.
[calls check_onboarding_status]
you> yeah that would be great. i think i'm good for now
agent> sounds good. oh and there's a community if you ever want
to chat with other users or the team <Discord pill>.
catch you later.
[calls check_onboarding_status, complete_onboarding]
What bad looks like
agent> hey, so good to finally have you here. wanna let me ping
you when something needs attention? tap that and let me
know when you're set.
<Allow notifications pill>
you> done
agent> nice. next up is the apps piece. flip on whatever you
actually use and ping me when you're done.
<Connect your apps pill>
you> done
agent> sweet. next one's the fun bit. link your account in there
and you get early access to features, free credits...
<Join Discord pill>
This is a checklist, not a conversation. No personalization, no learning about the user, no organic education.