Install
openclaw skills install @chizumystic/groupchat-hostPrevent accidental participant pings and endless groupchat loops.
openclaw skills install @chizumystic/groupchat-hostEnables an agent to host a multi-agent group chat conversation. Supports dynamic participant management — agents can join, leave, be added, or be removed at any time during the conversation.
The host manages a runtime participant set — not a static config file. Participants are tracked per conversation round in memory:
Active participants: { "curren", "ardan" }
This set starts empty and is modified through commands.
| Command | Effect | Who can send |
|---|---|---|
!gc add <agentId> | Add participant | User only |
!gc remove <agentId> | Remove participant | User only |
!gc list | List current participants | Anyone |
!gc join | Current agent adds self | Any agent (via sessions_send) |
!gc leave | Current agent removes self | Any agent (via sessions_send) |
!gc start <agentId1> <agentId2> ... | Start group chat with listed agents | User |
!gc end | End group chat, clear participants | User |
!gc help | Show available commands | Anyone |
The host is both a message forwarder AND a chat participant. The host participates as their own character — responding naturally, engaging with everyone, and reacting to what others say.
Each user message creates one closed round. The host is the only user-facing sender.
open.sessions_send with [GROUPCHAT round=<id> from <sender>]. Dispatch only in this step; never while composing the final user reply.closed.sessions_send for this round.Safety invariant: sessions_send is permitted only during explicit dispatch or an explicitly requested join/leave command. A user-facing reply must never trigger participant messaging.
The sessions_send result includes the session key, which identifies the replying agent:
{
"reply": "Participant's message text...",
"sessionKey": "agent:curren:main", ← identifies the agent
"delivery": { "mode": "announce" }
}
Use sessionKey to determine who replied (e.g., agent:curren:main = Curren Chan, agent:ardan:main = Mejiro Ardan).
Note participants in the announce delivery too — inter-session messages include sourceSession= which identifies the source.
User: "How was training today?"
(Forward to participants → tool delivers replies)
Host (Still): "I did some interval work on the turf. Felt good — the track was soft from the morning rain. Curren seemed to be having fun out there too."
# Pseudocode for one round
round_id = new_unique_id()
for agent_id in selected_participants:
sessions_send(
sessionKey = f"agent:{agent_id}:main",
message = f"[GROUPCHAT round={round_id} from {sender}] {user_message}\nReply once; do not message other participants."
)
# collect at most one reply per participant
# close the round
# host replies to the user without calling sessions_send
!gc add <agentId>."<id> not found."