A source group is a named set of sources inside one knowledge base. Each surface (a widget, a support form, a bot) can then answer from only the groups you pick. Use groups for:
  • Docs versions: v1, v2, latest.
  • Products that share one knowledge base.
  • Audiences: public docs and internal runbooks.

Create groups and assign sources

1

Create a group

On the knowledge base’s Sources tab, click Groups. Enter a name (and an optional description) and click Create group.
2

Assign sources

Pick the Group when you add a source. For an existing source, open its Configuration tab, click Edit, and change Group. A source belongs to one group at most.
3

Scope your surfaces

Choose which groups each surface answers from. See below.
When you move a source to another group, everything it has already indexed moves with it as soon as you save. You don’t need to sync again. Deleting a group does not delete its sources. They become ungrouped.

Choose which groups a surface answers from

SurfaceWhere to set it
Website widgetSource groups in the widget’s settings, or data-source-group-ids="<id>,<id>" on the script tag. See Website widget.
Support form deflectorSource groups in the deflector’s settings. See Form deflector.
Slack and Teams botsSource groups in the bot’s settings. See Bots.
Ask and the PlaygroundThe Groups / Source groups filter above the question box.
SDKsgroupIds. See Web SDK.
Public APIgroup_ids on chat, search, form-deflect and WebSocket requests.
{ "query": "How do I paginate?", "group_ids": ["3f2a6c1e-…"] }
How scoping works:
  • No groups picked means every source in the knowledge base is searched.
  • With groups picked, only sources in those groups are searched. Ungrouped sources are left out, including your Custom Answers unless their source is in one of the groups.
  • A page’s own setting can only narrow what the surface allows, never widen it.
To find a group’s ID, click Groups on the Sources tab. Each group shows its ID with a copy button. Where a surface has a Source groups picker, you can use that instead of typing IDs.

Versioned docs

Add one source per version (for example one GitHub Files source per branch, or one website source per version path). Give each a Version label such as v2 when you add it, put each in its own group, and scope each docs version’s widget to its group. Kelu passes the version label to the model with every excerpt, so it can say which version an answer applies to. If you change a source’s version label later on its Configuration tab, content already indexed gets the new label as soon as you save. For how often sources re-sync, see Keeping content fresh.

Get notified when things happen

A knowledge base can send events to your own URL. There is no dashboard screen for this yet: register the URL through the management API, as a member with the Config permission on the knowledge base.
POST /api/v1/knowledge-bases/:id/webhook-triggers
{
  "name": "Deflection alerts",
  "url": "https://example.com/hooks/kelu",
  "events": ["ticket.deflected", "ticket.escalated"],
  "secret": "a-long-random-string"
}
GET on the same path lists a knowledge base’s webhooks, and DELETE /api/v1/webhook-triggers/:id removes one.
EventSent whendata includes
conversation.completedA chat answer is finishedconversation_id, message_id, answer_excerpt
deflection.completedThe support form deflector answeredconversation_id, confidence, deflected
ticket.deflectedHelpdesk automation answered a ticketintegration_id, ticket_id
ticket.escalatedHelpdesk automation handed a ticket or chat to a personintegration_id, ticket_id, reason. On tickets and Intercom, reason is always customer_replied. On Zendesk Messaging and Freshchat chats it says why: customer_asked, turn_cap (Kelu gave its 5 answers), low_confidence, or answer_failed (Kelu couldn’t write or post an answer)
simulation.completedA deflection simulation finishedsimulation_id, integration_id, total, completed
Each delivery is a POST with a JSON body of event, knowledge_base_id, data and timestamp, and an X-Kelu-Event header naming the event. With a secret set, X-Kelu-Signature holds the hex HMAC-SHA256 of the raw body. Check it before trusting the payload. Deliveries are not retried, and your endpoint has 10 seconds to answer.