tinyhumansai/openhuman · error
Core rejected the agent_meetings_join request.
Error message
Core rejected the agent_meetings_join request.
What it means
The openhuman.agent_meetings_join RPC round-tripped but the core/backend answered ok:false — the join request was rejected downstream. The frontend sends the trimmed URL plus optional mascot slots (snake_case mapped), system prompt, listen_only and correlation_id to the backend's Recall.ai bot over the core's Socket.IO bridge; ok:false means the backend refused or the core could not emit bot:join.
Solutions
- Inspect the core's backend-bot logs — the ok:false is produced after the backend replies (bot:reply error event) and the reason is logged Rust-side
- Verify the URL matches a supported platform pattern before calling join
- Confirm backend connectivity: the core must hold a live Socket.IO session (check connections/health panel)
- Retry after resolving capacity/auth; surface the backend's reason string to the user instead of the generic message
Example fix
// before
const r = await joinMeetViaBackendBot({ meetUrl });
// after
const MEET_URL_RE = /^https:\/\/(meet\.google\.com|zoom\.us|teams\.microsoft\.com|webex\.com)\//;
if (!MEET_URL_RE.test(meetUrl)) throw new Error('Unsupported meeting link — use Google Meet, Zoom, Teams or Webex.');
const r = await joinMeetViaBackendBot({ meetUrl }); Defensive patterns
Strategy: try-catch
Validate before calling
function looksLikeMeetingUrl(u: string): boolean {
return /^https:\/\/(meet\.google\.com|.*\.zoom\.us|teams\.microsoft\.com|.*\.webex\.com)\//i.test(u.trim());
} Type guard
function isJoinRejected(err: unknown): boolean {
return err instanceof Error && err.message.includes('agent_meetings_join');
} Try / catch
try {
return await joinMeetViaBackendBot(input);
} catch (err) {
if (isJoinRejected(err)) {
// ok:false came from backend bot join — check core logs for the bot:reply reason
showJoinFailed('The meeting bot could not join. Check the link and try again.');
return null;
}
throw err;
} Prevention
- Client-side-validate the platform before calling join — most ok:false joins are unsupported URLs
- Surface the backend's reason (core log / bot:reply event) instead of the generic message
- Confirm backend connectivity (Socket.IO session) before offering Join
When it happens
Trigger: Unsupported or malformed meeting platform/URL (not Google Meet/Zoom/Teams/Webex); backend rejects the bot join (capacity, auth, room unavailable); the core's persistent Socket.IO connection to the backend is down so join dispatch fails; invalid mascot_id or voice_id rejected server-side.
Common situations: Backend outage or expired backend session; pasting a personal-meeting-room link of an unsupported provider; concurrent join attempts exceeding the account's bot quota; mascot configuration referencing deleted mascots.
Related errors
- Core rejected the meet_agent_get_call_detail request.
- Core rejected the meet_agent_list_calls request.
- Core rejected the meet_get_event_policies request.
- Core rejected the meet_list_upcoming request.
- Core rejected the meet_set_event_policy request.
AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17).
Data as JSON: /api/errors/b618d660fb1a326c.
Report an issue: GitHub.
Appendix: source
Thrown at app/src/services/meetCallService.ts:272
method: 'openhuman.agent_meetings_join',
params: {
meet_url: meetUrl,
display_name: input.displayName?.trim() || undefined,
platform: input.platform || undefined,
agent_name: input.agentName?.trim() || undefined,
system_prompt: input.systemPrompt?.trim() || undefined,
mascot_id: input.mascotId?.trim() || undefined,
respond_to_participant: input.respondToParticipant?.trim() || undefined,
wake_phrase: input.wakePhrase?.trim() || undefined,
correlation_id: input.correlationId?.trim() || undefined,
listen_only: input.listenOnly ?? undefined,
rive_colors: mapRiveColors(input.riveColors),
mascots,
},
});
if (!result?.ok) {
throw new Error('Core rejected the agent_meetings_join request.');
}
return { meetUrl: result.meet_url, platform: result.platform };
}
/**
* Ask the backend bot to leave the current meeting.
*/
export async function leaveBackendMeetBot(reason?: string): Promise<void> {
await callCoreRpc<{ ok: boolean }>({
method: 'openhuman.agent_meetings_leave',
params: { reason: reason || 'requested' },
});
}
/**
* Send a tool execution result back to the backend's meeting LLM.
*/View on GitHub (pinned to 7491200858)