chore(i18n): refresh nl translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-05-04 07:12:04 +00:00
parent 0efca9a45b
commit ac60263840
38 changed files with 5613 additions and 4927 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,43 +1,43 @@
---
read_when:
- Slack instellen of de socket-/HTTP-modus van Slack debuggen
summary: Slack-configuratie en runtimegedrag (Socketmodus + HTTP-verzoek-URL's)
- Slack instellen of de Slack-socket-/HTTP-modus debuggen
summary: Slack-configuratie en runtimegedrag (Socket Mode + HTTP-verzoek-URL's)
title: Slack
x-i18n:
generated_at: "2026-05-04T02:22:14Z"
generated_at: "2026-05-04T07:02:42Z"
model: gpt-5.5
provider: openai
source_hash: 2be45f03511a64373b1f4316c59800eeeef8baccb4c00454b49999258b2e546b
source_hash: d4a91fc1ae5f1e03f714308be54e164ef204809e74efabed8dc75c3035c14228
source_path: channels/slack.md
workflow: 16
---
Productieklaar voor DM's en kanalen via Slack-appintegraties. De standaardmodus is Socket Mode; HTTP Request URLs worden ook ondersteund.
Productieklaar voor DM's en kanalen via Slack-app-integraties. De standaardmodus is Socket Mode; HTTP Request URLs worden ook ondersteund.
<CardGroup cols={3}>
<Card title="Koppelen" icon="link" href="/nl/channels/pairing">
Slack-DM's gebruiken standaard de koppelmodus.
Slack-DM's gebruiken standaard de koppelingsmodus.
</Card>
<Card title="Slash-opdrachten" icon="terminal" href="/nl/tools/slash-commands">
Native opdrachtgedrag en opdrachtcatalogus.
Ingebouwd opdrachtgedrag en opdrachtcatalogus.
</Card>
<Card title="Kanaalproblemen oplossen" icon="wrench" href="/nl/channels/troubleshooting">
Kanaaloverschrijdende diagnostiek en herstelplaybooks.
<Card title="Probleemoplossing voor kanalen" icon="wrench" href="/nl/channels/troubleshooting">
Kanaaloverstijgende diagnostiek en reparatieprocedures.
</Card>
</CardGroup>
## Snelle configuratie
## Snelle installatie
<Tabs>
<Tab title="Socket Mode (standaard)">
<Steps>
<Step title="Maak een nieuwe Slack-app">
Druk in de Slack-appinstellingen op de knop **[Create New App](https://api.slack.com/apps/new)**:
Druk in de Slack-app-instellingen op de knop **[Nieuwe app maken](https://api.slack.com/apps/new)**:
- kies **from a manifest** en selecteer een workspace voor je app
- plak het [voorbeeldmanifest](#manifest-and-scope-checklist) hieronder en ga verder met maken
- genereer een **App-Level Token** (`xapp-...`) met `connections:write`
- installeer de app en kopieer de weergegeven **Bot Token** (`xoxb-...`)
- kies **uit een manifest** en selecteer een werkruimte voor je app
- plak het onderstaande [voorbeeldmanifest](#manifest-and-scope-checklist) en ga verder met maken
- genereer een **token op appniveau** (`xapp-...`) met `connections:write`
- installeer de app en kopieer het weergegeven **Bot-token** (`xoxb-...`)
</Step>
@ -64,7 +64,7 @@ openclaw config patch --file ./slack.socket.patch.json5 --dry-run
openclaw config patch --file ./slack.socket.patch.json5
```
Env-fallback (alleen standaardaccount):
Terugval via omgevingsvariabelen (alleen standaardaccount):
```bash
SLACK_APP_TOKEN=xapp-...
@ -87,12 +87,12 @@ openclaw gateway
<Tab title="HTTP Request URLs">
<Steps>
<Step title="Maak een nieuwe Slack-app">
Druk in de Slack-appinstellingen op de knop **[Create New App](https://api.slack.com/apps/new)**:
Druk in de Slack-app-instellingen op de knop **[Nieuwe app maken](https://api.slack.com/apps/new)**:
- kies **from a manifest** en selecteer een workspace voor je app
- plak het [voorbeeldmanifest](#manifest-and-scope-checklist) en werk de URL's bij voordat je maakt
- bewaar de **Signing Secret** voor verzoekverificatie
- installeer de app en kopieer de weergegeven **Bot Token** (`xoxb-...`)
- kies **uit een manifest** en selecteer een werkruimte voor je app
- plak het [voorbeeldmanifest](#manifest-and-scope-checklist) en werk de URL's bij voordat je de app maakt
- sla het **ondertekeningsgeheim** op voor aanvraagverificatie
- installeer de app en kopieer het weergegeven **Bot-token** (`xoxb-...`)
</Step>
@ -121,9 +121,9 @@ openclaw config patch --file ./slack.http.patch.json5
```
<Note>
Gebruik unieke webhookpaden voor HTTP met meerdere accounts
Gebruik unieke Webhook-paden voor HTTP met meerdere accounts
Geef elk account een eigen `webhookPath` (standaard `/slack/events`) zodat registraties niet botsen.
Geef elk account een afzonderlijk `webhookPath` (standaard `/slack/events`) zodat registraties niet botsen.
</Note>
</Step>
@ -140,9 +140,9 @@ openclaw gateway
</Tab>
</Tabs>
## Socket Mode-transport afstemmen
## Transportafstemming voor Socket Mode
OpenClaw stelt de pong-time-out van de Slack SDK-client standaard in op 15 seconden voor Socket Mode. Overschrijf de transportinstellingen alleen wanneer je workspace- of hostspecifieke afstemming nodig hebt:
OpenClaw stelt de pong-time-out van de Slack SDK-client voor Socket Mode standaard in op 15 seconden. Overschrijf de transportinstellingen alleen wanneer je werkruimte- of hostspecifieke afstemming nodig hebt:
```json5
{
@ -159,13 +159,13 @@ OpenClaw stelt de pong-time-out van de Slack SDK-client standaard in op 15 secon
}
```
Gebruik dit alleen voor Socket Mode-workspaces die Slack-websocket-pong- of server-ping-time-outs loggen, of die draaien op hosts met bekende event-loop-uithongering. `clientPingTimeout` is de wachttijd voor pong nadat de SDK een client-ping heeft verzonden; `serverPingTimeout` is de wachttijd voor Slack-serverpings. Appberichten en events blijven applicatiestatus, geen signalen voor transportliveness.
Gebruik dit alleen voor Socket Mode-werkruimten die time-outs voor Slack-websocket-pong/serverping registreren of draaien op hosts met bekende event-loop-uithongering. `clientPingTimeout` is de wachttijd op pong nadat de SDK een clientping verzendt; `serverPingTimeout` is de wachttijd op serverpings van Slack. App-berichten en gebeurtenissen blijven applicatiestatus, geen signalen voor transportlevendigheid.
## Checklist voor manifest en scopes
Het basale Slack-appmanifest is hetzelfde voor Socket Mode en HTTP Request URLs. Alleen het `settings`-blok (en de slash-opdracht-`url`) verschilt.
Het basismanifest voor de Slack-app is hetzelfde voor Socket Mode en HTTP Request URLs. Alleen het `settings`-blok (en de `url` van de slash-opdracht) verschilt.
Basemanifest (standaard Socket Mode):
Basismanifest (Socket Mode standaard):
```json
{
@ -240,7 +240,7 @@ Basemanifest (standaard Socket Mode):
}
```
Vervang voor de modus **HTTP Request URLs** `settings` door de HTTP-variant en voeg `url` toe aan elke slash-opdracht. Openbare URL vereist:
Voor de modus **HTTP Request URLs** vervang je `settings` door de HTTP-variant en voeg je `url` toe aan elke slash-opdracht. Openbare URL vereist:
```json
{
@ -284,14 +284,14 @@ Vervang voor de modus **HTTP Request URLs** `settings` door de HTTP-variant en v
### Aanvullende manifestinstellingen
Toon andere functies die de bovenstaande standaardwaarden uitbreiden.
Toon verschillende functies die de bovenstaande standaardinstellingen uitbreiden.
Het standaardmanifest schakelt het Slack App Home-tabblad **Home** in en abonneert zich op `app_home_opened`. Wanneer een workspacelid het tabblad Home opent, publiceert OpenClaw een veilige standaard-Home-weergave met `views.publish`; er wordt geen gespreks-payload of privéconfiguratie opgenomen. Het tabblad **Messages** blijft ingeschakeld voor Slack-DM's.
Het standaardmanifest schakelt het Slack App Home-tabblad **Startpagina** in en abonneert zich op `app_home_opened`. Wanneer een lid van de werkruimte het tabblad Startpagina opent, publiceert OpenClaw een veilige standaardweergave voor Startpagina met `views.publish`; er wordt geen gesprekspayload of privéconfiguratie opgenomen. Het tabblad **Berichten** blijft ingeschakeld voor Slack-DM's.
<AccordionGroup>
<Accordion title="Optionele native slash-opdrachten">
<Accordion title="Optionele ingebouwde slash-opdrachten">
Meerdere [native slash-opdrachten](#commands-and-slash-behavior) kunnen worden gebruikt in plaats van één geconfigureerde opdracht, met nuance:
Er kunnen meerdere [ingebouwde slash-opdrachten](#commands-and-slash-behavior) worden gebruikt in plaats van één geconfigureerde opdracht, met enkele nuances:
- Gebruik `/agentstatus` in plaats van `/status`, omdat de opdracht `/status` gereserveerd is.
- Er kunnen maximaal 25 slash-opdrachten tegelijk beschikbaar worden gemaakt.
@ -423,7 +423,7 @@ Het standaardmanifest schakelt het Slack App Home-tabblad **Home** in en abonnee
</Tab>
<Tab title="HTTP Request URLs">
Gebruik dezelfde lijst `slash_commands` als Socket Mode hierboven, en voeg aan elk item `"url": "https://gateway-host.example.com/slack/events"` toe. Voorbeeld:
Gebruik dezelfde lijst `slash_commands` als Socket Mode hierboven, en voeg `"url": "https://gateway-host.example.com/slack/events"` toe aan elk item. Voorbeeld:
```json
{
@ -449,14 +449,14 @@ Het standaardmanifest schakelt het Slack App Home-tabblad **Home** in en abonnee
</Tabs>
</Accordion>
<Accordion title="Optionele auteurschap-scopes (schrijfbewerkingen)">
Voeg de `chat:write.customize`-bot-scope toe als je wilt dat uitgaande berichten de actieve agentidentiteit gebruiken (aangepaste gebruikersnaam en pictogram) in plaats van de standaardidentiteit van de Slack-app.
<Accordion title="Optionele auteurschapsscopes (schrijfbewerkingen)">
Voeg de bot-scope `chat:write.customize` toe als je wilt dat uitgaande berichten de actieve agentidentiteit gebruiken (aangepaste gebruikersnaam en pictogram) in plaats van de standaardidentiteit van de Slack-app.
Als je een emoji-pictogram gebruikt, verwacht Slack de syntaxis `:emoji_name:`.
</Accordion>
<Accordion title="Optionele gebruikerstoken-scopes (leesbewerkingen)">
Als je `channels.slack.userToken` configureert, zijn typische lees-scopes:
<Accordion title="Optionele gebruikerstokenscopes (leesbewerkingen)">
Als je `channels.slack.userToken` configureert, zijn typische leesscopes:
- `channels:history`, `groups:history`, `im:history`, `mpim:history`
- `channels:read`, `groups:read`, `im:read`, `mpim:read`
@ -464,7 +464,7 @@ Het standaardmanifest schakelt het Slack App Home-tabblad **Home** in en abonnee
- `reactions:read`
- `pins:read`
- `emoji:read`
- `search:read` (als je afhankelijk bent van leesbewerkingen via Slack-zoeken)
- `search:read` (als je afhankelijk bent van leesbewerkingen via Slack-zoekopdrachten)
</Accordion>
</AccordionGroup>
@ -473,48 +473,48 @@ Het standaardmanifest schakelt het Slack App Home-tabblad **Home** in en abonnee
- `botToken` + `appToken` zijn vereist voor Socket Mode.
- HTTP-modus vereist `botToken` + `signingSecret`.
- `botToken`, `appToken`, `signingSecret` en `userToken` accepteren platte-tekststrings
- `botToken`, `appToken`, `signingSecret` en `userToken` accepteren plattetekststrings
of SecretRef-objecten.
- Configuratietokens overschrijven de env-fallback.
- De env-fallback `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` geldt alleen voor het standaardaccount.
- `userToken` (`xoxp-...`) is alleen via configuratie beschikbaar (geen env-fallback) en gebruikt standaard alleen-lezen gedrag (`userTokenReadOnly: true`).
- Configuratietokens overschrijven de env-terugval.
- De env-terugval `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` geldt alleen voor het standaardaccount.
- `userToken` (`xoxp-...`) is alleen via configuratie beschikbaar (geen env-terugval) en gebruikt standaard alleen-lezen gedrag (`userTokenReadOnly: true`).
Gedrag van statusmomentopnamen:
Gedrag van statussnapshot:
- Inspectie van Slack-accounts houdt per referentie `*Source`- en `*Status`-
velden bij (`botToken`, `appToken`, `signingSecret`, `userToken`).
- Inspectie van Slack-accounts volgt per credential de velden `*Source` en `*Status`
(`botToken`, `appToken`, `signingSecret`, `userToken`).
- Status is `available`, `configured_unavailable` of `missing`.
- `configured_unavailable` betekent dat het account is geconfigureerd via SecretRef
of een andere niet-inline geheime bron, maar dat het huidige commando-/runtimepad
de werkelijke waarde niet kon oplossen.
of een andere niet-inline geheime bron, maar dat het huidige command-/runtimepad
de daadwerkelijke waarde niet kon oplossen.
- In HTTP-modus wordt `signingSecretStatus` opgenomen; in Socket Mode is het
vereiste paar `botTokenStatus` + `appTokenStatus`.
<Tip>
Voor acties/mapleesbewerkingen kan het gebruikerstoken de voorkeur krijgen wanneer dit is geconfigureerd. Voor schrijfbewerkingen blijft het bottoken de voorkeur houden; schrijven met gebruikerstokens is alleen toegestaan wanneer `userTokenReadOnly: false` en het bottoken niet beschikbaar is.
Voor acties/directory-leesbewerkingen kan de voorkeur uitgaan naar het gebruikerstoken wanneer dit is geconfigureerd. Voor schrijfbewerkingen blijft het bottoken de voorkeur houden; schrijfbewerkingen met gebruikerstoken zijn alleen toegestaan wanneer `userTokenReadOnly: false` en het bottoken niet beschikbaar is.
</Tip>
## Acties en poorten
## Acties en gates
Slack-acties worden beheerd door `channels.slack.actions.*`.
Beschikbare actiegroepen in de huidige Slack-tooling:
| Groep | Standaard |
| ---------- | --------- |
| messages | enabled |
| reactions | enabled |
| pins | enabled |
| memberInfo | enabled |
| emojiList | enabled |
| ---------- | ------- |
| messages | ingeschakeld |
| reactions | ingeschakeld |
| pins | ingeschakeld |
| memberInfo | ingeschakeld |
| emojiList | ingeschakeld |
Huidige Slack-berichtacties omvatten `send`, `upload-file`, `download-file`, `read`, `edit`, `delete`, `pin`, `unpin`, `list-pins`, `member-info` en `emoji-list`. `download-file` accepteert Slack-bestands-ID's die in inkomende bestandsplaatsaanduidingen worden getoond en retourneert afbeeldingsvoorbeelden voor afbeeldingen of lokale bestandsmetadata voor andere bestandstypen.
Huidige Slack-berichtacties omvatten `send`, `upload-file`, `download-file`, `read`, `edit`, `delete`, `pin`, `unpin`, `list-pins`, `member-info` en `emoji-list`. `download-file` accepteert Slack-bestands-ID's die worden weergegeven in placeholders voor inkomende bestanden en retourneert afbeeldingsvoorbeelden voor afbeeldingen of lokale bestandsmetadata voor andere bestandstypen.
## Toegangscontrole en routering
<Tabs>
<Tab title="DM-beleid">
`channels.slack.dmPolicy` beheert DM-toegang. `channels.slack.allowFrom` is de canonieke DM-toestemmingslijst.
`channels.slack.dmPolicy` beheert DM-toegang. `channels.slack.allowFrom` is de canonieke DM-allowlist.
- `pairing` (standaard)
- `allowlist`
@ -526,18 +526,18 @@ Huidige Slack-berichtacties omvatten `send`, `upload-file`, `download-file`, `re
- `dm.enabled` (standaard true)
- `channels.slack.allowFrom`
- `dm.allowFrom` (legacy)
- `dm.groupEnabled` (groeps-DM's standaard false)
- `dm.groupChannels` (optionele MPIM-toestemmingslijst)
- `dm.groupEnabled` (groep-DM's standaard false)
- `dm.groupChannels` (optionele MPIM-allowlist)
Voorrang bij meerdere accounts:
Prioriteit bij meerdere accounts:
- `channels.slack.accounts.default.allowFrom` geldt alleen voor het `default`-account.
- Benoemde accounts erven `channels.slack.allowFrom` wanneer hun eigen `allowFrom` niet is ingesteld.
- Benoemde accounts erven `channels.slack.accounts.default.allowFrom` niet.
Legacy `channels.slack.dm.policy` en `channels.slack.dm.allowFrom` worden nog steeds gelezen voor compatibiliteit. `openclaw doctor --fix` migreert ze naar `dmPolicy` en `allowFrom` wanneer dit kan zonder de toegang te wijzigen.
Legacy `channels.slack.dm.policy` en `channels.slack.dm.allowFrom` worden nog gelezen voor compatibiliteit. `openclaw doctor --fix` migreert ze naar `dmPolicy` en `allowFrom` wanneer dat kan zonder de toegang te wijzigen.
Koppelen in DM's gebruikt `openclaw pairing approve slack <code>`.
Pairing in DM's gebruikt `openclaw pairing approve slack <code>`.
</Tab>
@ -548,18 +548,18 @@ Huidige Slack-berichtacties omvatten `send`, `upload-file`, `download-file`, `re
- `allowlist`
- `disabled`
De kanaaltoestemmingslijst staat onder `channels.slack.channels` en **moet stabiele Slack-kanaal-ID's gebruiken** (bijvoorbeeld `C12345678`) als configuratiesleutels.
De kanaal-allowlist staat onder `channels.slack.channels` en **moet stabiele Slack-kanaal-ID's gebruiken** (bijvoorbeeld `C12345678`) als configuratiesleutels.
Runtime-opmerking: als `channels.slack` volledig ontbreekt (setup alleen via env), valt de runtime terug op `groupPolicy="allowlist"` en logt een waarschuwing (zelfs als `channels.defaults.groupPolicy` is ingesteld).
Naam-/ID-resolutie:
- items in kanaaltoestemmingslijsten en DM-toestemmingslijsten worden bij het opstarten opgelost wanneer tokentoegang dit toestaat
- onopgeloste items met kanaalnamen blijven zoals geconfigureerd behouden, maar worden standaard genegeerd voor routering
- inkomende autorisatie en kanaalroutering zijn standaard ID-eerst; directe matching op gebruikersnaam/slug vereist `channels.slack.dangerouslyAllowNameMatching: true`
- vermeldingen in de kanaal-allowlist en DM-allowlist worden bij het opstarten opgelost wanneer tokentoegang dit toestaat
- niet-opgeloste vermeldingen met kanaalnamen worden bewaard zoals geconfigureerd, maar standaard genegeerd voor routering
- inkomende autorisatie en kanaalroutering zijn standaard ID-first; directe matching op gebruikersnaam/slug vereist `channels.slack.dangerouslyAllowNameMatching: true`
<Warning>
Op namen gebaseerde sleutels (`#channel-name` of `channel-name`) matchen **niet** onder `groupPolicy: "allowlist"`. De kanaalopzoeking is standaard ID-eerst, dus een op naam gebaseerde sleutel zal nooit succesvol routeren en alle berichten in dat kanaal worden stilzwijgend geblokkeerd. Dit verschilt van `groupPolicy: "open"`, waarbij de kanaalsleutel niet vereist is voor routering en een op naam gebaseerde sleutel lijkt te werken.
Naamgebaseerde sleutels (`#channel-name` of `channel-name`) matchen **niet** onder `groupPolicy: "allowlist"`. De kanaalopzoeking is standaard ID-first, dus een naamgebaseerde sleutel zal nooit succesvol routeren en alle berichten in dat kanaal worden stilzwijgend geblokkeerd. Dit verschilt van `groupPolicy: "open"`, waarbij de kanaalsleutel niet vereist is voor routering en een naamgebaseerde sleutel lijkt te werken.
Gebruik altijd de Slack-kanaal-ID als sleutel. Zo vind je die: klik met de rechtermuisknop op het kanaal in Slack → **Copy link** — de ID (`C...`) staat aan het einde van de URL.
@ -578,7 +578,7 @@ Huidige Slack-berichtacties omvatten `send`, `upload-file`, `download-file`, `re
}
```
Onjuist (stilzwijgend geblokkeerd onder `groupPolicy: "allowlist"`):
Onjuist (stil geblokkeerd onder `groupPolicy: "allowlist"`):
```json5
{
@ -596,63 +596,63 @@ Huidige Slack-berichtacties omvatten `send`, `upload-file`, `download-file`, `re
</Tab>
<Tab title="Vermeldingen en kanaalgebruikers">
Kanaalberichten zijn standaard afgeschermd met vermeldingen.
<Tab title="Mentions and channel users">
Kanaalberichten zijn standaard achter mention-toegang geplaatst.
Bronnen voor vermeldingen:
Bronnen voor mentions:
- expliciete app-vermelding (`<@botId>`)
- Slack-gebruikersgroepvermelding (`<!subteam^S...>`) wanneer de botgebruiker lid is van die gebruikersgroep; vereist `usergroups:read`
- regexpatronen voor vermeldingen (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`)
- impliciet antwoord-op-bot-threadgedrag (uitgeschakeld wanneer `thread.requireExplicitMention` `true` is)
- expliciete app-mention (`<@botId>`)
- Slack-gebruikersgroep-mention (`<!subteam^S...>`) wanneer de botgebruiker lid is van die gebruikersgroep; vereist `usergroups:read`
- mention-regexpatronen (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`)
- impliciet reply-to-bot-threadgedrag (uitgeschakeld wanneer `thread.requireExplicitMention` `true` is)
Regelaars per kanaal (`channels.slack.channels.<id>`; namen alleen via opstartresolutie of `dangerouslyAllowNameMatching`):
Besturing per kanaal (`channels.slack.channels.<id>`; namen alleen via opstartresolutie of `dangerouslyAllowNameMatching`):
- `requireMention`
- `users` (toestemmingslijst)
- `users` (allowlist)
- `allowBots`
- `skills`
- `systemPrompt`
- `tools`, `toolsBySender`
- sleutelindeling voor `toolsBySender`: `id:`, `e164:`, `username:`, `name:` of wildcard `"*"`
(legacy sleutels zonder prefix worden nog steeds alleen toegewezen aan `id:`)
- sleutelindeling voor `toolsBySender`: `id:`, `e164:`, `username:`, `name:`, of wildcard `"*"`
(verouderde sleutels zonder prefix worden nog steeds alleen aan `id:` gekoppeld)
`allowBots` is conservatief voor kanalen en privékanalen: door bots geschreven kamerberichten worden alleen geaccepteerd wanneer de verzendende bot expliciet in de `users`-toestemmingslijst van die kamer staat, of wanneer ten minste één expliciete Slack-eigenaars-ID uit `channels.slack.allowFrom` momenteel lid is van de kamer. Wildcards en eigenaarsitems met weergavenaam voldoen niet aan aanwezigheid van de eigenaar. Aanwezigheid van de eigenaar gebruikt Slack `conversations.members`; zorg dat de app de bijpassende lees-scope heeft voor het kamertype (`channels:read` voor openbare kanalen, `groups:read` voor privékanalen). Als het opzoeken van leden mislukt, verwijdert OpenClaw het door de bot geschreven kamerbericht.
`allowBots` is conservatief voor kanalen en privékanalen: door bots geschreven ruimteberichten worden alleen geaccepteerd wanneer de verzendende bot expliciet in de `users`-allowlist van die ruimte staat, of wanneer ten minste één expliciete Slack-eigenaars-ID uit `channels.slack.allowFrom` momenteel lid is van de ruimte. Wildcards en eigenaarsvermeldingen op weergavenaam voldoen niet aan aanwezigheid van de eigenaar. Aanwezigheid van de eigenaar gebruikt Slack `conversations.members`; zorg dat de app de bijbehorende lees-scope heeft voor het ruimtetype (`channels:read` voor openbare kanalen, `groups:read` voor privékanalen). Als het ophalen van leden mislukt, laat OpenClaw het door de bot geschreven ruimtebericht vallen.
</Tab>
</Tabs>
## Threads, sessies en antwoordtags
## Threads, sessies en reply-tags
- DM's routeren als `direct`; kanalen als `channel`; MPIM's als `group`.
- Slack-routebindingen accepteren ruwe peer-ID's plus Slack-doelvormen zoals `channel:C12345678`, `user:U12345678` en `<@U12345678>`.
- Slack-routebindingen accepteren ruwe peer-ID's plus Slack-doelformulieren zoals `channel:C12345678`, `user:U12345678` en `<@U12345678>`.
- Met de standaard `session.dmScope=main` worden Slack-DM's samengevoegd naar de hoofdsessie van de agent.
- Kanaalsessies: `agent:<agentId>:slack:channel:<channelId>`.
- Threadantwoorden kunnen, indien van toepassing, threadsessieachtervoegsels maken (`:thread:<threadTs>`).
- Thread-antwoorden kunnen waar van toepassing thread-sessieachtervoegsels maken (`:thread:<threadTs>`).
- De standaard voor `channels.slack.thread.historyScope` is `thread`; de standaard voor `thread.inheritParent` is `false`.
- `channels.slack.thread.initialHistoryLimit` bepaalt hoeveel bestaande threadberichten worden opgehaald wanneer een nieuwe threadsessie start (standaard `20`; stel in op `0` om uit te schakelen).
- `channels.slack.thread.requireExplicitMention` (standaard `false`): wanneer `true`, worden impliciete threadvermeldingen onderdrukt, zodat de bot alleen reageert op expliciete `@bot`-vermeldingen binnen threads, zelfs wanneer de bot al aan de thread heeft deelgenomen. Zonder dit omzeilen antwoorden in een thread waaraan de bot heeft deelgenomen de `requireMention`-poort.
- `channels.slack.thread.requireExplicitMention` (standaard `false`): onderdrukt impliciete thread-mentions wanneer `true`, zodat de bot alleen reageert op expliciete `@bot`-mentions binnen threads, zelfs wanneer de bot al aan de thread heeft deelgenomen. Zonder dit omzeilen antwoorden in een thread waaraan een bot heeft deelgenomen de `requireMention`-toegang.
Regelaars voor antwoord-threads:
Besturing voor reply-threading:
- `channels.slack.replyToMode`: `off|first|all|batched` (standaard `off`)
- `channels.slack.replyToModeByChatType`: per `direct|group|channel`
- legacy fallback voor directe chats: `channels.slack.dm.replyToMode`
- verouderde fallback voor directe chats: `channels.slack.dm.replyToMode`
Handmatige antwoordtags worden ondersteund:
Handmatige reply-tags worden ondersteund:
- `[[reply_to_current]]`
- `[[reply_to:<id>]]`
<Note>
`replyToMode="off"` schakelt **alle** antwoord-threads in Slack uit, inclusief expliciete `[[reply_to_*]]`-tags. Dit verschilt van Telegram, waar expliciete tags nog steeds worden gehonoreerd in de modus `"off"`. Slack-threads verbergen berichten in het kanaal, terwijl Telegram-antwoorden inline zichtbaar blijven.
`replyToMode="off"` schakelt **alle** reply-threading in Slack uit, inclusief expliciete `[[reply_to_*]]`-tags. Dit verschilt van Telegram, waar expliciete tags nog steeds worden gerespecteerd in de modus `"off"`. Slack-threads verbergen berichten in het kanaal, terwijl Telegram-antwoorden inline zichtbaar blijven.
</Note>
## Ack-reacties
`ackReaction` verzendt een bevestigingsemoji terwijl OpenClaw een inkomend bericht verwerkt.
`ackReaction` verzendt een bevestigings-emoji terwijl OpenClaw een binnenkomend bericht verwerkt.
Resolutievolgorde:
Volgorde van resolutie:
- `channels.slack.accounts.<accountId>.ackReaction`
- `channels.slack.ackReaction`
@ -668,22 +668,41 @@ Opmerkingen:
`channels.slack.streaming` beheert livevoorbeeldgedrag:
- `off`: schakel streaming van livevoorbeelden uit.
- `partial` (standaard): vervang voorbeeldtekst door de nieuwste gedeeltelijke uitvoer.
- `block`: voeg voorbeeldupdates in chunks toe.
- `progress`: toon voortgangsstatustekst tijdens het genereren en verzend daarna de definitieve tekst.
- `streaming.preview.toolProgress`: wanneer het conceptvoorbeeld actief is, routeer tool-/voortgangsupdates naar hetzelfde bewerkte voorbeeldbericht (standaard: `true`). Stel in op `false` om aparte tool-/voortgangsberichten te behouden.
- `off`: livevoorbeeldstreaming uitschakelen.
- `partial` (standaard): voorbeeldtekst vervangen door de nieuwste gedeeltelijke uitvoer.
- `block`: updates van voorbeeld in chunks toevoegen.
- `progress`: voortgangsstatustekst tonen tijdens het genereren en daarna de definitieve tekst verzenden.
- `streaming.preview.toolProgress`: wanneer conceptvoorbeeld actief is, routeer tool-/voortgangsupdates naar hetzelfde bewerkte voorbeeldbericht (standaard: `true`). Stel in op `false` om afzonderlijke tool-/voortgangsberichten te behouden.
- `streaming.preview.commandText` / `streaming.progress.commandText`: stel in op `status` om compacte tool-voortgangsregels te behouden terwijl ruwe command-/exec-tekst wordt verborgen (standaard: `raw`).
`channels.slack.streaming.nativeTransport` beheert Slack-native tekststreaming wanneer `channels.slack.streaming.mode` `partial` is (standaard: `true`).
Verberg ruwe command-/exec-tekst terwijl compacte voortgangsregels behouden blijven:
- Er moet een antwoordthread beschikbaar zijn om native tekststreaming en Slack-assistent-threadstatus te laten verschijnen. Threadselectie volgt nog steeds `replyToMode`.
- Kanaal-, groepschat- en DM-hoofdberichten op topniveau kunnen nog steeds het normale conceptvoorbeeld gebruiken wanneer native streaming niet beschikbaar is of er geen antwoordthread bestaat.
- Slack-DM's op topniveau blijven standaard buiten threads, waardoor ze Slack's threadachtige native stream-/statusvoorbeeld niet tonen; OpenClaw plaatst en bewerkt in plaats daarvan een conceptvoorbeeld in de DM.
```json
{
"channels": {
"slack": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
```
`channels.slack.streaming.nativeTransport` beheert native tekststreaming van Slack wanneer `channels.slack.streaming.mode` `partial` is (standaard: `true`).
- Er moet een reply-thread beschikbaar zijn voordat native tekststreaming en Slack-assistentthreadstatus kunnen verschijnen. Threadselectie volgt nog steeds `replyToMode`.
- Kanaal-, groepschat- en top-level DM-roots kunnen nog steeds het normale conceptvoorbeeld gebruiken wanneer native streaming niet beschikbaar is of er geen reply-thread bestaat.
- Top-level Slack-DM's blijven standaard buiten threads, dus ze tonen Slack's threadachtige native stream-/statusvoorbeeld niet; OpenClaw plaatst en bewerkt in plaats daarvan een conceptvoorbeeld in de DM.
- Media en niet-tekstpayloads vallen terug op normale levering.
- Definitieve media-/foutberichten annuleren wachtende voorbeeldbewerkingen; in aanmerking komende definitieve tekst-/blokberichten worden alleen geflusht wanneer ze het voorbeeld ter plekke kunnen bewerken.
- Als streaming halverwege een antwoord mislukt, valt OpenClaw terug op normale levering voor resterende payloads.
- Definitieve media-/foutberichten annuleren wachtende voorbeeldbewerkingen; in aanmerking komende definitieve tekst-/blokberichten worden alleen geflusht wanneer ze het voorbeeld ter plaatse kunnen bewerken.
- Als streaming halverwege een antwoord mislukt, valt OpenClaw terug op normale levering voor de resterende payloads.
Gebruik conceptvoorbeeld in plaats van Slack-native tekststreaming:
Gebruik conceptvoorbeeld in plaats van native tekststreaming van Slack:
```json5
{
@ -698,17 +717,17 @@ Gebruik conceptvoorbeeld in plaats van Slack-native tekststreaming:
}
```
Legacy sleutels:
Verouderde sleutels:
- `channels.slack.streamMode` (`replace | status_final | append`) wordt automatisch gemigreerd naar `channels.slack.streaming.mode`.
- boolean `channels.slack.streaming` wordt automatisch gemigreerd naar `channels.slack.streaming.mode` en `channels.slack.streaming.nativeTransport`.
- legacy `channels.slack.nativeStreaming` wordt automatisch gemigreerd naar `channels.slack.streaming.nativeTransport`.
- booleaanse `channels.slack.streaming` wordt automatisch gemigreerd naar `channels.slack.streaming.mode` en `channels.slack.streaming.nativeTransport`.
- verouderde `channels.slack.nativeStreaming` wordt automatisch gemigreerd naar `channels.slack.streaming.nativeTransport`.
## Fallback voor typreactie
`typingReaction` voegt een tijdelijke reactie toe aan het inkomende Slack-bericht terwijl OpenClaw een antwoord verwerkt, en verwijdert die wanneer de run is voltooid. Dit is het nuttigst buiten threadantwoorden, die een standaardstatusindicator "is typing..." gebruiken.
`typingReaction` voegt een tijdelijke reactie toe aan het inkomende Slack-bericht terwijl OpenClaw een antwoord verwerkt, en verwijdert die wanneer de run klaar is. Dit is vooral nuttig buiten thread-antwoorden, die een standaardstatusindicator "is typing..." gebruiken.
Resolutievolgorde:
Volgorde van resolutie:
- `channels.slack.accounts.<accountId>.typingReaction`
- `channels.slack.typingReaction`
@ -718,40 +737,40 @@ Opmerkingen:
- Slack verwacht shortcodes (bijvoorbeeld `"hourglass_flowing_sand"`).
- De reactie is best-effort en opschoning wordt automatisch geprobeerd nadat het antwoord- of foutpad is voltooid.
## Media, chunking en aflevering
## Media, chunking en levering
<AccordionGroup>
<Accordion title="Inkomende bijlagen">
Slack-bestandsbijlagen worden gedownload vanaf door Slack gehoste privé-URL's (token-geauthenticeerde aanvraagstroom) en naar de mediaopslag geschreven wanneer ophalen slaagt en de groottelimieten dit toestaan. Bestand-placeholders bevatten de Slack `fileId`, zodat agents het oorspronkelijke bestand kunnen ophalen met `download-file`.
<Accordion title="Inbound attachments">
Slack-bestandsbijlagen worden gedownload van door Slack gehoste privé-URL's (token-geauthenticeerde aanvraagstroom) en naar de mediaopslag geschreven wanneer ophalen slaagt en de groottelimieten dit toestaan. Bestandsplaatsaanduidingen bevatten de Slack `fileId`, zodat agents het oorspronkelijke bestand kunnen ophalen met `download-file`.
Downloads gebruiken begrensde idle- en totale time-outs. Als het ophalen van Slack-bestanden vastloopt of mislukt, blijft OpenClaw het bericht verwerken en valt het terug op de bestand-placeholder.
Downloads gebruiken begrensde idle- en totale time-outs. Als het ophalen van Slack-bestanden vastloopt of mislukt, blijft OpenClaw het bericht verwerken en valt het terug op de bestandsplaatsaanduiding.
De runtime-limiet voor inkomende grootte is standaard `20MB`, tenzij overschreven door `channels.slack.mediaMaxMb`.
</Accordion>
<Accordion title="Uitgaande tekst en bestanden">
<Accordion title="Outbound text and files">
- tekstchunks gebruiken `channels.slack.textChunkLimit` (standaard 4000)
- `channels.slack.chunkMode="newline"` schakelt alinea-eerst splitsen in
- bestandsverzendingen gebruiken Slack-upload-API's en kunnen threadantwoorden bevatten (`thread_ts`)
- bestanden verzenden gebruikt Slack-upload-API's en kan thread-antwoorden (`thread_ts`) bevatten
- de limiet voor uitgaande media volgt `channels.slack.mediaMaxMb` wanneer geconfigureerd; anders gebruiken kanaalverzendingen MIME-soortstandaarden uit de mediapijplijn
</Accordion>
<Accordion title="Afleveringsdoelen">
<Accordion title="Delivery targets">
Voorkeursdoelen die expliciet zijn:
- `user:<id>` voor DM's
- `channel:<id>` voor kanalen
Slack-DM's met alleen tekst/blokken kunnen rechtstreeks naar gebruikers-ID's posten; bestandsuploads en threaded verzendingen openen eerst de DM via Slack-conversatie-API's, omdat die paden een concrete conversatie-ID vereisen.
Slack-DM's met alleen tekst/blokken kunnen rechtstreeks naar gebruikers-ID's posten; bestandsuploads en verzenden in threads openen eerst de DM via Slack-conversatie-API's, omdat die paden een concreet conversatie-ID vereisen.
</Accordion>
</AccordionGroup>
## Commando's en slash-gedrag
## Opdrachten en slash-gedrag
Slash-commando's verschijnen in Slack als één geconfigureerd commando of meerdere native commando's. Configureer `channels.slack.slashCommand` om standaardwaarden voor commando's te wijzigen:
Slash-opdrachten verschijnen in Slack als één geconfigureerde opdracht of meerdere native opdrachten. Configureer `channels.slack.slashCommand` om opdrachtstandaarden te wijzigen:
- `enabled: false`
- `name: "openclaw"`
@ -762,30 +781,30 @@ Slash-commando's verschijnen in Slack als één geconfigureerd commando of meerd
/openclaw /help
```
Native commando's vereisen [aanvullende manifestinstellingen](#additional-manifest-settings) in je Slack-app en worden in plaats daarvan ingeschakeld met `channels.slack.commands.native: true` of `commands.native: true` in globale configuraties.
Native opdrachten vereisen [aanvullende manifestinstellingen](#additional-manifest-settings) in je Slack-app en worden in plaats daarvan ingeschakeld met `channels.slack.commands.native: true` of `commands.native: true` in globale configuraties.
- Native commando-auto-modus staat **uit** voor Slack, dus `commands.native: "auto"` schakelt native Slack-commando's niet in.
- Automatische modus voor native opdrachten staat voor Slack **uit**, dus `commands.native: "auto"` schakelt native Slack-opdrachten niet in.
```txt
/help
```
Native argumentmenu's gebruiken een adaptieve renderstrategie die een bevestigingsmodal toont voordat een geselecteerde optiewaarde wordt verzonden:
Native argumentmenu's gebruiken een adaptieve renderstrategie die een bevestigingsmodal toont voordat een geselecteerde optiewaarde wordt verstuurd:
- tot 5 opties: knopblokken
- maximaal 5 opties: knopblokken
- 6-100 opties: statisch selectiemenu
- meer dan 100 opties: externe selectie met asynchrone optiefiltering wanneer interactiviteitsoptiehandlers beschikbaar zijn
- meer dan 100 opties: externe selectie met asynchrone optiefiltering wanneer handlers voor interactiviteitsopties beschikbaar zijn
- overschreden Slack-limieten: gecodeerde optiewaarden vallen terug op knoppen
```txt
/think
```
Slash-sessies gebruiken geïsoleerde sleutels zoals `agent:<agentId>:slack:slash:<userId>` en routeren commando-uitvoeringen nog steeds naar de doelconversatiesessie met `CommandTargetSessionKey`.
Slash-sessies gebruiken geïsoleerde sleutels zoals `agent:<agentId>:slack:slash:<userId>` en routeren opdrachtuitvoeringen nog steeds naar de doelconversatiesessie met `CommandTargetSessionKey`.
## Interactieve antwoorden
Slack kan interactieve antwoordbesturingselementen renderen die door agents zijn opgesteld, maar deze functie is standaard uitgeschakeld.
Slack kan door agents gemaakte interactieve antwoordknoppen weergeven, maar deze functie is standaard uitgeschakeld.
Schakel dit globaal in:
@ -819,44 +838,44 @@ Of schakel dit alleen voor één Slack-account in:
}
```
Wanneer ingeschakeld, kunnen agents Slack-only antwoorddirectieven uitsturen:
Wanneer ingeschakeld, kunnen agents Slack-only antwoordrichtlijnen uitsturen:
- `[[slack_buttons: Approve:approve, Reject:reject]]`
- `[[slack_select: Choose a target | Canary:canary, Production:production]]`
Deze directieven worden gecompileerd naar Slack Block Kit en routeren klikken of selecties terug via het bestaande Slack-interactiegebeurtenispad.
Deze richtlijnen compileren naar Slack Block Kit en routeren klikken of selecties terug via het bestaande Slack-interactiegebeurtenispad.
Opmerkingen:
- Dit is Slack-specifieke UI. Andere kanalen vertalen Slack Block Kit-directieven niet naar hun eigen knopsystemen.
- De interactieve callbackwaarden zijn door OpenClaw gegenereerde ondoorzichtige tokens, geen ruwe waarden die door agents zijn opgesteld.
- Dit is Slack-specifieke UI. Andere kanalen vertalen Slack Block Kit-richtlijnen niet naar hun eigen knopsystemen.
- De interactieve callbackwaarden zijn door OpenClaw gegenereerde ondoorzichtige tokens, geen ruwe door agents geschreven waarden.
- Als gegenereerde interactieve blokken Slack Block Kit-limieten zouden overschrijden, valt OpenClaw terug op het oorspronkelijke tekstantwoord in plaats van een ongeldige blocks-payload te verzenden.
## Exec-goedkeuringen in Slack
Slack kan fungeren als een native goedkeuringsclient met interactieve knoppen en interacties, in plaats van terug te vallen op de Web UI of terminal.
Slack kan fungeren als native goedkeuringsclient met interactieve knoppen en interacties, in plaats van terug te vallen op de web-UI of terminal.
- Exec-goedkeuringen gebruiken `channels.slack.execApprovals.*` voor native DM-/kanaalroutering.
- Plugin-goedkeuringen kunnen nog steeds via hetzelfde Slack-native knopoppervlak worden afgehandeld wanneer de aanvraag al in Slack landt en het goedkeurings-ID-soort `plugin:` is.
- Autorisatie van goedkeurders wordt nog steeds afgedwongen: alleen gebruikers die als goedkeurders zijn geïdentificeerd, kunnen aanvragen via Slack goedkeuren of weigeren.
- Plugin-goedkeuringen kunnen nog steeds via hetzelfde Slack-native knopoppervlak worden afgehandeld wanneer het verzoek al in Slack terechtkomt en het soort goedkeurings-ID `plugin:` is.
- Autorisatie van goedkeurders wordt nog steeds afgedwongen: alleen gebruikers die als goedkeurders zijn geïdentificeerd, kunnen verzoeken via Slack goedkeuren of weigeren.
Dit gebruikt hetzelfde gedeelde goedkeuringsknopoppervlak als andere kanalen. Wanneer `interactivity` is ingeschakeld in je Slack-appinstellingen, worden goedkeuringsprompts rechtstreeks in de conversatie als Block Kit-knoppen gerenderd.
Wanneer die knoppen aanwezig zijn, zijn ze de primaire goedkeurings-UX; OpenClaw
mag alleen een handmatig `/approve`-commando opnemen wanneer het toolresultaat zegt dat chatgoedkeuringen
Dit gebruikt hetzelfde gedeelde goedkeuringsknopoppervlak als andere kanalen. Wanneer `interactivity` is ingeschakeld in je Slack-appinstellingen, worden goedkeuringsprompts rechtstreeks in de conversatie als Block Kit-knoppen weergegeven.
Wanneer die knoppen aanwezig zijn, vormen ze de primaire goedkeurings-UX; OpenClaw
mag alleen een handmatige `/approve`-opdracht opnemen wanneer het toolresultaat zegt dat chatgoedkeuringen
niet beschikbaar zijn of handmatige goedkeuring het enige pad is.
Configuratiepad:
- `channels.slack.execApprovals.enabled`
- `channels.slack.execApprovals.approvers` (optioneel; valt terug op `commands.ownerAllowFrom` wanneer mogelijk)
- `channels.slack.execApprovals.approvers` (optioneel; valt waar mogelijk terug op `commands.ownerAllowFrom`)
- `channels.slack.execApprovals.target` (`dm` | `channel` | `both`, standaard: `dm`)
- `agentFilter`, `sessionFilter`
Slack schakelt native exec-goedkeuringen automatisch in wanneer `enabled` niet is ingesteld of `"auto"` is en ten minste één
goedkeurder wordt gevonden. Stel `enabled: false` in om Slack expliciet uit te schakelen als native goedkeuringsclient.
Stel `enabled: true` in om native goedkeuringen af te dwingen wanneer goedkeurders worden gevonden.
goedkeurder wordt opgelost. Stel `enabled: false` in om Slack expliciet als native goedkeuringsclient uit te schakelen.
Stel `enabled: true` in om native goedkeuringen geforceerd in te schakelen wanneer goedkeurders worden opgelost.
Standaardgedrag zonder expliciete Slack-exec-goedkeuringsconfiguratie:
Standaardgedrag zonder expliciete Slack exec-goedkeuringsconfiguratie:
```json5
{
@ -867,7 +886,7 @@ Standaardgedrag zonder expliciete Slack-exec-goedkeuringsconfiguratie:
```
Expliciete Slack-native configuratie is alleen nodig wanneer je goedkeurders wilt overschrijven, filters wilt toevoegen of
wilt kiezen voor aflevering in de oorspronkelijke chat:
wilt kiezen voor levering via de oorsprongschat:
```json5
{
@ -884,53 +903,53 @@ wilt kiezen voor aflevering in de oorspronkelijke chat:
```
Gedeelde `approvals.exec`-doorsturing staat los hiervan. Gebruik dit alleen wanneer exec-goedkeuringsprompts ook
naar andere chats of expliciete out-of-band doelen moeten worden gerouteerd. Gedeelde `approvals.plugin`-doorsturing staat ook
los hiervan; Slack-native knoppen kunnen Plugin-goedkeuringen nog steeds afhandelen wanneer die aanvragen al
in Slack landen.
naar andere chats of expliciete out-of-band doelen moeten routeren. Gedeelde `approvals.plugin`-doorsturing staat ook
los hiervan; Slack-native knoppen kunnen Plugin-goedkeuringen nog steeds afhandelen wanneer die verzoeken al
in Slack terechtkomen.
Same-chat `/approve` werkt ook in Slack-kanalen en DM's die al commando's ondersteunen. Zie [Exec-goedkeuringen](/nl/tools/exec-approvals) voor het volledige goedkeuringsdoorsturingsmodel.
Same-chat `/approve` werkt ook in Slack-kanalen en DM's die al opdrachten ondersteunen. Zie [Exec-goedkeuringen](/nl/tools/exec-approvals) voor het volledige model voor goedkeuringsdoorsturing.
## Gebeurtenissen en operationeel gedrag
- Berichtbewerkingen/-verwijderingen worden omgezet naar systeemgebeurtenissen.
- Thread-broadcasts ("Ook naar kanaal verzenden"-threadantwoorden) worden verwerkt als normale gebruikersberichten.
- Gebeurtenissen voor het toevoegen/verwijderen van reacties worden omgezet naar systeemgebeurtenissen.
- Gebeurtenissen voor lid toetreden/verlaten, kanaal aangemaakt/hernoemd en pin toevoegen/verwijderen worden omgezet naar systeemgebeurtenissen.
- Berichtbewerkingen/-verwijderingen worden naar systeemgebeurtenissen gemapt.
- Thread-broadcasts ("Also send to channel" thread-antwoorden) worden verwerkt als normale gebruikersberichten.
- Reactie-toevoeg-/verwijdergebeurtenissen worden naar systeemgebeurtenissen gemapt.
- Gebeurtenissen voor lid toetreden/verlaten, kanaal aangemaakt/hernoemd en pin toevoegen/verwijderen worden naar systeemgebeurtenissen gemapt.
- `channel_id_changed` kan kanaalconfiguratiesleutels migreren wanneer `configWrites` is ingeschakeld.
- Metadata over kanaalonderwerp/-doel wordt behandeld als niet-vertrouwde context en kan in routeringscontext worden geïnjecteerd.
- Threadstarter en initiële seeding van threadgeschiedeniscontext worden gefilterd op basis van geconfigureerde sender-allowlists wanneer van toepassing.
- Blokacties en modalinteracties zenden gestructureerde `Slack interaction: ...`-systeemgebeurtenissen uit met rijke payloadvelden:
- Metadata voor kanaalonderwerp/-doel wordt behandeld als niet-vertrouwde context en kan in routeringscontext worden geïnjecteerd.
- Thread-starter en initiële seeding van threadgeschiedeniscontext worden gefilterd op basis van geconfigureerde sender-allowlists wanneer van toepassing.
- Blokacties en modalinteracties sturen gestructureerde `Slack interaction: ...`-systeemgebeurtenissen uit met rijke payloadvelden:
- blokacties: geselecteerde waarden, labels, pickerwaarden en `workflow_*`-metadata
- modal `view_submission`- en `view_closed`-gebeurtenissen met gerouteerde kanaalmetadata en formulierinvoer
- modal-`view_submission`- en `view_closed`-gebeurtenissen met gerouteerde kanaalmetadata en formulierinvoer
## Configuratiereferentie
Primaire referentie: [Configuratiereferentie - Slack](/nl/gateway/config-channels#slack).
<Accordion title="Slack-velden met hoge signaalwaarde">
<Accordion title="High-signal Slack fields">
- modus/auth: `mode`, `botToken`, `appToken`, `signingSecret`, `webhookPath`, `accounts.*`
- DM-toegang: `dm.enabled`, `dmPolicy`, `allowFrom` (legacy: `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels`
- compatibiliteitsschakelaar: `dangerouslyAllowNameMatching` (break-glass; uit laten tenzij nodig)
- compatibiliteitsschakelaar: `dangerouslyAllowNameMatching` (break-glass; houd uit tenzij nodig)
- kanaaltoegang: `groupPolicy`, `channels.*`, `channels.*.users`, `channels.*.requireMention`
- threads/geschiedenis: `replyToMode`, `replyToModeByChatType`, `thread.*`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
- aflevering: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `streaming.nativeTransport`, `streaming.preview.toolProgress`
- ops/functies: `configWrites`, `commands.native`, `slashCommand.*`, `actions.*`, `userToken`, `userTokenReadOnly`
- threading/geschiedenis: `replyToMode`, `replyToModeByChatType`, `thread.*`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
- levering: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `streaming.nativeTransport`, `streaming.preview.toolProgress`
- beheer/functies: `configWrites`, `commands.native`, `slashCommand.*`, `actions.*`, `userToken`, `userTokenReadOnly`
</Accordion>
## Problemen oplossen
## Probleemoplossing
<AccordionGroup>
<Accordion title="Geen antwoorden in kanalen">
<Accordion title="No replies in channels">
Controleer, in volgorde:
- `groupPolicy`
- kanaal-allowlist (`channels.slack.channels`) — **sleutels moeten kanaal-ID's zijn** (`C12345678`), geen namen (`#channel-name`). Op naam gebaseerde sleutels mislukken stil onder `groupPolicy: "allowlist"`, omdat kanaalroutering standaard ID-eerst is. Een ID vinden: klik met de rechtermuisknop op het kanaal in Slack → **Link kopiëren** — de `C...`-waarde aan het einde van de URL is de kanaal-ID.
- kanaal-allowlist (`channels.slack.channels`) — **sleutels moeten kanaal-ID's zijn** (`C12345678`), geen namen (`#channel-name`). Op naam gebaseerde sleutels falen stilzwijgend onder `groupPolicy: "allowlist"` omdat kanaalroutering standaard ID-eerst is. Een ID vinden: klik met rechts op het kanaal in Slack → **Copy link** — de `C...`-waarde aan het einde van de URL is de kanaal-ID.
- `requireMention`
- per-kanaal `users`-allowlist
Nuttige commando's:
Nuttige opdrachten:
```bash
openclaw channels status --probe
@ -940,14 +959,14 @@ openclaw doctor
</Accordion>
<Accordion title="DM-berichten genegeerd">
<Accordion title="DM messages ignored">
Controleer:
- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy` (of legacy `channels.slack.dm.policy`)
- koppelingsgoedkeuringen / allowlist-vermeldingen
- Slack Assistant-DM-gebeurtenissen: uitgebreide logs met `drop message_changed`
betekenen meestal dat Slack een bewerkte Assistant-thread-gebeurtenis stuurde zonder een
- Slack Assistant DM-gebeurtenissen: uitgebreide logs met `drop message_changed`
betekenen meestal dat Slack een bewerkte Assistant-threadgebeurtenis stuurde zonder een
herstelbare menselijke afzender in berichtmetadata
```bash
@ -956,122 +975,122 @@ openclaw pairing list slack
</Accordion>
<Accordion title="Socket mode maakt geen verbinding">
Valideer bot- en app-tokens en of Socket Mode is ingeschakeld in de Slack-appinstellingen.
<Accordion title="Socket mode not connecting">
Valideer bot- en app-tokens en Socket Mode-inschakeling in Slack-appinstellingen.
Als `openclaw channels status --probe --json` `botTokenStatus` of
`appTokenStatus: "configured_unavailable"` toont, is het Slack-account
geconfigureerd maar kon de huidige runtime de door SecretRef ondersteunde
geconfigureerd, maar kon de huidige runtime de door SecretRef ondersteunde
waarde niet oplossen.
</Accordion>
<Accordion title="HTTP-modus ontvangt geen gebeurtenissen">
<Accordion title="HTTP mode not receiving events">
Valideer:
- signing secret
- webhookpad
- Webhook-pad
- Slack Request URLs (Events + Interactivity + Slash Commands)
- unieke `webhookPath` per HTTP-account
Als `signingSecretStatus: "configured_unavailable"` verschijnt in account-
snapshots, is het HTTP-account geconfigureerd maar kon de huidige runtime
de door SecretRef ondersteunde signing secret niet oplossen.
snapshots, is het HTTP-account geconfigureerd, maar kon de huidige runtime het
door SecretRef ondersteunde signing secret niet oplossen.
</Accordion>
<Accordion title="Native/slash-commando's worden niet uitgevoerd">
<Accordion title="Native/slash commands not firing">
Controleer wat je bedoelde:
- native command-modus (`channels.slack.commands.native: true`) met overeenkomende slash-commando's die in Slack zijn geregistreerd
- of single slash command-modus (`channels.slack.slashCommand.enabled: true`)
- native opdrachtmodus (`channels.slack.commands.native: true`) met overeenkomende slash-opdrachten geregistreerd in Slack
- of modus met één slash-opdracht (`channels.slack.slashCommand.enabled: true`)
Controleer ook `commands.useAccessGroups` en kanaal-/gebruikers-allowlists.
Controleer ook `commands.useAccessGroups` en allowlists voor kanalen/gebruikers.
</Accordion>
</AccordionGroup>
## Referentie voor bijlagenvision
## Referentie voor bijlagevisie
Slack kan gedownloade media aan de agentbeurt koppelen wanneer Slack-bestandsdownloads slagen en groottelimieten dit toestaan. Afbeeldingsbestanden kunnen via het media-understanding-pad worden doorgegeven of rechtstreeks aan een vision-capabel antwoordmodel; andere bestanden worden behouden als downloadbare bestandscontext in plaats van als afbeeldingsinvoer te worden behandeld.
Slack kan gedownloade media aan de agentbeurt koppelen wanneer Slack-bestandsdownloads slagen en de groottelimieten dit toestaan. Afbeeldingsbestanden kunnen via het pad voor mediabegrip worden doorgegeven of rechtstreeks naar een antwoordmodel met vision-mogelijkheden; andere bestanden worden behouden als downloadbare bestandscontext in plaats van als afbeeldingsinvoer te worden behandeld.
### Ondersteunde mediatypen
| Mediatype | Bron | Huidig gedrag | Opmerkingen |
| ------------------------------ | -------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| JPEG- / PNG- / GIF- / WebP-afbeeldingen | Slack-bestands-URL | Gedownload en aan de beurt gekoppeld voor vision-geschikte verwerking | Limiet per bestand: `channels.slack.mediaMaxMb` (standaard 20 MB) |
| PDF-bestanden | Slack-bestands-URL | Gedownload en beschikbaar gemaakt als bestandscontext voor tools zoals `download-file` of `pdf` | Slack-invoer zet PDF's niet automatisch om naar invoer voor beeld-vision |
| Andere bestanden | Slack-bestands-URL | Waar mogelijk gedownload en beschikbaar gemaakt als bestandscontext | Binaire bestanden worden niet behandeld als afbeeldingsinvoer |
| Thread-antwoorden | Bestanden van threadstarter | Bestanden uit het rootbericht kunnen als context worden gehydrateerd wanneer het antwoord geen directe media heeft | Starters met alleen bestanden gebruiken een bijlageplaceholder |
| Berichten met meerdere afbeeldingen | Meerdere Slack-bestanden | Elk bestand wordt onafhankelijk beoordeeld | Slack-verwerking is beperkt tot acht bestanden per bericht |
| Mediatype | Bron | Huidig gedrag | Opmerkingen |
| ------------------------------ | -------------------- | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| JPEG- / PNG- / GIF- / WebP-afbeeldingen | Slack-bestands-URL | Gedownload en aan de beurt toegevoegd voor verwerking met vision-ondersteuning | Limiet per bestand: `channels.slack.mediaMaxMb` (standaard 20 MB) |
| PDF-bestanden | Slack-bestands-URL | Gedownload en beschikbaar gemaakt als bestandscontext voor tools zoals `download-file` of `pdf` | Inkomend Slack-verkeer zet PDF's niet automatisch om naar input voor beeldvision |
| Andere bestanden | Slack-bestands-URL | Waar mogelijk gedownload en beschikbaar gemaakt als bestandscontext | Binaire bestanden worden niet behandeld als afbeeldingsinput |
| Thread-antwoorden | Bestanden van threadstarter | Bestanden uit het rootbericht kunnen als context worden gehydrateerd wanneer het antwoord geen directe media heeft | Starters met alleen bestanden gebruiken een bijlage-placeholder |
| Berichten met meerdere afbeeldingen | Meerdere Slack-bestanden | Elk bestand wordt onafhankelijk beoordeeld | Slack-verwerking is beperkt tot acht bestanden per bericht |
### Inkomende pipeline
Wanneer een Slack-bericht met bestandsbijlagen binnenkomt:
1. OpenClaw downloadt het bestand vanaf de privé-URL van Slack met de bottoken (`xoxb-...`).
2. Bij succes wordt het bestand naar de mediaopslag geschreven.
3. Gedownloade mediapaden en contenttypen worden toegevoegd aan de inkomende context.
4. Model- en toolpaden die afbeeldingen ondersteunen, kunnen afbeeldingsbijlagen uit die context gebruiken.
1. OpenClaw downloadt het bestand vanaf de privé-URL van Slack met het bottoken (`xoxb-...`).
2. Het bestand wordt bij succes naar de mediaopslag geschreven.
3. Gedownloade mediapaden en contenttypes worden aan de inkomende context toegevoegd.
4. Model-/toolpaden met afbeeldingsondersteuning kunnen afbeeldingsbijlagen uit die context gebruiken.
5. Niet-afbeeldingsbestanden blijven beschikbaar als bestandsmetadata of mediareferenties voor tools die ze kunnen verwerken.
### Overerving van bijlagen uit de thread-root
### Overerving van thread-rootbijlagen
Wanneer een bericht binnenkomt in een thread (met een `thread_ts`-ouder):
Wanneer een bericht binnenkomt in een thread (met een `thread_ts`-parent):
- Als het antwoord zelf geen directe media heeft en het meegeleverde rootbericht bestanden heeft, kan Slack de rootbestanden hydrateren als threadstartercontext.
- Directe antwoordbijlagen hebben voorrang op bijlagen uit het rootbericht.
- Een rootbericht dat alleen bestanden en geen tekst heeft, wordt weergegeven met een bijlageplaceholder zodat de fallback de bestanden nog steeds kan opnemen.
- Als het antwoord zelf geen directe media heeft en het meegeleverde rootbericht bestanden bevat, kan Slack de rootbestanden hydrateren als context van de threadstarter.
- Directe antwoordbijlagen hebben voorrang op rootberichtbijlagen.
- Een rootbericht dat alleen bestanden en geen tekst heeft, wordt weergegeven met een bijlage-placeholder zodat de fallback de bestanden nog steeds kan opnemen.
### Afhandeling van meerdere bijlagen
### Verwerking van meerdere bijlagen
Wanneer één Slack-bericht meerdere bestandsbijlagen bevat:
- Elke bijlage wordt onafhankelijk verwerkt via de mediapipeline.
- Elke bijlage wordt onafhankelijk via de mediapipeline verwerkt.
- Gedownloade mediareferenties worden samengevoegd in de berichtcontext.
- De verwerkingsvolgorde volgt de bestandsvolgorde van Slack in de eventpayload.
- Een downloadfout bij één bijlage blokkeert de andere niet.
- Een fout bij het downloaden van één bijlage blokkeert de andere niet.
### Grootte-, download- en modellimieten
- **Groottelimiet**: Standaard 20 MB per bestand. Configureerbaar via `channels.slack.mediaMaxMb`.
- **Downloadfouten**: Bestanden die Slack niet kan aanbieden, verlopen URL's, ontoegankelijke bestanden, te grote bestanden en HTML-reacties voor Slack-authenticatie of -login worden overgeslagen in plaats van gerapporteerd als niet-ondersteunde indelingen.
- **Vision-model**: Afbeeldingsanalyse gebruikt het actieve antwoordmodel wanneer dit vision ondersteunt, of het afbeeldingsmodel dat is geconfigureerd op `agents.defaults.imageModel`.
- **Downloadfouten**: Bestanden die Slack niet kan leveren, verlopen URL's, ontoegankelijke bestanden, te grote bestanden en Slack-auth/login-HTML-antwoorden worden overgeslagen in plaats van gerapporteerd als niet-ondersteunde formaten.
- **Vision-model**: Afbeeldingsanalyse gebruikt het actieve antwoordmodel wanneer dat vision ondersteunt, of het afbeeldingsmodel dat is geconfigureerd op `agents.defaults.imageModel`.
### Bekende beperkingen
| Scenario | Huidig gedrag | Workaround |
| -------------------------------------- | ---------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| Verlopen Slack-bestands-URL | Bestand overgeslagen; geen fout getoond | Upload het bestand opnieuw in Slack |
| Vision-model niet geconfigureerd | Afbeeldingsbijlagen worden opgeslagen als mediareferenties, maar niet als afbeeldingen geanalyseerd | Configureer `agents.defaults.imageModel` of gebruik een vision-geschikt antwoordmodel |
| Zeer grote afbeeldingen (> standaard 20 MB) | Overgeslagen vanwege de groottelimiet | Verhoog `channels.slack.mediaMaxMb` als Slack dit toestaat |
| Doorgestuurde/gedeelde bijlagen | Tekst en door Slack gehoste afbeeldings-/bestandsmedia zijn best-effort | Deel ze rechtstreeks opnieuw in de OpenClaw-thread |
| PDF-bijlagen | Opgeslagen als bestands-/mediacontext, niet automatisch via afbeeldings-vision gerouteerd | Gebruik `download-file` voor bestandsmetadata of de `pdf`-tool voor PDF-analyse |
| Scenario | Huidig gedrag | Tijdelijke oplossing |
| -------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| Verlopen Slack-bestands-URL | Bestand overgeslagen; geen fout weergegeven | Upload het bestand opnieuw in Slack |
| Vision-model niet geconfigureerd | Afbeeldingsbijlagen worden opgeslagen als mediareferenties, maar niet als afbeeldingen geanalyseerd | Configureer `agents.defaults.imageModel` of gebruik een vision-geschikt antwoordmodel |
| Zeer grote afbeeldingen (> 20 MB standaard) | Overgeslagen volgens groottelimiet | Verhoog `channels.slack.mediaMaxMb` als Slack dit toestaat |
| Doorgestuurde/gedeelde bijlagen | Tekst en door Slack gehoste afbeeldings-/bestandsmedia worden best effort verwerkt | Deel opnieuw rechtstreeks in de OpenClaw-thread |
| PDF-bijlagen | Opgeslagen als bestands-/mediacontext, niet automatisch via beeldvision gerouteerd | Gebruik `download-file` voor bestandsmetadata of de `pdf`-tool voor PDF-analyse |
### Gerelateerde documentatie
- [Pipeline voor mediabegrip](/nl/nodes/media-understanding)
- [PDF-tool](/nl/tools/pdf)
- Epic: [#51349](https://github.com/openclaw/openclaw/issues/51349) — Slack-bijlagenvision inschakelen
- Epic: [#51349](https://github.com/openclaw/openclaw/issues/51349) — inschakeling van Slack-bijlagevision
- Regressietests: [#51353](https://github.com/openclaw/openclaw/issues/51353)
- Liveverificatie: [#51354](https://github.com/openclaw/openclaw/issues/51354)
## Gerelateerd
<CardGroup cols={2}>
<Card title="Pairing" icon="link" href="/nl/channels/pairing">
Koppel een Slack-gebruiker aan de gateway.
<Card title="Koppelen" icon="link" href="/nl/channels/pairing">
Koppel een Slack-gebruiker aan de Gateway.
</Card>
<Card title="Groups" icon="users" href="/nl/channels/groups">
<Card title="Groepen" icon="users" href="/nl/channels/groups">
Gedrag van kanalen en groeps-DM's.
</Card>
<Card title="Channel routing" icon="route" href="/nl/channels/channel-routing">
<Card title="Kanaalroutering" icon="route" href="/nl/channels/channel-routing">
Routeer inkomende berichten naar agents.
</Card>
<Card title="Security" icon="shield" href="/nl/gateway/security">
<Card title="Beveiliging" icon="shield" href="/nl/gateway/security">
Dreigingsmodel en hardening.
</Card>
<Card title="Configuration" icon="sliders" href="/nl/gateway/configuration">
<Card title="Configuratie" icon="sliders" href="/nl/gateway/configuration">
Configuratie-indeling en prioriteit.
</Card>
<Card title="Slash commands" icon="terminal" href="/nl/tools/slash-commands">

View File

@ -1,25 +1,25 @@
---
read_when:
- Werken aan Telegram-functies of Webhooks
summary: Status, mogelijkheden en configuratie voor ondersteuning van Telegram-bots
summary: Ondersteuningsstatus, mogelijkheden en configuratie van de Telegram-bot
title: Telegram
x-i18n:
generated_at: "2026-05-03T21:27:17Z"
generated_at: "2026-05-04T07:02:42Z"
model: gpt-5.5
provider: openai
source_hash: 528ace9dae29eda22f98cc1436ec16146eb9d83edc73aa6db1ab8283f4f873c0
source_hash: 6ef1b019a6a0e261b33972b5edffaedd29310b1333d112bade2e79e9d56887c6
source_path: channels/telegram.md
workflow: 16
---
Productieklaar voor bot-DM's en groepen via grammY. Long polling is de standaardmodus; Webhook-modus is optioneel.
Productieklaar voor bot-DM's en groepen via grammY. Long polling is de standaardmodus; webhookmodus is optioneel.
<CardGroup cols={3}>
<Card title="Koppelen" icon="link" href="/nl/channels/pairing">
Het standaard-DM-beleid voor Telegram is koppelen.
</Card>
<Card title="Problemen met kanalen oplossen" icon="wrench" href="/nl/channels/troubleshooting">
Cross-channel diagnostiek en herstelplaybooks.
<Card title="Kanaalprobleemoplossing" icon="wrench" href="/nl/channels/troubleshooting">
Kanaaloverstijgende diagnostiek en herstelplaybooks.
</Card>
<Card title="Gateway-configuratie" icon="settings" href="/nl/gateway/configuration">
Volledige kanaalconfiguratiepatronen en voorbeelden.
@ -29,10 +29,10 @@ Productieklaar voor bot-DM's en groepen via grammY. Long polling is de standaard
## Snelle installatie
<Steps>
<Step title="Maak het bot-token aan in BotFather">
Open Telegram en chat met **@BotFather** (bevestig dat de handle exact `@BotFather` is).
<Step title="Maak de bottoken aan in BotFather">
Open Telegram en chat met **@BotFather** (controleer of de handle precies `@BotFather` is).
Voer `/newbot` uit, volg de prompts en bewaar het token.
Voer `/newbot` uit, volg de aanwijzingen en bewaar de token.
</Step>
@ -52,11 +52,11 @@ Productieklaar voor bot-DM's en groepen via grammY. Long polling is de standaard
```
Env-fallback: `TELEGRAM_BOT_TOKEN=...` (alleen standaardaccount).
Telegram gebruikt **niet** `openclaw channels login telegram`; configureer token in config/env en start daarna de Gateway.
Telegram gebruikt **niet** `openclaw channels login telegram`; configureer de token in config/env en start daarna de gateway.
</Step>
<Step title="Start de Gateway en keur de eerste DM goed">
<Step title="Start gateway en keur de eerste DM goed">
```bash
openclaw gateway
@ -69,70 +69,70 @@ openclaw pairing approve telegram <CODE>
</Step>
<Step title="Voeg de bot toe aan een groep">
Voeg de bot toe aan je groep en stel daarna `channels.telegram.groups` en `groupPolicy` zo in dat ze overeenkomen met je toegangsmodel.
Voeg de bot toe aan je groep en stel daarna `channels.telegram.groups` en `groupPolicy` in zodat ze passen bij je toegangsmodel.
</Step>
</Steps>
<Note>
De volgorde voor tokenresolutie is accountbewust. In de praktijk winnen configuratiewaarden van env-fallback, en `TELEGRAM_BOT_TOKEN` is alleen van toepassing op het standaardaccount.
De volgorde voor tokenresolutie is accountbewust. In de praktijk hebben configuratiewaarden voorrang op env-fallback, en `TELEGRAM_BOT_TOKEN` geldt alleen voor het standaardaccount.
</Note>
## Instellingen aan Telegram-zijde
## Telegram-instellingen
<AccordionGroup>
<Accordion title="Privacymodus en groepszichtbaarheid">
Telegram-bots gebruiken standaard **Privacy Mode**, wat beperkt welke groepsberichten ze ontvangen.
Telegram-bots gebruiken standaard **Privacymodus**, wat beperkt welke groepsberichten ze ontvangen.
Als de bot alle groepsberichten moet zien, doe dan een van beide:
- schakel privacymodus uit via `/setprivacy`, of
- schakel de privacymodus uit via `/setprivacy`, of
- maak de bot groepsbeheerder.
Wanneer je de privacymodus omschakelt, verwijder je de bot uit elke groep en voeg je hem opnieuw toe, zodat Telegram de wijziging toepast.
Verwijder de bot en voeg hem opnieuw toe in elke groep wanneer je de privacymodus wijzigt, zodat Telegram de wijziging toepast.
</Accordion>
<Accordion title="Groepsmachtigingen">
Beheerdersstatus wordt beheerd in de groepsinstellingen van Telegram.
Beheerdersbots ontvangen alle groepsberichten, wat nuttig is voor altijd actieve groepswerking.
Beheerder-bots ontvangen alle groepsberichten, wat nuttig is voor altijd-actief groepsgedrag.
</Accordion>
<Accordion title="Handige BotFather-schakelaars">
- `/setjoingroups` om toevoegen aan groepen toe te staan/te weigeren
- `/setjoingroups` om groepstoevoegingen toe te staan of te weigeren
- `/setprivacy` voor gedrag rond groepszichtbaarheid
</Accordion>
</AccordionGroup>
## Toegangscontrole en activering
## Toegangsbeheer en activering
<Tabs>
<Tab title="DM-beleid">
`channels.telegram.dmPolicy` beheert toegang via directe berichten:
- `pairing` (standaard)
- `allowlist` (vereist ten minste één afzender-ID in `allowFrom`)
- `allowlist` (vereist minstens één afzender-ID in `allowFrom`)
- `open` (vereist dat `allowFrom` `"*"` bevat)
- `disabled`
`dmPolicy: "open"` met `allowFrom: ["*"]` laat elk Telegram-account dat de botgebruikersnaam vindt of raadt de bot opdrachten geven. Gebruik dit alleen voor bewust openbare bots met strikt beperkte tools; bots met één eigenaar moeten `allowlist` gebruiken met numerieke gebruikers-ID's.
`channels.telegram.allowFrom` accepteert numerieke Telegram-gebruikers-ID's. Prefixen `telegram:` / `tg:` worden geaccepteerd en genormaliseerd.
In configuraties met meerdere accounts wordt een beperkende `channels.telegram.allowFrom` op topniveau behandeld als veiligheidsgrens: accountniveau-items `allowFrom: ["*"]` maken dat account niet openbaar, tenzij de effectieve account-allowlist na samenvoeging nog steeds een expliciete wildcard bevat.
In configuraties met meerdere accounts wordt een beperkende `channels.telegram.allowFrom` op topniveau behandeld als veiligheidsgrens: accountniveauvermeldingen `allowFrom: ["*"]` maken dat account niet openbaar tenzij de effectieve account-allowlist na samenvoeging nog steeds een expliciete wildcard bevat.
`dmPolicy: "allowlist"` met lege `allowFrom` blokkeert alle DM's en wordt geweigerd door configuratievalidatie.
Setup vraagt alleen om numerieke gebruikers-ID's.
Als je hebt geüpgraded en je config `@username`-allowlist-items bevat, voer dan `openclaw doctor --fix` uit om ze op te lossen (best-effort; vereist een Telegram-bottoken).
Als je eerder vertrouwde op allowlist-bestanden uit de koppelingsopslag, kan `openclaw doctor --fix` items herstellen naar `channels.telegram.allowFrom` in allowlist-flows (bijvoorbeeld wanneer `dmPolicy: "allowlist"` nog geen expliciete ID's heeft).
De installatie vraagt alleen om numerieke gebruikers-ID's.
Als je hebt geüpgraded en je configuratie `@username`-allowlistvermeldingen bevat, voer dan `openclaw doctor --fix` uit om ze op te lossen (best effort; vereist een Telegram-bottoken).
Als je eerder vertrouwde op allowlistbestanden uit de koppelopslag, kan `openclaw doctor --fix` vermeldingen herstellen naar `channels.telegram.allowFrom` in allowlistflows (bijvoorbeeld wanneer `dmPolicy: "allowlist"` nog geen expliciete ID's heeft).
Voor bots met één eigenaar verdient `dmPolicy: "allowlist"` met expliciete numerieke `allowFrom`-ID's de voorkeur, zodat het toegangsbeleid duurzaam in config staat (in plaats van afhankelijk te zijn van eerdere koppelingsgoedkeuringen).
Voor bots met één eigenaar geef je de voorkeur aan `dmPolicy: "allowlist"` met expliciete numerieke `allowFrom`-ID's om het toegangsbeleid duurzaam in de configuratie vast te leggen (in plaats van afhankelijk te zijn van eerdere koppelgoedkeuringen).
Veelvoorkomende verwarring: goedkeuring van DM-koppeling betekent niet "deze afzender is overal geautoriseerd".
Koppelen verleent DM-toegang. Als er nog geen opdrachteigenaar bestaat, stelt de eerste goedgekeurde koppeling ook `commands.ownerAllowFrom` in, zodat eigenaar-only opdrachten en exec-goedkeuringen een expliciet operatoraccount hebben.
Veelvoorkomende verwarring: DM-koppelgoedkeuring betekent niet "deze afzender is overal geautoriseerd".
Koppelen verleent DM-toegang. Als er nog geen opdrachteigenaar bestaat, stelt de eerste goedgekeurde koppeling ook `commands.ownerAllowFrom` in zodat alleen-eigenaar-opdrachten en exec-goedkeuringen een expliciet operatoraccount hebben.
Autorisatie van groepsafzenders komt nog steeds uit expliciete configuratie-allowlists.
Als je wilt "ik ben één keer geautoriseerd en zowel DM's als groepsopdrachten werken", zet dan je numerieke Telegram-gebruikers-ID in `channels.telegram.allowFrom`; zorg er voor eigenaar-only opdrachten voor dat `commands.ownerAllowFrom` `telegram:<your user id>` bevat.
Als je wilt "ik ben één keer geautoriseerd en zowel DM's als groepsopdrachten werken", zet dan je numerieke Telegram-gebruikers-ID in `channels.telegram.allowFrom`; zorg er voor alleen-eigenaar-opdrachten voor dat `commands.ownerAllowFrom` `telegram:<your user id>` bevat.
### Je Telegram-gebruikers-ID vinden
@ -153,12 +153,12 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Tab>
<Tab title="Groepsbeleid en allowlists">
Twee controles zijn samen van toepassing:
Twee instellingen gelden samen:
1. **Welke groepen zijn toegestaan** (`channels.telegram.groups`)
- geen `groups`-config:
- met `groupPolicy: "open"`: elke groep kan groeps-ID-controles doorstaan
- met `groupPolicy: "allowlist"` (standaard): groepen worden geblokkeerd totdat je `groups`-items (of `"*"`) toevoegt
- geen `groups`-configuratie:
- met `groupPolicy: "open"`: elke groep kan groeps-ID-controles passeren
- met `groupPolicy: "allowlist"` (standaard): groepen worden geblokkeerd totdat je `groups`-vermeldingen toevoegt (of `"*"`)
- `groups` geconfigureerd: werkt als allowlist (expliciete ID's of `"*"`)
2. **Welke afzenders zijn toegestaan in groepen** (`channels.telegram.groupPolicy`)
@ -167,16 +167,16 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `disabled`
`groupAllowFrom` wordt gebruikt voor filtering van groepsafzenders. Als dit niet is ingesteld, valt Telegram terug op `allowFrom`.
`groupAllowFrom`-items moeten numerieke Telegram-gebruikers-ID's zijn (prefixen `telegram:` / `tg:` worden genormaliseerd).
Zet geen Telegram-groeps- of supergroepchat-ID's in `groupAllowFrom`. Negatieve chat-ID's horen onder `channels.telegram.groups`.
Niet-numerieke items worden genegeerd voor afzenderautorisatie.
Veiligheidsgrens (`2026.2.25+`): groepsafzenderauth neemt **geen** DM-koppelingsopslaggoedkeuringen over.
Koppelen blijft alleen voor DM. Stel voor groepen `groupAllowFrom` of per-groep/per-onderwerp `allowFrom` in.
Als `groupAllowFrom` niet is ingesteld, valt Telegram terug op config `allowFrom`, niet op de koppelingsopslag.
Praktisch patroon voor bots met één eigenaar: zet je gebruikers-ID in `channels.telegram.allowFrom`, laat `groupAllowFrom` leeg en sta de doelgroepen toe onder `channels.telegram.groups`.
Runtime-opmerking: als `channels.telegram` volledig ontbreekt, gebruikt runtime standaard fail-closed `groupPolicy="allowlist"`, tenzij `channels.defaults.groupPolicy` expliciet is ingesteld.
`groupAllowFrom`-vermeldingen moeten numerieke Telegram-gebruikers-ID's zijn (prefixen `telegram:` / `tg:` worden genormaliseerd).
Plaats geen Telegram-groeps- of supergroepchat-ID's in `groupAllowFrom`. Negatieve chat-ID's horen onder `channels.telegram.groups`.
Niet-numerieke vermeldingen worden genegeerd voor afzenderautorisatie.
Veiligheidsgrens (`2026.2.25+`): auth voor groepsafzenders erft **geen** DM-goedkeuringen uit de koppelopslag.
Koppelen blijft alleen voor DM's. Stel voor groepen `groupAllowFrom` of per-groep/per-onderwerp `allowFrom` in.
Als `groupAllowFrom` niet is ingesteld, valt Telegram terug op configuratie-`allowFrom`, niet op de koppelopslag.
Praktisch patroon voor bots met één eigenaar: stel je gebruikers-ID in bij `channels.telegram.allowFrom`, laat `groupAllowFrom` leeg en sta de doelgroepen toe onder `channels.telegram.groups`.
Runtime-opmerking: als `channels.telegram` volledig ontbreekt, gebruikt de runtime standaard fail-closed `groupPolicy="allowlist"` tenzij `channels.defaults.groupPolicy` expliciet is ingesteld.
Voorbeeld: elk lid in één specifieke groep toestaan:
Voorbeeld: sta elk lid toe in één specifieke groep:
```json5
{
@ -193,7 +193,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Voorbeeld: alleen specifieke gebruikers binnen één specifieke groep toestaan:
Voorbeeld: sta alleen specifieke gebruikers toe binnen één specifieke groep:
```json5
{
@ -211,10 +211,10 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
```
<Warning>
Veelvoorkomende fout: `groupAllowFrom` is geen Telegram-groepsallowlist.
Veelgemaakte fout: `groupAllowFrom` is geen Telegram-groeps-allowlist.
- Zet negatieve Telegram-groeps- of supergroepchat-ID's zoals `-1001234567890` onder `channels.telegram.groups`.
- Zet Telegram-gebruikers-ID's zoals `8734062810` onder `groupAllowFrom` wanneer je wilt beperken welke mensen binnen een toegestane groep de bot kunnen activeren.
- Plaats negatieve Telegram-groeps- of supergroepchat-ID's zoals `-1001234567890` onder `channels.telegram.groups`.
- Plaats Telegram-gebruikers-ID's zoals `8734062810` onder `groupAllowFrom` wanneer je wilt beperken welke mensen binnen een toegestane groep de bot kunnen activeren.
- Gebruik `groupAllowFrom: ["*"]` alleen wanneer je wilt dat elk lid van een toegestane groep met de bot kan praten.
</Warning>
@ -224,21 +224,21 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
<Tab title="Vermeldingsgedrag">
Groepsantwoorden vereisen standaard een vermelding.
Vermelding kan komen van:
Een vermelding kan komen van:
- native `@botusername`-vermelding, of
- vermeldingspatronen in:
- `agents.list[].groupChat.mentionPatterns`
- `messages.groupChat.mentionPatterns`
Opdrachtschakelaars op sessieniveau:
Opdrachten voor sessieniveau-schakelaars:
- `/activation always`
- `/activation mention`
Deze werken alleen sessiestatus bij. Gebruik config voor persistentie.
Deze werken alleen de sessiestatus bij. Gebruik configuratie voor persistentie.
Voorbeeld van persistente config:
Voorbeeld van persistente configuratie:
```json5
{
@ -252,7 +252,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
De groepschat-ID ophalen:
De groepschat-ID verkrijgen:
- stuur een groepsbericht door naar `@userinfobot` / `@getidsbot`
- of lees `chat.id` uit `openclaw logs --follow`
@ -263,15 +263,15 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
## Runtimegedrag
- Telegram is eigendom van het Gateway-proces.
- Routering is deterministisch: inkomende Telegram-berichten worden terug beantwoord via Telegram (het model kiest geen kanalen).
- Inkomende berichten worden genormaliseerd naar de gedeelde kanaalenvelop met antwoordmetadata en mediaplaceholders.
- Telegram is eigendom van het gatewayproces.
- Routering is deterministisch: Telegram-inbound antwoordt terug naar Telegram (het model kiest geen kanalen).
- Inboundberichten worden genormaliseerd naar de gedeelde kanaalenvelop met antwoordmetadata en mediaplaceholders.
- Groepssessies worden geïsoleerd op groeps-ID. Forumonderwerpen voegen `:topic:<threadId>` toe om onderwerpen geïsoleerd te houden.
- DM-berichten kunnen `message_thread_id` bevatten; OpenClaw behoudt de thread-ID voor antwoorden, maar houdt DM's standaard op de platte sessie. Configureer `channels.telegram.dm.threadReplies: "inbound"`, `channels.telegram.direct.<chatId>.threadReplies: "inbound"`, `requireTopic: true`, of een overeenkomende onderwerpconfiguratie wanneer je bewust DM-onderwerpsessie-isolatie wilt.
- Long polling gebruikt grammY runner met per-chat/per-thread-volgorde. De algemene runner-sinkconcurrency gebruikt `agents.defaults.maxConcurrent`.
- Long polling wordt binnen elk Gateway-proces beschermd, zodat slechts één actieve poller tegelijk een bottoken kan gebruiken. Als je nog steeds `getUpdates` 409-conflicten ziet, gebruikt waarschijnlijk een andere OpenClaw Gateway, script of externe poller hetzelfde token.
- Herstarts van de long-polling-watchdog worden standaard geactiveerd na 120 seconden zonder voltooide `getUpdates`-liveness. Verhoog `channels.telegram.pollingStallThresholdMs` alleen als je deployment nog steeds valse polling-stall-herstarts ziet tijdens langlopende werkzaamheden. De waarde is in milliseconden en is toegestaan van `30000` tot `600000`; overschrijvingen per account worden ondersteund.
- Telegram Bot API heeft geen ondersteuning voor leesbevestigingen (`sendReadReceipts` is niet van toepassing).
- DM-berichten kunnen `message_thread_id` bevatten; OpenClaw behoudt de thread-ID voor antwoorden maar houdt DM's standaard op de platte sessie. Configureer `channels.telegram.dm.threadReplies: "inbound"`, `channels.telegram.direct.<chatId>.threadReplies: "inbound"`, `requireTopic: true`, of een overeenkomende onderwerpconfiguratie wanneer je bewust DM-onderwerpsessie-isolatie wilt.
- Long polling gebruikt grammY runner met volgordebepaling per chat/per thread. Algemene runner-sinkconcurrency gebruikt `agents.defaults.maxConcurrent`.
- Long polling wordt binnen elk gatewayproces bewaakt zodat slechts één actieve poller tegelijk een bottoken kan gebruiken. Als je nog steeds `getUpdates` 409-conflicten ziet, gebruikt waarschijnlijk een andere OpenClaw-gateway, script of externe poller dezelfde token.
- Long-pollingwatchdog-herstarts worden standaard geactiveerd na 120 seconden zonder voltooide `getUpdates`-liveness. Verhoog `channels.telegram.pollingStallThresholdMs` alleen als je deployment nog steeds foutieve polling-stall-herstarts ziet tijdens langlopende werkzaamheden. De waarde is in milliseconden en is toegestaan van `30000` tot `600000`; overrides per account worden ondersteund.
- Telegram Bot API ondersteunt geen leesbevestigingen (`sendReadReceipts` is niet van toepassing).
## Functiereferentie
@ -285,11 +285,12 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Vereiste:
- `channels.telegram.streaming` is `off | partial | block | progress` (standaard: `partial`)
- `progress` houdt één bewerkbaar statusconcept bij en werkt dit bij met toolvoortgang tot de uiteindelijke aflevering
- `progress` behoudt één bewerkbaar statusconcept en werkt dit bij met toolvoortgang tot de definitieve aflevering
- `streaming.preview.toolProgress` bepaalt of tool-/voortgangsupdates hetzelfde bewerkte previewbericht hergebruiken (standaard: `true` wanneer previewstreaming actief is)
- verouderde waarden `channels.telegram.streamMode` en boolean `streaming` worden gedetecteerd; voer `openclaw doctor --fix` uit om ze te migreren naar `channels.telegram.streaming.mode`
- `streaming.preview.commandText` bepaalt opdracht-/exec-detail binnen die toolvoortgangsregels: `raw` (standaard, behoudt uitgebracht gedrag) of `status` (alleen toollabel)
- legacy `channels.telegram.streamMode` en booleaanse `streaming`-waarden worden gedetecteerd; voer `openclaw doctor --fix` uit om ze te migreren naar `channels.telegram.streaming.mode`
Toolvoortgangs-previewupdates zijn de korte statusregels die worden getoond terwijl tools draaien, bijvoorbeeld opdrachtuitvoering, bestanden lezen, planningsupdates of patchsamenvattingen. Telegram houdt deze standaard ingeschakeld om overeen te komen met uitgebracht OpenClaw-gedrag vanaf `v2026.4.22` en later. Stel het volgende in om de bewerkte preview voor antwoordtekst te behouden, maar toolvoortgangsregels te verbergen:
Previewupdates voor toolvoortgang zijn de korte statusregels die worden getoond terwijl tools draaien, bijvoorbeeld opdrachtuitvoering, bestanden lezen, planningsupdates of patchsamenvattingen. Telegram houdt deze standaard ingeschakeld om overeen te komen met uitgebracht OpenClaw-gedrag vanaf `v2026.4.22` en later. Om de bewerkte preview voor antwoordtekst te behouden maar toolvoortgangsregels te verbergen, stel je in:
```json
{
@ -306,26 +307,62 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Gebruik `streaming.mode: "off"` alleen wanneer je alleen uiteindelijke levering wilt: bewerkingen van Telegram-voorbeelden zijn uitgeschakeld en generieke tool-/voortgangsberichten worden onderdrukt in plaats van als zelfstandige statusberichten te worden verzonden. Goedkeuringsprompts, media-payloads en fouten lopen nog steeds via normale uiteindelijke levering. Gebruik `streaming.preview.toolProgress: false` wanneer je alleen antwoordvoorbeeld-bewerkingen wilt behouden terwijl je de statusregels voor toolvoortgang verbergt.
Om toolvoortgang zichtbaar te houden maar opdracht-/exec-tekst te verbergen, stel je in:
```json
{
"channels": {
"telegram": {
"streaming": {
"mode": "partial",
"preview": {
"commandText": "status"
}
}
}
}
}
```
Voor de voortgang-conceptmodus zet je hetzelfde commandotekstbeleid onder `streaming.progress`:
```json
{
"channels": {
"telegram": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
```
Gebruik `streaming.mode: "off"` alleen wanneer je uitsluitend finale aflevering wilt: Telegram-voorbeeldbewerkingen zijn uitgeschakeld en generieke tool-/voortgangspraat wordt onderdrukt in plaats van als zelfstandige statusberichten te worden verzonden. Goedkeuringsprompts, media-payloads en fouten lopen nog steeds via normale finale aflevering. Gebruik `streaming.preview.toolProgress: false` wanneer je alleen antwoordvoorbeeldbewerkingen wilt behouden terwijl je de statusregels voor toolvoortgang verbergt.
<Note>
Telegram-antwoorden op geselecteerde citaten zijn de uitzondering. Wanneer `replyToMode` `"first"`, `"all"` of `"batched"` is en het inkomende bericht geselecteerde citaattekst bevat, verzendt OpenClaw het uiteindelijke antwoord via Telegrams native citaatantwoordpad in plaats van het antwoordvoorbeeld te bewerken, waardoor `streaming.preview.toolProgress` de korte statusregels voor die beurt niet kan tonen. Antwoorden op het huidige bericht zonder geselecteerde citaattekst behouden nog steeds previewstreaming. Stel `replyToMode: "off"` in wanneer zichtbaarheid van toolvoortgang belangrijker is dan native citaatantwoorden, of stel `streaming.preview.toolProgress: false` in om de afweging te erkennen.
Telegram-antwoorden op geselecteerde citaten vormen de uitzondering. Wanneer `replyToMode` `"first"`, `"all"` of `"batched"` is en het inkomende bericht geselecteerde citaattekst bevat, stuurt OpenClaw het finale antwoord via Telegrams native citaatantwoordpad in plaats van het antwoordvoorbeeld te bewerken, waardoor `streaming.preview.toolProgress` de korte statusregels voor die beurt niet kan tonen. Antwoorden op het huidige bericht zonder geselecteerde citaattekst behouden nog steeds voorbeeldstreaming. Stel `replyToMode: "off"` in wanneer zichtbaarheid van toolvoortgang belangrijker is dan native citaatantwoorden, of stel `streaming.preview.toolProgress: false` in om de afweging te erkennen.
</Note>
Voor antwoorden met alleen tekst:
- korte DM-/groeps-/onderwerpvoorbeelden: OpenClaw behoudt hetzelfde voorbeeldbericht en voert een uiteindelijke bewerking ter plekke uit, tenzij er een zichtbaar niet-voorbeeldbericht is verzonden nadat het voorbeeld verscheen
- voorbeelden gevolgd door zichtbare niet-voorbeelduitvoer: OpenClaw verzendt het voltooide antwoord als een nieuw definitief bericht en ruimt het oudere voorbeeld op, zodat het uiteindelijke antwoord na tussentijdse uitvoer verschijnt
- voorbeelden ouder dan ongeveer één minuut: OpenClaw verzendt het voltooide antwoord als een nieuw definitief bericht en ruimt daarna het voorbeeld op, zodat Telegrams zichtbare tijdstempel de voltooiingstijd weergeeft in plaats van de aanmaaktijd van het voorbeeld
- korte DM-/groep-/topicvoorbeelden: OpenClaw behoudt hetzelfde voorbeeldbericht en voert een finale bewerking op zijn plaats uit, tenzij er een zichtbaar niet-voorbeeldbericht is verzonden nadat het voorbeeld verscheen
- voorbeelden gevolgd door zichtbare niet-voorbeelduitvoer: OpenClaw stuurt het voltooide antwoord als een nieuw finaal bericht en ruimt het oudere voorbeeld op, zodat het finale antwoord na de tussentijdse uitvoer verschijnt
- voorbeelden ouder dan ongeveer een minuut: OpenClaw stuurt het voltooide antwoord als een nieuw finaal bericht en ruimt daarna het voorbeeld op, zodat Telegrams zichtbare tijdstempel de voltooiingstijd weergeeft in plaats van de aanmaaktijd van het voorbeeld
Voor complexe antwoorden (bijvoorbeeld media-payloads) valt OpenClaw terug op normale uiteindelijke levering en ruimt daarna het voorbeeldbericht op.
Voor complexe antwoorden (bijvoorbeeld media-payloads) valt OpenClaw terug op normale finale aflevering en ruimt daarna het voorbeeldbericht op.
Previewstreaming staat los van blokstreaming. Wanneer blokstreaming expliciet is ingeschakeld voor Telegram, slaat OpenClaw de previewstream over om dubbele streaming te voorkomen.
Voorbeeldstreaming staat los van blokstreaming. Wanneer blokstreaming expliciet is ingeschakeld voor Telegram, slaat OpenClaw de voorbeeldstream over om dubbel streamen te voorkomen.
Alleen-Telegram redeneerstroom:
Telegram-only redeneerstroom:
- `/reasoning stream` verzendt redenatie naar het livevoorbeeld tijdens het genereren
- het uiteindelijke antwoord wordt zonder redenatietekst verzonden
- `/reasoning stream` stuurt redenering naar het live voorbeeld tijdens het genereren
- het redeneervoorbeeld wordt verwijderd na finale aflevering; gebruik `/reasoning on` wanneer redenering zichtbaar moet blijven
- het finale antwoord wordt zonder redeneringstekst verzonden
</Accordion>
@ -333,8 +370,8 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Uitgaande tekst gebruikt Telegram `parse_mode: "HTML"`.
- Markdown-achtige tekst wordt gerenderd naar Telegram-veilige HTML.
- Ruwe model-HTML wordt geëscapet om Telegram-parsefouten te verminderen.
- Als Telegram geparseerde HTML weigert, probeert OpenClaw het opnieuw als platte tekst.
- Ruwe model-HTML wordt escaped om Telegram-parsefouten te beperken.
- Als Telegram geparsede HTML weigert, probeert OpenClaw het opnieuw als platte tekst.
Linkvoorbeelden zijn standaard ingeschakeld en kunnen worden uitgeschakeld met `channels.telegram.linkPreview: false`.
@ -343,7 +380,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
<Accordion title="Native opdrachten en aangepaste opdrachten">
Registratie van het Telegram-opdrachtmenu wordt bij het opstarten afgehandeld met `setMyCommands`.
Standaarden voor native opdrachten:
Standaardinstellingen voor native opdrachten:
- `commands.native: "auto"` schakelt native opdrachten in voor Telegram
@ -367,44 +404,44 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- namen worden genormaliseerd (voorloop-`/` verwijderen, kleine letters)
- geldig patroon: `a-z`, `0-9`, `_`, lengte `1..32`
- aangepaste opdrachten kunnen native opdrachten niet overschrijven
- conflicten/dubbele vermeldingen worden overgeslagen en gelogd
- conflicten/duplicaten worden overgeslagen en gelogd
Opmerkingen:
Notities:
- aangepaste opdrachten zijn alleen menu-items; ze implementeren niet automatisch gedrag
- plugin-/skillopdrachten kunnen nog steeds werken wanneer ze worden getypt, zelfs als ze niet in het Telegram-menu worden getoond
- aangepaste opdrachten zijn alleen menu-items; ze implementeren gedrag niet automatisch
- Plugin-/Skill-opdrachten kunnen nog steeds werken wanneer ze worden getypt, zelfs als ze niet in het Telegram-menu worden getoond
Als native opdrachten zijn uitgeschakeld, worden ingebouwde opdrachten verwijderd. Aangepaste/pluginopdrachten kunnen nog steeds worden geregistreerd als ze zijn geconfigureerd.
Als native opdrachten zijn uitgeschakeld, worden ingebouwde opdrachten verwijderd. Aangepaste/Plugin-opdrachten kunnen nog steeds worden geregistreerd als ze zijn geconfigureerd.
Veelvoorkomende configuratiefouten:
- `setMyCommands failed` met `BOT_COMMANDS_TOO_MUCH` betekent dat het Telegram-menu na inkorten nog steeds te groot was; verminder plugin-/skill-/aangepaste opdrachten of schakel `channels.telegram.commands.native` uit.
- `setMyCommands failed` met `BOT_COMMANDS_TOO_MUCH` betekent dat het Telegram-menu na inkorten nog steeds te vol was; verminder Plugin-/Skill-/aangepaste opdrachten of schakel `channels.telegram.commands.native` uit.
- `deleteWebhook`, `deleteMyCommands` of `setMyCommands` die faalt met `404: Not Found` terwijl directe Bot API-curlopdrachten werken, kan betekenen dat `channels.telegram.apiRoot` was ingesteld op het volledige `/bot<TOKEN>`-eindpunt. `apiRoot` mag alleen de Bot API-root zijn, en `openclaw doctor --fix` verwijdert een per ongeluk toegevoegde afsluitende `/bot<TOKEN>`.
- `getMe returned 401` betekent dat Telegram het geconfigureerde bottoken heeft geweigerd. Werk `botToken`, `tokenFile` of `TELEGRAM_BOT_TOKEN` bij met het huidige BotFather-token; OpenClaw stopt vóór het pollen, dus dit wordt niet gemeld als een Webhook-opruimfout.
- `getMe returned 401` betekent dat Telegram het geconfigureerde bottoken heeft geweigerd. Werk `botToken`, `tokenFile` of `TELEGRAM_BOT_TOKEN` bij met het huidige BotFather-token; OpenClaw stopt voor het pollen, dus dit wordt niet gerapporteerd als een Webhook-opruimfout.
- `setMyCommands failed` met netwerk-/fetchfouten betekent meestal dat uitgaande DNS/HTTPS naar `api.telegram.org` is geblokkeerd.
### Apparaatkoppelingsopdrachten (`device-pair`-plugin)
### Apparaatkoppelingsopdrachten (`device-pair`-Plugin)
Wanneer de `device-pair`-plugin is geïnstalleerd:
Wanneer de `device-pair`-Plugin is geïnstalleerd:
1. `/pair` genereert configuratiecode
2. plak code in iOS-app
3. `/pair pending` vermeldt openstaande aanvragen (inclusief rol/scopes)
4. keur de aanvraag goed:
3. `/pair pending` toont openstaande verzoeken (inclusief rol/scopes)
4. keur het verzoek goed:
- `/pair approve <requestId>` voor expliciete goedkeuring
- `/pair approve` wanneer er slechts één openstaande aanvraag is
- `/pair approve latest` voor de meest recente
- `/pair approve` wanneer er slechts één openstaand verzoek is
- `/pair approve latest` voor het meest recente
De configuratiecode bevat een kortlevend bootstrap-token. Ingebouwde bootstrap-overdracht houdt het primaire node-token op `scopes: []`; elk overgedragen operatortoken blijft begrensd tot `operator.approvals`, `operator.read`, `operator.talk.secrets` en `operator.write`. Bootstrap-scopecontroles zijn rol-geprefixt, dus die operator-allowlist voldoet alleen aan operatoraanvragen; niet-operatorrollen hebben nog steeds scopes nodig onder hun eigen rolprefix.
De configuratiecode bevat een kortlevend bootstrap-token. Ingebouwde bootstrap-overdracht houdt het primaire node-token op `scopes: []`; elk overgedragen operator-token blijft beperkt tot `operator.approvals`, `operator.read`, `operator.talk.secrets` en `operator.write`. Bootstrap-scopecontroles zijn rolgeprefixd, dus die operator-allowlist voldoet alleen aan operatorverzoeken; niet-operatorrollen hebben nog steeds scopes onder hun eigen rolprefix nodig.
Als een apparaat het opnieuw probeert met gewijzigde authgegevens (bijvoorbeeld rol/scopes/openbare sleutel), wordt de vorige openstaande aanvraag vervangen en gebruikt de nieuwe aanvraag een andere `requestId`. Voer `/pair pending` opnieuw uit voordat je goedkeurt.
Als een apparaat opnieuw probeert met gewijzigde authgegevens (bijvoorbeeld rol/scopes/publieke sleutel), wordt het vorige openstaande verzoek vervangen en gebruikt het nieuwe verzoek een andere `requestId`. Voer `/pair pending` opnieuw uit voordat je goedkeurt.
Meer details: [Koppelen](/nl/channels/pairing#pair-via-telegram-recommended-for-ios).
</Accordion>
<Accordion title="Inline knoppen">
Configureer het bereik van het inline toetsenbord:
Configureer inline toetsenbordscope:
```json5
{
@ -418,7 +455,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Overschrijving per account:
Per-account override:
```json5
{
@ -436,7 +473,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Bereiken:
Scopes:
- `off`
- `dm`
@ -444,7 +481,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `all`
- `allowlist` (standaard)
Verouderde `capabilities: ["inlineButtons"]` wordt toegewezen aan `inlineButtons: "all"`.
Verouderde `capabilities: ["inlineButtons"]` wordt gemapt naar `inlineButtons: "all"`.
Voorbeeld van berichtactie:
@ -478,27 +515,27 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `editMessage` (`chatId`, `messageId`, `content`)
- `createForumTopic` (`chatId`, `name`, optioneel `iconColor`, `iconCustomEmojiId`)
Kanaalberichtacties bieden ergonomische aliassen (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`).
Kanaalberichtacties stellen ergonomische aliassen beschikbaar (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`).
Gatecontroles:
Gatekeeping-instellingen:
- `channels.telegram.actions.sendMessage`
- `channels.telegram.actions.deleteMessage`
- `channels.telegram.actions.reactions`
- `channels.telegram.actions.sticker` (standaard: uitgeschakeld)
Opmerking: `edit` en `topic-create` zijn momenteel standaard ingeschakeld en hebben geen afzonderlijke `channels.telegram.actions.*`-schakelaars.
Runtime-verzendingen gebruiken de actieve configuratie-/secretssnapshot (opstarten/herladen), dus actiepaden voeren geen ad-hoc SecretRef-herresolutie per verzending uit.
Opmerking: `edit` en `topic-create` zijn momenteel standaard ingeschakeld en hebben geen afzonderlijke `channels.telegram.actions.*`-toggles.
Runtime-verzending gebruikt de actieve config-/secrets-snapshot (opstarten/herladen), dus actiepaden voeren geen ad-hoc SecretRef-heroplossing per verzending uit.
Semantiek voor verwijderen van reacties: [/tools/reactions](/nl/tools/reactions)
Semantiek voor het verwijderen van reacties: [/tools/reactions](/nl/tools/reactions)
</Accordion>
<Accordion title="Tags voor antwoordthreads">
Telegram ondersteunt expliciete antwoordthreadtags in gegenereerde uitvoer:
<Accordion title="Antwoord-threadingtags">
Telegram ondersteunt expliciete antwoord-threadingtags in gegenereerde uitvoer:
- `[[reply_to_current]]` antwoordt op het activerende bericht
- `[[reply_to:<id>]]` antwoordt op een specifieke Telegram-bericht-ID
- `[[reply_to:<id>]]` antwoordt op een specifiek Telegram-bericht-ID
`channels.telegram.replyToMode` bepaalt de afhandeling:
@ -506,29 +543,29 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `first`
- `all`
Wanneer antwoordthreading is ingeschakeld en de oorspronkelijke Telegram-tekst of het bijschrift beschikbaar is, neemt OpenClaw automatisch een native Telegram-citaatexcerpt op. Telegram beperkt native citaattekst tot 1024 UTF-16-code-eenheden, dus langere berichten worden vanaf het begin geciteerd en vallen terug op een gewoon antwoord als Telegram het citaat weigert.
Wanneer antwoord-threading is ingeschakeld en de oorspronkelijke Telegram-tekst of het bijschrift beschikbaar is, voegt OpenClaw automatisch een native Telegram-citaatfragment toe. Telegram beperkt native citaattekst tot 1024 UTF-16-code-eenheden, dus langere berichten worden vanaf het begin geciteerd en vallen terug op een gewoon antwoord als Telegram het citaat weigert.
Opmerking: `off` schakelt impliciete antwoordthreading uit. Expliciete `[[reply_to_*]]`-tags worden nog steeds gehonoreerd.
Opmerking: `off` schakelt impliciete antwoord-threading uit. Expliciete `[[reply_to_*]]`-tags worden nog steeds gerespecteerd.
</Accordion>
<Accordion title="Forumonderwerpen en threadgedrag">
<Accordion title="Forumtopics en threadgedrag">
Forum-supergroepen:
- onderwerpsessiesleutels voegen `:topic:<threadId>` toe
- antwoorden en typen richten zich op de onderwerpthread
- configuratiepad voor onderwerp:
- topicsessiesleutels voegen `:topic:<threadId>` toe
- antwoorden en typen richten zich op de topicthread
- topicconfiguratiepad:
`channels.telegram.groups.<chatId>.topics.<threadId>`
Speciaal geval voor algemeen onderwerp (`threadId=1`):
Speciaal geval voor algemeen topic (`threadId=1`):
- berichtverzendingen laten `message_thread_id` weg (Telegram weigert `sendMessage(...thread_id=1)`)
- typacties bevatten nog steeds `message_thread_id`
- typeacties bevatten nog steeds `message_thread_id`
Onderwerpovererving: onderwerpvermeldingen erven groepsinstellingen tenzij overschreven (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
`agentId` is alleen voor onderwerpen en erft niet van groepsstandaarden.
Topic-overerving: topicitems erven groepsinstellingen tenzij overschreven (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
`agentId` is alleen voor topics en erft niet van groepsstandaarden.
**Agentroutering per onderwerp**: Elk onderwerp kan naar een andere agent routeren door `agentId` in de onderwerpconfiguratie in te stellen. Dit geeft elk onderwerp zijn eigen geïsoleerde werkruimte, geheugen en sessie. Voorbeeld:
**Agentroutering per topic**: Elk topic kan naar een andere agent routeren door `agentId` in de topicconfiguratie in te stellen. Hierdoor krijgt elk topic zijn eigen geïsoleerde werkruimte, geheugen en sessie. Voorbeeld:
```json5
{
@ -548,13 +585,13 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
}
```
Elk onderwerp heeft dan zijn eigen sessiesleutel: `agent:zu:telegram:group:-1001234567890:topic:3`
Elk topic heeft dan zijn eigen sessiesleutel: `agent:zu:telegram:group:-1001234567890:topic:3`
**Persistente ACP-onderwerpbinding**: Forumonderwerpen kunnen ACP-harnesssessies vastzetten via typed ACP-bindingen op topniveau (`bindings[]` met `type: "acp"` en `match.channel: "telegram"`, `peer.kind: "group"` en een onderwerpgekwalificeerde id zoals `-1001234567890:topic:42`). Momenteel beperkt tot forumonderwerpen in groepen/supergroepen. Zie [ACP Agents](/nl/tools/acp-agents).
**Permanente ACP-topicbinding**: Forumtopics kunnen ACP-harness-sessies pinnen via top-level getypeerde ACP-bindingen (`bindings[]` met `type: "acp"` en `match.channel: "telegram"`, `peer.kind: "group"` en een topic-gekwalificeerd id zoals `-1001234567890:topic:42`). Momenteel beperkt tot forumtopics in groepen/supergroepen. Zie [ACP Agents](/nl/tools/acp-agents).
**Threadgebonden ACP-spawn vanuit chat**: `/acp spawn <agent> --thread here|auto` bindt het huidige onderwerp aan een nieuwe ACP-sessie; vervolgberichten worden daar direct naartoe gerouteerd. OpenClaw zet de spawnbevestiging vast in het onderwerp. Vereist dat `channels.telegram.threadBindings.spawnSessions` ingeschakeld blijft (standaard: `true`).
**Thread-gebonden ACP-spawn vanuit chat**: `/acp spawn <agent> --thread here|auto` bindt het huidige topic aan een nieuwe ACP-sessie; vervolgberichten worden daar rechtstreeks naartoe gerouteerd. OpenClaw pint de spawnbevestiging in het topic. Vereist dat `channels.telegram.threadBindings.spawnSessions` ingeschakeld blijft (standaard: `true`).
Templatecontext exposeert `MessageThreadId` en `IsForum`. DM-chats met `message_thread_id` behouden standaard DM-routering en antwoordmetadata op platte sessies; ze gebruiken alleen threadbewuste sessiesleutels wanneer geconfigureerd met `threadReplies: "inbound"`, `threadReplies: "always"`, `requireTopic: true` of een overeenkomende onderwerpconfiguratie. Gebruik `channels.telegram.dm.threadReplies` op topniveau voor de accountstandaard, of `direct.<chatId>.threadReplies` voor één DM.
Templatecontext stelt `MessageThreadId` en `IsForum` beschikbaar. DM-chats met `message_thread_id` behouden standaard DM-routering en antwoordmetadata op platte sessies; ze gebruiken alleen thread-bewuste sessiesleutels wanneer ze zijn geconfigureerd met `threadReplies: "inbound"`, `threadReplies: "always"`, `requireTopic: true`, of een overeenkomende topicconfiguratie. Gebruik top-level `channels.telegram.dm.threadReplies` voor de accountstandaard, of `direct.<chatId>.threadReplies` voor één DM.
</Accordion>
@ -563,11 +600,11 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Telegram maakt onderscheid tussen spraaknotities en audiobestanden.
- standaard: audiobestandsgedrag
- tag `[[audio_as_voice]]` in agentantwoord om verzending als spraaknotitie af te dwingen
- inkomende transcripties van spraaknotities worden ingekaderd als machinaal gegenereerde,
niet-vertrouwde tekst in de agentcontext; vermeldingsdetectie gebruikt nog steeds de ruwe
transcriptie, zodat spraakberichten met vermeldingsgate blijven werken.
- standaard: gedrag voor audiobestanden
- tag `[[audio_as_voice]]` in het antwoord van de agent om verzenden als spraaknotitie af te dwingen
- transcripties van inkomende spraaknotities worden in de agentcontext ingekaderd als machinaal gegenereerde,
niet-vertrouwde tekst; detectie van vermeldingen gebruikt nog steeds het ruwe
transcript, zodat vermelding-afgeschermde spraakberichten blijven werken.
Voorbeeld van berichtactie:
@ -583,7 +620,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
### Videoberichten
Telegram onderscheidt videobestanden van videonotities.
Telegram maakt onderscheid tussen videobestanden en videonotities.
Voorbeeld van berichtactie:
@ -615,11 +652,11 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `Sticker.fileUniqueId`
- `Sticker.cachedDescription`
Cachebestand voor stickers:
Stickercachebestand:
- `~/.openclaw/telegram/sticker-cache.json`
Stickers worden eenmaal beschreven (waar mogelijk) en gecachet om herhaalde vision-aanroepen te verminderen.
Stickers worden één keer beschreven (waar mogelijk) en gecachet om herhaalde vision-aanroepen te verminderen.
Stickeracties inschakelen:
@ -660,9 +697,9 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Reactiemeldingen">
Telegram-reacties komen binnen als `message_reaction`-updates (gescheiden van berichtpayloads).
Telegram-reacties komen binnen als `message_reaction`-updates (los van berichtpayloads).
Wanneer dit is ingeschakeld, plaatst OpenClaw systeemgebeurtenissen in de wachtrij zoals:
Wanneer ingeschakeld, zet OpenClaw systeemgebeurtenissen in de wachtrij zoals:
- `Telegram reaction added: 👍 by Alice (@alice) on msg 42`
@ -673,11 +710,11 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
Opmerkingen:
- `own` betekent alleen gebruikersreacties op berichten die door de bot zijn verzonden (best effort via cache voor verzonden berichten).
- Reactiegebeurtenissen respecteren nog steeds de toegangscontroles van Telegram (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`); onbevoegde afzenders worden genegeerd.
- `own` betekent alleen gebruikersreacties op berichten die door de bot zijn verzonden (beste poging via cache van verzonden berichten).
- Reactiegebeurtenissen respecteren nog steeds Telegram-toegangscontroles (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`); niet-geautoriseerde afzenders worden genegeerd.
- Telegram levert geen thread-ID's in reactie-updates.
- niet-forumgroepen routeren naar de groepschatsessie
- forumgroepen routeren naar de algemene-onderwerpsessie van de groep (`:topic:1`), niet naar het exacte oorspronkelijke onderwerp
- forumgroepen routeren naar de algemene-topic-sessie van de groep (`:topic:1`), niet naar het exacte oorspronkelijke topic
`allowed_updates` voor polling/webhook bevat automatisch `message_reaction`.
@ -691,7 +728,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `channels.telegram.accounts.<accountId>.ackReaction`
- `channels.telegram.ackReaction`
- `messages.ackReaction`
- fallback naar emoji van agentidentiteit (`agents.list[].identity.emoji`, anders "👀")
- fallback naar agentidentiteit-emoji (`agents.list[].identity.emoji`, anders "👀")
Opmerkingen:
@ -701,9 +738,9 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Config-schrijfacties vanuit Telegram-gebeurtenissen en -commando's">
Schrijfacties naar kanaalconfiguratie zijn standaard ingeschakeld (`configWrites !== false`).
Kanaalconfiguratie schrijven is standaard ingeschakeld (`configWrites !== false`).
Door Telegram geactiveerde schrijfacties omvatten:
Door Telegram getriggerde schrijfacties omvatten:
- groepsmigratiegebeurtenissen (`migrate_to_chat_id`) om `channels.telegram.groups` bij te werken
- `/config set` en `/config unset` (vereist dat commando's zijn ingeschakeld)
@ -723,12 +760,12 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
</Accordion>
<Accordion title="Long polling versus webhook">
Standaard wordt long polling gebruikt. Stel voor webhook-modus `channels.telegram.webhookUrl` en `channels.telegram.webhookSecret` in; optioneel `webhookPath`, `webhookHost`, `webhookPort` (standaardwaarden `/telegram-webhook`, `127.0.0.1`, `8787`).
Standaard wordt long polling gebruikt. Stel voor webhookmodus `channels.telegram.webhookUrl` en `channels.telegram.webhookSecret` in; optioneel `webhookPath`, `webhookHost`, `webhookPort` (standaardwaarden `/telegram-webhook`, `127.0.0.1`, `8787`).
De lokale listener bindt aan `127.0.0.1:8787`. Plaats voor publieke ingress een reverse proxy vóór de lokale poort of stel bewust `webhookHost: "0.0.0.0"` in.
Webhook-modus valideert request-guards, het geheime Telegram-token en de JSON-body voordat `200` aan Telegram wordt teruggegeven.
OpenClaw verwerkt de update daarna asynchroon via dezelfde botlanes per chat/per onderwerp die door long polling worden gebruikt, zodat trage agentbeurten de bezorgings-ACK van Telegram niet ophouden.
Webhookmodus valideert requestguards, de geheime Telegram-token en de JSON-body voordat `200` naar Telegram wordt geretourneerd.
OpenClaw verwerkt de update vervolgens asynchroon via dezelfde per-chat/per-topic bot-lanes die door long polling worden gebruikt, zodat trage agentbeurten de bezorgings-ACK van Telegram niet ophouden.
</Accordion>
@ -736,16 +773,16 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
- `channels.telegram.textChunkLimit` is standaard 4000.
- `channels.telegram.chunkMode="newline"` geeft de voorkeur aan alineagrenzen (lege regels) vóór splitsing op lengte.
- `channels.telegram.mediaMaxMb` (standaard 100) begrenst de grootte van inkomende en uitgaande Telegram-media.
- `channels.telegram.mediaGroupFlushMs` (standaard 500) bepaalt hoe lang Telegram-albums/mediagroepen worden gebufferd voordat OpenClaw ze als één inkomend bericht verzendt. Verhoog dit als albumdelen laat binnenkomen; verlaag dit om de antwoordlatentie voor albums te verminderen.
- `channels.telegram.timeoutSeconds` overschrijft de timeout van de Telegram API-client (als niet ingesteld, geldt de grammY-standaard). Botclients klemmen geconfigureerde waarden onder de 60-seconden request-guard voor uitgaande tekst/typen, zodat grammY de levering van zichtbare antwoorden niet afbreekt voordat OpenClaw's transportguard en fallback kunnen draaien. Long polling gebruikt nog steeds een 45-seconden `getUpdates` request-guard, zodat idle polls niet onbeperkt worden achtergelaten.
- `channels.telegram.pollingStallThresholdMs` is standaard `120000`; stem alleen af tussen `30000` en `600000` voor fout-positieve herstarts door polling-stalls.
- `channels.telegram.mediaGroupFlushMs` (standaard 500) bepaalt hoelang Telegram-albums/mediagroepen worden gebufferd voordat OpenClaw ze als één inkomend bericht verzendt. Verhoog dit als albumonderdelen laat aankomen; verlaag dit om de antwoordlatentie voor albums te verminderen.
- `channels.telegram.timeoutSeconds` overschrijft de time-out van de Telegram API-client (als dit niet is ingesteld, geldt de grammY-standaard). Botclients klemmen geconfigureerde waarden onder de 60-secondenrequestguard voor uitgaande tekst/typen, zodat grammY zichtbare antwoordbezorging niet afbreekt voordat OpenClaw's transportguard en fallback kunnen uitvoeren. Long polling gebruikt nog steeds een 45-secondenrequestguard voor `getUpdates`, zodat idle polls niet onbeperkt worden verlaten.
- `channels.telegram.pollingStallThresholdMs` is standaard `120000`; pas alleen af tussen `30000` en `600000` voor vals-positieve herstarts bij vastgelopen polling.
- groepscontextgeschiedenis gebruikt `channels.telegram.historyLimit` of `messages.groupChat.historyLimit` (standaard 50); `0` schakelt dit uit.
- aanvullende context voor antwoord/citaat/doorsturen wordt momenteel doorgegeven zoals ontvangen.
- Telegram-allowlists bepalen vooral wie de agent kan activeren, niet een volledige redactierand voor aanvullende context.
- Besturing van DM-geschiedenis:
- aanvullende context voor antwoorden/citaten/doorsturen wordt momenteel doorgegeven zoals ontvangen.
- Telegram-allowlists bepalen vooral wie de agent kan triggeren, niet een volledige redactiegrens voor aanvullende context.
- Besturing voor DM-geschiedenis:
- `channels.telegram.dmHistoryLimit`
- `channels.telegram.dms["<user_id>"].historyLimit`
- `channels.telegram.retry`-configuratie geldt voor Telegram-verzendhelpers (CLI/tools/acties) bij herstelbare uitgaande API-fouten. Levering van definitieve antwoorden voor inkomende berichten gebruikt ook een begrensde safe-send retry voor Telegram pre-connect-fouten, maar probeert ambigue post-send netwerk-enveloppen die zichtbare berichten kunnen dupliceren niet opnieuw.
- `channels.telegram.retry`-configuratie is van toepassing op Telegram-verzendhelpers (CLI/tools/acties) voor herstelbare uitgaande API-fouten. Bezorging van het uiteindelijke inkomende antwoord gebruikt ook een begrensde safe-send retry voor Telegram pre-connect-fouten, maar probeert geen ambigue netwerk-enveloppen na verzending opnieuw die zichtbare berichten zouden kunnen dupliceren.
CLI-verzenddoel kan een numerieke chat-ID of gebruikersnaam zijn:
@ -754,7 +791,7 @@ openclaw message send --channel telegram --target 123456789 --message "hi"
openclaw message send --channel telegram --target @name --message "hi"
```
Telegram-polls gebruiken `openclaw message poll` en ondersteunen forumonderwerpen:
Telegram-polls gebruiken `openclaw message poll` en ondersteunen forumtopics:
```bash
openclaw message poll --channel telegram --target 123456789 \
@ -769,34 +806,34 @@ openclaw message poll --channel telegram --target -1001234567890:topic:42 \
- `--poll-duration-seconds` (5-600)
- `--poll-anonymous`
- `--poll-public`
- `--thread-id` voor forumonderwerpen (of gebruik een `:topic:`-doel)
- `--thread-id` voor forumtopics (of gebruik een `:topic:`-doel)
Telegram-verzending ondersteunt ook:
Telegram-verzenden ondersteunt ook:
- `--presentation` met `buttons`-blokken voor inline keyboards wanneer `channels.telegram.capabilities.inlineButtons` dit toestaat
- `--pin` of `--delivery '{"pin":true}'` om vastgepinde levering aan te vragen wanneer de bot in die chat kan vastpinnen
- `--force-document` om uitgaande afbeeldingen en GIF's als documenten te verzenden in plaats van gecomprimeerde foto- of geanimeerde-media-uploads
- `--presentation` met `buttons`-blokken voor inline toetsenborden wanneer `channels.telegram.capabilities.inlineButtons` dit toestaat
- `--pin` of `--delivery '{"pin":true}'` om vastgezette bezorging aan te vragen wanneer de bot in die chat kan vastzetten
- `--force-document` om uitgaande afbeeldingen en GIF's als documenten te verzenden in plaats van als gecomprimeerde foto- of animated-media-uploads
Actie-gating:
Actieafscherming:
- `channels.telegram.actions.sendMessage=false` schakelt uitgaande Telegram-berichten uit, inclusief polls
- `channels.telegram.actions.poll=false` schakelt het maken van Telegram-polls uit terwijl gewone verzending ingeschakeld blijft
- `channels.telegram.actions.poll=false` schakelt het maken van Telegram-polls uit, terwijl gewone verzending ingeschakeld blijft
</Accordion>
<Accordion title="Exec-goedkeuringen in Telegram">
Telegram ondersteunt exec-goedkeuringen in DM's van goedkeurders en kan optioneel prompts plaatsen in de oorspronkelijke chat of het oorspronkelijke onderwerp. Goedkeurders moeten numerieke Telegram-gebruikers-ID's zijn.
Telegram ondersteunt exec-goedkeuringen in goedkeurders-DM's en kan optioneel prompts plaatsen in de oorspronkelijke chat of het oorspronkelijke topic. Goedkeurders moeten numerieke Telegram-gebruikers-ID's zijn.
Configuratiepad:
- `channels.telegram.execApprovals.enabled` (wordt automatisch ingeschakeld wanneer ten minste één goedkeurder kan worden opgelost)
- `channels.telegram.execApprovals.approvers` (valt terug op numerieke eigenaar-ID's uit `commands.ownerAllowFrom`)
- `channels.telegram.execApprovals.enabled` (wordt automatisch ingeschakeld wanneer ten minste één goedkeurder oplosbaar is)
- `channels.telegram.execApprovals.approvers` (valt terug op numerieke owner-ID's uit `commands.ownerAllowFrom`)
- `channels.telegram.execApprovals.target`: `dm` (standaard) | `channel` | `both`
- `agentFilter`, `sessionFilter`
`channels.telegram.allowFrom`, `groupAllowFrom` en `defaultTo` bepalen wie met de bot kan praten en waar deze normale antwoorden verzendt. Ze maken iemand geen exec-goedkeurder. De eerste goedgekeurde DM-koppeling bootstrapt `commands.ownerAllowFrom` wanneer er nog geen commando-eigenaar bestaat, zodat de installatie met één eigenaar nog steeds werkt zonder ID's te dupliceren onder `execApprovals.approvers`.
`channels.telegram.allowFrom`, `groupAllowFrom` en `defaultTo` bepalen wie met de bot kan praten en waar normale antwoorden naartoe worden gestuurd. Ze maken iemand niet tot exec-goedkeurder. De eerste goedgekeurde DM-koppeling bootstrapt `commands.ownerAllowFrom` wanneer er nog geen commando-owner bestaat, zodat de setup met één owner nog steeds werkt zonder ID's onder `execApprovals.approvers` te dupliceren.
Kanaallevering toont de commandotekst in de chat; schakel `channel` of `both` alleen in voor vertrouwde groepen/onderwerpen. Wanneer de prompt in een forumonderwerp terechtkomt, behoudt OpenClaw het onderwerp voor de goedkeuringsprompt en de opvolging. Exec-goedkeuringen verlopen standaard na 30 minuten.
Kanaalbezorging toont de commandotekst in de chat; schakel `channel` of `both` alleen in vertrouwde groepen/topics in. Wanneer de prompt in een forumtopic terechtkomt, behoudt OpenClaw het topic voor de goedkeuringsprompt en de follow-up. Exec-goedkeuringen verlopen standaard na 30 minuten.
Inline goedkeuringsknoppen vereisen ook dat `channels.telegram.capabilities.inlineButtons` het doeloppervlak toestaat (`dm`, `group` of `all`). Goedkeurings-ID's met prefix `plugin:` worden via plugin-goedkeuringen opgelost; andere worden eerst via exec-goedkeuringen opgelost.
@ -805,16 +842,16 @@ openclaw message poll --channel telegram --target -1001234567890:topic:42 \
</Accordion>
</AccordionGroup>
## Besturing van foutantwoorden
## Besturing voor foutantwoorden
Wanneer de agent een bezorgings- of providerfout tegenkomt, kan Telegram antwoorden met de fouttekst of deze onderdrukken. Twee configuratiesleutels bepalen dit gedrag:
Wanneer de agent een bezorgings- of providerfout tegenkomt, kan Telegram antwoorden met de fouttekst of die onderdrukken. Twee configuratiesleutels bepalen dit gedrag:
| Sleutel | Waarden | Standaard | Beschrijving |
| ----------------------------------- | ----------------- | --------- | ---------------------------------------------------------------------------------------------------------- |
| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` verzendt een vriendelijke foutmelding naar de chat. `silent` onderdrukt foutantwoorden volledig. |
| `channels.telegram.errorCooldownMs` | getal (ms) | `60000` | Minimale tijd tussen foutantwoorden naar dezelfde chat. Voorkomt foutspam tijdens storingen. |
| Sleutel | Waarden | Standaard | Beschrijving |
| ------------------------------------ | ----------------- | --------- | ---------------------------------------------------------------------------------------------- |
| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` verzendt een vriendelijke foutmelding naar de chat. `silent` onderdrukt foutantwoorden volledig. |
| `channels.telegram.errorCooldownMs` | getal (ms) | `60000` | Minimale tijd tussen foutantwoorden naar dezelfde chat. Voorkomt foutspam tijdens storingen. |
Overschrijvingen per account, per groep en per onderwerp worden ondersteund (dezelfde overerving als andere Telegram-configuratiesleutels).
Overrides per account, per groep en per topic worden ondersteund (dezelfde overerving als andere Telegram-configuratiesleutels).
```json5
{
@ -832,15 +869,15 @@ Overschrijvingen per account, per groep en per onderwerp worden ondersteund (dez
}
```
## Problemen oplossen
## Probleemoplossing
<AccordionGroup>
<Accordion title="Bot reageert niet op groepsberichten zonder vermelding">
- Als `requireMention=false`, moet de privacymodus van Telegram volledige zichtbaarheid toestaan.
- BotFather: `/setprivacy` -> Uitschakelen
- verwijder daarna de bot uit de groep en voeg deze opnieuw toe
- `openclaw channels status` waarschuwt wanneer de configuratie groepsberichten zonder vermelding verwacht.
- Als `requireMention=false`, moet Telegram-privacymodus volledige zichtbaarheid toestaan.
- BotFather: `/setprivacy` -> Disable
- verwijder de bot daarna uit de groep en voeg hem opnieuw toe
- `openclaw channels status` waarschuwt wanneer de configuratie onvermelde groepsberichten verwacht.
- `openclaw channels status --probe` kan expliciete numerieke groeps-ID's controleren; wildcard `"*"` kan niet op lidmaatschap worden geprobed.
- snelle sessietest: `/activation always`.
@ -848,41 +885,41 @@ Overschrijvingen per account, per groep en per onderwerp worden ondersteund (dez
<Accordion title="Bot ziet helemaal geen groepsberichten">
- wanneer `channels.telegram.groups` bestaat, moet de groep vermeld zijn (of `"*"` bevatten)
- verifieer botlidmaatschap in de groep
- wanneer `channels.telegram.groups` bestaat, moet de groep worden vermeld (of `"*"` bevatten)
- controleer botlidmaatschap in de groep
- bekijk logs: `openclaw logs --follow` voor redenen voor overslaan
</Accordion>
<Accordion title="Commando's werken gedeeltelijk of helemaal niet">
<Accordion title="Opdrachten werken gedeeltelijk of helemaal niet">
- autoriseer je afzenderidentiteit (koppeling en/of numerieke `allowFrom`)
- commandoautorisatie geldt nog steeds, zelfs wanneer groepsbeleid `open` is
- `setMyCommands failed` met `BOT_COMMANDS_TOO_MUCH` betekent dat het native menu te veel items heeft; verminder plugin-/skill-/aangepaste commando's of schakel native menu's uit
- `deleteMyCommands` / `setMyCommands`-aanroepen bij opstarten en `sendChatAction`-typingaanroepen zijn begrensd en proberen één keer opnieuw via Telegram's transportfallback bij request-timeout. Aanhoudende netwerk-/fetchfouten duiden meestal op DNS-/HTTPS-bereikbaarheidsproblemen met `api.telegram.org`
- opdrachtautorisatie blijft gelden, zelfs wanneer groepsbeleid `open` is
- `setMyCommands failed` met `BOT_COMMANDS_TOO_MUCH` betekent dat het native menu te veel items heeft; verminder plugin-/skill-/aangepaste opdrachten of schakel native menu's uit
- `deleteMyCommands` / `setMyCommands`-startaanroepen en `sendChatAction`-typeaanroepen zijn begrensd en proberen eenmaal opnieuw via Telegram's transportfallback bij time-out van het verzoek. Aanhoudende netwerk-/fetchfouten wijzen meestal op DNS-/HTTPS-bereikbaarheidsproblemen naar `api.telegram.org`
</Accordion>
<Accordion title="Opstarten meldt ongeautoriseerd token">
<Accordion title="Opstarten meldt niet-geautoriseerd token">
- `getMe returned 401` is een Telegram-authenticatiefout voor het geconfigureerde bottoken.
- Kopieer het bottoken opnieuw of genereer het opnieuw in BotFather, en werk daarna `channels.telegram.botToken`, `channels.telegram.tokenFile`, `channels.telegram.accounts.<id>.botToken` of `TELEGRAM_BOT_TOKEN` bij voor het standaardaccount.
- `deleteWebhook 401 Unauthorized` tijdens het opstarten is ook een authenticatiefout; dit behandelen als "er bestaat geen webhook" zou dezelfde fout door een ongeldig token alleen uitstellen tot latere API-aanroepen.
- Kopieer het bottoken opnieuw of genereer het opnieuw in BotFather, werk daarna `channels.telegram.botToken`, `channels.telegram.tokenFile`, `channels.telegram.accounts.<id>.botToken` of `TELEGRAM_BOT_TOKEN` bij voor het standaardaccount.
- `deleteWebhook 401 Unauthorized` tijdens het opstarten is ook een authenticatiefout; dit behandelen als "er bestaat geen Webhook" zou dezelfde fout met een ongeldig token alleen uitstellen tot latere API-aanroepen.
</Accordion>
<Accordion title="Polling of netwerkinstabiliteit">
<Accordion title="Polling- of netwerkinstabiliteit">
- Node 22+ + aangepaste fetch/proxy kan onmiddellijk afbreekgedrag veroorzaken als AbortSignal-typen niet overeenkomen.
- Sommige hosts resolven `api.telegram.org` eerst naar IPv6; defecte IPv6-egress kan intermitterende Telegram API-fouten veroorzaken.
- Node 22+ + aangepaste fetch/proxy kan direct afbreekgedrag veroorzaken als AbortSignal-typen niet overeenkomen.
- Sommige hosts lossen `api.telegram.org` eerst op naar IPv6; defecte IPv6-egress kan intermitterende Telegram API-fouten veroorzaken.
- Als logs `TypeError: fetch failed` of `Network request for 'getUpdates' failed!` bevatten, probeert OpenClaw deze nu opnieuw als herstelbare netwerkfouten.
- Tijdens het starten van polling hergebruikt OpenClaw de geslaagde opstartprobe `getMe` voor grammY, zodat de runner geen tweede `getMe` nodig heeft vóór de eerste `getUpdates`.
- Als `deleteWebhook` mislukt met een tijdelijke netwerkfout tijdens het starten van polling, gaat OpenClaw door naar long polling in plaats van nog een control-plane-aanroep vóór polling te doen. Een nog actieve webhook verschijnt als een `getUpdates`-conflict; OpenClaw bouwt daarna het Telegram-transport opnieuw op en probeert webhookopschoning opnieuw.
- Als Telegram-sockets volgens een korte vaste cadans worden gerecycled, controleer dan op een lage `channels.telegram.timeoutSeconds`; botclients klemmen geconfigureerde waarden onder de guards voor uitgaande en `getUpdates`-requests, maar oudere releases konden elke poll of elk antwoord afbreken wanneer dit lager was ingesteld dan die guards.
- Tijdens het opstarten van polling hergebruikt OpenClaw de succesvolle `getMe`-opstartprobe voor grammY, zodat de runner geen tweede `getMe` nodig heeft vóór de eerste `getUpdates`.
- Als `deleteWebhook` mislukt met een tijdelijke netwerkfout tijdens het opstarten van polling, gaat OpenClaw door met long polling in plaats van nog een pre-poll-control-plane-aanroep te doen. Een nog actieve Webhook verschijnt als een `getUpdates`-conflict; OpenClaw bouwt daarna het Telegram-transport opnieuw op en probeert Webhook-opschoning opnieuw.
- Als Telegram-sockets op een korte vaste cadans worden gerecycled, controleer dan op een lage `channels.telegram.timeoutSeconds`; botclients klemmen geconfigureerde waarden onder de outbound- en `getUpdates`-verzoekbewakers vast, maar oudere releases konden elke poll of elk antwoord afbreken wanneer dit onder die bewakers was ingesteld.
- Als logs `Polling stall detected` bevatten, herstart OpenClaw standaard polling en bouwt het Telegram-transport opnieuw op na 120 seconden zonder voltooide long-poll-liveness.
- `openclaw channels status --probe` en `openclaw doctor` waarschuwen wanneer een actief pollingaccount `getUpdates` na de opstartgratie niet heeft voltooid, wanneer een actief webhookaccount `setWebhook` na de opstartgratie niet heeft voltooid, of wanneer de laatste geslaagde pollingtransportactiviteit verouderd is.
- Verhoog `channels.telegram.pollingStallThresholdMs` alleen wanneer langlopende `getUpdates`-aanroepen gezond zijn maar je host nog steeds fout-positieve polling-stall-herstarts meldt. Aanhoudende stalls wijzen meestal op proxy-, DNS-, IPv6- of TLS-egressproblemen tussen de host en `api.telegram.org`.
- Telegram respecteert ook procesproxy-env voor Bot API-transport, inclusief `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` en hun varianten in kleine letters. `NO_PROXY` / `no_proxy` kan `api.telegram.org` nog steeds omzeilen.
- `openclaw channels status --probe` en `openclaw doctor` waarschuwen wanneer een actief pollingaccount na de opstartgratie geen `getUpdates` heeft voltooid, wanneer een actief Webhook-account na de opstartgratie geen `setWebhook` heeft voltooid, of wanneer de laatste succesvolle pollingtransportactiviteit verouderd is.
- Verhoog `channels.telegram.pollingStallThresholdMs` alleen wanneer langlopende `getUpdates`-aanroepen gezond zijn, maar je host nog steeds valse polling-stall-herstarts meldt. Aanhoudende stalls wijzen meestal op proxy-, DNS-, IPv6- of TLS-egressproblemen tussen de host en `api.telegram.org`.
- Telegram respecteert ook process-proxy-env voor Bot API-transport, waaronder `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` en hun varianten in kleine letters. `NO_PROXY` / `no_proxy` kan `api.telegram.org` nog steeds omzeilen.
- Als de door OpenClaw beheerde proxy via `OPENCLAW_PROXY_URL` is geconfigureerd voor een serviceomgeving en er geen standaard proxy-env aanwezig is, gebruikt Telegram die URL ook voor Bot API-transport.
- Routeer Telegram API-aanroepen op VPS-hosts met instabiele directe egress/TLS via `channels.telegram.proxy`:
@ -892,8 +929,8 @@ channels:
proxy: socks5://<user>:<password>@proxy-host:1080
```
- Node 22+ gebruikt standaard `autoSelectFamily=true` (behalve WSL2). De volgorde van Telegram DNS-resultaten respecteert eerst `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER`, daarna `channels.telegram.network.dnsResultOrder`, daarna de processtandaard zoals `NODE_OPTIONS=--dns-result-order=ipv4first`; als geen van deze van toepassing is, valt Node 22+ terug op `ipv4first`.
- Als je host WSL2 is of expliciet beter werkt met IPv4-only gedrag, forceer dan familieselectie:
- Node 22+ gebruikt standaard `autoSelectFamily=true` (behalve WSL2). De volgorde van Telegram DNS-resultaten respecteert `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER`, daarna `channels.telegram.network.dnsResultOrder`, daarna de processtandaard zoals `NODE_OPTIONS=--dns-result-order=ipv4first`; als niets van toepassing is, valt Node 22+ terug op `ipv4first`.
- Als je host WSL2 is of expliciet beter werkt met alleen-IPv4-gedrag, forceer dan familieselectie:
```yaml
channels:
@ -904,9 +941,9 @@ channels:
- Antwoorden uit het RFC 2544-benchmarkbereik (`198.18.0.0/15`) zijn standaard al toegestaan
voor Telegram-mediadownloads. Als een vertrouwde fake-IP- of
transparante proxy `api.telegram.org` tijdens mediadownloads herschrijft naar een ander
privé/intern/speciaal adres, kun je je aanmelden
voor de Telegram-only bypass:
transparante proxy `api.telegram.org` herschrijft naar een ander
privé-/intern/speciaal-adres tijdens mediadownloads, kun je je
aanmelden voor de alleen-Telegram-bypass:
```yaml
channels:
@ -915,18 +952,18 @@ channels:
dangerouslyAllowPrivateNetwork: true
```
- Dezelfde opt-in is per account beschikbaar op
- Dezelfde opt-in is beschikbaar per account op
`channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork`.
- Als je proxy Telegram-mediahosts resolvet naar `198.18.x.x`, laat de
- Als je proxy Telegram-mediahosts oplost naar `198.18.x.x`, laat de
gevaarlijke vlag eerst uit. Telegram-media staat het RFC 2544-
benchmarkbereik standaard al toe.
<Warning>
`channels.telegram.network.dangerouslyAllowPrivateNetwork` verzwakt Telegram
`channels.telegram.network.dangerouslyAllowPrivateNetwork` verzwakt Telegram-
media-SSRF-bescherming. Gebruik dit alleen voor vertrouwde, door operators beheerde proxy-
omgevingen zoals Clash, Mihomo of Surge fake-IP-routing wanneer zij
privé- of speciale antwoorden buiten het RFC 2544-benchmark-
bereik synthetiseren. Laat dit uit voor normale publieke Telegram-toegang.
omgevingen zoals Clash, Mihomo of Surge fake-IP-routing wanneer die
privé- of speciaal-gebruik-antwoorden buiten het RFC 2544-benchmark-
bereik synthetiseren. Laat dit uit voor normale openbare Telegram-toegang via internet.
</Warning>
- Omgevingsoverschrijvingen (tijdelijk):
@ -943,43 +980,43 @@ dig +short api.telegram.org AAAA
</Accordion>
</AccordionGroup>
Meer hulp: [Probleemoplossing voor kanalen](/nl/channels/troubleshooting).
Meer hulp: [Kanaalprobleemoplossing](/nl/channels/troubleshooting).
## Configuratiereferentie
Primaire referentie: [Configuratiereferentie - Telegram](/nl/gateway/config-channels#telegram).
<Accordion title="Telegram-velden met veel signaal">
<Accordion title="Telegram-velden met hoog signaal">
- opstarten/authenticatie: `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` moet naar een regulier bestand wijzen; symlinks worden geweigerd)
- opstarten/auth: `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` moet naar een gewoon bestand verwijzen; symlinks worden geweigerd)
- toegangscontrole: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*`, top-level `bindings[]` (`type: "acp"`)
- uitvoeringsgoedkeuringen: `execApprovals`, `accounts.*.execApprovals`
- exec-goedkeuringen: `execApprovals`, `accounts.*.execApprovals`
- opdracht/menu: `commands.native`, `commands.nativeSkills`, `customCommands`
- threads/antwoorden: `replyToMode`, `dm.threadReplies`, `direct.*.threadReplies`
- streaming: `streaming` (preview), `streaming.preview.toolProgress`, `blockStreaming`
- opmaak/bezorging: `textChunkLimit`, `chunkMode`, `linkPreview`, `responsePrefix`
- opmaak/levering: `textChunkLimit`, `chunkMode`, `linkPreview`, `responsePrefix`
- media/netwerk: `mediaMaxMb`, `mediaGroupFlushMs`, `timeoutSeconds`, `pollingStallThresholdMs`, `retry`, `network.autoSelectFamily`, `network.dangerouslyAllowPrivateNetwork`, `proxy`
- aangepaste API-root: `apiRoot` (alleen Bot API-root; neem `/bot<TOKEN>` niet op)
- webhook: `webhookUrl`, `webhookSecret`, `webhookPath`, `webhookHost`
- acties/capaciteiten: `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker`
- Webhook: `webhookUrl`, `webhookSecret`, `webhookPath`, `webhookHost`
- acties/capabilities: `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker`
- reacties: `reactionNotifications`, `reactionLevel`
- fouten: `errorPolicy`, `errorCooldownMs`
- schrijven/geschiedenis: `configWrites`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
- writes/geschiedenis: `configWrites`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
</Accordion>
<Note>
Multi-accountprecedentie: wanneer twee of meer account-ID's zijn geconfigureerd, stel `channels.telegram.defaultAccount` in (of neem `channels.telegram.accounts.default` op) om standaardroutering expliciet te maken. Anders valt OpenClaw terug op de eerste genormaliseerde account-ID en waarschuwt `openclaw doctor`. Benoemde accounts erven `channels.telegram.allowFrom` / `groupAllowFrom`, maar niet de waarden van `accounts.default.*`.
Prioriteit bij meerdere accounts: wanneer twee of meer account-ID's zijn geconfigureerd, stel `channels.telegram.defaultAccount` in (of neem `channels.telegram.accounts.default` op) om standaardroutering expliciet te maken. Anders valt OpenClaw terug op de eerste genormaliseerde account-ID en waarschuwt `openclaw doctor`. Benoemde accounts erven `channels.telegram.allowFrom` / `groupAllowFrom`, maar geen waarden uit `accounts.default.*`.
</Note>
## Gerelateerd
<CardGroup cols={2}>
<Card title="Koppelen" icon="link" href="/nl/channels/pairing">
<Card title="Koppeling" icon="link" href="/nl/channels/pairing">
Koppel een Telegram-gebruiker aan de Gateway.
</Card>
<Card title="Groepen" icon="users" href="/nl/channels/groups">
Gedrag van allowlists voor groepen en topics.
Gedrag voor allowlists van groepen en onderwerpen.
</Card>
<Card title="Kanaalroutering" icon="route" href="/nl/channels/channel-routing">
Routeer inkomende berichten naar agents.
@ -988,9 +1025,9 @@ Multi-accountprecedentie: wanneer twee of meer account-ID's zijn geconfigureerd,
Dreigingsmodel en hardening.
</Card>
<Card title="Multi-agent-routering" icon="sitemap" href="/nl/concepts/multi-agent">
Koppel groepen en topics aan agents.
Koppel groepen en onderwerpen aan agents.
</Card>
<Card title="Probleemoplossing" icon="wrench" href="/nl/channels/troubleshooting">
Kanaaloverschrijdende diagnostiek.
Cross-channeldiagnostiek.
</Card>
</CardGroup>

View File

@ -2,93 +2,93 @@
read_when:
- Je moet begrijpen waarom een CI-taak wel of niet is uitgevoerd
- Je debugt een falende GitHub Actions-controle
- Je coördineert een releasevalidatierun of heruitvoering
- Je wijzigt ClawSweeper-dispatch of het doorsturen van GitHub-activiteit
summary: CI-taakgrafiek, scopecontroles, release-overkoepelingen en lokale commando-equivalenten
title: CI-pijplijn
- Je coördineert een releasevalidatierun of een herhaling daarvan
- Je wijzigt de ClawSweeper-dispatch of het doorsturen van GitHub-activiteit
summary: CI-jobgrafiek, scope-gates, release-overkoepelingen en equivalenten voor lokale opdrachten
title: CI-pipeline
x-i18n:
generated_at: "2026-05-03T21:27:42Z"
generated_at: "2026-05-04T07:03:03Z"
model: gpt-5.5
provider: openai
source_hash: e07fc44aa844cb66ce529c570cbbbbf502a61bcbcbc3d9488557abb459ef7678
source_hash: 72959d0feaf1339f01c9da263153fd89cc4727da6f928933819931991222714d
source_path: ci.md
workflow: 16
---
OpenClaw CI draait bij elke push naar `main` en elke pull request. De job `preflight` classificeert de diff en schakelt dure lanes uit wanneer alleen niet-gerelateerde gebieden zijn gewijzigd. Handmatige `workflow_dispatch`-runs omzeilen bewust slimme scoping en waaieren de volledige graph uit voor releasekandidaten en brede validatie. Android-lanes blijven opt-in via `include_android`. Release-only plugin-dekking staat in de afzonderlijke workflow [`Plugin Prerelease`](#plugin-prerelease) en draait alleen vanuit [`Full Release Validation`](#full-release-validation) of een expliciete handmatige dispatch.
OpenClaw CI draait bij elke push naar `main` en elke pull request. De taak `preflight` classificeert de diff en schakelt dure lanes uit wanneer alleen niet-gerelateerde gebieden zijn gewijzigd. Handmatige `workflow_dispatch`-runs omzeilen bewust slimme scoping en waaieren de volledige graph uit voor releasekandidaten en brede validatie. Android-lanes blijven opt-in via `include_android`. Plugin-dekking die alleen voor releases geldt, staat in de afzonderlijke workflow [`Plugin-voorrelease`](#plugin-prerelease) en draait alleen vanuit [`Volledige releasevalidatie`](#full-release-validation) of een expliciete handmatige dispatch.
## Pipeline-overzicht
| Job | Doel | Wanneer deze draait |
| -------------------------------- | --------------------------------------------------------------------------------------------------------- | -------------------------------------- |
| `preflight` | Detecteert docs-only wijzigingen, gewijzigde scopes, gewijzigde extensions, en bouwt het CI-manifest | Altijd bij niet-draft pushes en PR's |
| `security-scm-fast` | Detectie van privésleutels en workflow-audit via `zizmor` | Altijd bij niet-draft pushes en PR's |
| `security-dependency-audit` | Dependency-vrije audit van production lockfile tegen npm-advisories | Altijd bij niet-draft pushes en PR's |
| `security-fast` | Vereiste aggregatie voor de snelle security-jobs | Altijd bij niet-draft pushes en PR's |
| `check-dependencies` | Production Knip dependency-only pass plus de guard voor de allowlist voor ongebruikte bestanden | Node-relevante wijzigingen |
| `build-artifacts` | Bouwt `dist/`, Control UI, checks voor gebouwde artefacten en herbruikbare downstream artefacten | Node-relevante wijzigingen |
| `checks-fast-core` | Snelle Linux-correctheidslanes zoals bundled/plugin-contract/protocol-checks | Node-relevante wijzigingen |
| `checks-fast-contracts-channels` | Gespreide channel-contractchecks met een stabiel geaggregeerd checkresultaat | Node-relevante wijzigingen |
| `checks-node-core-test` | Core Node-testshards, exclusief channel-, bundled-, contract- en extension-lanes | Node-relevante wijzigingen |
| `check` | Gespreide equivalent van de lokale hoofdgate: prod-types, lint, guards, testtypes en strikte smoke | Node-relevante wijzigingen |
| `check-additional` | Architectuur, gespreide boundary/prompt-drift, extension-guards, package-boundary en Gateway watch | Node-relevante wijzigingen |
| `build-smoke` | Built-CLI smoke-tests en startup-memory smoke | Node-relevante wijzigingen |
| `checks` | Verifier voor channel-tests met gebouwde artefacten | Node-relevante wijzigingen |
| `checks-node-compat-node22` | Node 22-compatibiliteitsbuild en smoke-lane | Handmatige CI-dispatch voor releases |
| `check-docs` | Docs-formatting, lint en broken-link checks | Docs gewijzigd |
| `skills-python` | Ruff + pytest voor Python-backed Skills | Python-Skills-relevante wijzigingen |
| `checks-windows` | Windows-specifieke process/path-tests plus gedeelde regressies voor runtime-importspecifiers | Windows-relevante wijzigingen |
| `macos-node` | macOS TypeScript-testlane met de gedeelde gebouwde artefacten | macOS-relevante wijzigingen |
| `macos-swift` | Swift-lint, build en tests voor de macOS-app | macOS-relevante wijzigingen |
| `android` | Android-unittests voor beide flavors plus één debug-APK-build | Android-relevante wijzigingen |
| `test-performance-agent` | Dagelijkse Codex-optimalisatie van trage tests na vertrouwde activiteit | Succesvolle main-CI of handmatige dispatch |
| `openclaw-performance` | Dagelijkse/on-demand Kova-runtimeperformancerapporten met mock-provider, deep-profile en GPT 5.4 live-lanes | Gepland en handmatige dispatch |
| Taak | Doel | Wanneer deze draait |
| -------------------------------- | --------------------------------------------------------------------------------------------------------- | ---------------------------------- |
| `preflight` | Detecteert wijzigingen die alleen docs raken, gewijzigde scopes, gewijzigde extensies en bouwt het CI-manifest | Altijd bij niet-concept pushes en PRs |
| `security-scm-fast` | Detectie van privésleutels en workflow-audit via `zizmor` | Altijd bij niet-concept pushes en PRs |
| `security-dependency-audit` | Productie-lockfile-audit zonder afhankelijkheden tegen npm-advisories | Altijd bij niet-concept pushes en PRs |
| `security-fast` | Vereiste aggregatie voor de snelle beveiligingstaken | Altijd bij niet-concept pushes en PRs |
| `check-dependencies` | Productie-Knip-pass alleen voor afhankelijkheden plus de unused-file allowlist guard | Node-relevante wijzigingen |
| `build-artifacts` | Bouwt `dist/`, Control UI, controles voor gebouwde artefacten en herbruikbare downstream artefacten | Node-relevante wijzigingen |
| `checks-fast-core` | Snelle Linux-correctheidslanes zoals gebundelde/plugin-contract/protocol-controles | Node-relevante wijzigingen |
| `checks-fast-contracts-channels` | Geshaarde channel-contractcontroles met een stabiel geaggregeerd controleresultaat | Node-relevante wijzigingen |
| `checks-node-core-test` | Core Node-testshards, met uitzondering van channel-, gebundelde, contract- en extensielanes | Node-relevante wijzigingen |
| `check` | Geshaarde equivalent van de hoofd-local gate: productietypes, lint, guards, testtypes en strikte smoke | Node-relevante wijzigingen |
| `check-additional` | Architectuur, geshaarde boundary/prompt-drift, extensieguards, package boundary en gateway watch | Node-relevante wijzigingen |
| `build-smoke` | Smoke-tests voor gebouwde CLI en startup-memory-smoke | Node-relevante wijzigingen |
| `checks` | Verifier voor channel-tests van gebouwde artefacten | Node-relevante wijzigingen |
| `checks-node-compat-node22` | Node 22-compatibiliteitsbuild en smoke-lane | Handmatige CI-dispatch voor releases |
| `check-docs` | Docs-formattering, lint en controles op gebroken links | Docs gewijzigd |
| `skills-python` | Ruff + pytest voor Python-ondersteunde Skills | Python-Skills-relevante wijzigingen |
| `checks-windows` | Windows-specifieke proces-/padtests plus gedeelde regressies voor runtime-importspecificaties | Windows-relevante wijzigingen |
| `macos-node` | macOS TypeScript-testlane met de gedeelde gebouwde artefacten | macOS-relevante wijzigingen |
| `macos-swift` | Swift-lint, build en tests voor de macOS-app | macOS-relevante wijzigingen |
| `android` | Android-unit tests voor beide flavors plus één debug-APK-build | Android-relevante wijzigingen |
| `test-performance-agent` | Dagelijkse optimalisatie van trage Codex-tests na vertrouwde activiteit | Succesvolle main-CI of handmatige dispatch |
| `openclaw-performance` | Dagelijkse/op aanvraag Kova-runtimeprestatierapporten met mock-provider-, deep-profile- en GPT 5.4-live-lanes | Gepland en handmatige dispatch |
## Fail-fast-volgorde
1. `preflight` bepaalt welke lanes überhaupt bestaan. De logica `docs-scope` en `changed-scope` zijn stappen binnen deze job, geen zelfstandige jobs.
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` en `skills-python` falen snel zonder te wachten op de zwaardere artefact- en platformmatrixjobs.
1. `preflight` bepaalt welke lanes überhaupt bestaan. De logica `docs-scope` en `changed-scope` zijn stappen binnen deze taak, geen zelfstandige taken.
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` en `skills-python` falen snel zonder te wachten op de zwaardere artefact- en platformmatrix-taken.
3. `build-artifacts` overlapt met de snelle Linux-lanes, zodat downstream consumers kunnen starten zodra de gedeelde build klaar is.
4. Zwaardere platform- en runtime-lanes waaieren daarna uit: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-core-test`, `checks`, `checks-windows`, `macos-node`, `macos-swift` en `android`.
4. Zwaardere platform- en runtimelanes waaieren daarna uit: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-core-test`, `checks`, `checks-windows`, `macos-node`, `macos-swift` en `android`.
GitHub kan vervangen jobs als `cancelled` markeren wanneer een nieuwere push op dezelfde PR of `main`-ref landt. Behandel dat als CI-ruis, tenzij de nieuwste run voor dezelfde ref ook faalt. Geaggregeerde shard-checks gebruiken `!cancelled() && always()`, zodat ze normale shard-fouten nog steeds rapporteren maar niet in de wachtrij komen nadat de hele workflow al is vervangen. De automatische CI-concurrency-key is geversioneerd (`CI-v7-*`), zodat een zombie aan GitHub-zijde in een oude queue group nieuwere main-runs niet onbeperkt kan blokkeren. Handmatige full-suite-runs gebruiken `CI-manual-v1-*` en annuleren lopende runs niet.
GitHub kan vervangen taken markeren als `cancelled` wanneer een nieuwere push op dezelfde PR- of `main`-ref landt. Behandel dat als CI-ruis tenzij de nieuwste run voor dezelfde ref ook faalt. Geaggregeerde shard-controles gebruiken `!cancelled() && always()`, zodat ze nog steeds normale shard-fouten rapporteren maar niet in de wachtrij komen nadat de hele workflow al is vervangen. De automatische CI-concurrency-key is geversioneerd (`CI-v7-*`), zodat een zombie aan GitHub-zijde in een oude queue group nieuwere main-runs niet oneindig kan blokkeren. Handmatige full-suite-runs gebruiken `CI-manual-v1-*` en annuleren geen lopende runs.
## Scope en routing
Scope-logica staat in `scripts/ci-changed-scope.mjs` en wordt gedekt door unittests in `src/scripts/ci-changed-scope.test.ts`. Handmatige dispatch slaat changed-scope-detectie over en laat het preflight-manifest handelen alsof elk scoped gebied is gewijzigd.
Scope-logica staat in `scripts/ci-changed-scope.mjs` en wordt gedekt door unit tests in `src/scripts/ci-changed-scope.test.ts`. Handmatige dispatch slaat changed-scope-detectie over en laat het preflight-manifest doen alsof elk scoped gebied is gewijzigd.
- **CI-workflowwijzigingen** valideren de Node CI-graph plus workflow-linting, maar forceren op zichzelf geen Windows-, Android- of macOS-native builds; die platformlanes blijven gescoped tot platformbronwijzigingen.
- **CI-routing-only wijzigingen, geselecteerde goedkope core-test fixture-wijzigingen en smalle plugin-contract helper/test-routing wijzigingen** gebruiken een snel Node-only manifestpad: `preflight`, security en één `checks-fast-core`-taak. Dat pad slaat build-artefacten, Node 22-compatibiliteit, channel-contracten, volledige core-shards, bundled-plugin-shards en aanvullende guard-matrices over wanneer de wijziging beperkt is tot de routing- of helperoppervlakken die de snelle taak direct oefent.
- **Windows Node-checks** zijn gescoped tot Windows-specifieke process/path-wrappers, npm/pnpm/UI-runnerhelpers, package manager-configuratie en de CI-workflowoppervlakken die die lane uitvoeren; niet-gerelateerde source-, plugin-, install-smoke- en test-only wijzigingen blijven op de Linux Node-lanes.
- **CI-wijzigingen die alleen routing raken, geselecteerde goedkope core-testfixturewijzigingen en smalle plugin-contract helper/test-routing-wijzigingen** gebruiken een snel Node-only manifestpad: `preflight`, security en één `checks-fast-core`-taak. Dat pad slaat build-artefacten, Node 22-compatibiliteit, channel-contracts, volledige core-shards, gebundelde-plugin-shards en extra guard-matrices over wanneer de wijziging beperkt is tot de routing- of helper-oppervlakken die de snelle taak direct oefent.
- **Windows Node-controles** zijn gescoped tot Windows-specifieke proces-/padwrappers, npm/pnpm/UI-runnerhelpers, package manager-configuratie en de CI-workflowoppervlakken die die lane uitvoeren; niet-gerelateerde bron-, plugin-, install-smoke- en test-only-wijzigingen blijven op de Linux Node-lanes.
De traagste Node-testfamilies zijn gesplitst of gebalanceerd zodat elke job klein blijft zonder runners te ruim te reserveren: channel-contracten draaien als drie gewogen shards, core unit fast/support-lanes draaien afzonderlijk, core runtime infra is gesplitst tussen state- en process/config-shards, auto-reply draait als gebalanceerde workers (waarbij de reply-subtree is gesplitst in agent-runner-, dispatch- en commands/state-routing-shards), en agentic Gateway/server-configs zijn gesplitst over chat/auth/model/http-plugin/runtime/startup-lanes in plaats van te wachten op gebouwde artefacten. Brede browser-, QA-, media- en diverse plugin-tests gebruiken hun eigen Vitest-configs in plaats van de gedeelde plugin catch-all. Include-pattern-shards registreren timingvermeldingen met de CI-shardnaam, zodat `.artifacts/vitest-shard-timings.json` een volledige config kan onderscheiden van een gefilterde shard. `check-additional` houdt package-boundary compile/canary-werk bij elkaar en scheidt runtime-topologiearchitectuur van Gateway watch-dekking; de boundary-guardlijst is over vier matrixshards gestreept, waarbij elke shard geselecteerde onafhankelijke guards gelijktijdig draait en per-check timings afdrukt, inclusief `pnpm prompt:snapshots:check`, zodat Codex runtime happy-path prompt-drift wordt vastgepind aan de PR die deze veroorzaakte. Gateway watch, channel-tests en de core support-boundary-shard draaien gelijktijdig binnen `build-artifacts` nadat `dist/` en `dist-runtime/` al zijn gebouwd.
De traagste Node-testfamilies zijn gesplitst of gebalanceerd, zodat elke taak klein blijft zonder runners te ruim te reserveren: channel-contracts draaien als drie gewogen shards, core unit fast/support-lanes draaien afzonderlijk, core runtime infra is gesplitst tussen state- en process/config-shards, auto-reply draait als gebalanceerde workers (waarbij de reply-subtree is gesplitst in agent-runner-, dispatch- en commands/state-routing-shards), en agentic gateway/server-configs zijn gesplitst over chat/auth/model/http-plugin/runtime/startup-lanes in plaats van te wachten op gebouwde artefacten. Brede browser-, QA-, media- en diverse plugintests gebruiken hun eigen Vitest-configs in plaats van de gedeelde plugin catch-all. Include-pattern-shards registreren timingvermeldingen met de CI-shardnaam, zodat `.artifacts/vitest-shard-timings.json` een volledige config kan onderscheiden van een gefilterde shard. `check-additional` houdt package-boundary compile/canary-werk bij elkaar en scheidt runtime-topologiearchitectuur van gateway watch-dekking; de boundary guard-lijst is verdeeld over vier matrixshards, die elk geselecteerde onafhankelijke guards gelijktijdig draaien en timings per controle afdrukken, inclusief `pnpm prompt:snapshots:check`, zodat Codex runtime happy-path prompt-drift wordt vastgepind op de PR die deze veroorzaakte. Gateway watch, channel-tests en de core support-boundary-shard draaien gelijktijdig binnen `build-artifacts` nadat `dist/` en `dist-runtime/` al zijn gebouwd.
Android CI draait zowel `testPlayDebugUnitTest` als `testThirdPartyDebugUnitTest` en bouwt daarna de Play debug-APK. De third-party flavor heeft geen afzonderlijke source set of manifest; de unittests-lane compileert de flavor nog steeds met de SMS/call-log BuildConfig-flags, terwijl een dubbele debug-APK-packagingjob bij elke Android-relevante push wordt vermeden.
Android CI draait zowel `testPlayDebugUnitTest` als `testThirdPartyDebugUnitTest` en bouwt daarna de Play debug-APK. De third-party flavor heeft geen afzonderlijke source set of manifest; de unit-testlane compileert de flavor nog steeds met de SMS/call-log BuildConfig-vlaggen, terwijl een dubbele debug-APK-packagingtaak bij elke Android-relevante push wordt vermeden.
De shard `check-dependencies` draait `pnpm deadcode:dependencies` (een production Knip dependency-only pass vastgepind op de nieuwste Knip-versie, met pnpm's minimum release age uitgeschakeld voor de `dlx`-installatie) en `pnpm deadcode:unused-files`, dat Knip's production unused-file-bevindingen vergelijkt met `scripts/deadcode-unused-files.allowlist.mjs`. De unused-file-guard faalt wanneer een PR een nieuw niet-gereviewd ongebruikt bestand toevoegt of een verouderde allowlist-vermelding laat staan, terwijl bewuste dynamische plugin-, generated-, build-, live-test- en package bridge-oppervlakken behouden blijven die Knip niet statisch kan oplossen.
De shard `check-dependencies` draait `pnpm deadcode:dependencies` (een productie-Knip-pass alleen voor afhankelijkheden, vastgezet op de nieuwste Knip-versie, met pnpms minimale releaseleeftijd uitgeschakeld voor de `dlx`-installatie) en `pnpm deadcode:unused-files`, die Knips productiebevindingen voor ongebruikte bestanden vergelijkt met `scripts/deadcode-unused-files.allowlist.mjs`. De unused-file guard faalt wanneer een PR een nieuw niet-beoordeeld ongebruikt bestand toevoegt of een verouderde allowlist-vermelding laat staan, terwijl bewuste dynamische plugin-, gegenereerde, build-, live-test- en package bridge-oppervlakken behouden blijven die Knip niet statisch kan oplossen.
## Doorsturen van ClawSweeper-activiteit
## ClawSweeper-activiteit doorsturen
`.github/workflows/clawsweeper-dispatch.yml` is de target-side bridge van OpenClaw-repositoryactiviteit naar ClawSweeper. Deze checkt geen onvertrouwde pull request-code uit en voert die niet uit. De workflow maakt een GitHub App-token aan vanuit `CLAWSWEEPER_APP_PRIVATE_KEY` en dispatcht daarna compacte `repository_dispatch`-payloads naar `openclaw/clawsweeper`.
`.github/workflows/clawsweeper-dispatch.yml` is de brug aan doelzijde van OpenClaw-repositoryactiviteit naar ClawSweeper. Deze checkt geen onvertrouwde pull request-code uit en voert die ook niet uit. De workflow maakt een GitHub App-token aan vanuit `CLAWSWEEPER_APP_PRIVATE_KEY` en dispatcht daarna compacte `repository_dispatch`-payloads naar `openclaw/clawsweeper`.
De workflow heeft vier lanes:
- `clawsweeper_item` voor exacte reviewverzoeken voor issues en pull requests;
- `clawsweeper_comment` voor expliciete ClawSweeper-commando's in issue-comments;
- `clawsweeper_comment` voor expliciete ClawSweeper-commandos in issuecommentaren;
- `clawsweeper_commit_review` voor reviewverzoeken op commitniveau bij `main`-pushes;
- `github_activity` voor algemene GitHub-activiteit die de ClawSweeper-agent kan inspecteren.
- `github_activity` voor algemene GitHub-activiteit die de ClawSweeper-agent mag inspecteren.
De lane `github_activity` stuurt alleen genormaliseerde metadata door: eventtype, actie, actor, repository, itemnummer, URL, titel, status en korte fragmenten voor comments of reviews wanneer aanwezig. Deze vermijdt bewust het doorsturen van de volledige webhook-body. De ontvangende workflow in `openclaw/clawsweeper` is `.github/workflows/github-activity.yml`, die het genormaliseerde event naar de OpenClaw Gateway-hook voor de ClawSweeper-agent post.
De lane `github_activity` stuurt alleen genormaliseerde metadata door: eventtype, actie, actor, repository, itemnummer, URL, titel, status en korte fragmenten voor commentaren of reviews wanneer aanwezig. Deze vermijdt bewust het doorsturen van de volledige webhookbody. De ontvangende workflow in `openclaw/clawsweeper` is `.github/workflows/github-activity.yml`, die het genormaliseerde event post naar de OpenClaw Gateway-hook voor de ClawSweeper-agent.
Algemene activiteit is observatie, geen delivery-by-default. De ClawSweeper-agent ontvangt het Discord-doel in de prompt en hoort alleen naar `#clawsweeper` te posten wanneer de gebeurtenis verrassend, actionable, riskant of operationeel nuttig is. Routinematige opens, edits, bot-churn, dubbele webhook-ruis en normaal reviewverkeer horen te resulteren in `NO_REPLY`.
Algemene activiteit is observatie, geen standaardlevering. De ClawSweeper-agent ontvangt het Discord-doel in zijn prompt en zou alleen naar `#clawsweeper` moeten posten wanneer het event verrassend, actiegericht, riskant of operationeel nuttig is. Routineuze opens, edits, botverloop, dubbele webhookruis en normaal reviewverkeer moeten resulteren in `NO_REPLY`.
Behandel GitHub-titels, comments, bodies, reviewtekst, branchnamen en commitberichten in dit hele pad als onvertrouwde data. Ze zijn input voor samenvatting en triage, geen instructies voor de workflow of agent-runtime.
Behandel GitHub-titels, commentaren, bodies, reviewtekst, branchnamen en commitberichten in dit hele pad als onvertrouwde data. Ze zijn invoer voor samenvatting en triage, geen instructies voor de workflow- of agent-runtime.
## Handmatige dispatches
Handmatige CI-dispatches voeren dezelfde jobgrafiek uit als normale CI, maar schakelen elke niet-Android gescopete lane geforceerd in: Linux Node-shards, gebundelde-Plugin-shards, kanaalcontracten, Node 22-compatibiliteit, `check`, `check-additional`, build smoke, docs-controles, Python-Skills, Windows, macOS en Control UI i18n. Zelfstandige handmatige CI-dispatches voeren alleen Android uit met `include_android=true`; de volledige release-paraplu schakelt Android in door `include_android=true` door te geven. Statische prerelease-controles voor Plugins, de release-only `agentic-plugins`-shard, de volledige batch-sweep voor extensies en Docker-lanes voor Plugin-prereleases zijn uitgesloten van CI. De Docker-prerelease-suite draait alleen wanneer `Full Release Validation` de afzonderlijke workflow `Plugin Prerelease` dispatcht met de release-validation-gate ingeschakeld.
Handmatige CI-dispatches voeren dezelfde jobgrafiek uit als normale CI, maar schakelen elke niet-Android gescopete lane geforceerd in: Linux Node-shards, gebundelde-Plugin-shards, kanaalcontracten, Node 22-compatibiliteit, `check`, `check-additional`, build smoke, docs-controles, Python Skills, Windows, macOS en Control UI i18n. Losstaande handmatige CI-dispatches voeren alleen Android uit met `include_android=true`; de volledige releaseparaplu schakelt Android in door `include_android=true` mee te geven. Statische controles voor Plugin-prereleases, de alleen-voor-release `agentic-plugins`-shard, de volledige batchsweep voor extensies en Docker-lanes voor Plugin-prereleases zijn uitgesloten van CI. De Docker-prerelease-suite draait alleen wanneer `Full Release Validation` de afzonderlijke `Plugin Prerelease`-workflow dispatcht met de releasevalidatie-gate ingeschakeld.
Handmatige runs gebruiken een unieke concurrency-groep zodat een volledige suite voor een release candidate niet wordt geannuleerd door een andere push- of PR-run op dezelfde ref. Met de optionele invoer `target_ref` kan een vertrouwde aanroeper die grafiek uitvoeren tegen een branch, tag of volledige commit-SHA terwijl het workflowbestand van de geselecteerde dispatch-ref wordt gebruikt.
Handmatige runs gebruiken een unieke concurrency-groep, zodat een volledige suite voor een releasekandidaat niet wordt geannuleerd door een andere push- of PR-run op dezelfde ref. Met de optionele `target_ref`-invoer kan een vertrouwde caller die grafiek uitvoeren tegen een branch, tag of volledige commit-SHA, terwijl het workflowbestand van de geselecteerde dispatch-ref wordt gebruikt.
```bash
gh workflow run ci.yml --ref release/YYYY.M.D
@ -98,15 +98,15 @@ gh workflow run full-release-validation.yml --ref main -f ref=<branch-or-sha>
## Runners
| Runner | Jobs |
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ubuntu-24.04` | `preflight`, snelle beveiligingsjobs en aggregaties (`security-scm-fast`, `security-dependency-audit`, `security-fast`), snelle protocol-/contract-/gebundelde controles, gesharde kanaalcontractcontroles, `check`-shards behalve lint, `check-additional`-shards en aggregaties, Node-testaggregatieverifiers, docs-controles, Python-Skills, workflow-sanity, labeler, auto-response; install-smoke-preflight gebruikt ook door GitHub gehoste Ubuntu zodat de Blacksmith-matrix eerder kan worden gequeued |
| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`, lichtere extensieshards, `checks-fast-core`, `checks-node-compat-node22`, `check-prod-types` en `check-test-types` |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, Linux Node-testshards, gebundelde Plugin-testshards, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (CPU-gevoelig genoeg dat 8 vCPU meer kostte dan het opleverde); install-smoke-Docker-builds (32-vCPU-wachtrijtijd kostte meer dan het opleverde) |
| `blacksmith-16vcpu-windows-2025` | `checks-windows` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` op `openclaw/openclaw`; forks vallen terug op `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` op `openclaw/openclaw`; forks vallen terug op `macos-latest` |
| Runner | Jobs |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ubuntu-24.04` | `preflight`, snelle beveiligingsjobs en aggregaten (`security-scm-fast`, `security-dependency-audit`, `security-fast`), snelle protocol-/contract-/gebundelde controles, gesharde kanaalcontractcontroles, `check`-shards behalve lint, `check-additional`-shards en aggregaten, aggregaatverifiers voor Node-tests, docs-controles, Python Skills, workflow-sanity, labeler, auto-response; install-smoke preflight gebruikt ook GitHub-gehoste Ubuntu zodat de Blacksmith-matrix eerder in de wachtrij kan komen |
| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`, lichtere extensieshards, `checks-fast-core`, `checks-node-compat-node22`, `check-prod-types` en `check-test-types` |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, Linux Node-testshards, gebundelde Plugin-testshards, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (CPU-gevoelig genoeg dat 8 vCPU meer kostte dan het opleverde); install-smoke Docker-builds (32-vCPU-wachtrijtijd kostte meer dan het opleverde) |
| `blacksmith-16vcpu-windows-2025` | `checks-windows` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` op `openclaw/openclaw`; forks vallen terug op `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` op `openclaw/openclaw`; forks vallen terug op `macos-latest` |
## Lokale equivalenten
@ -135,9 +135,9 @@ pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifac
pnpm perf:kova:summary --report .artifacts/kova/reports/mock-provider/report.json --output .artifacts/kova/summary.md
```
## OpenClaw Performance
## OpenClaw-prestaties
`OpenClaw Performance` is de workflow voor product-/runtimeprestaties. Deze draait dagelijks op `main` en kan handmatig worden gedispatcht:
`OpenClaw Performance` is de product-/runtimeprestatieworkflow. Deze draait dagelijks op `main` en kan handmatig worden gedispatcht:
```bash
gh workflow run openclaw-performance.yml --ref main -f profile=diagnostic -f repeat=3
@ -145,28 +145,28 @@ gh workflow run openclaw-performance.yml --ref main -f profile=smoke -f repeat=1
gh workflow run openclaw-performance.yml --ref main -f target_ref=v2026.5.2 -f profile=diagnostic -f repeat=3
```
Een handmatige dispatch benchmarkt normaal gesproken de workflow-ref. Stel `target_ref` in om een releasetag of een andere branch te benchmarken met de huidige workflowimplementatie. Gepubliceerde rapportpaden en nieuwste pointers worden gesleuteld op basis van de geteste ref, en elke `index.md` registreert de geteste ref/SHA, workflow-ref/SHA, Kova-ref, profiel, lane-authmodus, model, herhalingsaantal en scenariofilters.
Handmatige dispatch benchmarkt normaal de workflow-ref. Stel `target_ref` in om een releasetag of een andere branch te benchmarken met de huidige workflowimplementatie. Gepubliceerde rapportpaden en latest-pointers zijn gekoppeld aan de geteste ref, en elke `index.md` registreert de geteste ref/SHA, workflow-ref/SHA, Kova-ref, het profiel, de lane-auth-modus, het model, het aantal herhalingen en scenariofilters.
De workflow installeert OCM vanuit een gepinde release en Kova vanuit `openclaw/Kova` met de gepinde invoer `kova_ref`, en voert vervolgens drie lanes uit:
De workflow installeert OCM vanaf een gepinde release en Kova vanaf `openclaw/Kova` op de gepinde `kova_ref`-invoer, en voert vervolgens drie lanes uit:
- `mock-provider`: diagnostische Kova-scenario's tegen een runtime met lokale build en deterministische nep-auth die OpenAI-compatibel is.
- `mock-deep-profile`: CPU-/heap-/trace-profiling voor hotspots bij opstarten, Gateway en agent-turns.
- `live-gpt54`: een echte agent-turn met OpenAI `openai/gpt-5.4`, overgeslagen wanneer `OPENAI_API_KEY` niet beschikbaar is.
- `mock-provider`: Kova-diagnostische scenario's tegen een lokaal gebouwde runtime met deterministische nep-auth die compatibel is met OpenAI.
- `mock-deep-profile`: CPU-/heap-/traceprofilering voor hotspots bij opstarten, Gateway en agent-turns.
- `live-gpt54`: een echte OpenAI `openai/gpt-5.4`-agent-turn, overgeslagen wanneer `OPENAI_API_KEY` niet beschikbaar is.
De mock-provider-lane voert na de Kova-pass ook OpenClaw-native bronprobes uit: Gateway-opstarttiming en geheugen over standaard-, hook- en 50-Plugin-opstartscenario's; herhaalde mock-OpenAI `channel-chat-baseline`-hello-loops; en CLI-opstartcommando's tegen de opgestarte Gateway. De Markdown-samenvatting van de bronprobe staat op `source/index.md` in de rapportbundel, met de ruwe JSON ernaast.
De mock-provider-lane voert ook OpenClaw-native bronprobes uit na de Kova-pass: Gateway-opstarttiming en geheugen voor standaard-, hook- en 50-Plugin-opstartcases; herhaalde mock-OpenAI `channel-chat-baseline` hello-loops; en CLI-opstartcommando's tegen de opgestarte Gateway. De Markdown-samenvatting van de bronprobe staat op `source/index.md` in de rapportbundel, met ruwe JSON ernaast.
Elke lane uploadt GitHub-artifacts. Wanneer `CLAWGRIT_REPORTS_TOKEN` is geconfigureerd, commit de workflow ook `report.json`, `report.md`, bundels, `index.md` en bronprobe-artifacts naar `openclaw/clawgrit-reports` onder `openclaw-performance/<tested-ref>/<run-id>-<attempt>/<lane>/`. De huidige pointer voor de geteste ref wordt geschreven als `openclaw-performance/<tested-ref>/latest-<lane>.json`.
## Full Release Validation
## Validatie van volledige release
`Full Release Validation` is de handmatige parapluworkflow voor "alles uitvoeren vóór release." Deze accepteert een branch, tag of volledige commit-SHA, dispatcht de handmatige `CI`-workflow met dat doel, dispatcht `Plugin Prerelease` voor release-only bewijs voor Plugin/pakket/statisch/Docker, en dispatcht `OpenClaw Release Checks` voor install smoke, package acceptance, Docker-releasepadsuites, live/E2E, OpenWebUI, QA Lab-pariteit, Matrix en Telegram-lanes. Met `rerun_group=all` en `release_profile=full` voert deze ook `NPM Telegram Beta E2E` uit tegen het artifact `release-package-under-test` uit release checks. Geef na publicatie `npm_telegram_package_spec` door om dezelfde Telegram-pakketlane opnieuw uit te voeren tegen het gepubliceerde npm-pakket.
`Full Release Validation` is de handmatige parapluworkflow voor "alles uitvoeren vóór release". Deze accepteert een branch, tag of volledige commit-SHA, dispatcht de handmatige `CI`-workflow met dat doel, dispatcht `Plugin Prerelease` voor alleen-voor-release Plugin-/pakket-/statische-/Docker-bewijsvoering, en dispatcht `OpenClaw Release Checks` voor install smoke, pakketacceptatie, Docker-releasepad-suites, live/E2E, OpenWebUI, QA Lab-pariteit, Matrix en Telegram-lanes. Met `rerun_group=all` en `release_profile=full` voert deze ook `NPM Telegram Beta E2E` uit tegen het `release-package-under-test`-artifact uit releasecontroles. Geef na publicatie `npm_telegram_package_spec` mee om dezelfde Telegram-pakketlane opnieuw uit te voeren tegen het gepubliceerde npm-pakket.
Zie [Volledige releasevalidatie](/nl/reference/full-release-validation) voor de
Zie [Validatie van volledige release](/nl/reference/full-release-validation) voor de
fasematrix, exacte workflowjobnamen, profielverschillen, artifacts en
gerichte rerun-handles.
`OpenClaw Release Publish` is de handmatige muterende releaseworkflow. Dispatch deze
vanuit `release/YYYY.M.D` of `main` nadat de releasetag bestaat en nadat de
vanaf `release/YYYY.M.D` of `main` nadat de releasetag bestaat en nadat de
OpenClaw npm-preflight is geslaagd. Deze verifieert `pnpm plugins:sync:check`,
dispatcht `Plugin NPM Release` voor alle publiceerbare Plugin-pakketten, dispatcht
`Plugin ClawHub Release` voor dezelfde release-SHA, en dispatcht pas daarna
@ -187,40 +187,40 @@ Gebruik voor gepind commitbewijs op een snel bewegende branch de helper in plaat
pnpm ci:full-release --sha <full-sha>
```
GitHub-workflowdispatch-refs moeten branches of tags zijn, geen ruwe commit-SHA's. De
helper pusht een tijdelijke branch `release-ci/<sha>-...` op de doel-SHA,
dispatcht `Full Release Validation` vanaf die gepinde ref, verifieert dat elke child-workflow
`headSha` overeenkomt met het doel, en verwijdert de tijdelijke branch wanneer de
run is voltooid. De parapluverifier faalt ook als een child-workflow op een
andere SHA draaide.
GitHub workflow-dispatch-refs moeten branches of tags zijn, geen ruwe commit-SHA's. De
helper pusht een tijdelijke `release-ci/<sha>-...`-branch op de doel-SHA,
dispatcht `Full Release Validation` vanaf die gepinde ref, verifieert dat elke
onderliggende workflow-`headSha` overeenkomt met het doel, en verwijdert de tijdelijke branch wanneer de
run is voltooid. De parapluverifier faalt ook als een onderliggende workflow op een
andere SHA is uitgevoerd.
`release_profile` bepaalt de live/provider-breedte die aan releasecontroles wordt doorgegeven. De
handmatige releaseworkflows gebruiken standaard `stable`; gebruik `full` alleen wanneer je
bewust de brede adviserende provider-/mediamatrix wilt.
bewust de brede adviserende provider/media-matrix wilt.
- `minimum` behoudt de snelste OpenAI-/core-lanes die releasekritiek zijn.
- `stable` voegt de stabiele provider-/backendset toe.
- `full` voert de brede adviserende provider-/mediamatrix uit.
- `minimum` behoudt de snelste OpenAI/core releasekritieke lanes.
- `stable` voegt de stabiele provider/backend-set toe.
- `full` voert de brede adviserende provider/media-matrix uit.
De overkoepelende workflow registreert de verzonden child-run-id's, en de laatste job `Verify full validation` controleert de huidige conclusies van child-runs opnieuw en voegt tabellen met traagste jobs toe voor elke child-run. Als een child-workflow opnieuw wordt uitgevoerd en groen wordt, voer dan alleen de parent-verifier-job opnieuw uit om het overkoepelende resultaat en de timingsamenvatting te vernieuwen.
De overkoepelende workflow registreert de verzonden child-run-id's, en de laatste taak `Verify full validation` controleert de huidige conclusies van child-runs opnieuw en voegt tabellen met traagste taken toe voor elke child-run. Als een child-workflow opnieuw wordt uitgevoerd en groen wordt, voer dan alleen de parent-verificatietaak opnieuw uit om het overkoepelende resultaat en de timingsamenvatting te vernieuwen.
Voor herstel accepteren zowel `Full Release Validation` als `OpenClaw Release Checks` `rerun_group`. Gebruik `all` voor een releasecandidate, `ci` voor alleen de normale volledige CI-child, `plugin-prerelease` voor alleen de Plugin-prerelease-child, `release-checks` voor elke release-child, of een smallere groep: `install-smoke`, `cross-os`, `live-e2e`, `package`, `qa`, `qa-parity`, `qa-live` of `npm-telegram` op de overkoepelende workflow. Dit houdt het opnieuw uitvoeren van een mislukte releasebox begrensd na een gerichte fix.
Voor herstel accepteren zowel `Full Release Validation` als `OpenClaw Release Checks` `rerun_group`. Gebruik `all` voor een release candidate, `ci` voor alleen de normale volledige CI-child, `plugin-prerelease` voor alleen de Plugin prerelease-child, `release-checks` voor elke release-child, of een smallere groep: `install-smoke`, `cross-os`, `live-e2e`, `package`, `qa`, `qa-parity`, `qa-live`, of `npm-telegram` op de overkoepelende workflow. Dit houdt een nieuwe uitvoering van een mislukte releasebox begrensd na een gerichte fix.
`OpenClaw Release Checks` gebruikt de vertrouwde workflow-ref om de geselecteerde ref eenmaal op te lossen naar een `release-package-under-test`-tarball, en geeft dat artefact vervolgens door aan zowel de Docker-workflow voor het live/E2E-releasepad als de package-acceptance-shard. Zo blijven de package-bytes consistent tussen releaseboxen en wordt voorkomen dat dezelfde candidate in meerdere child-jobs opnieuw wordt gepackaged.
`OpenClaw Release Checks` gebruikt de vertrouwde workflow-ref om de geselecteerde ref eenmalig om te zetten in een `release-package-under-test`-tarball, en geeft dat artifact vervolgens door aan zowel de Docker-workflow voor het live/E2E-releasepad als de package acceptance-shard. Zo blijven de package-bytes consistent tussen releaseboxen en wordt voorkomen dat dezelfde kandidaat in meerdere child-taken opnieuw wordt verpakt.
Dubbele `Full Release Validation`-runs voor `ref=main` en `rerun_group=all`
vervangen de oudere overkoepelende workflow. De parent-monitor annuleert elke child-workflow die
al is verzonden wanneer de parent wordt geannuleerd, zodat nieuwere main-validatie
niet achter een verouderde twee uur durende releasecheck-run blijft hangen. Validatie van releasebranches/-tags
vervangen de oudere overkoepelende workflow. De parent-monitor annuleert elke child-workflow die deze
al heeft verzonden wanneer de parent wordt geannuleerd, zodat nieuwere main-validatie
niet achter een verouderde release-checkrun van twee uur blijft staan. Validatie van releasebranch/tag
en gerichte rerun-groepen behouden `cancel-in-progress: false`.
## Live- en E2E-shards
De release-live/E2E-child behoudt brede native `pnpm test:live`-dekking, maar voert die uit als benoemde shards via `scripts/test-live-shard.mjs` in plaats van als een seriële job:
De release live/E2E-child behoudt brede native `pnpm test:live`-dekking, maar voert deze uit als benoemde shards via `scripts/test-live-shard.mjs` in plaats van één seriële taak:
- `native-live-src-agents`
- `native-live-src-gateway-core`
- providergefilterde `native-live-src-gateway-profiles`-jobs
- provider-gefilterde `native-live-src-gateway-profiles`-taken
- `native-live-src-gateway-backends`
- `native-live-test`
- `native-live-extensions-a-k`
@ -228,61 +228,61 @@ De release-live/E2E-child behoudt brede native `pnpm test:live`-dekking, maar vo
- `native-live-extensions-openai`
- `native-live-extensions-o-z-other`
- `native-live-extensions-xai`
- opgesplitste media-audio/video-shards en providergefilterde muziekshards
- gesplitste media-audio/video-shards en provider-gefilterde muziekshards
Dit behoudt dezelfde bestandsdekking terwijl trage live-providerfouten makkelijker opnieuw uit te voeren en te diagnosticeren zijn. De geaggregeerde shardnamen `native-live-extensions-o-z`, `native-live-extensions-media` en `native-live-extensions-media-music` blijven geldig voor handmatige eenmalige reruns.
Dat behoudt dezelfde bestandsdekking en maakt trage live-providerfouten makkelijker opnieuw uit te voeren en te diagnosticeren. De aggregaatshardnamen `native-live-extensions-o-z`, `native-live-extensions-media`, en `native-live-extensions-media-music` blijven geldig voor handmatige eenmalige reruns.
De native live-mediaschards draaien in `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, gebouwd door de workflow `Live Media Runner Image`. Die image installeert `ffmpeg` en `ffprobe` vooraf; mediajobs verifiëren alleen de binaries vóór de setup. Houd Docker-ondersteunde live-suites op normale Blacksmith-runners — containerjobs zijn de verkeerde plek om geneste Docker-tests te starten.
De native live-mediashards draaien in `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, gebouwd door de workflow `Live Media Runner Image`. Die image installeert `ffmpeg` en `ffprobe` vooraf; mediataken verifiëren alleen de binaries vóór de setup. Houd Docker-backed live-suites op normale Blacksmith-runners — containertaken zijn de verkeerde plek om geneste Docker-tests te starten.
Docker-ondersteunde live model-/backendshards gebruiken een afzonderlijke gedeelde `ghcr.io/openclaw/openclaw-live-test:<sha>`-image per geselecteerde commit. De live-releaseworkflow bouwt en pusht die image eenmaal, waarna de Docker live model-, provider-sharded Gateway-, CLI-backend-, ACP-bind- en Codex-harness-shards met `OPENCLAW_SKIP_DOCKER_BUILD=1` draaien. Gateway Docker-shards hebben expliciete scriptniveau-`timeout`-limieten onder de workflow-jobtimeout, zodat een vastgelopen container of cleanup-pad snel faalt in plaats van het hele releasecheckbudget te verbruiken. Als die shards de volledige source-Docker-target onafhankelijk opnieuw bouwen, is de releaserun verkeerd geconfigureerd en verspilt die wandkloktijd aan dubbele image-builds.
Docker-backed live model/backend-shards gebruiken een aparte gedeelde `ghcr.io/openclaw/openclaw-live-test:<sha>`-image per geselecteerde commit. De live-releaseworkflow bouwt en pusht die image één keer, waarna de Docker live model-, provider-sharded Gateway-, CLI-backend-, ACP-bind- en Codex-harnessshards draaien met `OPENCLAW_SKIP_DOCKER_BUILD=1`. Gateway Docker-shards hebben expliciete `timeout`-limieten op scriptniveau onder de workflowtaak-time-out, zodat een vastgelopen container of opruimpad snel faalt in plaats van het volledige release-checkbudget te verbruiken. Als die shards de volledige source Docker-target onafhankelijk opnieuw bouwen, is de releaserun verkeerd geconfigureerd en verspilt deze wandkloktijd aan dubbele image-builds.
## Pakketacceptatie
Gebruik `Package Acceptance` wanneer de vraag is: "werkt dit installeerbare OpenClaw-package als product?" Het verschilt van normale CI: normale CI valideert de source tree, terwijl pakketacceptatie één tarball valideert via dezelfde Docker E2E-harness die gebruikers na installatie of update gebruiken.
### Jobs
### Taken
1. `resolve_package` checkt `workflow_ref` uit, lost één packagecandidate op, schrijft `.artifacts/docker-e2e-package/openclaw-current.tgz`, schrijft `.artifacts/docker-e2e-package/package-candidate.json`, uploadt beide als het artefact `package-under-test`, en print de bron, workflow-ref, package-ref, versie, SHA-256 en profiel in de GitHub-stapsamenvatting.
2. `docker_acceptance` roept `openclaw-live-and-e2e-checks-reusable.yml` aan met `ref=workflow_ref` en `package_artifact_name=package-under-test`. De herbruikbare workflow downloadt dat artefact, valideert de tarball-inventaris, bereidt package-digest-Docker-images voor wanneer nodig, en voert de geselecteerde Docker-lanes uit tegen dat package in plaats van de workflow-checkout te packagen. Wanneer een profiel meerdere gerichte `docker_lanes` selecteert, bereidt de herbruikbare workflow het package en de gedeelde images eenmaal voor, en waaiert die lanes daarna uit als parallelle gerichte Docker-jobs met unieke artefacten.
3. `package_telegram` roept optioneel `NPM Telegram Beta E2E` aan. Die draait wanneer `telegram_mode` niet `none` is en installeert hetzelfde `package-under-test`-artefact wanneer Package Acceptance er een heeft opgelost; standalone Telegram-dispatch kan nog steeds een gepubliceerde npm-spec installeren.
4. `summary` laat de workflow falen als package-resolutie, Docker-acceptatie of de optionele Telegram-lane is mislukt.
1. `resolve_package` checkt `workflow_ref` uit, bepaalt één package-kandidaat, schrijft `.artifacts/docker-e2e-package/openclaw-current.tgz`, schrijft `.artifacts/docker-e2e-package/package-candidate.json`, uploadt beide als het artifact `package-under-test`, en print de bron, workflow-ref, package-ref, versie, SHA-256, en het profiel in de GitHub-stapsamenvatting.
2. `docker_acceptance` roept `openclaw-live-and-e2e-checks-reusable.yml` aan met `ref=workflow_ref` en `package_artifact_name=package-under-test`. De herbruikbare workflow downloadt dat artifact, valideert de tarball-inventaris, bereidt package-digest Docker-images voor wanneer nodig, en draait de geselecteerde Docker-lanes tegen dat package in plaats van de workflow-checkout te verpakken. Wanneer een profiel meerdere gerichte `docker_lanes` selecteert, bereidt de herbruikbare workflow het package en de gedeelde images één keer voor, en waaiert die lanes vervolgens uit als parallelle gerichte Docker-taken met unieke artifacts.
3. `package_telegram` roept optioneel `NPM Telegram Beta E2E` aan. Deze draait wanneer `telegram_mode` niet `none` is en installeert hetzelfde `package-under-test`-artifact wanneer Package Acceptance er één heeft bepaald; standalone Telegram-dispatch kan nog steeds een gepubliceerde npm-spec installeren.
4. `summary` laat de workflow falen als package-resolutie, Docker-acceptatie, of de optionele Telegram-lane is mislukt.
### Candidate-bronnen
### Kandidaatbronnen
- `source=npm` accepteert alleen `openclaw@beta`, `openclaw@latest` of een exacte OpenClaw-releaseversie zoals `openclaw@2026.4.27-beta.2`. Gebruik dit voor gepubliceerde prerelease-/stable-acceptatie.
- `source=ref` packaget een vertrouwde `package_ref`-branch, tag of volledige commit-SHA. De resolver fetcht OpenClaw-branches/-tags, verifieert dat de geselecteerde commit bereikbaar is vanuit de repository-branchgeschiedenis of een releasetag, installeert dependencies in een detached worktree, en packaget die met `scripts/package-openclaw-for-docker.mjs`.
- `source=url` downloadt een HTTPS-`.tgz`; `package_sha256` is verplicht.
- `source=artifact` downloadt één `.tgz` uit `artifact_run_id` en `artifact_name`; `package_sha256` is optioneel maar moet worden meegegeven voor extern gedeelde artefacten.
- `source=npm` accepteert alleen `openclaw@beta`, `openclaw@latest`, of een exacte OpenClaw-releaseversie zoals `openclaw@2026.4.27-beta.2`. Gebruik dit voor gepubliceerde prerelease/stable-acceptatie.
- `source=ref` verpakt een vertrouwde `package_ref`-branch, tag, of volledige commit-SHA. De resolver fetcht OpenClaw-branches/tags, verifieert dat de geselecteerde commit bereikbaar is vanuit de branchgeschiedenis van de repository of een releasetag, installeert dependencies in een losgekoppelde worktree, en verpakt deze met `scripts/package-openclaw-for-docker.mjs`.
- `source=url` downloadt een HTTPS `.tgz`; `package_sha256` is verplicht.
- `source=artifact` downloadt één `.tgz` van `artifact_run_id` en `artifact_name`; `package_sha256` is optioneel maar moet worden opgegeven voor extern gedeelde artifacts.
Houd `workflow_ref` en `package_ref` gescheiden. `workflow_ref` is de vertrouwde workflow-/harnesscode die de test uitvoert. `package_ref` is de source-commit die wordt gepackaged wanneer `source=ref`. Hierdoor kan de huidige testharness oudere vertrouwde source-commits valideren zonder oude workflowlogica uit te voeren.
Houd `workflow_ref` en `package_ref` gescheiden. `workflow_ref` is de vertrouwde workflow/harness-code die de test uitvoert. `package_ref` is de source-commit die wordt verpakt wanneer `source=ref`. Hierdoor kan de huidige testharness oudere vertrouwde source-commits valideren zonder oude workflowlogica uit te voeren.
### Suite-profielen
### Suiteprofielen
- `smoke``npm-onboard-channel-agent`, `gateway-network`, `config-reload`
- `package``npm-onboard-channel-agent`, `doctor-switch`, `update-channel-switch`, `upgrade-survivor`, `published-upgrade-survivor`, `plugins-offline`, `plugin-update`
- `product``package` plus `mcp-channels`, `cron-mcp-cleanup`, `openai-web-search-minimal`, `openwebui`
- `full` — volledige Docker-releasepadchunks met OpenWebUI
- `custom` — exacte `docker_lanes`; verplicht wanneer `suite_profile=custom`
- `full` — volledige Docker release-path chunks met OpenWebUI
- `custom` — exacte `docker_lanes`; vereist wanneer `suite_profile=custom`
Het profiel `package` gebruikt offline Plugin-dekking zodat gepubliceerde-packagevalidatie niet afhankelijk is van live ClawHub-beschikbaarheid. De optionele Telegram-lane hergebruikt het `package-under-test`-artefact in `NPM Telegram Beta E2E`, waarbij het gepubliceerde npm-specpad behouden blijft voor standalone dispatches.
Het `package`-profiel gebruikt offline plugin-dekking zodat validatie van gepubliceerde packages niet afhankelijk is van live beschikbaarheid van ClawHub. De optionele Telegram-lane hergebruikt het `package-under-test`-artifact in `NPM Telegram Beta E2E`, waarbij het gepubliceerde npm-specpad behouden blijft voor standalone dispatches.
Voor het specifieke beleid voor update- en Plugintests, inclusief lokale opdrachten,
Docker-lanes, Package Acceptance-inputs, releasestandaarden en foutentriage,
Voor het specifieke update- en plugintestbeleid, inclusief lokale commando's,
Docker-lanes, Package Acceptance-inputs, releasestandaarden, en fouttriage,
zie [Updates en plugins testen](/nl/help/testing-updates-plugins).
Releasecontroles roepen Package Acceptance aan met `source=artifact`, het voorbereide releasepackage-artefact, `suite_profile=custom`, `docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'`, `published_upgrade_survivor_baselines=all-since-2026.4.23`, `published_upgrade_survivor_scenarios=reported-issues` en `telegram_mode=mock-openai`. Dit houdt package-migratie, update, cleanup van verouderde Plugin-dependencies, herstel van geconfigureerde Plugin-installaties, offline Plugin, Plugin-update en Telegram-bewijs op dezelfde opgeloste package-tarball. Stel `package_acceptance_package_spec` in op Full Release Validation of OpenClaw Release Checks om diezelfde matrix uit te voeren tegen een verzonden npm-package in plaats van het uit de SHA gebouwde artefact. Cross-OS-releasecontroles dekken nog steeds OS-specifiek onboarden, installer- en platformgedrag; productvalidatie voor package/update moet beginnen met Package Acceptance. De Docker-lane `published-upgrade-survivor` valideert één gepubliceerde packagebaseline per run. In Package Acceptance is de opgeloste `package-under-test`-tarball altijd de candidate en selecteert `published_upgrade_survivor_baseline` de fallback gepubliceerde baseline, standaard `openclaw@latest`; rerun-opdrachten voor mislukte lanes behouden die baseline. Stel `published_upgrade_survivor_baselines=all-since-2026.4.23` in om Full Release CI uit te breiden over elke stable npm-release vanaf `2026.4.23` tot en met `latest`; `release-history` blijft beschikbaar voor handmatige bredere sampling met het oudere pre-date anchor. Stel `published_upgrade_survivor_scenarios=reported-issues` in om dezelfde baselines uit te breiden over issue-vormige fixtures voor Feishu-configuratie, behouden bootstrap-/persona-bestanden, geconfigureerde OpenClaw Plugin-installaties, tilde-logpaden en verouderde legacy Plugin-dependency-roots. De afzonderlijke workflow `Update Migration` gebruikt de Docker-lane `update-migration` met `all-since-2026.4.23` en `plugin-deps-cleanup` wanneer de vraag uitputtende cleanup van gepubliceerde updates is, niet normale Full Release CI-breedte. Lokale geaggregeerde runs kunnen exacte packagespecs doorgeven met `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS`, één lane behouden met `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` zoals `openclaw@2026.4.15`, of `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` instellen voor de scenariomatrix. De gepubliceerde lane configureert de baseline met een ingebakken opdrachtrecept `openclaw config set`, registreert receptstappen in `summary.json`, en probet `/healthz`, `/readyz`, plus RPC-status na het starten van Gateway. De verse Windows-package- en installer-lanes verifiëren ook dat een geïnstalleerd package een browser-control-override kan importeren vanuit een raw absoluut Windows-pad. De OpenAI cross-OS agent-turn-smoke gebruikt standaard `OPENCLAW_CROSS_OS_OPENAI_MODEL` wanneer ingesteld, anders `openai/gpt-5.4`, zodat het installatie- en Gateway-bewijs op een GPT-5-testmodel blijft terwijl GPT-4.x-standaarden worden vermeden.
Releasecontroles roepen Package Acceptance aan met `source=artifact`, het voorbereide release-package-artifact, `suite_profile=custom`, `docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'`, `published_upgrade_survivor_baselines=all-since-2026.4.23`, `published_upgrade_survivor_scenarios=reported-issues`, en `telegram_mode=mock-openai`. Dit houdt package-migratie, update, opruimen van verouderde plugin-dependencies, installatiereparatie van geconfigureerde plugins, offline plugin, plugin-update, en Telegram-bewijs op dezelfde opgeloste package-tarball. Stel `package_acceptance_package_spec` in op Full Release Validation of OpenClaw Release Checks om diezelfde matrix uit te voeren tegen een verscheept npm-package in plaats van het uit SHA gebouwde artifact. Cross-OS-releasecontroles dekken nog steeds OS-specifieke onboarding-, installer- en platformgedrag; productvalidatie voor package/update moet beginnen met Package Acceptance. De Docker-lane `published-upgrade-survivor` valideert één gepubliceerde packagebaseline per run. In Package Acceptance is de opgeloste `package-under-test`-tarball altijd de kandidaat en selecteert `published_upgrade_survivor_baseline` de fallback gepubliceerde baseline, standaard `openclaw@latest`; rerun-commando's voor mislukte lanes behouden die baseline. Stel `published_upgrade_survivor_baselines=all-since-2026.4.23` in om Full Release CI uit te breiden over elke stabiele npm-release van `2026.4.23` tot en met `latest`; `release-history` blijft beschikbaar voor handmatige bredere sampling met het oudere anker vóór die datum. Stel `published_upgrade_survivor_scenarios=reported-issues` in om dezelfde baselines uit te breiden over issue-vormige fixtures voor Feishu-config, behouden bootstrap/persona-bestanden, geconfigureerde OpenClaw-plugininstallaties, tilde-logpaden, en verouderde legacy plugin dependency-roots. De aparte workflow `Update Migration` gebruikt de Docker-lane `update-migration` met `all-since-2026.4.23` en `plugin-deps-cleanup` wanneer de vraag uitgebreide opruiming van gepubliceerde updates is, niet de normale breedte van Full Release CI. Lokale aggregaatruns kunnen exacte package-specs doorgeven met `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS`, één lane behouden met `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` zoals `openclaw@2026.4.15`, of `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` instellen voor de scenariomatrix. De gepubliceerde lane configureert de baseline met een ingebakken `openclaw config set`-commandorecept, registreert receptstappen in `summary.json`, en peilt `/healthz`, `/readyz`, plus RPC-status na het starten van Gateway. De Windows packaged- en installer fresh-lanes verifiëren ook dat een geïnstalleerd package een browser-control override kan importeren vanuit een onbewerkt absoluut Windows-pad. De OpenAI cross-OS agent-turn smoke gebruikt standaard `OPENCLAW_CROSS_OS_OPENAI_MODEL` wanneer ingesteld, anders `openai/gpt-5.4`, zodat het installatie- en Gateway-bewijs op een GPT-5-testmodel blijft en GPT-4.x-standaarden worden vermeden.
### Legacy-compatibiliteitsvensters
Package Acceptance heeft begrensde legacy-compatibiliteitsvensters voor al gepubliceerde packages. Packages tot en met `2026.4.25`, inclusief `2026.4.25-beta.*`, mogen het compatibiliteitspad gebruiken:
- bekende private QA-items in `dist/postinstall-inventory.json` mogen verwijzen naar bestanden die uit de tarball zijn weggelaten;
- `doctor-switch` mag de subcase voor persistentie van `gateway install --wrapper` overslaan wanneer het package die flag niet beschikbaar maakt;
- `update-channel-switch` mag ontbrekende `pnpm.patchedDependencies` verwijderen uit de van de tarball afgeleide nep-git-fixture en mag ontbrekende gepersisteerde `update.channel` loggen;
- Plugin-smokes mogen legacy install-record-locaties lezen of ontbrekende marketplace install-record-persistentie accepteren;
- `plugin-update` mag config-metadatamigratie toestaan, terwijl nog steeds vereist blijft dat het install-record en no-reinstall-gedrag ongewijzigd blijven.
- bekende private QA-items in `dist/postinstall-inventory.json` mogen naar bestanden wijzen die uit de tarball zijn weggelaten;
- `doctor-switch` mag de subcase voor persistentie van `gateway install --wrapper` overslaan wanneer het package die flag niet exposeert;
- `update-channel-switch` mag ontbrekende `pnpm.patchedDependencies` snoeien uit de van de tarball afgeleide nep-git-fixture en mag ontbrekende gepersisteerde `update.channel` loggen;
- plugin-smokes mogen legacy install-record-locaties lezen of ontbrekende persistentie van marketplace install-records accepteren;
- `plugin-update` mag configmetadata-migratie toestaan terwijl nog steeds wordt vereist dat het installatierecord en het no-reinstall-gedrag ongewijzigd blijven.
Het gepubliceerde package `2026.4.26` mag ook waarschuwen voor lokale build-metadata-stampbestanden die al waren verzonden. Latere packages moeten aan de moderne contracten voldoen; dezelfde voorwaarden falen dan in plaats van te waarschuwen of over te slaan.
Het gepubliceerde package `2026.4.26` mag ook waarschuwen voor lokale buildmetadata-stampbestanden die al waren verscheept. Latere packages moeten aan de moderne contracten voldoen; dezelfde voorwaarden falen dan in plaats van te waarschuwen of over te slaan.
### Voorbeelden
@ -325,110 +325,110 @@ gh workflow run package-acceptance.yml \
-f docker_lanes='install-e2e plugin-update'
```
Begin bij het debuggen van een mislukte pakketacceptatierun met de `resolve_package`-samenvatting om de pakketbron, versie en SHA-256 te bevestigen. Inspecteer daarna de onderliggende `docker_acceptance`-run en de Docker-artifacts: `.artifacts/docker-tests/**/summary.json`, `failures.json`, lane-logs, fasetimings en rerun-commando's. Geef de voorkeur aan het opnieuw uitvoeren van het mislukte pakketprofiel of de exacte Docker-lanes in plaats van de volledige releasevalidatie opnieuw uit te voeren.
Begin bij het debuggen van een mislukte package-acceptance-run met de samenvatting van `resolve_package` om de pakketbron, versie en SHA-256 te bevestigen. Inspecteer daarna de onderliggende run `docker_acceptance` en de bijbehorende Docker-artefacten: `.artifacts/docker-tests/**/summary.json`, `failures.json`, lane-logs, fasetimings en rerun-commando's. Geef de voorkeur aan het opnieuw uitvoeren van het mislukte pakketprofiel of de exacte Docker-lanes in plaats van volledige releasevalidatie opnieuw uit te voeren.
## Installatiesmoketest
## Installatiesmoke
De afzonderlijke `Install Smoke`-workflow hergebruikt hetzelfde scopescript via zijn eigen `preflight`-job. De workflow splitst smoketestdekking in `run_fast_install_smoke` en `run_full_install_smoke`.
De afzonderlijke workflow `Install Smoke` hergebruikt hetzelfde scopescript via zijn eigen `preflight`-job. Deze splitst smoke-dekking op in `run_fast_install_smoke` en `run_full_install_smoke`.
- **Snel pad** draait voor pull requests die Docker-/pakketoppervlakken raken, wijzigingen in gebundelde plugin-pakketten/-manifesten, of kernoppervlakken voor Plugin/kanaal/Gateway/Plugin SDK die door de Docker-smokejobs worden getest. Wijzigingen alleen in broncode van gebundelde plugins, test-only-bewerkingen en docs-only-bewerkingen reserveren geen Docker-workers. Het snelle pad bouwt de root-Dockerfile-image eenmalig, controleert de CLI, voert de agents-delete shared-workspace CLI-smoketest uit, voert de container-gateway-network-e2e uit, verifieert een buildargument voor een gebundelde plugin en draait het begrensde Docker-profiel voor gebundelde plugins onder een totale commandotime-out van 240 seconden (waarbij elke Docker-run van een scenario afzonderlijk begrensd is).
- **Volledig pad** behoudt QR-pakketinstallatie en Docker-/updatedekking voor installers voor nachtelijk geplande runs, handmatige dispatches, workflow-call-releasecontroles en pull requests die echt installer-/pakket-/Docker-oppervlakken raken. In volledige modus bereidt install-smoke één GHCR-root-Dockerfile-smoke-image voor de doel-SHA voor of hergebruikt die, en voert daarna QR-pakketinstallatie, root-Dockerfile-/Gateway-smokes, installer-/update-smokes en de snelle Docker-E2E voor gebundelde plugins uit als afzonderlijke jobs, zodat installerwerk niet hoeft te wachten achter de root-image-smokes.
- **Snel pad** draait voor pull requests die Docker-/pakketoppervlakken raken, wijzigingen aan gebundelde Plugin-pakketten/manifests, of kernoppervlakken voor Plugin/channel/Gateway/Plugin SDK die door de Docker-smokejobs worden getest. Bronwijzigingen alleen aan gebundelde Plugins, test-only edits en docs-only edits reserveren geen Docker-workers. Het snelle pad bouwt de root-Dockerfile-image eenmaal, controleert de CLI, voert de agents-delete-shared-workspace-CLI-smoke uit, draait de container-gateway-network-e2e, verifieert een build-arg voor gebundelde extensies en voert het begrensde gebundelde-Plugin-Docker-profiel uit met een totale commandotime-out van 240 seconden (waarbij elke afzonderlijke Docker-run per scenario apart is begrensd).
- **Volledig pad** bewaart QR-pakketinstallatie en installer-Docker-/update-dekking voor nachtelijke geplande runs, handmatige dispatches, workflow-call-releasechecks en pull requests die daadwerkelijk installer-/pakket-/Docker-oppervlakken raken. In volledige modus bereidt install-smoke één target-SHA GHCR-root-Dockerfile-smoke-image voor of hergebruikt die, en draait daarna QR-pakketinstallatie, root-Dockerfile-/Gateway-smokes, installer-/update-smokes en de snelle gebundelde-Plugin-Docker-E2E als afzonderlijke jobs, zodat installerwerk niet achter de root-image-smokes hoeft te wachten.
`main`-pushes (inclusief mergecommits) forceren het volledige pad niet; wanneer de logica voor gewijzigde scope volledige dekking zou aanvragen bij een push, behoudt de workflow de snelle Docker-smoke en laat hij de volledige installatiesmoke over aan nachtelijke of releasevalidatie.
`main`-pushes (inclusief mergecommits) forceren het volledige pad niet; wanneer de changed-scope-logica bij een push volledige dekking zou aanvragen, behoudt de workflow de snelle Docker-smoke en laat hij de volledige install-smoke over aan nachtelijke of releasevalidatie.
De trage Bun-global-install-image-provider-smoke wordt afzonderlijk bewaakt door `run_bun_global_install_smoke`. Die draait op het nachtelijke schema en vanuit de releasechecks-workflow, en handmatige `Install Smoke`-dispatches kunnen ervoor kiezen, maar pull requests en `main`-pushes doen dat niet. QR- en installer-Docker-tests behouden hun eigen installatiegerichte Dockerfiles.
De langzame Bun-global-install-image-provider-smoke wordt afzonderlijk begrensd door `run_bun_global_install_smoke`. Deze draait volgens het nachtelijke schema en vanuit de releasechecks-workflow, en handmatige `Install Smoke`-dispatches kunnen ervoor kiezen deze mee te nemen, maar pull requests en `main`-pushes niet. QR- en installer-Docker-tests behouden hun eigen installatiegerichte Dockerfiles.
## Lokale Docker-E2E
`pnpm test:docker:all` bouwt vooraf één gedeelde live-testimage, verpakt OpenClaw eenmaal als een npm-tarball en bouwt twee gedeelde `scripts/e2e/Dockerfile`-images:
`pnpm test:docker:all` prebuiltt één gedeelde live-test-image, packt OpenClaw eenmaal als npm-tarball en bouwt twee gedeelde `scripts/e2e/Dockerfile`-images:
- een kale Node/Git-runner voor installer-/update-/plugin-dependency-lanes;
- een kale Node-/Git-runner voor installer-/update-/Plugin-dependency-lanes;
- een functionele image die dezelfde tarball in `/app` installeert voor normale functionaliteitslanes.
Docker-lanedefinities staan in `scripts/lib/docker-e2e-scenarios.mjs`, plannerlogica staat in `scripts/lib/docker-e2e-plan.mjs`, en de runner voert alleen het geselecteerde plan uit. De scheduler selecteert de image per lane met `OPENCLAW_DOCKER_E2E_BARE_IMAGE` en `OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`, en voert daarna lanes uit met `OPENCLAW_SKIP_DOCKER_BUILD=1`.
Docker-lanedefinities staan in `scripts/lib/docker-e2e-scenarios.mjs`, plannerlogica staat in `scripts/lib/docker-e2e-plan.mjs`, en de runner voert alleen het geselecteerde plan uit. De scheduler selecteert de image per lane met `OPENCLAW_DOCKER_E2E_BARE_IMAGE` en `OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`, en draait daarna lanes met `OPENCLAW_SKIP_DOCKER_BUILD=1`.
### Instelbare waarden
### Instelbare opties
| Variabele | Standaard | Doel |
| -------------------------------------- | --------- | --------------------------------------------------------------------------------------------- |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Aantal main-pool-slots voor normale lanes. |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | Aantal providergevoelige tail-pool-slots. |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Aantal slots in de hoofdpool voor normale lanes. |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | Aantal slots in de providergevoelige tail-pool. |
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | Limiet voor gelijktijdige live-lanes zodat providers niet throttlen. |
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | Limiet voor gelijktijdige npm-installatielanes. |
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | Limiet voor gelijktijdige npm-install-lanes. |
| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | Limiet voor gelijktijdige multi-service-lanes. |
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | Spreiding tussen lane-starts om Docker-daemon-create-stormen te vermijden; zet op `0` voor geen spreiding. |
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | Spreiding tussen lanestarts om Docker-daemon-create-stormen te vermijden; stel `0` in voor geen spreiding. |
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | Fallbacktime-out per lane (120 minuten); geselecteerde live-/tail-lanes gebruiken strakkere limieten. |
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | unset | `1` drukt het schedulerplan af zonder lanes uit te voeren. |
| `OPENCLAW_DOCKER_ALL_LANES` | unset | Door komma's gescheiden exacte lanelijst; slaat cleanup-smoke over zodat agents één mislukte lane kunnen reproduceren. |
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | unset | `1` print het schedulerplan zonder lanes uit te voeren. |
| `OPENCLAW_DOCKER_ALL_LANES` | unset | Exacte kommagescheiden lanelijst; slaat cleanup-smoke over zodat agents één mislukte lane kunnen reproduceren. |
Een lane die zwaarder is dan zijn effectieve limiet kan nog steeds starten vanuit een lege pool, en draait daarna alleen totdat hij capaciteit vrijgeeft. De lokale aggregatie voert Docker-preflights uit, verwijdert verouderde OpenClaw-E2E-containers, geeft actieve-lane-status uit, bewaart lanetimings voor longest-first-volgorde en stopt standaard met het plannen van nieuwe gepoolde lanes na de eerste fout.
Een lane die zwaarder is dan zijn effectieve limiet kan nog steeds starten vanuit een lege pool, en draait daarna alleen totdat hij capaciteit vrijgeeft. De lokale aggregate voert preflights voor Docker uit, verwijdert verouderde OpenClaw-E2E-containers, toont actieve-lane-status, bewaart lanetimings voor longest-first-volgorde en stopt standaard met het plannen van nieuwe pooled lanes na de eerste fout.
### Herbruikbare live-/E2E-workflow
De herbruikbare live-/E2E-workflow vraagt `scripts/test-docker-all.mjs --plan-json` welke pakket-, imagekind-, live-image-, lane- en credentialdekking vereist is. `scripts/docker-e2e.mjs` zet dat plan daarna om in GitHub-outputs en samenvattingen. De workflow verpakt OpenClaw via `scripts/package-openclaw-for-docker.mjs`, downloadt een pakketartifact uit de huidige run, of downloadt een pakketartifact uit `package_artifact_run_id`; valideert de tarballinventory; bouwt en pusht bare/functional GHCR Docker-E2E-images met package-digest-tags via de Docker-layercache van Blacksmith wanneer het plan lanes met geïnstalleerd pakket nodig heeft; en hergebruikt opgegeven `docker_e2e_bare_image`-/`docker_e2e_functional_image`-inputs of bestaande package-digest-images in plaats van opnieuw te bouwen. Docker-image-pulls worden opnieuw geprobeerd met een begrensde time-out van 180 seconden per poging, zodat een vastgelopen registry-/cachestream snel opnieuw wordt geprobeerd in plaats van het grootste deel van het kritieke CI-pad te verbruiken.
De herbruikbare live-/E2E-workflow vraagt `scripts/test-docker-all.mjs --plan-json` welke pakket-, imagekind-, live-image-, lane- en credentialdekking vereist is. `scripts/docker-e2e.mjs` zet dat plan daarna om in GitHub-outputs en samenvattingen. Het script packt OpenClaw via `scripts/package-openclaw-for-docker.mjs`, downloadt een pakketartefact van de huidige run, of downloadt een pakketartefact uit `package_artifact_run_id`; valideert de tarball-inventaris; bouwt en pusht package-digest-getagde bare/functional GHCR-Docker-E2E-images via Blacksmiths Docker-layer-cache wanneer het plan lanes met geïnstalleerd pakket nodig heeft; en hergebruikt aangeleverde `docker_e2e_bare_image`-/`docker_e2e_functional_image`-inputs of bestaande package-digest-images in plaats van opnieuw te bouwen. Docker-image-pulls worden opnieuw geprobeerd met een begrensde time-out van 180 seconden per poging, zodat een vastgelopen registry-/cachestream snel opnieuw probeert in plaats van het grootste deel van het kritieke CI-pad te verbruiken.
### Releasepad-chunks
Release-Docker-dekking draait kleinere chunked jobs met `OPENCLAW_SKIP_DOCKER_BUILD=1`, zodat elke chunk alleen het imagekind ophaalt dat hij nodig heeft en meerdere lanes via dezelfde gewogen scheduler uitvoert:
Release-Docker-dekking draait kleinere gechunkte jobs met `OPENCLAW_SKIP_DOCKER_BUILD=1`, zodat elke chunk alleen het imagekind pullt dat nodig is en meerdere lanes uitvoert via dezelfde gewogen scheduler:
- `OPENCLAW_DOCKER_ALL_PROFILE=release-path`
- `OPENCLAW_DOCKER_ALL_CHUNK=core | package-update-openai | package-update-anthropic | package-update-core | plugins-runtime-plugins | plugins-runtime-services | plugins-runtime-install-a..h`
Huidige release-Docker-chunks zijn `core`, `package-update-openai`, `package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`, `plugins-runtime-services` en `plugins-runtime-install-a` tot en met `plugins-runtime-install-h`. `plugins-runtime-core`, `plugins-runtime` en `plugins-integrations` blijven geaggregeerde plugin-/runtime-aliassen. De `install-e2e`-lanealias blijft de geaggregeerde handmatige rerun-alias voor beide provider-installerlanes.
De huidige release-Docker-chunks zijn `core`, `package-update-openai`, `package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`, `plugins-runtime-services`, en `plugins-runtime-install-a` tot en met `plugins-runtime-install-h`. `plugins-runtime-core`, `plugins-runtime` en `plugins-integrations` blijven aggregate Plugin-/runtime-aliassen. De lane-alias `install-e2e` blijft de aggregate handmatige rerun-alias voor beide provider-installer-lanes.
OpenWebUI wordt opgenomen in `plugins-runtime-services` wanneer volledige releasepath-dekking daarom vraagt, en behoudt alleen een zelfstandige `openwebui`-chunk voor OpenWebUI-only-dispatches. Bundled-channel-updatelanes proberen één keer opnieuw bij tijdelijke npm-netwerkfouten.
OpenWebUI wordt opgenomen in `plugins-runtime-services` wanneer volledige releasepaddekking erom vraagt, en behoudt alleen een afzonderlijke `openwebui`-chunk voor OpenWebUI-only-dispatches. Update-lanes voor gebundelde channels proberen één keer opnieuw bij tijdelijke npm-netwerkfouten.
Elke chunk uploadt `.artifacts/docker-tests/` met lane-logs, timings, `summary.json`, `failures.json`, fasetimings, schedulerplan-JSON, slow-lane-tabellen en rerun-commando's per lane. De workflowinput `docker_lanes` voert geselecteerde lanes uit tegen de voorbereide images in plaats van de chunkjobs, waardoor debugging van mislukte lanes begrensd blijft tot één gerichte Docker-job en de pakketartifact voor die run wordt voorbereid, gedownload of hergebruikt; als een geselecteerde lane een live-Docker-lane is, bouwt de gerichte job de live-testimage lokaal voor die rerun. Gegenereerde GitHub-rerun-commando's per lane bevatten `package_artifact_run_id`, `package_artifact_name` en inputs voor voorbereide images wanneer die waarden bestaan, zodat een mislukte lane het exacte pakket en de exacte images uit de mislukte run kan hergebruiken.
Elke chunk uploadt `.artifacts/docker-tests/` met lane-logs, timings, `summary.json`, `failures.json`, fasetimings, schedulerplan-JSON, slow-lane-tabellen en rerun-commando's per lane. De workflow-input `docker_lanes` draait geselecteerde lanes tegen de voorbereide images in plaats van de chunkjobs, waardoor debugging van mislukte lanes begrensd blijft tot één gerichte Docker-job en het pakketartefact voor die run wordt voorbereid, gedownload of hergebruikt; als een geselecteerde lane een live-Docker-lane is, bouwt de gerichte job de live-test-image lokaal voor die rerun. Gegenereerde GitHub-rerun-commando's per lane bevatten `package_artifact_run_id`, `package_artifact_name` en voorbereide image-inputs wanneer die waarden bestaan, zodat een mislukte lane exact het pakket en de images uit de mislukte run kan hergebruiken.
```bash
pnpm test:docker:rerun <run-id> # download Docker artifacts and print combined/per-lane targeted rerun commands
pnpm test:docker:timings <summary> # slow-lane and phase critical-path summaries
```
De geplande live-/E2E-workflow draait dagelijks de volledige releasepath-Docker-suite.
De geplande live-/E2E-workflow draait dagelijks de volledige releasepad-Docker-suite.
## Plugin-prerelease
`Plugin Prerelease` is duurdere product-/pakketdekking, dus het is een afzonderlijke workflow die wordt gedispatcht door `Full Release Validation` of door een expliciete operator. Normale pull requests, `main`-pushes en zelfstandige handmatige CI-dispatches houden die suite uitgeschakeld. De workflow verdeelt tests voor gebundelde plugins over acht extension-workers; die extension-shardjobs draaien maximaal twee pluginconfiguratiegroepen tegelijk met één Vitest-worker per groep en een grotere Node-heap, zodat importzware pluginbatches geen extra CI-jobs maken. Het release-only Docker-prereleasepad batcht gerichte Docker-lanes in kleine groepen om te voorkomen dat tientallen runners worden gereserveerd voor jobs van één tot drie minuten.
`Plugin Prerelease` is duurdere product-/pakketdekking, dus het is een afzonderlijke workflow die wordt gedispatcht door `Full Release Validation` of door een expliciete operator. Normale pull requests, `main`-pushes en zelfstandige handmatige CI-dispatches houden die suite uitgeschakeld. De workflow balanceert gebundelde Plugin-tests over acht extensieworkers; die extensieshardjobs draaien maximaal twee Plugin-configgroepen tegelijk met één Vitest-worker per groep en een grotere Node-heap, zodat importzware Plugin-batches geen extra CI-jobs creëren. Het release-only Docker-prereleasepad batched gerichte Docker-lanes in kleine groepen om te voorkomen dat tientallen runners worden gereserveerd voor jobs van één tot drie minuten.
## QA Lab
QA Lab heeft toegewijde CI-lanes buiten de belangrijkste slim-gescopete workflow. Agentic parity is genest onder de brede QA- en releaseharnassen, niet onder een zelfstandige PR-workflow. Gebruik `Full Release Validation` met `rerun_group=qa-parity` wanneer parity moet meelopen met een brede validatierun.
QA Lab heeft toegewezen CI-lanes buiten de hoofdworkflow met slimme scope. Agentic parity is genest onder de brede QA- en releaseharnassen, niet als zelfstandige PR-workflow. Gebruik `Full Release Validation` met `rerun_group=qa-parity` wanneer parity moet meelopen met een brede validatierun.
- De `QA-Lab - All Lanes`-workflow draait nachtelijk op `main` en bij handmatige dispatch; hij waaiert de mock-parity-lane, live-Matrix-lane en live-Telegram- en Discord-lanes uit als parallelle jobs. Live-jobs gebruiken de `qa-live-shared`-environment, en Telegram/Discord gebruiken Convex-leases.
- De workflow `QA-Lab - All Lanes` draait nachtelijk op `main` en bij handmatige dispatch; hij waaiert de mock-parity-lane, live Matrix-lane en live Telegram- en Discord-lanes uit als parallelle jobs. Live-jobs gebruiken de omgeving `qa-live-shared`, en Telegram/Discord gebruiken Convex-leases.
Releasechecks draaien Matrix- en Telegram-live-transportlanes met de deterministische mock-provider en mock-gekwalificeerde modellen (`mock-openai/gpt-5.5` en `mock-openai/gpt-5.5-alt`), zodat het kanaalcontract geïsoleerd is van live-modellatentie en normale startup van provider-plugins. De live-transport-Gateway schakelt memory search uit, omdat QA-parity memory-gedrag afzonderlijk dekt; providerconnectiviteit wordt gedekt door de afzonderlijke suites voor live model, native provider en Docker-provider.
Releasechecks draaien Matrix- en Telegram-live-transportlanes met de deterministische mockprovider en mock-gekwalificeerde modellen (`mock-openai/gpt-5.5` en `mock-openai/gpt-5.5-alt`), zodat het channelcontract geïsoleerd is van live-modellatentie en normale provider-Plugin-startup. De live-transport-Gateway schakelt geheugenzoekopdrachten uit omdat QA-parity geheugengedrag afzonderlijk dekt; providerconnectiviteit wordt gedekt door de afzonderlijke live-model-, native-provider- en Docker-provider-suites.
Matrix gebruikt `--profile fast` voor geplande en releasegates, en voegt `--fail-fast` alleen toe wanneer de uitgecheckte CLI dit ondersteunt. De CLI-standaard en handmatige workflowinput blijven `all`; handmatige `matrix_profile=all`-dispatch shardt volledige Matrix-dekking altijd in `transport`-, `media`-, `e2ee-smoke`-, `e2ee-deep`- en `e2ee-cli`-jobs.
Matrix gebruikt `--profile fast` voor geplande en releasegates, en voegt `--fail-fast` alleen toe wanneer de uitgecheckte CLI dit ondersteunt. De CLI-standaard en handmatige workflowinput blijven `all`; handmatige `matrix_profile=all`-dispatch shardt volledige Matrix-dekking altijd in jobs voor `transport`, `media`, `e2ee-smoke`, `e2ee-deep` en `e2ee-cli`.
`OpenClaw Release Checks` draait ook de releasekritieke QA Lab-lanes vóór releasegoedkeuring; de QA-parity-gate draait de kandidaat- en baselinepacks als parallelle lanejobs, en downloadt daarna beide artifacts naar een kleine rapportjob voor de uiteindelijke parityvergelijking.
`OpenClaw Release Checks` draait ook de releasekritieke QA Lab-lanes vóór releasegoedkeuring; de QA-parity-gate draait de candidate- en baseline-packs als parallelle lanejobs, en downloadt daarna beide artefacten in een kleine rapportjob voor de uiteindelijke parity-vergelijking.
Volg voor normale PR's gescopete CI-/checkbewijzen in plaats van parity als verplichte status te behandelen.
Volg voor normale PR's scoped CI-/checkbewijs in plaats van parity als vereiste status te behandelen.
## CodeQL
De `CodeQL`-workflow is bewust een smalle beveiligingsscanner voor een eerste controle, niet de volledige repository-sweep. Dagelijkse, handmatige en niet-concept pull request guard-runs scannen Actions-workflowcode plus de JavaScript/TypeScript-oppervlakken met het hoogste risico met beveiligingsquery's met hoge betrouwbaarheid, gefilterd op hoge/kritieke `security-severity`.
De `CodeQL`-workflow is bewust een smalle beveiligingsscanner voor de eerste controle, niet de volledige repository-sweep. Dagelijkse, handmatige en niet-concept pull request-guard-runs scannen Actions-workflowcode plus de JavaScript/TypeScript-oppervlakken met het hoogste risico, met beveiligingsquery's met hoge betrouwbaarheid die zijn gefilterd op hoge/kritieke `security-severity`.
De pull request guard blijft licht: hij start alleen voor wijzigingen onder `.github/actions`, `.github/codeql`, `.github/workflows`, `packages` of `src`, en voert dezelfde beveiligingsmatrix met hoge betrouwbaarheid uit als de geplande workflow. Android- en macOS-CodeQL blijven buiten de PR-standaarden.
De pull request-guard blijft licht: hij start alleen voor wijzigingen onder `.github/actions`, `.github/codeql`, `.github/workflows`, `packages` of `src`, en voert dezelfde beveiligingsmatrix met hoge betrouwbaarheid uit als de geplande workflow. Android en macOS CodeQL blijven buiten de standaardinstellingen voor PR's.
### Beveiligingscategorieën
| Categorie | Oppervlak |
| ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-security-high/core-auth-secrets` | Authenticatie, geheimen, sandbox, Cron en Gateway-baseline |
| `/codeql-security-high/channel-runtime-boundary` | Implementatiecontracten voor kernkanalen plus de runtime van kanaal-Plugins, Gateway, Plugin SDK, geheimen en audit-aanraakpunten |
| `/codeql-security-high/network-ssrf-boundary` | Core SSRF, IP-parsing, netwerkguard, web-fetch en SSRF-beleidsoppervlakken van de Plugin SDK |
| `/codeql-security-high/mcp-process-tool-boundary` | MCP-servers, helpers voor procesuitvoering, uitgaande levering en gates voor tooluitvoering door agents |
| `/codeql-security-high/plugin-trust-boundary` | Vertrouwensoppervlakken voor Plugin-installatie, loader, manifest, registry, package-manager-installatie, source-loading en Plugin SDK-packagecontract |
| Categorie | Oppervlak |
| ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-security-high/core-auth-secrets` | Auth, secrets, sandbox, cron en gateway-baseline |
| `/codeql-security-high/channel-runtime-boundary` | Core-kanaalimplementatiecontracten plus de kanaal-Plugin-runtime, gateway, Plugin SDK, secrets, audit-aanraakpunten |
| `/codeql-security-high/network-ssrf-boundary` | Core SSRF, IP-parsing, netwerkguard, web-fetch en SSRF-beleidsoppervlakken van de Plugin SDK |
| `/codeql-security-high/mcp-process-tool-boundary` | MCP-servers, procesuitvoeringshelpers, uitgaande aflevering en agent-tooluitvoeringspoorten |
| `/codeql-security-high/plugin-trust-boundary` | Plugin-installatie, loader, manifest, registry, package-manager-installatie, source-loading en vertrouwensoppervlakken van het Plugin SDK-packagecontract |
### Platformspecifieke beveiligingsshards
- `CodeQL Android Critical Security` — geplande Android-beveiligingsshard. Bouwt de Android-app handmatig voor CodeQL op de kleinste Blacksmith Linux-runner die door workflow sanity wordt geaccepteerd. Uploadt onder `/codeql-critical-security/android`.
- `CodeQL macOS Critical Security` — wekelijkse/handmatige macOS-beveiligingsshard. Bouwt de macOS-app handmatig voor CodeQL op Blacksmith macOS, filtert buildresultaten van afhankelijkheden uit de geüploade SARIF en uploadt onder `/codeql-critical-security/macos`. Buiten de dagelijkse standaarden gehouden omdat de macOS-build de runtime domineert, zelfs wanneer deze schoon is.
- `CodeQL Android Critical Security` — geplande Android-beveiligingsshard. Bouwt de Android-app handmatig voor CodeQL op de kleinste Blacksmith Linux-runner die door workflow-sanity wordt geaccepteerd. Uploadt onder `/codeql-critical-security/android`.
- `CodeQL macOS Critical Security` — wekelijkse/handmatige macOS-beveiligingsshard. Bouwt de macOS-app handmatig voor CodeQL op Blacksmith macOS, filtert dependency-buildresultaten uit de geüploade SARIF en uploadt onder `/codeql-critical-security/macos`. Buiten de dagelijkse standaardinstellingen gehouden omdat de macOS-build de runtime domineert, zelfs wanneer hij schoon is.
### Critical Quality-categorieën
### Categorieën voor kritieke kwaliteit
`CodeQL Critical Quality` is de bijbehorende niet-beveiligingsshard. Deze voert alleen JavaScript/TypeScript-kwaliteitsquery's met fout-ernst en zonder beveiligingsfocus uit over smalle, waardevolle oppervlakken op de kleinere Blacksmith Linux-runner. De pull request guard is bewust kleiner dan het geplande profiel: niet-concept-PR's voeren alleen de bijbehorende shards `agent-runtime-boundary`, `config-boundary`, `core-auth-secrets`, `channel-runtime-boundary`, `gateway-runtime-boundary`, `memory-runtime-boundary`, `mcp-process-runtime-boundary`, `provider-runtime-boundary`, `session-diagnostics-boundary`, `plugin-boundary`, `plugin-sdk-package-contract` en `plugin-sdk-reply-runtime` uit voor wijzigingen in agent-opdracht/model/tool-uitvoering en reply-dispatchcode, config-schema/migratie/IO-code, auth/geheimen/sandbox/beveiligingscode, kernkanaal en gebundelde kanaal-Plugin-runtime, Gateway-protocol/server-method, memory-runtime/SDK-glue, MCP/proces/uitgaande levering, provider-runtime/modelcatalogus, sessiediagnostiek/leveringsqueues, Plugin-loader, Plugin SDK/packagecontract of Plugin SDK-reply-runtime. Wijzigingen in CodeQL-configuratie en kwaliteitsworkflow voeren alle twaalf PR-kwaliteitsshards uit.
`CodeQL Critical Quality` is de bijbehorende niet-beveiligingsshard. Deze voert alleen JavaScript/TypeScript-kwaliteitsquery's met fout-severity en zonder beveiligingsfocus uit over smalle oppervlakken met hoge waarde op de kleinere Blacksmith Linux-runner. De pull request-guard is bewust kleiner dan het geplande profiel: niet-concept PR's voeren alleen de bijbehorende `agent-runtime-boundary`, `config-boundary`, `core-auth-secrets`, `channel-runtime-boundary`, `gateway-runtime-boundary`, `memory-runtime-boundary`, `mcp-process-runtime-boundary`, `provider-runtime-boundary`, `session-diagnostics-boundary`, `plugin-boundary`, `plugin-sdk-package-contract` en `plugin-sdk-reply-runtime`-shards uit voor wijzigingen in agent-command/model/tool-uitvoering en reply-dispatchcode, configschema/migratie/IO-code, auth/secrets/sandbox/beveiligingscode, core-kanaal en meegeleverde kanaal-Plugin-runtime, Gateway-protocol/servermethode, memory-runtime/SDK-glue, MCP/proces/uitgaande aflevering, provider-runtime/modelcatalogus, sessiediagnostiek/afleveringswachtrijen, Plugin-loader, Plugin SDK/packagecontract of Plugin SDK-reply-runtime. CodeQL-configuratie- en kwaliteitsworkflowwijzigingen voeren alle twaalf PR-kwaliteitsshards uit.
Handmatige dispatch accepteert:
@ -436,40 +436,40 @@ Handmatige dispatch accepteert:
profile=all|agent-runtime-boundary|config-boundary|core-auth-secrets|channel-runtime-boundary|gateway-runtime-boundary|memory-runtime-boundary|mcp-process-runtime-boundary|plugin-boundary|plugin-sdk-package-contract|plugin-sdk-reply-runtime|provider-runtime-boundary|session-diagnostics-boundary
```
De smalle profielen zijn hooks voor training/iteratie om één kwaliteitsshard geïsoleerd uit te voeren.
De smalle profielen zijn onderwijs-/iteratiehooks om één kwaliteitsshard geïsoleerd uit te voeren.
| Categorie | Oppervlak |
| ------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-critical-quality/core-auth-secrets` | Authenticatie, geheimen, sandbox, Cron en code voor de Gateway-beveiligingsgrens |
| `/codeql-critical-quality/config-boundary` | Config-schema, migratie, normalisatie en IO-contracten |
| `/codeql-critical-quality/gateway-runtime-boundary` | Gateway-protocolschema's en contracten voor servermethoden |
| `/codeql-critical-quality/channel-runtime-boundary` | Implementatiecontracten voor kernkanaal en gebundelde kanaal-Plugin |
| `/codeql-critical-quality/agent-runtime-boundary` | Opdrachtuitvoering, model/provider-dispatch, auto-reply-dispatch en queues, en runtimecontracten voor het ACP-control plane |
| `/codeql-critical-quality/mcp-process-runtime-boundary` | MCP-servers en toolbridges, helpers voor procestoezicht en contracten voor uitgaande levering |
| `/codeql-critical-quality/memory-runtime-boundary` | Memory host SDK, memory-runtimefacades, memory-Plugin SDK-aliassen, glue voor memory-runtimeactivatie en memory doctor-opdrachten |
| `/codeql-critical-quality/session-diagnostics-boundary` | Interne reply-queue, sessieleveringsqueues, helpers voor uitgaande sessiebinding/levering, oppervlakken voor diagnostische events/logbundels en CLI-contracten voor session doctor |
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | Inkomende reply-dispatch van Plugin SDK, reply-payload/chunking/runtime-helpers, kanaal-replyopties, leveringsqueues en helpers voor sessie/thread-binding |
| `/codeql-critical-quality/provider-runtime-boundary` | Normalisatie van modelcatalogus, provider-authenticatie en -discovery, provider-runtime-registratie, provider-standaarden/catalogi en web/search/fetch/embedding-registries |
| `/codeql-critical-quality/ui-control-plane` | Bootstrap van Control UI, lokale persistentie, Gateway-control flows en runtimecontracten voor task control plane |
| `/codeql-critical-quality/web-media-runtime-boundary` | Core web fetch/search, media-IO, media understanding, image-generation en runtimecontracten voor media-generation |
| `/codeql-critical-quality/plugin-boundary` | Loader-, registry-, public-surface- en Plugin SDK-entrypointcontracten |
| `/codeql-critical-quality/plugin-sdk-package-contract` | Gepubliceerde package-side Plugin SDK-bron en helpers voor Plugin-packagecontracten |
| Categorie | Oppervlak |
| ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-critical-quality/core-auth-secrets` | Auth, secrets, sandbox, cron en code voor de Gateway-beveiligingsgrens |
| `/codeql-critical-quality/config-boundary` | Configschema-, migratie-, normalisatie- en IO-contracten |
| `/codeql-critical-quality/gateway-runtime-boundary` | Gateway-protocolschema's en servermethodecontracten |
| `/codeql-critical-quality/channel-runtime-boundary` | Implementatiecontracten voor core-kanaal en meegeleverde kanaal-Plugin |
| `/codeql-critical-quality/agent-runtime-boundary` | Command-uitvoering, model/provider-dispatch, auto-reply-dispatch en wachtrijen, en ACP control-plane-runtimecontracten |
| `/codeql-critical-quality/mcp-process-runtime-boundary` | MCP-servers en tool-bridges, proces-supervisionhelpers en contracten voor uitgaande aflevering |
| `/codeql-critical-quality/memory-runtime-boundary` | Memory-host-SDK, memory-runtimefacades, memory-Plugin SDK-aliassen, memory-runtimeactivatieglue en memory-doctorcommands |
| `/codeql-critical-quality/session-diagnostics-boundary` | Internals van reply-wachtrijen, sessieafleveringswachtrijen, helpers voor uitgaande sessiebinding/aflevering, oppervlakken voor diagnostische events/logbundels en sessie-doctor-CLI-contracten |
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | Inbound reply-dispatch van Plugin SDK, reply-payload-/chunking-/runtimehelpers, kanaal-replyopties, afleveringswachtrijen en helpers voor sessie-/threadbinding |
| `/codeql-critical-quality/provider-runtime-boundary` | Normalisatie van modelcatalogus, provider-auth en discovery, provider-runtimeregistratie, providerstandaarden/catalogi en web/search/fetch/embedding-registries |
| `/codeql-critical-quality/ui-control-plane` | Control UI-bootstrap, lokale persistentie, Gateway-controlflows en Task-control-plane-runtimecontracten |
| `/codeql-critical-quality/web-media-runtime-boundary` | Core web-fetch/search, media-IO, media-understanding, image-generation en media-generation-runtimecontracten |
| `/codeql-critical-quality/plugin-boundary` | Loader-, registry-, public-surface- en Plugin SDK-entrypointcontracten |
| `/codeql-critical-quality/plugin-sdk-package-contract` | Gepubliceerde package-side Plugin SDK-source en helperfuncties voor pluginpackagecontracten |
Kwaliteit blijft gescheiden van beveiliging zodat kwaliteitsbevindingen kunnen worden gepland, gemeten, uitgeschakeld of uitgebreid zonder het beveiligingssignaal te vertroebelen. Uitbreiding van CodeQL voor Swift, Python en gebundelde Plugins moet alleen als gescopeerde of gesharde follow-up worden teruggezet nadat de smalle profielen stabiele runtime en signalen hebben.
Kwaliteit blijft gescheiden van beveiliging zodat kwaliteitsbevindingen kunnen worden gepland, gemeten, uitgeschakeld of uitgebreid zonder het beveiligingssignaal te vertroebelen. Swift-, Python- en meegeleverde-Plugin-CodeQL-uitbreiding moet pas weer worden toegevoegd als afgebakend of geshard vervolgwerk nadat de smalle profielen stabiele runtime en stabiel signaal hebben.
## Onderhoudsworkflows
### Docs Agent
De `Docs Agent`-workflow is een event-gedreven Codex-onderhoudslane om bestaande docs afgestemd te houden op recent gelande wijzigingen. Hij heeft geen zuiver schema: een succesvolle niet-bot push-CI-run op `main` kan hem activeren, en handmatige dispatch kan hem direct uitvoeren. Workflow-run-aanroepen worden overgeslagen wanneer `main` inmiddels is verplaatst of wanneer in het afgelopen uur een andere niet-overgeslagen Docs Agent-run is gemaakt. Wanneer hij draait, beoordeelt hij het commitbereik van de vorige niet-overgeslagen Docs Agent-bron-SHA tot de huidige `main`, zodat één uurlijkse run alle main-wijzigingen kan afdekken die sinds de laatste docs-pass zijn verzameld.
De `Docs Agent`-workflow is een eventgestuurde Codex-onderhoudsbaan om bestaande docs afgestemd te houden op recent gelande wijzigingen. Er is geen puur schema: een succesvolle niet-bot push-CI-run op `main` kan hem triggeren, en handmatige dispatch kan hem direct uitvoeren. Workflow-run-invocations worden overgeslagen wanneer `main` is verdergegaan of wanneer er in het afgelopen uur een andere niet-overgeslagen Docs Agent-run is gemaakt. Wanneer hij draait, bekijkt hij het commitbereik van de vorige niet-overgeslagen Docs Agent-source-SHA tot de huidige `main`, zodat één uurlijkse run alle main-wijzigingen kan dekken die sinds de laatste docs-pass zijn verzameld.
### Test Performance Agent
De `Test Performance Agent`-workflow is een event-gedreven Codex-onderhoudslane voor trage tests. Hij heeft geen zuiver schema: een succesvolle niet-bot push-CI-run op `main` kan hem activeren, maar hij slaat over als er die UTC-dag al een andere workflow-run-aanroep heeft gedraaid of draait. Handmatige dispatch omzeilt die dagelijkse activiteitsgate. De lane bouwt een full-suite gegroepeerd Vitest-prestatierapport, laat Codex alleen kleine dekking-behoudende testprestatieverbeteringen maken in plaats van brede refactors, voert daarna het full-suite-rapport opnieuw uit en wijst wijzigingen af die het aantal tests in de passerende baseline verlagen. Als de baseline falende tests heeft, mag Codex alleen duidelijke failures oplossen en moet het full-suite-rapport na de agent slagen voordat er iets wordt gecommit. Wanneer `main` verdergaat voordat de bot-push landt, rebased de lane de gevalideerde patch, voert `pnpm check:changed` opnieuw uit en probeert de push opnieuw; conflicterende verouderde patches worden overgeslagen. Hij gebruikt GitHub-hosted Ubuntu zodat de Codex-action dezelfde drop-sudo-veiligheidshouding kan behouden als de docs-agent.
De `Test Performance Agent`-workflow is een eventgestuurde Codex-onderhoudsbaan voor trage tests. Er is geen puur schema: een succesvolle niet-bot push-CI-run op `main` kan hem triggeren, maar hij wordt overgeslagen als er die UTC-dag al een andere workflow-run-invocation heeft gedraaid of draait. Handmatige dispatch omzeilt die dagelijkse activiteitspoort. De baan bouwt een full-suite gegroepeerd Vitest-performancerapport, laat Codex alleen kleine testperformancefixes uitvoeren die coverage behouden in plaats van brede refactors, voert daarna het full-suite-rapport opnieuw uit en wijst wijzigingen af die het aantal passerende baseline-tests verlagen. Als de baseline falende tests heeft, mag Codex alleen duidelijke failures fixen en moet het full-suite-rapport na de agent slagen voordat er iets wordt gecommit. Wanneer `main` verdergaat voordat de bot-push landt, rebased de baan de gevalideerde patch, voert `pnpm check:changed` opnieuw uit en probeert de push opnieuw; conflicterende verouderde patches worden overgeslagen. Hij gebruikt GitHub-hosted Ubuntu zodat de Codex-action dezelfde drop-sudo-veiligheidshouding kan behouden als de docs-agent.
### Dubbele PR's Na Merge
### Dubbele PR's na merge
De `Duplicate PRs After Merge`-workflow is een handmatige maintainer-workflow voor het opruimen van duplicaten na landen. Hij staat standaard op dry-run en sluit alleen expliciet vermelde PR's wanneer `apply=true`. Voordat hij GitHub muteert, verifieert hij dat de gelande PR is gemerged en dat elk duplicaat ofwel een gedeeld gerefereerd issue heeft of overlappende gewijzigde hunks.
De `Duplicate PRs After Merge`-workflow is een handmatige maintainer-workflow voor duplicate cleanup na landing. Hij staat standaard op dry-run en sluit alleen expliciet vermelde PR's wanneer `apply=true`. Voordat GitHub wordt gewijzigd, verifieert hij dat de gelande PR is gemerged en dat elke duplicate ofwel een gedeeld gerefereerd issue heeft, of overlappende gewijzigde hunks.
```bash
gh workflow run duplicate-after-merge.yml \
@ -478,38 +478,115 @@ gh workflow run duplicate-after-merge.yml \
-f apply=true
```
## Lokale checkgates en gewijzigde routering
## Lokale checkpoorten en changed-routing
Lokale changed-lane-logica staat in `scripts/changed-lanes.mjs` en wordt uitgevoerd door `scripts/check-changed.mjs`. Die lokale checkgate is strenger over architectuurgrenzen dan de brede CI-platformscope:
Lokale changed-lane-logica staat in `scripts/changed-lanes.mjs` en wordt uitgevoerd door `scripts/check-changed.mjs`. Die lokale checkpoort is strenger over architectuurgrenzen dan de brede CI-platformscope:
- wijzigingen in core production voeren core prod- en core test-typecheck plus core lint/guards uit;
- wijzigingen alleen in core tests voeren alleen core test-typecheck plus core lint uit;
- wijzigingen in extension production voeren extension prod- en extension test-typecheck plus extension lint uit;
- wijzigingen alleen in extension tests voeren extension test-typecheck plus extension lint uit;
- wijzigingen in de publieke Plugin SDK of Plugin-contracten breiden uit naar extension-typecheck omdat extensies afhankelijk zijn van die core-contracten (Vitest extension-sweeps blijven expliciet testwerk);
- release-metadata-only versiebumps voeren gerichte versie/config/root-dependency-checks uit;
- onbekende root/config-wijzigingen falen veilig naar alle checklanes.
- core-productiewijzigingen voeren core prod- en core test-typecheck plus core lint/guards uit;
- alleen-core-testwijzigingen voeren alleen core test-typecheck plus core lint uit;
- extensieproductiewijzigingen voeren extensie prod- en extensie test-typecheck plus extensie lint uit;
- alleen-extensie-testwijzigingen voeren extensie test-typecheck plus extensie lint uit;
- publieke Plugin SDK- of plugin-contractwijzigingen breiden uit naar extensietypecheck omdat extensies afhankelijk zijn van die core-contracten (Vitest-extensiesweeps blijven expliciet testwerk);
- version bumps die alleen release-metadata raken, voeren gerichte versie-/config-/root-dependency-checks uit;
- onbekende root-/configwijzigingen falen veilig naar alle checklanes.
Lokale changed-test-routering staat in `scripts/test-projects.test-support.mjs` en is bewust goedkoper dan `check:changed`: directe testbewerkingen voeren zichzelf uit, bronbewerkingen geven de voorkeur aan expliciete mappings, daarna sibling-tests en import-graph-afhankelijken. Gedeelde group-room delivery-config is een van de expliciete mappings: wijzigingen in de group visible-reply-config, source reply delivery mode of de message-tool system prompt lopen via de core reply-tests plus Discord- en Slack-deliveryregressies, zodat een gedeelde standaardwijziging faalt vóór de eerste PR-push. Gebruik `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` alleen wanneer de wijziging zo harness-breed is dat de goedkope gemapte set geen betrouwbare proxy is.
Lokale changed-test-routing staat in `scripts/test-projects.test-support.mjs` en is bewust goedkoper dan `check:changed`: directe testbewerkingen voeren zichzelf uit, sourcebewerkingen geven de voorkeur aan expliciete mappings, daarna sibling-tests en import-graph-dependents. Gedeelde group-room-afleveringsconfig is een van de expliciete mappings: wijzigingen aan de group visible-reply-config, source-reply-afleveringsmodus of de message-tool-systemprompt lopen via de core reply-tests plus Discord- en Slack-afleveringsregressies, zodat een gedeelde standaardwijziging faalt voor de eerste PR-push. Gebruik `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` alleen wanneer de wijziging zo harness-breed is dat de goedkope gemapte set geen betrouwbare proxy is.
## Testbox-validatie
Voer Testbox uit vanuit de repo-root en gebruik bij voorkeur een pas opgewarmde box voor brede verificatie. Voordat je een trage gate uitvoert op een box die is hergebruikt, verlopen is of net een onverwacht grote sync meldde, voer je eerst `pnpm testbox:sanity` uit binnen de box.
Voer Testbox uit vanuit de repo-root en geef voor breed bewijs de voorkeur aan een nieuw opgewarmde box. Voordat je een trage gate besteedt aan een box die is hergebruikt, verlopen is of net een onverwacht grote sync heeft gerapporteerd, voer je eerst `pnpm testbox:sanity` uit binnen de box.
De sanity-check faalt snel wanneer vereiste rootbestanden zoals `pnpm-lock.yaml` zijn verdwenen of wanneer `git status --short` ten minste 200 gevolgde verwijderingen toont. Dat betekent meestal dat de externe syncstatus geen betrouwbare kopie van de PR is; stop die box en warm een nieuwe op in plaats van de producttestfout te debuggen. Stel voor PRs met opzettelijke grootschalige verwijderingen `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` in voor die sanity-run.
De sanity-check faalt snel wanneer vereiste root-bestanden zoals `pnpm-lock.yaml` zijn verdwenen of wanneer `git status --short` minstens 200 gevolgde verwijderingen toont. Dat betekent meestal dat de externe sync-status geen betrouwbare kopie van de PR is; stop die box en warm een nieuwe op in plaats van de producttestfout te debuggen. Voor opzettelijke PRs met veel verwijderingen stel je `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` in voor die sanity-run.
`pnpm testbox:run` beëindigt ook een lokale Blacksmith CLI-aanroep die langer dan vijf minuten in de syncfase blijft zonder uitvoer na de sync. Stel `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` in om die beveiliging uit te schakelen, of gebruik een grotere millisecondewaarde voor ongebruikelijk grote lokale diffs.
`pnpm testbox:run` beëindigt ook een lokale Blacksmith CLI-aanroep die langer dan vijf minuten in de sync-fase blijft zonder output na de sync. Stel `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` in om die guard uit te schakelen, of gebruik een grotere millisecondewaarde voor ongewoon grote lokale diffs.
Crabbox is het repo-eigen tweede pad voor externe boxen voor Linux-verificatie wanneer Blacksmith niet beschikbaar is of wanneer eigen cloudcapaciteit de voorkeur heeft. Warm een box op, hydrateer deze via de projectworkflow en voer daarna opdrachten uit via de Crabbox CLI:
Crabbox is de repo-eigen remote-box-wrapper voor maintainer-Linux-bewijs. Gebruik het wanneer een check te breed is voor een lokale edit-loop, wanneer CI-pariteit belangrijk is, of wanneer het bewijs secrets, Docker, package-lanes, herbruikbare boxes of externe logs nodig heeft. De normale OpenClaw-backend is `blacksmith-testbox`; eigen AWS/Hetzner-capaciteit is een fallback bij Blacksmith-storingen, quota-problemen of expliciete tests met eigen capaciteit.
Controleer de wrapper vanuit de repo-root vóór een eerste run:
```bash
pnpm crabbox:warmup -- --idle-timeout 90m
pnpm crabbox:hydrate -- --id <cbx_id>
pnpm crabbox:run -- --id <cbx_id> --shell "OPENCLAW_TESTBOX=1 pnpm check:changed"
pnpm crabbox:stop -- <cbx_id>
pnpm crabbox:run -- --help | sed -n '1,120p'
```
`.crabbox.yaml` beheert de standaardwaarden voor provider, sync en GitHub Actions-hydratatie. Het sluit de lokale `.git` uit, zodat de gehydrateerde Actions-checkout zijn eigen externe Git-metadata behoudt in plaats van maintainer-lokale remotes en objectstores te synchroniseren, en het sluit lokale runtime-/buildartefacten uit die nooit mogen worden overgedragen. `.github/workflows/crabbox-hydrate.yml` beheert checkout, Node/pnpm-configuratie, ophalen van `origin/main` en de niet-geheime omgevingsoverdracht die latere `crabbox run --id <cbx_id>`-opdrachten gebruiken.
De repo-wrapper weigert een verouderde Crabbox-binary die `blacksmith-testbox` niet adverteert. Geef de provider expliciet door, ook al heeft `.crabbox.yaml` defaults voor eigen cloud.
Gewijzigde gate:
```bash
pnpm crabbox:run -- --provider blacksmith-testbox \
--blacksmith-org openclaw \
--blacksmith-workflow .github/workflows/ci-check-testbox.yml \
--blacksmith-job check \
--blacksmith-ref main \
--idle-timeout 90m \
--ttl 240m \
--timing-json \
--shell -- \
"env CI=1 NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_TEST_PROJECTS_PARALLEL=6 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm check:changed"
```
Gerichte testrerun:
```bash
pnpm crabbox:run -- --provider blacksmith-testbox \
--blacksmith-org openclaw \
--blacksmith-workflow .github/workflows/ci-check-testbox.yml \
--blacksmith-job check \
--blacksmith-ref main \
--idle-timeout 90m \
--ttl 240m \
--timing-json \
--shell -- \
"env CI=1 NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm test <path-or-filter>"
```
Volledige suite:
```bash
pnpm crabbox:run -- --provider blacksmith-testbox \
--blacksmith-org openclaw \
--blacksmith-workflow .github/workflows/ci-check-testbox.yml \
--blacksmith-job check \
--blacksmith-ref main \
--idle-timeout 90m \
--ttl 240m \
--timing-json \
--shell -- \
"env CI=1 NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_TEST_PROJECTS_PARALLEL=6 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm test"
```
Lees de uiteindelijke JSON-samenvatting. De nuttige velden zijn `provider`, `leaseId`, `syncDelegated`, `exitCode`, `commandMs` en `totalMs`. Eenmalige door Blacksmith ondersteunde Crabbox-runs zouden de Testbox automatisch moeten stoppen; als een run wordt onderbroken of cleanup onduidelijk is, inspecteer dan live boxes en stop alleen de boxes die je hebt aangemaakt:
```bash
blacksmith testbox list
blacksmith testbox stop --id <tbx_id>
```
Gebruik hergebruik alleen wanneer je bewust meerdere commandos op dezelfde gehydrateerde box nodig hebt:
```bash
pnpm crabbox:run -- --provider blacksmith-testbox --id <tbx_id> --no-sync --timing-json --shell -- "pnpm test <path-or-filter>"
pnpm crabbox:stop -- <tbx_id>
```
Als Crabbox de kapotte laag is maar Blacksmith zelf werkt, gebruik dan direct Blacksmith als smalle fallback:
```bash
blacksmith testbox warmup ci-check-testbox.yml --ref main --idle-timeout 90
blacksmith testbox run --id <tbx_id> "env CI=1 NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_TEST_PROJECTS_PARALLEL=6 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm check:changed"
blacksmith testbox stop --id <tbx_id>
```
Escaleren naar eigen Crabbox-capaciteit doe je alleen wanneer Blacksmith down is, door quota wordt beperkt, de benodigde omgeving mist, of eigen capaciteit expliciet het doel is:
```bash
pnpm crabbox:warmup -- --provider aws --class beast --market on-demand --idle-timeout 90m
pnpm crabbox:hydrate -- --id <cbx_id-or-slug>
pnpm crabbox:run -- --id <cbx_id-or-slug> --timing-json --shell -- "env NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_TEST_PROJECTS_PARALLEL=6 OPENCLAW_VITEST_MAX_WORKERS=1 OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=900000 pnpm check:changed"
pnpm crabbox:stop -- <cbx_id-or-slug>
```
`.crabbox.yaml` beheert de defaults voor provider, sync en GitHub Actions-hydratatie voor eigen-cloud-lanes. Het sluit lokale `.git` uit zodat de gehydrateerde Actions-checkout zijn eigen externe Git-metadata behoudt in plaats van maintainer-lokale remotes en object stores te synchroniseren, en het sluit lokale runtime-/build-artifacts uit die nooit mogen worden overgedragen. `.github/workflows/crabbox-hydrate.yml` beheert checkout, Node/pnpm-setup, `origin/main`-fetch en de niet-secret environment-overdracht voor eigen-cloud-commandos met `crabbox run --id <cbx_id>`.
## Gerelateerd

View File

@ -6,22 +6,22 @@ sidebarTitle: Plugins
summary: CLI-referentie voor `openclaw plugins` (list, install, marketplace, uninstall, enable/disable, doctor)
title: Plugins
x-i18n:
generated_at: "2026-05-03T21:28:47Z"
generated_at: "2026-05-04T07:02:50Z"
model: gpt-5.5
provider: openai
source_hash: d854d052b0a012a86f9c775775676a9a8fe8ae86b2c38a18118f1abf0732174c
source_hash: 36ae7edb12986ead7e126f25e0761bf312b2644b35017181b674082105886776
source_path: cli/plugins.md
workflow: 16
---
Beheer Gateway-plugins, hookpakketten en compatibele bundels.
Beheer Gateway-plugins, hook-pakketten en compatibele bundels.
<CardGroup cols={2}>
<Card title="Pluginsysteem" href="/nl/tools/plugin">
Eindgebruikersgids voor het installeren, inschakelen en oplossen van problemen met plugins.
<Card title="Plugin-systeem" href="/nl/tools/plugin">
Gebruikershandleiding voor het installeren, inschakelen en oplossen van problemen met plugins.
</Card>
<Card title="Plugins beheren" href="/nl/plugins/manage-plugins">
Snelle voorbeelden voor installeren, weergeven, bijwerken, verwijderen en publiceren.
Korte voorbeelden voor installeren, weergeven, bijwerken, verwijderen en publiceren.
</Card>
<Card title="Plugin-bundels" href="/nl/plugins/bundles">
Compatibiliteitsmodel voor bundels.
@ -62,14 +62,14 @@ openclaw plugins marketplace list <marketplace>
openclaw plugins marketplace list <marketplace> --json
```
Voor onderzoek naar trage installatie, inspectie, verwijdering of registry-vernieuwing voert u de opdracht uit met `OPENCLAW_PLUGIN_LIFECYCLE_TRACE=1`. De trace schrijft fasetimings naar stderr en houdt JSON-uitvoer parseerbaar. Zie [Foutopsporing](/nl/help/debugging#plugin-lifecycle-trace).
Voor onderzoek naar trage installatie-, inspectie-, verwijderings- of registry-refresh-acties voer je de opdracht uit met `OPENCLAW_PLUGIN_LIFECYCLE_TRACE=1`. De trace schrijft fasetimings naar stderr en houdt JSON-uitvoer parseerbaar. Zie [Debuggen](/nl/help/debugging#plugin-lifecycle-trace).
<Note>
Gebundelde plugins worden met OpenClaw meegeleverd. Sommige zijn standaard ingeschakeld (bijvoorbeeld gebundelde modelproviders, gebundelde spraakproviders en de gebundelde browser-plugin); andere vereisen `plugins enable`.
Gebundelde plugins worden met OpenClaw meegeleverd. Sommige zijn standaard ingeschakeld (bijvoorbeeld gebundelde modelproviders, gebundelde spraakproviders en de gebundelde browserplugin); andere vereisen `plugins enable`.
Native OpenClaw-plugins moeten `openclaw.plugin.json` meeleveren met een inline JSON Schema (`configSchema`, zelfs als dit leeg is). Compatibele bundels gebruiken in plaats daarvan hun eigen bundelmanifesten.
Native OpenClaw-plugins moeten `openclaw.plugin.json` leveren met een inline JSON Schema (`configSchema`, zelfs als het leeg is). Compatibele bundels gebruiken in plaats daarvan hun eigen bundelmanifesten.
`plugins list` toont `Format: openclaw` of `Format: bundle`. Uitgebreide uitvoer van list/info toont ook het bundelsubtype (`codex`, `claude` of `cursor`) plus gedetecteerde bundelmogelijkheden.
`plugins list` toont `Format: openclaw` of `Format: bundle`. Uitgebreide list/info-uitvoer toont ook het bundelsubtype (`codex`, `claude` of `cursor`) plus gedetecteerde bundelmogelijkheden.
</Note>
### Installeren
@ -91,63 +91,63 @@ openclaw plugins install <plugin> --marketplace https://github.com/<owner>/<repo
```
<Warning>
Kale pakketnamen installeren tijdens de lanceerovergang standaard vanuit npm. Gebruik `clawhub:<package>` voor ClawHub. Behandel plugin-installaties als het uitvoeren van code. Geef de voorkeur aan vastgepinde versies.
Kale pakketnamen installeren tijdens de lanceringsovergang standaard vanuit npm. Gebruik `clawhub:<package>` voor ClawHub. Behandel plugin-installaties alsof je code uitvoert. Geef de voorkeur aan vastgepinde versies.
</Warning>
`plugins search` bevraagt ClawHub naar installeerbare pluginpakketten en drukt pakketnamen af die direct kunnen worden geïnstalleerd. Het zoekt naar code-plugin- en bundle-plugin-pakketten, niet naar skills. Gebruik `openclaw skills search` voor ClawHub-skills.
`plugins search` bevraagt ClawHub op installeerbare plugin-pakketten en toont pakketnamen die direct geïnstalleerd kunnen worden. Het zoekt code-plugin- en bundel-plugin-pakketten, geen Skills. Gebruik `openclaw skills search` voor ClawHub-Skills.
<Note>
ClawHub is het primaire oppervlak voor distributie en ontdekking voor de meeste plugins. Npm blijft een ondersteunde fallback en direct-installatiepad. Pluginpakketten van OpenClaw zelf onder `@openclaw/*` worden weer op npm gepubliceerd; zie de huidige lijst op [npmjs.com/org/openclaw](https://www.npmjs.com/org/openclaw) of de [plugin-inventaris](/nl/plugins/plugin-inventory). Stabiele installaties gebruiken `latest`. Installaties en updates via het bètakanaal geven de voorkeur aan de npm-`beta`-dist-tag wanneer die tag beschikbaar is, en vallen daarna terug op `latest`.
ClawHub is het primaire distributie- en ontdekkingsoppervlak voor de meeste plugins. Npm blijft een ondersteunde fallback en direct-installatiepad. OpenClaw-eigen `@openclaw/*` plugin-pakketten worden weer op npm gepubliceerd; zie de huidige lijst op [npmjs.com/org/openclaw](https://www.npmjs.com/org/openclaw) of de [plugin-inventaris](/nl/plugins/plugin-inventory). Stabiele installaties gebruiken `latest`. Installaties en updates via het bètakanaal geven de voorkeur aan de npm-`beta` dist-tag wanneer die tag beschikbaar is, en vallen daarna terug op `latest`.
</Note>
<AccordionGroup>
<Accordion title="Configuratie-includes en herstel van ongeldige configuratie">
Als uw `plugins`-sectie wordt ondersteund door een `$include` met één bestand, schrijven `plugins install/update/enable/disable/uninstall` door naar dat included bestand en laten ze `openclaw.json` onaangeroerd. Root-includes, include-arrays en includes met sibling-overrides falen gesloten in plaats van te flattenen. Zie [Configuratie-includes](/nl/gateway/configuration) voor de ondersteunde vormen.
<Accordion title="Config-includes en reparatie van ongeldige configuratie">
Als je `plugins`-sectie wordt ondersteund door een single-file `$include`, schrijven `plugins install/update/enable/disable/uninstall` door naar dat opgenomen bestand en laten ze `openclaw.json` ongemoeid. Root-includes, include-arrays en includes met sibling-overrides falen gesloten in plaats van af te vlakken. Zie [Config-includes](/nl/gateway/configuration) voor de ondersteunde vormen.
Als configuratie tijdens installatie ongeldig is, faalt `plugins install` normaal gesproken gesloten en vraagt het u eerst `openclaw doctor --fix` uit te voeren. Tijdens het starten en hot reloaden van de Gateway faalt ongeldige pluginconfiguratie gesloten zoals elke andere ongeldige configuratie; `openclaw doctor --fix` kan de ongeldige pluginvermelding in quarantaine plaatsen. De enige gedocumenteerde uitzondering tijdens installatie is een smal herstelpad voor gebundelde plugins voor plugins die expliciet opt-innen op `openclaw.install.allowInvalidConfigRecovery`.
Als de configuratie ongeldig is tijdens installatie, faalt `plugins install` normaal gesloten en zegt het dat je eerst `openclaw doctor --fix` moet uitvoeren. Tijdens het starten en hot reloaden van de Gateway faalt ongeldige plugin-configuratie gesloten zoals elke andere ongeldige configuratie; `openclaw doctor --fix` kan de ongeldige plugin-vermelding in quarantaine plaatsen. De enige gedocumenteerde uitzondering tijdens installatie is een smal herstelpad voor gebundelde plugins voor plugins die expliciet kiezen voor `openclaw.install.allowInvalidConfigRecovery`.
</Accordion>
<Accordion title="--force en opnieuw installeren versus bijwerken">
`--force` hergebruikt het bestaande installatiedoel en overschrijft een al geïnstalleerde plugin of hookpakket ter plaatse. Gebruik dit wanneer u bewust dezelfde id opnieuw installeert vanuit een nieuw lokaal pad, archief, ClawHub-pakket of npm-artefact. Geef voor routinematige upgrades van een al gevolgde npm-plugin de voorkeur aan `openclaw plugins update <id-or-npm-spec>`.
<Accordion title="--force en herinstalleren versus bijwerken">
`--force` hergebruikt het bestaande installatiedoel en overschrijft een reeds geïnstalleerde plugin of hook-pakket ter plekke. Gebruik dit wanneer je bewust dezelfde id opnieuw installeert vanuit een nieuw lokaal pad, archief, ClawHub-pakket of npm-artefact. Voor routinematige upgrades van een al gevolgde npm-plugin geef je de voorkeur aan `openclaw plugins update <id-or-npm-spec>`.
Als u `plugins install` uitvoert voor een plugin-id die al is geïnstalleerd, stopt OpenClaw en verwijst het u naar `plugins update <id-or-npm-spec>` voor een normale upgrade, of naar `plugins install <package> --force` wanneer u de huidige installatie echt vanuit een andere bron wilt overschrijven.
Als je `plugins install` uitvoert voor een plugin-id die al is geïnstalleerd, stopt OpenClaw en verwijst het je naar `plugins update <id-or-npm-spec>` voor een normale upgrade, of naar `plugins install <package> --force` wanneer je de huidige installatie echt vanuit een andere bron wilt overschrijven.
</Accordion>
<Accordion title="Bereik van --pin">
`--pin` is alleen van toepassing op npm-installaties. Het wordt niet ondersteund met `git:`-installaties; gebruik een expliciete git-ref zoals `git:github.com/acme/plugin@v1.2.3` wanneer u een vastgepinde bron wilt. Het wordt niet ondersteund met `--marketplace`, omdat marketplace-installaties marketplace-bronmetadata bewaren in plaats van een npm-spec.
`--pin` is alleen van toepassing op npm-installaties. Het wordt niet ondersteund met `git:`-installaties; gebruik een expliciete git-ref zoals `git:github.com/acme/plugin@v1.2.3` wanneer je een vastgepinde bron wilt. Het wordt niet ondersteund met `--marketplace`, omdat marketplace-installaties marketplace-bronmetadata bewaren in plaats van een npm-specificatie.
</Accordion>
<Accordion title="--dangerously-force-unsafe-install">
`--dangerously-force-unsafe-install` is een noodoptie voor fout-positieven in de ingebouwde gevaarlijke-code-scanner. Hiermee kan de installatie doorgaan, zelfs wanneer de ingebouwde scanner `critical`-bevindingen meldt, maar dit omzeilt **geen** beleidsblokkades van plugin-`before_install`-hooks en omzeilt **geen** scanfouten.
`--dangerously-force-unsafe-install` is een noodoptie voor fout-positieven in de ingebouwde scanner voor gevaarlijke code. Hiermee kan de installatie doorgaan, zelfs wanneer de ingebouwde scanner `critical`-bevindingen rapporteert, maar het omzeilt **geen** beleidsblokkades van plugin-`before_install`-hooks en omzeilt **geen** scanfouten.
Deze CLI-vlag is van toepassing op plugin-installatie- en updateflows. Door de Gateway ondersteunde skill-afhankelijkheidsinstallaties gebruiken de overeenkomende request-override `dangerouslyForceUnsafeInstall`, terwijl `openclaw skills install` een afzonderlijke download-/installatieflow voor ClawHub-skills blijft.
Deze CLI-vlag is van toepassing op plugin-installatie- en updateflows. Door de Gateway ondersteunde installaties van skill-afhankelijkheden gebruiken de overeenkomende `dangerouslyForceUnsafeInstall`-requestoverride, terwijl `openclaw skills install` een afzonderlijke download-/installatieflow voor ClawHub-skills blijft.
Als een plugin die u op ClawHub hebt gepubliceerd wordt geblokkeerd door een registryscan, gebruik dan de publicatiestappen in [ClawHub](/nl/tools/clawhub).
Als een plugin die je op ClawHub hebt gepubliceerd wordt geblokkeerd door een registry-scan, gebruik dan de publicatiestappen in [ClawHub](/nl/tools/clawhub).
</Accordion>
<Accordion title="Hookpakketten en npm-specs">
`plugins install` is ook het installatieoppervlak voor hookpakketten die `openclaw.hooks` in `package.json` aanbieden. Gebruik `openclaw hooks` voor gefilterde hook-zichtbaarheid en inschakeling per hook, niet voor pakketinstallatie.
<Accordion title="Hook-pakketten en npm-specificaties">
`plugins install` is ook het installatieoppervlak voor hook-pakketten die `openclaw.hooks` in `package.json` aanbieden. Gebruik `openclaw hooks` voor gefilterde hook-zichtbaarheid en inschakeling per hook, niet voor pakketinstallatie.
Npm-specs zijn **alleen registry** (pakketnaam + optionele **exacte versie** of **dist-tag**). Git-/URL-/bestandsspecs en semver-bereiken worden geweigerd. Afhankelijkheidsinstallaties worden projectlokaal uitgevoerd met `--ignore-scripts` voor veiligheid, zelfs wanneer uw shell globale npm-installatie-instellingen heeft.
Npm-specificaties zijn **alleen registry** (pakketnaam + optionele **exacte versie** of **dist-tag**). Git-/URL-/file-specificaties en semver-bereiken worden geweigerd. Afhankelijkheidsinstallaties draaien projectlokaal met `--ignore-scripts` voor veiligheid, zelfs wanneer je shell globale npm-installatie-instellingen heeft.
Gebruik `npm:<package>` wanneer u npm-resolutie expliciet wilt maken. Kale pakketspecs installeren tijdens de lanceerovergang ook rechtstreeks vanuit npm.
Gebruik `npm:<package>` wanneer je npm-resolutie expliciet wilt maken. Kale pakketspecificaties installeren tijdens de lanceringsovergang ook direct vanuit npm.
Kale specs en `@latest` blijven op het stabiele spoor. Als npm een van beide naar een prerelease resolved, stopt OpenClaw en vraagt het u expliciet opt-in te doen met een prerelease-tag zoals `@beta`/`@rc` of een exacte prereleaseversie zoals `@1.2.3-beta.4`.
Kale specificaties en `@latest` blijven op het stabiele spoor. OpenClaw-correctieversies met datumstempel zoals `2026.5.3-1` zijn stabiele releases voor deze controle. Als npm een van beide naar een prerelease resolveert, stopt OpenClaw en vraagt het je expliciet in te stemmen met een prerelease-tag zoals `@beta`/`@rc` of een exacte prerelease-versie zoals `@1.2.3-beta.4`.
Als een kale installatiespec overeenkomt met een officiële plugin-id (bijvoorbeeld `diffs`), installeert OpenClaw de catalogusvermelding rechtstreeks. Gebruik een expliciete scoped spec (bijvoorbeeld `@scope/diffs`) om een npm-pakket met dezelfde naam te installeren.
Als een kale installatiespecificatie overeenkomt met een officiële plugin-id (bijvoorbeeld `diffs`), installeert OpenClaw de catalogusvermelding direct. Gebruik een expliciete scoped specificatie (bijvoorbeeld `@scope/diffs`) om een npm-pakket met dezelfde naam te installeren.
</Accordion>
<Accordion title="Git-repository's">
Gebruik `git:<repo>` om rechtstreeks vanuit een git-repository te installeren. Ondersteunde vormen zijn onder meer `git:github.com/owner/repo`, `git:owner/repo`, volledige `https://`-, `ssh://`-, `git://`-, `file://`- en `git@host:owner/repo.git`-clone-URL's. Voeg `@<ref>` of `#<ref>` toe om vóór installatie een branch, tag of commit uit te checken.
Gebruik `git:<repo>` om direct vanuit een git-repository te installeren. Ondersteunde vormen zijn onder andere `git:github.com/owner/repo`, `git:owner/repo`, volledige `https://`, `ssh://`, `git://`, `file://` en `git@host:owner/repo.git` clone-URL's. Voeg `@<ref>` of `#<ref>` toe om vóór installatie een branch, tag of commit uit te checken.
Git-installaties clonen naar een tijdelijke map, checken de gevraagde ref uit wanneer die aanwezig is, en gebruiken daarna de normale installer voor plugin-mappen. Dat betekent dat manifestvalidatie, scanning op gevaarlijke code, package-manager-installatiewerk en installatierecords zich gedragen zoals bij npm-installaties. Geregistreerde git-installaties bevatten de bron-URL/ref plus de resolved commit, zodat `openclaw plugins update` de bron later opnieuw kan resolven.
Git-installaties klonen naar een tijdelijke map, checken de gevraagde ref uit wanneer aanwezig en gebruiken daarna de normale installer voor plugin-mappen. Dat betekent dat manifestvalidatie, scanning op gevaarlijke code, package-manager-installatiewerk en installatierecords zich gedragen zoals bij npm-installaties. Vastgelegde git-installaties bevatten de bron-URL/ref plus de opgeloste commit, zodat `openclaw plugins update` de bron later opnieuw kan resolven.
Gebruik na installatie vanuit git `openclaw plugins inspect <id> --runtime --json` om runtime-registraties zoals gateway-methoden en CLI-opdrachten te verifiëren. Als de plugin een CLI-root heeft geregistreerd met `api.registerCli`, voert u die opdracht rechtstreeks uit via de OpenClaw-root-CLI, bijvoorbeeld `openclaw demo-plugin ping`.
Gebruik na installatie vanuit git `openclaw plugins inspect <id> --runtime --json` om runtime-registraties zoals gateway-methoden en CLI-opdrachten te verifiëren. Als de plugin een CLI-root heeft geregistreerd met `api.registerCli`, voer die opdracht dan direct uit via de OpenClaw-root-CLI, bijvoorbeeld `openclaw demo-plugin ping`.
</Accordion>
<Accordion title="Archieven">
Ondersteunde archieven: `.zip`, `.tgz`, `.tar.gz`, `.tar`. Native OpenClaw-pluginarchieven moeten een geldige `openclaw.plugin.json` bevatten in de uitgepakte plugin-root; archieven die alleen `package.json` bevatten, worden geweigerd voordat OpenClaw installatierecords schrijft.
Claude marketplace-installaties worden ook ondersteund.
Claude-marketplace-installaties worden ook ondersteund.
</Accordion>
</AccordionGroup>
@ -159,7 +159,7 @@ openclaw plugins install clawhub:openclaw-codex-app-server
openclaw plugins install clawhub:openclaw-codex-app-server@1.2.3
```
Kale npm-veilige pluginspecs installeren tijdens de lanceerovergang standaard vanuit npm:
Kale npm-veilige plugin-specificaties installeren tijdens de lanceringsovergang standaard vanuit npm:
```bash
openclaw plugins install openclaw-codex-app-server
@ -172,19 +172,19 @@ openclaw plugins install npm:openclaw-codex-app-server
openclaw plugins install npm:@scope/plugin-name@1.0.1
```
OpenClaw controleert de geadverteerde plugin-API / minimale gatewaycompatibiliteit vóór installatie. Wanneer de geselecteerde ClawHub-versie een ClawPack-artefact publiceert, downloadt OpenClaw de versioned npm-pack `.tgz`, verifieert het de ClawHub-digest-header en de artefactdigest, en installeert het dit vervolgens via het normale archiefpad. Oudere ClawHub-versies zonder ClawPack-metadata installeren nog steeds via het legacy verificatiepad voor pakketarchieven. Geregistreerde installaties bewaren hun ClawHub-bronmetadata, artefactsoort, npm-integriteit, npm-shasum, tarballnaam en ClawPack-digestfeiten voor latere updates.
Ongeversioneerde ClawHub-installaties bewaren een ongeversioneerde geregistreerde spec, zodat `openclaw plugins update` nieuwere ClawHub-releases kan volgen; expliciete versie- of tagselectors zoals `clawhub:pkg@1.2.3` en `clawhub:pkg@beta` blijven vastgepind op die selector.
OpenClaw controleert vóór installatie de geadverteerde plugin-API / minimale gateway-compatibiliteit. Wanneer de geselecteerde ClawHub-versie een ClawPack-artefact publiceert, downloadt OpenClaw de geversioneerde npm-pack-`.tgz`, verifieert het de ClawHub-digestheader en de artefactdigest, en installeert het deze daarna via het normale archiefpad. Oudere ClawHub-versies zonder ClawPack-metadata installeren nog steeds via het legacy-verificatiepad voor pakketarchieven. Vastgelegde installaties bewaren hun ClawHub-bronmetadata, artefactsoort, npm-integriteit, npm-shasum, tarballnaam en ClawPack-digestfeiten voor latere updates.
Ongeversioneerde ClawHub-installaties bewaren een ongeversioneerde vastgelegde specificatie zodat `openclaw plugins update` nieuwere ClawHub-releases kan volgen; expliciete versie- of tagselectors zoals `clawhub:pkg@1.2.3` en `clawhub:pkg@beta` blijven vastgepind op die selector.
#### Marketplace-shorthand
Gebruik de shorthand `plugin@marketplace` wanneer de marketplace-naam bestaat in Claude's lokale registrycache op `~/.claude/plugins/known_marketplaces.json`:
Gebruik de `plugin@marketplace`-shorthand wanneer de marketplace-naam bestaat in Claude's lokale registry-cache op `~/.claude/plugins/known_marketplaces.json`:
```bash
openclaw plugins marketplace list <marketplace-name>
openclaw plugins install <plugin-name>@<marketplace-name>
```
Gebruik `--marketplace` wanneer u de marketplace-bron expliciet wilt doorgeven:
Gebruik `--marketplace` wanneer je de marketplace-bron expliciet wilt doorgeven:
```bash
openclaw plugins install <plugin-name> --marketplace <marketplace-name>
@ -197,13 +197,13 @@ openclaw plugins install <plugin-name> --marketplace ./my-marketplace
<Tab title="Marketplace-bronnen">
- een bekende Claude-marketplace-naam uit `~/.claude/plugins/known_marketplaces.json`
- een lokale marketplace-root of `marketplace.json`-pad
- een GitHub-repoverkorting zoals `owner/repo`
- een GitHub-repo-afkorting zoals `owner/repo`
- een GitHub-repo-URL zoals `https://github.com/owner/repo`
- een git-URL
</Tab>
<Tab title="Regels voor externe marketplaces">
Voor externe marketplaces die vanuit GitHub of git worden geladen, moeten plugin-vermeldingen binnen de gekloonde marketplace-repo blijven. OpenClaw accepteert relatieve padbronnen uit die repo en weigert HTTP(S), absolute paden, git, GitHub en andere niet-pad-pluginbronnen uit externe manifests.
Voor externe marketplaces die vanuit GitHub of git worden geladen, moeten pluginvermeldingen binnen de gekloonde marketplace-repo blijven. OpenClaw accepteert relatieve padbronnen uit die repo en weigert HTTP(S), absolute paden, git, GitHub en andere niet-pad-pluginbronnen uit externe manifests.
</Tab>
</Tabs>
@ -215,7 +215,7 @@ Voor lokale paden en archieven detecteert OpenClaw automatisch:
- Cursor-compatibele bundels (`.cursor-plugin/plugin.json`)
<Note>
Compatibele bundels worden in de normale plugin-root geïnstalleerd en doen mee aan dezelfde list/info/enable/disable-flow. Momenteel worden bundel-Skills, Claude-command-Skills, standaardwaarden uit Claude `settings.json`, standaardwaarden uit Claude `.lsp.json` / manifest-gedeclareerde `lspServers`, Cursor-command-Skills en compatibele Codex-hookmappen ondersteund; andere gedetecteerde bundelmogelijkheden worden weergegeven in diagnostics/info, maar zijn nog niet gekoppeld aan runtime-uitvoering.
Compatibele bundels worden in de normale plugin-root geïnstalleerd en nemen deel aan dezelfde list/info/enable/disable-flow. Momenteel worden bundel-Skills, Claude command-skills, Claude-standaardwaarden voor `settings.json`, Claude-standaardwaarden voor `.lsp.json` / in het manifest gedeclareerde `lspServers`, Cursor command-skills en compatibele Codex-hookmappen ondersteund; andere gedetecteerde bundelmogelijkheden worden getoond in diagnostiek/info, maar zijn nog niet gekoppeld aan runtime-uitvoering.
</Note>
### Lijst
@ -234,54 +234,58 @@ openclaw plugins search <query> --json
Toon alleen ingeschakelde plugins.
</ParamField>
<ParamField path="--verbose" type="boolean">
Schakel over van de tabelweergave naar detailregels per plugin met metadata over bron/oorsprong/versie/activering.
Schakel over van de tabelweergave naar detailregels per plugin met metadata over source/origin/version/activation.
</ParamField>
<ParamField path="--json" type="boolean">
Machineleesbare inventaris plus registry-diagnostics en installatiestatus van pakketafhankelijkheden.
Machineleesbare inventaris plus registrydiagnostiek en installatiestatus van package-afhankelijkheden.
</ParamField>
<Note>
`plugins list` leest eerst de opgeslagen lokale plugin-registry, met een alleen-uit-manifest-afgeleide fallback wanneer de registry ontbreekt of ongeldig is. Dit is nuttig om te controleren of een plugin is geïnstalleerd, ingeschakeld en zichtbaar is voor planning van een koude start, maar het is geen live runtime-probe van een al draaiend Gateway-proces. Nadat je plugin-code, inschakeling, hookbeleid of `plugins.load.paths` hebt gewijzigd, herstart je de Gateway die het kanaal bedient voordat je verwacht dat nieuwe `register(api)`-code of hooks worden uitgevoerd. Controleer bij externe/container-deployments dat je het daadwerkelijke `openclaw gateway run`-child herstart, niet alleen een wrapper-proces.
`plugins list` leest eerst de opgeslagen lokale plugin-registry, met een alleen-uit-manifest-afgeleide fallback wanneer de registry ontbreekt of ongeldig is. Dit is nuttig om te controleren of een plugin is geïnstalleerd, ingeschakeld en zichtbaar is voor koude startupplanning, maar het is geen live runtime-probe van een al draaiend Gateway-proces. Nadat je plugincode, inschakeling, hookbeleid of `plugins.load.paths` hebt gewijzigd, herstart je de Gateway die het kanaal bedient voordat je verwacht dat nieuwe `register(api)`-code of hooks worden uitgevoerd. Controleer bij externe/containerdeployments dat je het daadwerkelijke `openclaw gateway run`-child herstart, niet alleen een wrapperproces.
`plugins list --json` bevat voor elke plugin de `dependencyStatus` uit `package.json`
`dependencies` en `optionalDependencies`. OpenClaw controleert of die pakketnamen aanwezig zijn langs het normale Node `node_modules`-opzoekpad van de plugin; het importeert geen plugin-runtimecode, voert geen package manager uit en repareert geen ontbrekende afhankelijkheden.
`dependencies` en `optionalDependencies`. OpenClaw controleert of die package-
namen aanwezig zijn langs het normale Node-`node_modules`-opzoekpad van de plugin; het
importeert geen plugin-runtimecode, voert geen package manager uit en repareert geen ontbrekende
afhankelijkheden.
</Note>
`plugins search` is een externe ClawHub-cataloguszoekopdracht. Het inspecteert geen lokale
staat, wijzigt geen configuratie, installeert geen pakketten en laadt geen plugin-runtimecode. Zoekresultaten bevatten de ClawHub-pakketnaam, familie, kanaal, versie, samenvatting en
status, muteert geen config, installeert geen packages en laadt geen plugin-runtimecode. Zoek
resultaten bevatten de ClawHub-packagenaam, familie, kanaal, versie, samenvatting en
een installatietip zoals `openclaw plugins install clawhub:<package>`.
Voor werk aan meegeleverde plugins binnen een verpakte Docker-image, bind-mount je de plugin-
bronmap over het overeenkomende verpakte bronpad, zoals
`/app/extensions/synology-chat`. OpenClaw ontdekt die gemounte bron-
overlay vóór `/app/dist/extensions/synology-chat`; een gewoon gekopieerde bron-
map blijft inert, zodat normale verpakte installaties nog steeds de gecompileerde dist gebruiken.
Voor werk aan gebundelde plugins binnen een packaged Docker-image bind-mount je de
bronmap van de plugin over het overeenkomende packaged bronpad, zoals
`/app/extensions/synology-chat`. OpenClaw ontdekt die gekoppelde bron-
overlay vóór `/app/dist/extensions/synology-chat`; een gewone gekopieerde bron-
map blijft inert, zodat normale packaged installaties nog steeds de gecompileerde dist gebruiken.
Voor runtime-hookdebugging:
- `openclaw plugins inspect <id> --runtime --json` toont geregistreerde hooks en diagnostics uit een inspectiepass waarbij de module is geladen. Runtime-inspectie installeert nooit afhankelijkheden; gebruik `openclaw doctor --fix` om legacy-afhankelijkheidsstaat op te schonen of ontbrekende geconfigureerde downloadbare plugins te installeren.
- `openclaw gateway status --deep --require-rpc` bevestigt de bereikbare Gateway, service-/process-hints, configuratiepad en RPC-gezondheid.
- Niet-meegeleverde gesprekshooks (`llm_input`, `llm_output`, `before_agent_finalize`, `agent_end`) vereisen `plugins.entries.<id>.hooks.allowConversationAccess=true`.
- `openclaw plugins inspect <id> --runtime --json` toont geregistreerde hooks en diagnostiek uit een inspectiepass met geladen module. Runtime-inspectie installeert nooit afhankelijkheden; gebruik `openclaw doctor --fix` om legacy-afhankelijkheidsstatus op te schonen of ontbrekende geconfigureerde downloadbare plugins te installeren.
- `openclaw gateway status --deep --require-rpc` bevestigt de bereikbare Gateway, service-/proceshints, het configpad en de RPC-gezondheid.
- Niet-gebundelde gesprekshooks (`llm_input`, `llm_output`, `before_agent_finalize`, `agent_end`) vereisen `plugins.entries.<id>.hooks.allowConversationAccess=true`.
Gebruik `--link` om het kopiëren van een lokale map te vermijden (voegt toe aan `plugins.load.paths`):
Gebruik `--link` om te voorkomen dat een lokale map wordt gekopieerd (voegt toe aan `plugins.load.paths`):
```bash
openclaw plugins install -l ./my-plugin
```
<Note>
`--force` wordt niet ondersteund met `--link`, omdat gekoppelde installaties het bronpad hergebruiken in plaats van over een beheerd installatiedoel heen te kopiëren.
`--force` wordt niet ondersteund met `--link`, omdat gelinkte installaties het bronpad hergebruiken in plaats van over een beheerd installatiedoel heen te kopiëren.
Gebruik `--pin` bij npm-installaties om de opgeloste exacte spec (`name@version`) op te slaan in de beheerde plugin-index, terwijl het standaardgedrag ongepind blijft.
Gebruik `--pin` bij npm-installaties om de opgeloste exacte spec (`name@version`) in de beheerde pluginindex op te slaan terwijl het standaardgedrag ongepind blijft.
</Note>
### Plugin-index
### Pluginindex
Plugin-installatiemetadata is machinebeheerde staat, geen gebruikersconfiguratie. Installaties en updates schrijven dit naar `plugins/installs.json` onder de actieve OpenClaw-statusmap. De top-level `installRecords`-map is de duurzame bron van installatiemetadata, inclusief records voor kapotte of ontbrekende plugin-manifests. De `plugins`-array is de uit manifest afgeleide koude registry-cache. Het bestand bevat een waarschuwing om het niet te bewerken en wordt gebruikt door `openclaw plugins update`, verwijderen, diagnostics en de koude plugin-registry.
Installatiemetadata van plugins is machinebeheerde status, geen gebruikersconfiguratie. Installaties en updates schrijven deze naar `plugins/installs.json` onder de actieve OpenClaw-statusmap. De top-level `installRecords`-map is de duurzame bron van installatiemetadata, inclusief records voor kapotte of ontbrekende pluginmanifests. De `plugins`-array is de uit het manifest afgeleide koude registrycache. Het bestand bevat een waarschuwing dat het niet handmatig mag worden bewerkt en wordt gebruikt door `openclaw plugins update`, uninstall, diagnostiek en de koude pluginregistry.
Wanneer OpenClaw meegeleverde legacy-`plugins.installs`-records in de configuratie ziet, verplaatst het deze naar de plugin-index en verwijdert het de configuratiesleutel; als een van beide schrijfacties mislukt, blijven de configuratierecords behouden zodat de installatiemetadata niet verloren gaat.
Wanneer OpenClaw verzonden legacy-`plugins.installs`-records in de config ziet, verplaatst het deze naar de pluginindex en verwijdert het de configkey; als een van beide schrijfoperaties mislukt, blijven de configrecords behouden zodat de installatiemetadata niet verloren gaat.
### Verwijderen
### Deïnstalleren
```bash
openclaw plugins uninstall <id>
@ -289,10 +293,10 @@ openclaw plugins uninstall <id> --dry-run
openclaw plugins uninstall <id> --keep-files
```
`uninstall` verwijdert plugin-records uit `plugins.entries`, de opgeslagen plugin-index, plugin-allow/deny-listvermeldingen en gekoppelde `plugins.load.paths`-vermeldingen waar van toepassing. Tenzij `--keep-files` is ingesteld, verwijdert uninstall ook de gevolgde beheerde installatiemap wanneer die zich binnen de plugin-extensions-root van OpenClaw bevindt. Voor Active Memory-plugins wordt het geheugenslot teruggezet naar `memory-core`.
`uninstall` verwijdert pluginrecords uit `plugins.entries`, de opgeslagen pluginindex, plugin allow/deny-listvermeldingen en gelinkte `plugins.load.paths`-vermeldingen waar van toepassing. Tenzij `--keep-files` is ingesteld, verwijdert uninstall ook de bijgehouden beheerde installatiemap wanneer die zich binnen de plugin-extensieroot van OpenClaw bevindt. Voor Active Memory-plugins wordt de geheugensleuf gereset naar `memory-core`.
<Note>
`--keep-config` wordt ondersteund als verouderd alias voor `--keep-files`.
`--keep-config` wordt ondersteund als verouderde alias voor `--keep-files`.
</Note>
### Bijwerken
@ -305,29 +309,29 @@ openclaw plugins update @openclaw/voice-call
openclaw plugins update openclaw-codex-app-server --dangerously-force-unsafe-install
```
Updates zijn van toepassing op gevolgde plugin-installaties in de beheerde plugin-index en gevolgde hook-pack-installaties in `hooks.internal.installs`.
Updates worden toegepast op bijgehouden plugininstallaties in de beheerde pluginindex en bijgehouden hook-pack-installaties in `hooks.internal.installs`.
<AccordionGroup>
<Accordion title="Plugin-id versus npm-spec oplossen">
Wanneer je een plugin-id doorgeeft, hergebruikt OpenClaw de vastgelegde installatiespec voor die plugin. Dat betekent dat eerder opgeslagen dist-tags zoals `@beta` en exact gepinde versies ook bij latere `update <id>`-runs worden gebruikt.
Wanneer je een plugin-id doorgeeft, hergebruikt OpenClaw de vastgelegde installatiespec voor die plugin. Dat betekent dat eerder opgeslagen dist-tags zoals `@beta` en exact gepinde versies ook bij latere `update <id>`-runs gebruikt blijven worden.
Voor npm-installaties kun je ook een expliciete npm-pakketspec met een dist-tag of exacte versie doorgeven. OpenClaw herleidt die pakketnaam terug naar het gevolgde plugin-record, werkt die geïnstalleerde plugin bij en legt de nieuwe npm-spec vast voor toekomstige updates op basis van id.
Voor npm-installaties kun je ook een expliciete npm-packagespec met een dist-tag of exacte versie doorgeven. OpenClaw herleidt die packagenaam terug naar het bijgehouden pluginrecord, werkt die geïnstalleerde plugin bij en legt de nieuwe npm-spec vast voor toekomstige updates op basis van id.
Het doorgeven van de npm-pakketnaam zonder versie of tag wordt ook terug herleid naar het gevolgde plugin-record. Gebruik dit wanneer een plugin aan een exacte versie was gepind en je die terug wilt verplaatsen naar de standaard releaselijn van de registry.
Het doorgeven van de npm-packagenaam zonder versie of tag wordt ook terug herleid naar het bijgehouden pluginrecord. Gebruik dit wanneer een plugin was gepind op een exacte versie en je deze terug wilt verplaatsen naar de standaard releaselijn van de registry.
</Accordion>
<Accordion title="Updates voor het bètakanaal">
`openclaw plugins update` hergebruikt de gevolgde plugin-spec tenzij je een nieuwe spec doorgeeft. `openclaw update` kent daarnaast het actieve OpenClaw-updatekanaal: op het bètakanaal proberen npm- en ClawHub-plugin-records op de standaardlijn eerst `@beta` en vallen daarna terug op de vastgelegde default/latest-spec als er geen plugin-bètarelease bestaat. Exacte versies en expliciete tags blijven aan die selector gepind.
<Accordion title="Updates voor het betakanaal">
`openclaw plugins update` hergebruikt de bijgehouden pluginspec tenzij je een nieuwe spec doorgeeft. `openclaw update` kent daarnaast het actieve OpenClaw-updatekanaal: op het betakanaal proberen npm- en ClawHub-pluginrecords op de standaardlijn eerst `@beta` en vallen daarna terug op de vastgelegde default/latest-spec als er geen bètarelease van de plugin bestaat. Exacte versies en expliciete tags blijven gepind op die selector.
</Accordion>
<Accordion title="Versiecontroles en integriteitsdrift">
Vóór een live npm-update controleert OpenClaw de geïnstalleerde pakketversie tegen de metadata van de npm-registry. Als de geïnstalleerde versie en vastgelegde artefactidentiteit al overeenkomen met het opgeloste doel, wordt de update overgeslagen zonder te downloaden, opnieuw te installeren of `openclaw.json` te herschrijven.
Vóór een live npm-update controleert OpenClaw de geïnstalleerde packageversie tegen de metadata van de npm-registry. Als de geïnstalleerde versie en vastgelegde artifact-identiteit al overeenkomen met het opgeloste doel, wordt de update overgeslagen zonder downloaden, opnieuw installeren of herschrijven van `openclaw.json`.
Wanneer er een opgeslagen integriteitshash bestaat en de opgehaalde artefacthash verandert, behandelt OpenClaw dat als npm-artefactdrift. Het interactieve `openclaw plugins update`-commando toont de verwachte en daadwerkelijke hashes en vraagt om bevestiging voordat het doorgaat. Niet-interactieve updatehelpers falen gesloten tenzij de aanroeper een expliciet vervolgbeleid opgeeft.
Wanneer er een opgeslagen integriteitshash bestaat en de opgehaalde artifacthash verandert, behandelt OpenClaw dat als npm-artifactdrift. De interactieve opdracht `openclaw plugins update` print de verwachte en daadwerkelijke hashes en vraagt om bevestiging voordat wordt doorgegaan. Niet-interactieve updatehelpers falen gesloten tenzij de aanroeper een expliciet voortzettingsbeleid opgeeft.
</Accordion>
<Accordion title="--dangerously-force-unsafe-install bij update">
`--dangerously-force-unsafe-install` is ook beschikbaar bij `plugins update` als break-glass-override voor false positives in ingebouwde dangerous-code-scans tijdens plugin-updates. Het omzeilt nog steeds geen plugin-`before_install`-beleidsblokkades of blokkering door scanfouten, en het geldt alleen voor plugin-updates, niet voor hook-pack-updates.
`--dangerously-force-unsafe-install` is ook beschikbaar bij `plugins update` als break-glass-override voor fout-positieven in de ingebouwde dangerous-code-scan tijdens pluginupdates. Het omzeilt nog steeds geen plugin-`before_install`-beleidsblokkades of blokkering door scanfouten, en het geldt alleen voor pluginupdates, niet voor hook-pack-updates.
</Accordion>
</AccordionGroup>
@ -339,21 +343,21 @@ openclaw plugins inspect <id> --runtime
openclaw plugins inspect <id> --json
```
Inspect toont identiteit, laadstatus, bron, manifestmogelijkheden, beleidsflags, diagnostics, installatiemetadata, bundelmogelijkheden en eventuele gedetecteerde MCP- of LSP-serverondersteuning zonder standaard plugin-runtime te importeren. Voeg `--runtime` toe om de plugin-module te laden en geregistreerde hooks, tools, commando's, services, gateway-methoden en HTTP-routes op te nemen. Runtime-inspectie rapporteert ontbrekende plugin-afhankelijkheden direct; installaties en reparaties blijven in `openclaw plugins install`, `openclaw plugins update` en `openclaw doctor --fix`.
Inspect toont identiteit, laadstatus, bron, manifestmogelijkheden, beleidsvlaggen, diagnostiek, installatiemetadata, bundelmogelijkheden en alle gedetecteerde MCP- of LSP-serverondersteuning zonder standaard plugin-runtime te importeren. Voeg `--runtime` toe om de pluginmodule te laden en geregistreerde hooks, tools, opdrachten, services, gatewaymethoden en HTTP-routes op te nemen. Runtime-inspectie rapporteert ontbrekende pluginafhankelijkheden direct; installaties en reparaties blijven in `openclaw plugins install`, `openclaw plugins update` en `openclaw doctor --fix`.
CLI-commando's die eigendom zijn van plugins worden geïnstalleerd als root-`openclaw`-commandogroepen. Nadat `inspect --runtime` een commando onder `cliCommands` toont, voer je het uit als `openclaw <command> ...`; bijvoorbeeld een plugin die `demo-git` registreert, kan worden gecontroleerd met `openclaw demo-git ping`.
CLI-opdrachten die eigendom zijn van een plugin worden geïnstalleerd als root-`openclaw`-opdrachtgroepen. Nadat `inspect --runtime` een opdracht onder `cliCommands` toont, voer je deze uit als `openclaw <command> ...`; een plugin die bijvoorbeeld `demo-git` registreert, kan worden gecontroleerd met `openclaw demo-git ping`.
Elke plugin wordt geclassificeerd op basis van wat hij daadwerkelijk tijdens runtime registreert:
Elke plugin wordt geclassificeerd op basis van wat deze daadwerkelijk tijdens runtime registreert:
- **plain-capability** — één capabilitytype (bijv. een provider-only plugin)
- **hybrid-capability** — meerdere capabilitytypen (bijv. tekst + spraak + afbeeldingen)
- **hook-only** — alleen hooks, geen capabilities of oppervlakken
- **non-capability** — tools/commando's/services maar geen capabilities
- **plain-capability** — één mogelijkheidstype (bijv. een provider-only-plugin)
- **hybrid-capability** — meerdere mogelijkheidstypen (bijv. tekst + spraak + afbeeldingen)
- **hook-only** — alleen hooks, geen mogelijkheden of oppervlakken
- **non-capability** — tools/opdrachten/services maar geen mogelijkheden
Zie [Plugin-vormen](/nl/plugins/architecture#plugin-shapes) voor meer over het capabilitymodel.
Zie [Pluginvormen](/nl/plugins/architecture#plugin-shapes) voor meer over het mogelijkhedenmodel.
<Note>
De `--json`-flag geeft een machineleesbaar rapport dat geschikt is voor scripting en auditing. `inspect --all` rendert een fleet-brede tabel met kolommen voor vorm, capabilitysoorten, compatibiliteitsmeldingen, bundelmogelijkheden en hooksamenvatting. `info` is een alias voor `inspect`.
De vlag `--json` geeft een machineleesbaar rapport dat geschikt is voor scripting en auditing. `inspect --all` rendert een fleet-brede tabel met kolommen voor vorm, capabilitysoorten, compatibiliteitsmeldingen, bundelmogelijkheden en hooksamenvatting. `info` is een alias voor `inspect`.
</Note>
### Doctor
@ -362,11 +366,11 @@ De `--json`-flag geeft een machineleesbaar rapport dat geschikt is voor scriptin
openclaw plugins doctor
```
`doctor` rapporteert plugin-laadfouten, manifest-/discovery-diagnostics en compatibiliteitsmeldingen. Wanneer alles schoon is, wordt `No plugin issues detected.` afgedrukt.
`doctor` rapporteert pluginlaadfouten, manifest-/discoverydiagnostiek en compatibiliteitsmeldingen. Wanneer alles schoon is, print het `No plugin issues detected.`
Als een geconfigureerde plugin op schijf aanwezig is maar wordt geblokkeerd door de padveiligheidscontroles van de loader, behoudt configuratievalidatie de plugin-vermelding en rapporteert deze als `present but blocked`. Los de voorafgaande blocked-plugin-diagnostic op, zoals padeigendom of world-writable machtigingen, in plaats van de `plugins.entries.<id>`- of `plugins.allow`-configuratie te verwijderen.
Als een geconfigureerde plugin op schijf aanwezig is maar wordt geblokkeerd door de path-safety-controles van de loader, behoudt configvalidatie de pluginvermelding en rapporteert deze als `present but blocked`. Los de voorafgaande diagnostiek voor de geblokkeerde plugin op, zoals padeigendom of world-writable machtigingen, in plaats van de config `plugins.entries.<id>` of `plugins.allow` te verwijderen.
Voor modulevormfouten zoals ontbrekende `register`/`activate`-exports, voer je opnieuw uit met `OPENCLAW_PLUGIN_LOAD_DEBUG=1` om een compacte exportvormsamenvatting in de diagnostic-uitvoer op te nemen.
Voor modulevormfouten zoals ontbrekende `register`/`activate`-exports voer je opnieuw uit met `OPENCLAW_PLUGIN_LOAD_DEBUG=1` om een compacte exportvormsamenvatting in de diagnostische output op te nemen.
### Registry
@ -376,22 +380,22 @@ openclaw plugins registry --refresh
openclaw plugins registry --json
```
De lokale plugin-registry is het opgeslagen koude leesmodel van OpenClaw voor geïnstalleerde plugin-identiteit, inschakeling, bronmetadata en eigendom van bijdragen. Normale startup, provider-owner-opzoeking, classificatie van kanaalsetup en plugin-inventaris kunnen dit lezen zonder plugin-runtimemodules te importeren.
De lokale pluginregistry is het opgeslagen koude leesmodel van OpenClaw voor geïnstalleerde pluginidentiteit, inschakeling, bronmetadata en eigenaarschap van bijdragen. Normale startup, provider-eigenaaropzoeking, classificatie van kanaalsetup en plugininventaris kunnen deze lezen zonder plugin-runtimemodules te importeren.
Gebruik `plugins registry` om te controleren of de persistente registry aanwezig, actueel of verouderd is. Gebruik `--refresh` om deze opnieuw op te bouwen vanuit de persistente Plugin-index, het configuratiebeleid en de manifest-/pakketmetadata. Dit is een herstelpad, geen runtime-activeringspad.
Gebruik `plugins registry` om te controleren of het opgeslagen register aanwezig, actueel of verouderd is. Gebruik `--refresh` om het opnieuw op te bouwen vanuit de opgeslagen Plugin-index, het configuratiebeleid en de manifest-/pakketmetadata. Dit is een herstelpad, geen pad voor runtime-activering.
<Warning>
`OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRY=1` is een verouderde break-glass-compatibiliteitsschakelaar voor leesfouten in de registry. Geef de voorkeur aan `plugins registry --refresh` of `openclaw doctor --fix`; de env-terugval is alleen bedoeld voor noodherstel bij opstarten terwijl de migratie wordt uitgerold.
`OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRY=1` is een verouderde break-glass-compatibiliteitsschakelaar voor leesfouten in het register. Gebruik bij voorkeur `plugins registry --refresh` of `openclaw doctor --fix`; de env-fallback is alleen bedoeld voor noodherstel bij het opstarten terwijl de migratie wordt uitgerold.
</Warning>
### Marketplace
### Marktplaats
```bash
openclaw plugins marketplace list <source>
openclaw plugins marketplace list <source> --json
```
Marketplace list accepteert een lokaal Marketplace-pad, een `marketplace.json`-pad, een GitHub-verkorting zoals `owner/repo`, een GitHub-repo-URL of een git-URL. `--json` drukt het opgeloste bronlabel af, plus het geparste Marketplace-manifest en de Plugin-vermeldingen.
De marktplaatslijst accepteert een lokaal marktplaatspad, een `marketplace.json`-pad, een GitHub-shorthand zoals `owner/repo`, een GitHub-repo-URL of een git-URL. `--json` print het opgeloste bronlabel plus het geparsete marktplaatsmanifest en de Plugin-vermeldingen.
## Gerelateerd

View File

@ -1,31 +1,31 @@
---
read_when:
- Je moet door operators beheerde proxyrouting vóór implementatie valideren
- Je moet OpenClaw-transportverkeer lokaal vastleggen voor foutopsporing
- Je wilt debug-proxysessies, blobs of ingebouwde queryvoorinstellingen inspecteren
summary: CLI-referentie voor `openclaw proxy`, inclusief door de operator beheerde proxyvalidatie en de lokale inspecteur voor debugproxy-opnamen
- Je moet door de operator beheerde proxyrouting vóór de uitrol valideren
- Je moet lokaal OpenClaw-transportverkeer vastleggen voor foutopsporing
- Je wilt foutopsporingsproxysessies, binaire objecten of ingebouwde queryvoorinstellingen inspecteren
summary: CLI-referentie voor `openclaw proxy`, inclusief validatie van door de operator beheerde proxy's en de lokale inspectietool voor vastleggingen van de foutopsporingsproxy
title: Proxy
x-i18n:
generated_at: "2026-05-01T11:16:50Z"
generated_at: "2026-05-04T07:03:04Z"
model: gpt-5.5
provider: openai
source_hash: e0820de861bfe1ec14e0c1624d636d6474b5fedd317e3ba1baaa61f6530e06e9
source_hash: 9589bedafb97c31bcb6536a04307cd0c6550e1f307693bd4401785d79f34a1eb
source_path: cli/proxy.md
workflow: 16
---
# `openclaw proxy`
Valideer door de operator beheerde proxyrouting, of voer de lokale expliciete debugproxy uit
Valideer door operators beheerde proxyrouting, of voer de lokale expliciete debugproxy uit
en inspecteer vastgelegd verkeer.
Gebruik `validate` om een door de operator beheerde forward-proxy vooraf te controleren voordat
OpenClaw-proxyrouting wordt ingeschakeld. De andere commando's zijn debugtools voor
onderzoek op transportniveau: ze kunnen een lokale proxy starten, een onderliggend commando uitvoeren
met vastlegging ingeschakeld, vastleggingssessies tonen, veelvoorkomende verkeerspatronen opvragen, vastgelegde
blobs lezen en lokale vastleggingsgegevens opschonen.
Gebruik `validate` om een door de operator beheerde forwardproxy vooraf te controleren voordat
OpenClaw-proxyrouting wordt ingeschakeld. De andere opdrachten zijn debughulpmiddelen voor
onderzoek op transportniveau: ze kunnen een lokale proxy starten, een child-opdracht uitvoeren
met vastlegging ingeschakeld, vastleggingssessies tonen, veelvoorkomende verkeerspatronen opvragen, vastgelegde blobs lezen
en lokale vastleggingsgegevens verwijderen.
## Commando's
## Opdrachten
```bash
openclaw proxy start [--host <host>] [--port <port>]
@ -41,20 +41,20 @@ openclaw proxy purge
## Valideren
`openclaw proxy validate` controleert de effectieve door de operator beheerde proxy-URL uit
`--proxy-url`, config of `OPENCLAW_PROXY_URL`. Het meldt een configuratieprobleem wanneer
geen proxy is ingeschakeld en geconfigureerd; gebruik `--proxy-url` voor een eenmalige voorafcontrole
voordat je de configuratie wijzigt. Standaard verifieert het dat een openbare bestemming slaagt
via de proxy en dat de proxy geen tijdelijke loopback-canary kan bereiken.
Aangepaste geweigerde bestemmingen zijn fail-closed: HTTP-reacties en ambigu
transportfalen mislukken beide, tenzij je een implementatiespecifiek weigeringssignaal
`--proxy-url`, configuratie of `OPENCLAW_PROXY_URL`. Het meldt een configuratieprobleem wanneer
er geen proxy is ingeschakeld en geconfigureerd; gebruik `--proxy-url` voor een eenmalige voorafcontrole
voordat de configuratie wordt gewijzigd. Standaard wordt gecontroleerd of een openbare bestemming via
de proxy slaagt en of de proxy geen tijdelijke loopback-canary kan bereiken.
Aangepaste geweigerde bestemmingen zijn fail-closed: HTTP-antwoorden en dubbelzinnige
transportfouten mislukken allebei, tenzij je een implementatiespecifiek weigeringssignaal
afzonderlijk kunt verifiëren.
Opties:
- `--json`: druk machineleesbare JSON af.
- `--proxy-url <url>`: valideer deze proxy-URL in plaats van config of env.
- `--allowed-url <url>`: voeg een bestemming toe die naar verwachting via de proxy slaagt. Herhaal om meerdere bestemmingen te controleren.
- `--denied-url <url>`: voeg een bestemming toe die naar verwachting door de proxy wordt geblokkeerd. Herhaal om meerdere bestemmingen te controleren.
- `--proxy-url <url>`: valideer deze proxy-URL in plaats van configuratie of env.
- `--allowed-url <url>`: voeg een bestemming toe die naar verwachting via de proxy slaagt. Herhaal dit om meerdere bestemmingen te controleren.
- `--denied-url <url>`: voeg een bestemming toe die naar verwachting door de proxy wordt geblokkeerd. Herhaal dit om meerdere bestemmingen te controleren.
- `--timeout-ms <ms>`: time-out per aanvraag in milliseconden.
Zie [Netwerkproxy](/nl/security/network-proxy) voor implementatierichtlijnen en weigeringssemantiek.
@ -70,15 +70,16 @@ Zie [Netwerkproxy](/nl/security/network-proxy) voor implementatierichtlijnen en
- `missing-ack`
- `error-bursts`
## Opmerkingen
## Notities
- `start` gebruikt standaard `127.0.0.1`, tenzij `--host` is ingesteld.
- `run` start een lokale debugproxy en voert daarna het commando na `--` uit.
- `validate` sluit af met code 1 wanneer de proxyconfiguratie of bestemmingscontroles mislukken.
- `run` start een lokale debugproxy en voert vervolgens de opdracht na `--` uit.
- De directe upstream-forwarding van de debugproxy opent upstream-sockets voor diagnostiek. Wanneer de door OpenClaw beheerde proxymodus actief is, is directe forwarding voor proxy-aanvragen en CONNECT-tunnels standaard uitgeschakeld; stel `OPENCLAW_DEBUG_PROXY_ALLOW_DIRECT_CONNECT_WITH_MANAGED_PROXY=1` alleen in voor goedgekeurde lokale diagnostiek.
- `validate` sluit af met code 1 wanneer proxyconfiguratie of bestemmingscontroles mislukken.
- Vastleggingen zijn lokale debuggegevens; gebruik `openclaw proxy purge` wanneer je klaar bent.
## Gerelateerd
- [CLI-referentie](/nl/cli)
- [Netwerkproxy](/nl/security/network-proxy)
- [Vertrouwde proxyauthenticatie](/nl/gateway/trusted-proxy-auth)
- [Vertrouwde proxy-authenticatie](/nl/gateway/trusted-proxy-auth)

View File

@ -4,10 +4,10 @@ read_when:
summary: CLI-referentie voor `openclaw sessions` (opgeslagen sessies weergeven + gebruik)
title: Sessies
x-i18n:
generated_at: "2026-05-02T20:42:12Z"
generated_at: "2026-05-04T07:02:43Z"
model: gpt-5.5
provider: openai
source_hash: 5c9ec3ca55f7c5b6217b481e9da62f5416df73e69405a0dc15e77d2afeac723f
source_hash: 8dc90344f40c53513bd6db3696bc709279155f26e7c3b6ea27e81a07a2f9f15e
source_path: cli/sessions.md
workflow: 16
---
@ -16,13 +16,19 @@ x-i18n:
Geef opgeslagen gesprekssessies weer.
Sessielijsten zijn geen liveness-controles voor kanalen/providers. Ze tonen bewaarde
gespreksrijen uit sessiestores. Een stille Discord-, Slack-, Telegram- of
ander kanaal kan succesvol opnieuw verbinden zonder een nieuwe sessierij te maken
totdat een bericht wordt verwerkt. Gebruik `openclaw channels status --probe`,
Sessielijsten zijn geen liveness-controles voor kanalen/providers. Ze tonen opgeslagen
gespreksrijen uit sessiestores. Een stil Discord-, Slack-, Telegram- of
ander kanaal kan succesvol opnieuw verbinden zonder een nieuwe sessierij aan te
maken totdat een bericht wordt verwerkt. Gebruik `openclaw channels status --probe`,
`openclaw status --deep` of `openclaw health --verbose` wanneer je live
kanaalconnectiviteit nodig hebt.
Gateway-`sessions.list`-responses zijn standaard begrensd, zodat grote langlevende
stores de Gateway-eventloop niet kunnen monopoliseren. Geef vanuit RPC-clients een expliciete positieve
`limit` door wanneer een ander resultaatvenster nodig is; responses
bevatten `totalCount`, `limitApplied` en `hasMore` wanneer aanroepers moeten tonen
dat er meer rijen bestaan.
```bash
openclaw sessions
openclaw sessions --agent work
@ -32,13 +38,13 @@ openclaw sessions --verbose
openclaw sessions --json
```
Bereikselectie:
Scopeselectie:
- standaard: geconfigureerde standaard agent-store
- standaard: geconfigureerde standaard-agentstore
- `--verbose`: uitgebreide logging
- `--agent <id>`: één geconfigureerde agent-store
- `--all-agents`: alle geconfigureerde agent-stores samenvoegen
- `--store <path>`: expliciet store-pad (kan niet worden gecombineerd met `--agent` of `--all-agents`)
- `--agent <id>`: één geconfigureerde agentstore
- `--all-agents`: verzamel alle geconfigureerde agentstores
- `--store <path>`: expliciet storepad (kan niet worden gecombineerd met `--agent` of `--all-agents`)
Exporteer een trajectbundel voor een opgeslagen sessie:
@ -47,15 +53,15 @@ openclaw sessions export-trajectory --session-key "agent:main:telegram:direct:12
openclaw sessions export-trajectory --session-key "agent:main:telegram:direct:123" --output bug-123 --json
```
Dit is het opdrachtpad dat door de `/export-trajectory` slash-opdracht wordt gebruikt nadat
Dit is het commandopad dat door de slashopdracht `/export-trajectory` wordt gebruikt nadat
de eigenaar het exec-verzoek goedkeurt. De uitvoermap wordt altijd opgelost
binnen `.openclaw/trajectory-exports/` onder de geselecteerde workspace.
`openclaw sessions --all-agents` leest geconfigureerde agent-stores. Gateway- en ACP-
sessiedetectie is breder: die omvat ook disk-only stores die worden gevonden onder
de standaard `agents/`-root of een getemplate `session.store`-root. Die
gevonden stores moeten worden opgelost naar reguliere `sessions.json`-bestanden binnen de
agent-root; symlinks en paden buiten de root worden overgeslagen.
`openclaw sessions --all-agents` leest geconfigureerde agentstores. Gateway- en ACP-
sessiediscovery zijn breder: ze bevatten ook stores die alleen op schijf staan en zijn gevonden onder
de standaardroot `agents/` of een getemplatete `session.store`-root. Die
ontdekte stores moeten worden opgelost naar reguliere `sessions.json`-bestanden binnen de
agentroot; symlinks en paden buiten de root worden overgeslagen.
JSON-voorbeelden:
@ -91,23 +97,23 @@ openclaw sessions cleanup --enforce --active-key "agent:main:telegram:direct:123
openclaw sessions cleanup --json
```
`openclaw sessions cleanup` gebruikt `session.maintenance`-instellingen uit de config:
`openclaw sessions cleanup` gebruikt `session.maintenance`-instellingen uit de configuratie:
- Bereikopmerking: `openclaw sessions cleanup` onderhoudt sessiestores, transcripties en trajectory-sidecars. Het snoeit geen Cron-runlogs (`cron/runs/<jobId>.jsonl`), die worden beheerd door `cron.runLog.maxBytes` en `cron.runLog.keepLines` in [Cron-configuratie](/nl/automation/cron-jobs#configuration) en worden uitgelegd in [Cron-onderhoud](/nl/automation/cron-jobs#maintenance).
- Scope-opmerking: `openclaw sessions cleanup` onderhoudt sessiestores, transcripties en traject-sidecars. Het snoeit geen cron-runlogs (`cron/runs/<jobId>.jsonl`), die worden beheerd door `cron.runLog.maxBytes` en `cron.runLog.keepLines` in [Cron-configuratie](/nl/automation/cron-jobs#configuration) en worden uitgelegd in [Cron-onderhoud](/nl/automation/cron-jobs#maintenance).
- `--dry-run`: bekijk vooraf hoeveel items zouden worden gesnoeid/afgetopt zonder te schrijven.
- In tekstmodus drukt dry-run een actietabel per sessie af (`Action`, `Key`, `Age`, `Model`, `Flags`), zodat je kunt zien wat behouden versus verwijderd zou worden.
- In tekstmodus drukt dry-run een actietabel per sessie af (`Action`, `Key`, `Age`, `Model`, `Flags`) zodat je kunt zien wat behouden blijft versus verwijderd wordt.
- `--enforce`: pas onderhoud toe, zelfs wanneer `session.maintenance.mode` `warn` is.
- `--fix-missing`: verwijder items waarvan transcriptiebestanden ontbreken, zelfs als ze normaal nog niet op leeftijd/aantal zouden uitvallen.
- `--active-key <key>`: bescherm een specifieke actieve sleutel tegen verwijdering door het schijfbudget. Duurzame externe gesprekspointers, zoals groepssessies en thread-gebonden chatsessies, worden ook behouden door onderhoud op leeftijd/aantal/schijfbudget.
- `--agent <id>`: voer opschoning uit voor één geconfigureerde agent-store.
- `--all-agents`: voer opschoning uit voor alle geconfigureerde agent-stores.
- `--store <path>`: voer uit tegen een specifiek `sessions.json`-bestand.
- `--fix-missing`: verwijder items waarvan de transcriptiebestanden ontbreken, zelfs als ze normaal gesproken nog niet op leeftijd/aantal zouden uitvallen.
- `--active-key <key>`: bescherm een specifieke actieve sleutel tegen verwijdering door het schijfbudget. Duurzame externe gesprekspointers, zoals groepssessies en thread-scoped chatsessies, worden ook behouden door onderhoud op basis van leeftijd/aantal/schijfbudget.
- `--agent <id>`: voer cleanup uit voor één geconfigureerde agentstore.
- `--all-agents`: voer cleanup uit voor alle geconfigureerde agentstores.
- `--store <path>`: voer uit op een specifiek `sessions.json`-bestand.
- `--json`: druk een JSON-samenvatting af. Met `--all-agents` bevat de uitvoer één samenvatting per store.
Wanneer een Gateway bereikbaar is, wordt niet-dry-run-opschoning voor geconfigureerde agent-stores
via de Gateway verzonden, zodat dezelfde sessiestore-writer wordt gedeeld als runtimeverkeer.
Gebruik `--store <path>` voor expliciet offline herstel van een store-bestand.
Wanneer een Gateway bereikbaar is, wordt niet-dry-run cleanup voor geconfigureerde agentstores
via de Gateway verzonden, zodat deze dezelfde sessiestore-writer deelt als runtime-
verkeer. Gebruik `--store <path>` voor expliciet offline herstel van een storebestand.
`openclaw sessions cleanup --all-agents --dry-run --json`:

View File

@ -1,85 +1,85 @@
---
read_when:
- Live visuele QA bouwen of uitvoeren voor OpenClaw-bugs
- Voor- en naverificatie toevoegen voor een pull request
- Live visuele QA voor OpenClaw-bugs bouwen of uitvoeren
- Voor- en naverificatie toevoegen voor een pull-aanvraag
- Discord-, Slack-, WhatsApp- of andere live-transportscenario's toevoegen
- QA-runs debuggen waarvoor screenshots, browserautomatisering of VNC-toegang nodig zijn
summary: Mantis is het visuele end-to-end-verificatiesysteem voor het reproduceren van OpenClaw-bugs op live-transporten, het vastleggen van bewijs vóór en na, en het toevoegen van artefacten aan PR's.
- QA-runs debuggen waarvoor schermafbeeldingen, browserautomatisering of VNC-toegang nodig zijn
summary: Mantis is het visuele end-to-end-verificatiesysteem voor het reproduceren van OpenClaw-fouten op live-transporten, het vastleggen van bewijs van vóór en na, en het toevoegen van artefacten aan PR's.
title: Bidsprinkhaan
x-i18n:
generated_at: "2026-05-04T02:23:08Z"
generated_at: "2026-05-04T07:03:14Z"
model: gpt-5.5
provider: openai
source_hash: 5a86ab4bc876d1c53ada1c30580034165f028194a072f559eb54a898a369211d
source_hash: 9d3f3fa3db111b1b5c85f8efeccd749fbd5885cee6b7843ca4c8d049acfd9164
source_path: concepts/mantis.md
workflow: 16
---
Mantis is het end-to-end-verificatiesysteem van OpenClaw voor bugs die een echte
runtime, een echt transport en zichtbaar bewijs nodig hebben. Het voert een scenario uit tegen een bekende
Mantis is het OpenClaw end-to-end-verificatiesysteem voor bugs die een echte
runtime, een echte transportlaag en zichtbaar bewijs nodig hebben. Het voert een scenario uit tegen een bekende
slechte ref, legt bewijs vast, voert hetzelfde scenario uit tegen een kandidaat-ref en
publiceert de vergelijking als artefacten die een maintainer kan inspecteren vanuit een PR of
vanuit een lokale opdracht.
publiceert de vergelijking als artifacts die een maintainer kan inspecteren vanuit een PR of
vanuit een lokaal commando.
Mantis begint met Discord omdat Discord ons een eerste lane met hoge waarde geeft:
echte bot-authenticatie, echte guild-kanalen, reacties, threads, native opdrachten en een
browser-UI waarin mensen visueel kunnen bevestigen wat het transport liet zien.
echte botauthenticatie, echte guild-kanalen, reacties, threads, native commando's en een
browser-UI waarin mensen visueel kunnen bevestigen wat de transportlaag liet zien.
## Doelen
- Reproduceer een bug uit een GitHub-issue of PR met dezelfde transportvorm die gebruikers
zien.
- Leg een **vooraf**-artefact vast op de baseline-ref voordat de fix wordt toegepast.
- Leg een **achteraf**-artefact vast op de kandidaat-ref nadat de fix is toegepast.
- Leg een **voor**-artifact vast op de baseline-ref voordat de fix wordt toegepast.
- Leg een **na**-artifact vast op de kandidaat-ref nadat de fix is toegepast.
- Gebruik waar mogelijk een deterministische oracle, zoals een Discord REST-reactie
uitlezing of kanaaltranscriptcontrole.
uitlezen of een kanaaltranscriptcontrole.
- Leg screenshots vast wanneer de bug een zichtbaar UI-oppervlak heeft.
- Voer lokaal uit vanuit een door een agent aangestuurde CLI en op afstand vanuit GitHub.
- Bewaar genoeg machinestatus voor VNC-redding wanneer aanmelden, browserautomatisering of
provider-authenticatie vastloopt.
- Plaats beknopte status in een operator-Discord-kanaal wanneer de uitvoering is geblokkeerd,
- Voer lokaal uit vanuit een door een agent bestuurde CLI en op afstand vanuit GitHub.
- Bewaar genoeg machinetoestand voor VNC-redding wanneer inloggen, browserautomatisering of
providerauthenticatie vastloopt.
- Plaats beknopte status in een operator-Discord-kanaal wanneer de run geblokkeerd is,
handmatige VNC-hulp nodig heeft of klaar is.
## Niet-doelen
- Mantis is geen vervanging voor unit-tests. Een Mantis-uitvoering moet meestal een
- Mantis is geen vervanging voor unit tests. Een Mantis-run moet meestal een
kleinere regressietest worden nadat de fix is begrepen.
- Mantis is niet de normale snelle CI-gate. Het is langzamer, gebruikt live-inloggegevens en
is gereserveerd voor bugs waarbij de live-omgeving ertoe doet.
- Mantis is niet de normale snelle CI-gate. Het is trager, gebruikt live credentials en
is gereserveerd voor bugs waarbij de live omgeving ertoe doet.
- Mantis zou voor normale werking geen mens moeten vereisen. Handmatige VNC is een reddingspad,
niet het standaardpad.
- Mantis slaat geen ruwe geheimen op in artefacten, logs, screenshots, Markdown-
- Mantis slaat geen ruwe secrets op in artifacts, logs, screenshots, Markdown-
rapporten of PR-opmerkingen.
## Eigenaarschap
Mantis leeft in de OpenClaw QA-stack.
- OpenClaw is eigenaar van de scenario-runtime, transportadapters, het bewijsschema en
- OpenClaw is eigenaar van de scenarioruntime, transportadapters, het bewijsschema en
de lokale CLI onder `pnpm openclaw qa mantis`.
- QA Lab is eigenaar van de live-transportharnasonderdelen, browseropnamehelpers en
artefactschrijvers.
- QA Lab is eigenaar van de live transport-harnessonderdelen, browser-capturehelpers en
artifact-writers.
- Crabbox is eigenaar van opgewarmde Linux-machines wanneer een externe VM nodig is.
- GitHub Actions is eigenaar van het externe workflow-entrypoint en artefactretentie.
- ClawSweeper is eigenaar van GitHub-commentaarrouting: maintainer-opdrachten parsen,
- GitHub Actions is eigenaar van het externe workflow-entrypoint en artifactretentie.
- ClawSweeper is eigenaar van GitHub-commentaarrouting: maintainercommando's parsen,
de workflow dispatchen en de definitieve PR-opmerking plaatsen.
- OpenClaw-agents sturen Mantis aan via Codex wanneer een scenario agentische setup,
debugging of rapportage van vastgelopen status nodig heeft.
debugging of rapportage van vastgelopen toestand nodig heeft.
Deze grens houdt transportkennis in OpenClaw, machineplanning in
Crabbox en maintainer-workflowlijm in ClawSweeper.
## Opdrachtvorm
## Commandovorm
De eerste lokale opdracht verifieert de Discord-bot, guild, kanaal, berichtverzending,
reactieverzending en artefactpad:
Het eerste lokale commando verifieert de Discord-bot, guild, kanaal, berichtverzending,
reactieverzending en artifactpad:
```bash
pnpm openclaw qa mantis discord-smoke \
--output-dir .artifacts/qa-e2e/mantis/discord-smoke
```
De lokale vooraf- en achteraf-runner accepteert deze vorm:
De lokale voor- en na-runner accepteert deze vorm:
```bash
pnpm openclaw qa mantis run \
@ -90,115 +90,159 @@ pnpm openclaw qa mantis run \
--output-dir .artifacts/qa-e2e/mantis/local-discord-status-reactions
```
De runner maakt losgekoppelde baseline- en kandidaat-worktrees onder de output-
directory, installeert afhankelijkheden, bouwt elke ref, voert het scenario uit met
`--allow-failures` en schrijft daarna `baseline/`, `candidate/`, `comparison.json`,
De runner maakt detached baseline- en kandidaat-worktrees onder de outputmap,
installeert dependencies, bouwt elke ref, voert het scenario uit met
`--allow-failures` en schrijft daarna `baseline/`, `candidate/`, `comparison.json`
en `mantis-report.md`. Voor het eerste Discord-scenario betekent een succesvolle verificatie
dat de baseline-status `fail` is en de kandidaatstatus `pass`.
dat de baselinestatus `fail` is en de kandidaatstatus `pass`.
De eerste VM/browser-primitieve is de desktop-smoke:
De eerste VM/browser-primitive is de desktop-smoke:
```bash
pnpm openclaw qa mantis desktop-browser-smoke \
--output-dir .artifacts/qa-e2e/mantis/desktop-browser
```
Deze leaset of hergebruikt een Crabbox-desktopmachine, start een zichtbare browser binnen de
VNC-sessie, legt de desktop vast, haalt artefacten terug naar de lokale output-
directory en schrijft de opdracht om opnieuw te verbinden in het rapport. De opdracht gebruikt standaard
Deze least of hergebruikt een Crabbox-desktopmachine, start een zichtbare browser binnen de
VNC-sessie, legt de desktop vast, haalt artifacts terug naar de lokale outputmap
en schrijft het reconnect-commando in het rapport. Het commando gebruikt standaard
de Hetzner-provider omdat dit de eerste provider is met werkende desktop/VNC-
dekking in de Mantis-lane. Overschrijf dit met `--provider`, `--crabbox-bin` of
`OPENCLAW_MANTIS_CRABBOX_PROVIDER` wanneer je tegen een andere Crabbox-fleet draait.
Nuttige desktop-smokevlaggen:
Nuttige desktop-smoke-flags:
- `--lease-id <cbx_...>` of `OPENCLAW_MANTIS_CRABBOX_LEASE_ID` hergebruikt een opgewarmde desktop.
- `--browser-url <url>` wijzigt de pagina die in de zichtbare browser wordt geopend.
- `--html-file <path>` rendert een repo-lokaal HTML-artefact in de zichtbare browser. Mantis gebruikt dit om de gegenereerde Discord-statusreactietijdlijn via een echte Crabbox-desktop vast te leggen.
- `--keep-lease` of `OPENCLAW_MANTIS_KEEP_VM=1` houdt een nieuw aangemaakte geslaagde lease open voor VNC-inspectie. Mislukte uitvoeringen houden de lease standaard vast wanneer er een is aangemaakt, zodat een operator opnieuw kan verbinden.
- `--html-file <path>` rendert een repo-lokaal HTML-artifact in de zichtbare browser. Mantis gebruikt dit om de gegenereerde Discord status-reactietijdlijn via een echte Crabbox-desktop vast te leggen.
- `--keep-lease` of `OPENCLAW_MANTIS_KEEP_VM=1` houdt een nieuw gemaakte geslaagde lease open voor VNC-inspectie. Mislukte runs houden de lease standaard open wanneer er een is gemaakt, zodat een operator opnieuw kan verbinden.
- `--class`, `--idle-timeout` en `--ttl` stemmen machinegrootte en leaselevensduur af.
De GitHub-smokeworkflow is `Mantis Discord Smoke`. De vooraf- en achteraf-GitHub-
De eerste volledige desktoptransport-primitive is de Slack desktop-smoke:
```bash
pnpm openclaw qa mantis slack-desktop-smoke \
--output-dir .artifacts/qa-e2e/mantis/slack-desktop \
--gateway-setup \
--scenario slack-canary \
--keep-lease
```
Deze least of hergebruikt een Crabbox-desktopmachine, synchroniseert de huidige checkout naar
de VM, draait `pnpm openclaw qa slack` binnen die VM, opent Slack Web in de VNC-
browser, legt de zichtbare desktop vast en kopieert zowel de Slack QA-artifacts als
de VNC-screenshot terug naar de lokale outputmap. Dit is de eerste Mantis-
vorm waarin de SUT OpenClaw Gateway en de browser allebei binnen dezelfde
Linux-desktop-VM leven.
Met `--gateway-setup` bereidt het commando een persistente wegwerpbare OpenClaw-
home voor op `$HOME/.openclaw-mantis/slack-openclaw`, patcht Slack Socket Mode-
configuratie voor het geselecteerde kanaal, start `openclaw gateway run` op poort
`38973` en houdt Chrome actief in de VNC-sessie. Dit is de modus "laat me een
Linux-desktop achter met Slack en een actieve claw"; de bot-naar-bot Slack QA-lane
blijft de standaard wanneer `--gateway-setup` wordt weggelaten.
Vereiste invoer voor `--credential-source env`:
- `OPENCLAW_QA_SLACK_CHANNEL_ID`
- `OPENCLAW_QA_SLACK_DRIVER_BOT_TOKEN`
- `OPENCLAW_QA_SLACK_SUT_BOT_TOKEN`
- `OPENCLAW_QA_SLACK_SUT_APP_TOKEN`
- `OPENCLAW_LIVE_OPENAI_KEY` voor de externe modellane. Als alleen
`OPENAI_API_KEY` lokaal is ingesteld, mappt Mantis die naar `OPENCLAW_LIVE_OPENAI_KEY`
voordat Crabbox wordt aangeroepen, zodat Crabbox' `OPENCLAW_*` env-forwarding deze
de VM in kan dragen.
Nuttige Slack desktop-flags:
- `--lease-id <cbx_...>` draait opnieuw tegen een machine waarop een operator al via VNC bij Slack Web heeft ingelogd.
- `--gateway-setup` start een persistente OpenClaw Slack Gateway in de VM in plaats van alleen de bot-naar-bot QA-lane uit te voeren.
- `--slack-url <url>` opent een specifieke Slack Web-URL. Zonder deze flag leidt Mantis `https://app.slack.com/client/<team>/<channel>` af uit Slack `auth.test` wanneer de SUT-bottoken beschikbaar is.
- `--slack-channel-id <id>` bepaalt de Slack-kanaal-allowlist die gatewaysetup gebruikt.
- `OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIR` bepaalt het persistente Chrome-profiel binnen de VM. De standaard is `$HOME/.config/openclaw-mantis/slack-chrome-profile`, zodat een handmatige Slack Web-login herstarts op dezelfde lease overleeft.
- `--credential-source convex --credential-role ci` gebruikt de gedeelde credentialpool in plaats van directe Slack-envtokens.
- `--provider-mode`, `--model`, `--alt-model` en `--fast` worden doorgegeven aan de Slack live-lane.
De GitHub-smokeworkflow is `Mantis Discord Smoke`. De voor- en na-GitHub-
workflow voor het eerste echte scenario is `Mantis Discord Status Reactions`. Deze
accepteert:
- `baseline_ref`: de ref waarvan wordt verwacht dat deze gedrag met alleen queued reproduceert.
- `candidate_ref`: de ref waarvan wordt verwacht dat deze `queued -> thinking -> done` toont.
- `baseline_ref`: de ref waarvan wordt verwacht dat die queued-only-gedrag reproduceert.
- `candidate_ref`: de ref waarvan wordt verwacht dat die `queued -> thinking -> done` toont.
Deze checkt de workflow-harness-ref uit, bouwt afzonderlijke baseline- en kandidaat-
worktrees, voert `discord-status-reactions-tool-only` uit tegen elke worktree en
Deze checkt de workflow-harnessref uit, bouwt aparte baseline- en kandidaat-
worktrees, draait `discord-status-reactions-tool-only` tegen elke worktree en
uploadt `baseline/`, `candidate/`, `comparison.json` en `mantis-report.md` als
Actions-artefacten. Deze rendert ook de tijdlijn-HTML van elke lane in een Crabbox-
Actions-artifacts. Deze rendert ook de tijdlijn-HTML van elke lane in een Crabbox-
desktopbrowser en publiceert die VNC-screenshots naast de deterministische
tijdlijn-PNG's in de PR-opmerking. De workflow bouwt de Crabbox CLI vanuit
`openclaw/crabbox` main zodat deze de huidige desktop/browser-leasevlaggen kan gebruiken
voordat de volgende Crabbox-binaryrelease wordt uitgebracht.
`openclaw/crabbox` main zodat deze de huidige desktop/browser-leaseflags kan gebruiken
voordat de volgende Crabbox-binaryrelease wordt gemaakt.
Je kunt de statusreactie-uitvoering ook direct vanuit een PR-opmerking starten:
Je kunt de status-reacties-run ook direct vanuit een PR-opmerking starten:
```text
@Mantis discord status reactions
```
De commentaartrigger is bewust smal. Deze draait alleen op pullrequest-
opmerkingen van gebruikers met schrijf-, maintain- of beheerdersrechten, en herkent alleen
Discord-statusreactieverzoeken. Standaard gebruikt deze de bekende slechte baseline-ref
en de huidige PR-head-SHA als kandidaat. Maintainers kunnen beide
refs overschrijven:
De commentaartrigger is bewust smal. Deze draait alleen op pull request-
opmerkingen van gebruikers met schrijf-, maintain- of admin-toegang, en herkent alleen
Discord status-reactieverzoeken. Standaard gebruikt deze de bekende slechte baseline-ref
en de huidige PR-head-SHA als kandidaat. Maintainers kunnen beide refs overschrijven:
```text
@Mantis discord status reactions baseline=origin/main candidate=HEAD
```
ClawSweeper-opdrachtvoorbeelden:
ClawSweeper-commandovoorbeelden:
```text
@clawsweeper mantis discord discord-status-reactions-tool-only
@clawsweeper verify e2e discord
```
De eerste opdracht is expliciet en scenariogericht. De tweede kan later een PR
of issue koppelen aan aanbevolen Mantis-scenario's op basis van labels, gewijzigde bestanden en
Het eerste commando is expliciet en scenariogericht. Het tweede kan later een PR
of issue mappen naar aanbevolen Mantis-scenario's op basis van labels, gewijzigde bestanden en
ClawSweeper-reviewbevindingen.
## Uitvoeringslevenscyclus
## Runlevenscyclus
1. Verkrijg inloggegevens.
1. Verkrijg credentials.
2. Wijs een VM toe of hergebruik er een.
3. Bereid het desktop-/browserprofiel voor wanneer het scenario UI-bewijs nodig heeft.
3. Bereid het desktop/browserprofiel voor wanneer het scenario UI-bewijs nodig heeft.
4. Bereid een schone checkout voor de baseline-ref voor.
5. Installeer afhankelijkheden en bouw alleen wat het scenario nodig heeft.
6. Start een child OpenClaw Gateway met een geïsoleerde statusdirectory.
7. Configureer het live transport, de provider, het model en het browserprofiel.
5. Installeer dependencies en bouw alleen wat het scenario nodig heeft.
6. Start een child OpenClaw Gateway met een geïsoleerde state-directory.
7. Configureer de live transportlaag, provider, model en browserprofiel.
8. Voer het scenario uit en leg baseline-bewijs vast.
9. Stop de Gateway en bewaar logs.
10. Bereid de kandidaat-ref voor in dezelfde VM.
10. Bereid de kandidaat-ref in dezelfde VM voor.
11. Voer hetzelfde scenario uit en leg kandidaatbewijs vast.
12. Vergelijk de oracle-resultaten en visueel bewijs.
13. Schrijf Markdown, JSON, logs, screenshots en optionele trace-artefacten.
14. Upload GitHub Actions-artefacten.
15. Plaats een beknopte PR- of Discord-statusmelding.
13. Schrijf Markdown, JSON, logs, screenshots en optionele trace-artifacts.
14. Upload GitHub Actions-artifacts.
15. Plaats een beknopt PR- of Discord-statusbericht.
Het scenario moet op twee verschillende manieren kunnen falen:
- **Bug gereproduceerd**: baseline faalde op de verwachte manier.
- **Harnasfout**: omgevingssetup, inloggegevens, Discord API, browser of
- **Harnessfout**: omgevingssetup, credentials, Discord API, browser of
provider faalde voordat de bug-oracle betekenisvol was.
Het eindrapport moet deze gevallen scheiden zodat maintainers een flakkerige
Het eindrapport moet deze gevallen scheiden, zodat maintainers een flakende
omgeving niet verwarren met productgedrag.
## Discord-MVP
Het eerste scenario moet Discord-statusreacties targeten in guild-kanalen waar
de bronantwoordleveringsmodus `message_tool_only` is.
Het eerste scenario moet gericht zijn op Discord-statusreacties in guild-kanalen waar
de bronantwoordbezorgmodus `message_tool_only` is.
Waarom dit een goede Mantis-start is:
Waarom dit een goede Mantis-seed is:
- Het is zichtbaar in Discord als reacties op het triggerbericht.
- Het heeft een sterke REST-oracle via Discord-berichtreactiestatus.
- Het oefent een echte OpenClaw Gateway, Discord-bot-authenticatie, berichtdispatch,
bronantwoordleveringsmodus, statusreactiestatus en modelbeurtleven cyclus.
- Het oefent een echte OpenClaw Gateway, Discord-botauthenticatie, berichtdispatch,
bronantwoordbezorgmodus, statusreactiestatus en modelbeurtlevenscyclus.
- Het is smal genoeg om de eerste implementatie eerlijk te houden.
Verwachte scenariovorm:
@ -233,9 +277,9 @@ evidence:
```
Baseline-bewijs moet de queued-bevestigingsreactie tonen, maar geen
levenscyclusovergang in tool-only-modus. Kandidaatbewijs moet tonen dat levenscyclus-
levenscyclustransitie in tool-only-modus. Kandidaatbewijs moet tonen dat lifecycle-
statusreacties draaien wanneer `messages.statusReactions.enabled` expliciet
true is.
`true` is.
De uitvoerbare eerste slice is het opt-in Discord live QA-scenario:
@ -249,9 +293,9 @@ pnpm openclaw qa discord \
--output-dir .artifacts/qa-e2e/mantis/discord-status-reactions-candidate
```
Dit configureert de SUT met always-on guild-afhandeling, `visibleReplies:
Het configureert de SUT met altijd actieve guild-verwerking, `visibleReplies:
"message_tool"`, `ackReaction: "👀"` en expliciete statusreacties. De oracle
pollt het echte Discord-triggerbericht en verwacht de geobserveerde reeks
pollt het echte Discord-triggerbericht en verwacht de waargenomen reeks
`👀 -> 🤔 -> 👍`. Artefacten omvatten `discord-qa-reaction-timelines.json`,
`discord-status-reactions-tool-only-timeline.html` en
`discord-status-reactions-tool-only-timeline.png`.
@ -263,20 +307,20 @@ nul te beginnen:
- `pnpm openclaw qa discord` voert al een live Discord-lane uit met driver- en
SUT-bots.
- De live-transportrunner schrijft al rapporten en geobserveerdebericht-
artefacten onder `.artifacts/qa-e2e/`.
- Convex-inloggegevensleases bieden al exclusieve toegang tot gedeelde live-
transportinloggegevens.
- De live-transportrunner schrijft al rapporten en waargenomen-berichtartefacten
onder `.artifacts/qa-e2e/`.
- Convex-referentieleases bieden al exclusieve toegang tot gedeelde live
transportreferenties.
- De browserbesturingsservice ondersteunt al screenshots, snapshots,
headless beheerde profielen en externe CDP-profielen.
headless beheerde profielen en remote CDP-profielen.
- QA Lab heeft al een debugger-UI en bus voor transportvormige tests.
De eerste Mantis-implementatie kan een dunne vooraf/achteraf-runner bovenop deze
De eerste Mantis-implementatie kan een dunne before/after-runner over deze
onderdelen zijn, plus één visuele bewijslaag.
## Bewijsmodel
Elke uitvoering schrijft een stabiele artefactdirectory:
Elke run schrijft een stabiele artefactdirectory:
```text
.artifacts/qa-e2e/mantis/<run-id>/
@ -297,79 +341,78 @@ Elke uitvoering schrijft een stabiele artefactdirectory:
```
`mantis-summary.json` moet de machineleesbare bron van waarheid zijn. Het
Markdown-rapport is voor PR-opmerkingen en menselijke review.
Markdown-rapport is voor PR-opmerkingen en menselijke beoordeling.
De samenvatting moet bevatten:
- geteste refs en SHA's
- transport- en scenario-id
- machineprovider en machine-id of lease-id
- inloggegevensbron zonder geheime waarden
- referentiebron zonder geheime waarden
- baseline-resultaat
- kandidaatresultaat
- of de bug op baseline is gereproduceerd
- of de kandidaat deze heeft gefixt
- of de bug op de baseline werd gereproduceerd
- of de kandidaat deze heeft opgelost
- artefactpaden
- opgeschoonde setup- of cleanup-problemen
Screenshots zijn bewijs, geen geheimen. Ze hebben nog steeds redactiediscipline nodig:
privékanaalnamen, gebruikersnamen of berichtinhoud kunnen verschijnen. Voor publieke PR's
hebben GitHub Actions-artefactlinks de voorkeur boven inline afbeeldingen totdat het redactieverhaal
sterker is.
Screenshots zijn bewijs, geen geheimen. Ze vereisen nog steeds discipline voor
redactie: private kanaalnamen, gebruikersnamen of berichtinhoud kunnen zichtbaar
zijn. Geef voor publieke PR's de voorkeur aan GitHub Actions-artefactlinks boven
inline afbeeldingen totdat het redactieverhaal sterker is.
## Browser en VNC
De browser-lane heeft twee modi:
- **Headless automatisering**: standaard voor CI. Chrome draait met CDP ingeschakeld, en
Playwright of OpenClaw-browserbesturing legt screenshots vast.
- **VNC-redding**: ingeschakeld op dezelfde VM wanneer aanmelden, MFA, Discord-anti-automatisering
of visueel debuggen een mens nodig heeft.
- **Headless automatisering**: standaard voor CI. Chrome draait met CDP
ingeschakeld, en Playwright of OpenClaw-browserbesturing legt screenshots vast.
- **VNC-redding**: ingeschakeld op dezelfde VM wanneer login, MFA,
Discord-anti-automatisering of visuele debugging een mens nodig heeft.
Het Discord-observerbrowserprofiel moet persistent genoeg zijn om te voorkomen dat
voor elke run opnieuw moet worden ingelogd, maar geisoleerd zijn van persoonlijke
browserstatus. Een profiel hoort bij de Mantis-machinepool, niet bij een
ontwikkelaarslaptop.
Het Discord-observerbrowserprofiel moet persistent genoeg zijn om niet bij elke
run in te hoeven loggen, maar geïsoleerd zijn van persoonlijke browserstatus. Een
profiel hoort bij de Mantis-machinepool, niet bij een ontwikkelaarslaptop.
Wanneer Mantis vastloopt, plaatst het een Discord-statusbericht met:
- run-id
- scenario-id
- machineprovider
- artifactmap
- artefactdirectory
- VNC- of noVNC-verbindingsinstructies indien beschikbaar
- korte blokkadetekst
De eerste private deployment kan deze berichten plaatsen in het bestaande
operatorkanaal en later naar een specifiek Mantis-kanaal verplaatsen.
De eerste private deployment kan deze berichten naar het bestaande
operatorkanaal posten en later naar een speciaal Mantis-kanaal verplaatsen.
## Machines
Mantis moet voor de eerste remote implementatie de voorkeur geven aan AWS via
Crabbox. Crabbox geeft ons voorverwarmde machines, lease-tracking, hydratatie,
logs, resultaten en opruiming. Als AWS-capaciteit te traag of niet beschikbaar
is, voeg dan een Hetzner-provider toe achter dezelfde machine-interface.
Crabbox. Crabbox geeft ons opgewarmde machines, lease-tracking, hydratatie,
logs, resultaten en cleanup. Als AWS-capaciteit te traag of niet beschikbaar is,
voeg dan een Hetzner-provider toe achter dezelfde machine-interface.
Minimale VM-vereisten:
- Linux met een desktopgeschikte Chrome- of Chromium-installatie
- CDP-toegang voor browserautomatisering
- VNC of noVNC voor herstel
- VNC of noVNC voor redding
- Node 22 en pnpm
- OpenClaw-checkout en dependency-cache
- Playwright Chromium-browsercache wanneer Playwright wordt gebruikt
- genoeg CPU en geheugen voor een OpenClaw Gateway, een browser en een modelrun
- uitgaande toegang tot Discord, GitHub, modelproviders en de credential broker
- genoeg CPU en geheugen voor één OpenClaw Gateway, één browser en één modelrun
- uitgaande toegang tot Discord, GitHub, modelproviders en de referentiebroker
De VM mag geen langlevende ruwe secrets bewaren buiten de verwachte credential-
of browserprofielopslag.
De VM mag geen langlevende ruwe geheimen bewaren buiten de verwachte opslag voor
referenties of browserprofielen.
## Secrets
## Geheimen
Secrets staan in GitHub-organisatie- of repositorysecrets voor remote runs, en
in een lokaal door de operator beheerd secretbestand voor lokale runs.
Geheimen staan in GitHub-organisatie- of repositorygeheimen voor remote runs, en
in een lokaal door de operator beheerd geheimenbestand voor lokale runs.
Aanbevolen secretnamen:
Aanbevolen geheime namen:
- `OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN`
- `OPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN`
@ -377,52 +420,52 @@ Aanbevolen secretnamen:
- `OPENCLAW_QA_DISCORD_GUILD_ID`
- `OPENCLAW_QA_DISCORD_CHANNEL_ID`
- `OPENCLAW_QA_DISCORD_NOTIFY_CHANNEL_ID`
- `OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` voor publieke GitHub-artifactuploads
- `OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` voor publieke GitHub-artefactuploads
- `OPENCLAW_QA_CONVEX_SITE_URL`
- `OPENCLAW_QA_CONVEX_SECRET_CI`
- `OPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR`
- `OPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR_TOKEN`
Op lange termijn moet de Convex-credentialpool de normale bron blijven voor live
transportcredentials. GitHub-secrets bootstrappen de broker en fallback-lanes.
De workflow voor Discord-statusreacties koppelt de Mantis Crabbox-secrets terug
naar de omgevingsvariabelen `CRABBOX_COORDINATOR` en
Op lange termijn moet de Convex-referentiepool de normale bron blijven voor
live transportreferenties. GitHub-geheimen bootstrappen de broker en fallback-
lanes. De Discord-statusreacties-workflow koppelt de Mantis Crabbox-geheimen
terug naar de omgevingsvariabelen `CRABBOX_COORDINATOR` en
`CRABBOX_COORDINATOR_TOKEN` die de Crabbox CLI verwacht. De gewone
`CRABBOX_*` GitHub-secretnamen blijven geaccepteerd als compatibiliteitsfallback.
GitHub-geheimnamen `CRABBOX_*` blijven geaccepteerd als compatibiliteitsfallback.
De Mantis-runner mag nooit het volgende afdrukken:
De Mantis-runner mag nooit afdrukken:
- Discord-bottokens
- provider-API-sleutels
- browsercookies
- inhoud van auth-profielen
- VNC-wachtwoorden
- ruwe credentialpayloads
- ruwe referentiepayloads
Publieke artifactuploads moeten ook Discord-doelmetadata redigeren, zoals bot-,
guild-, kanaal- en bericht-id's. De GitHub-smokeworkflow schakelt
Publieke artefactuploads moeten ook Discord-doelmetadata zoals bot-, guild-,
kanaal- en bericht-id's redigeren. De GitHub-smoke-workflow schakelt
`OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` om deze reden in.
Als een token per ongeluk in een issue, PR, chat of log wordt geplakt, roteer
het dan nadat het nieuwe secret is opgeslagen.
Als een token per ongeluk in een issue, PR, chat of log wordt geplakt, roteer het
nadat het nieuwe geheim is opgeslagen.
## GitHub-artifacts en PR-opmerkingen
## GitHub-artefacten en PR-opmerkingen
Mantis-workflows moeten de volledige bewijsbundel uploaden als een kortlevend
Actions-artifact. Wanneer de workflow wordt uitgevoerd voor een bugrapport of
Actions-artefact. Wanneer de workflow wordt uitgevoerd voor een bugrapport of
fix-PR, moet deze ook de geredigeerde PNG-screenshots publiceren naar de
`qa-artifacts`-branch en een opmerking op die bug of fix-PR upserten met inline
voor/na-screenshots. Plaats het primaire bewijs niet alleen op een generieke
QA-automatiserings-PR. Ruwe logs, geobserveerde berichten en ander omvangrijk
bewijs blijven in het Actions-artifact.
before/after-screenshots. Plaats het primaire bewijs niet alleen op een generieke
QA-automatiserings-PR. Ruwe logs, waargenomen berichten en ander omvangrijk
bewijs blijven in het Actions-artefact.
Productieworkflows moeten die opmerkingen plaatsen met de Mantis GitHub App,
niet met `github-actions[bot]`. Sla de app-id en private key op als
GitHub Actions-secrets `MANTIS_GITHUB_APP_ID` en
`MANTIS_GITHUB_APP_PRIVATE_KEY`. De workflow gebruikt een verborgen marker als
upsert-sleutel, werkt die opmerking bij wanneer het token deze kan bewerken, en
maakt een nieuwe opmerking namens Mantis wanneer een oudere marker van een bot
niet kan worden bewerkt.
Productieworkflows moeten die opmerkingen plaatsen met de Mantis GitHub App, niet
met `github-actions[bot]`. Sla de app-id en private key op als
`MANTIS_GITHUB_APP_ID` en `MANTIS_GITHUB_APP_PRIVATE_KEY` GitHub Actions-
geheimen. De workflow gebruikt een verborgen marker als upsert-sleutel, werkt
die opmerking bij wanneer het token deze kan bewerken, en maakt een nieuwe
Mantis-eigendom opmerking wanneer een oudere bot-eigendom marker niet kan worden
bewerkt.
De PR-opmerking moet kort en visueel zijn:
@ -444,22 +487,23 @@ candidate showed the expected queued -> thinking -> done sequence.
| <inline screenshot> | <inline screenshot> |
```
Wanneer de run mislukt omdat de harness faalde, moet de opmerking dat zeggen in
plaats van te impliceren dat de candidate faalde.
Wanneer de run faalt omdat de harness faalde, moet de opmerking dat zeggen in
plaats van te impliceren dat de kandidaat faalde.
## Opmerkingen over private deployment
## Private deploymentnotities
Een private deployment heeft mogelijk al een Mantis Discord-applicatie. Hergebruik
die applicatie in plaats van een andere app te maken wanneer deze de juiste
botrechten heeft en veilig kan worden geroteerd.
Stel het eerste operatornotificatiekanaal in via secrets of deploymentconfiguratie.
Het kan eerst naar een bestaand maintainer- of operations-kanaal wijzen en daarna
naar een specifiek Mantis-kanaal verhuizen zodra dat bestaat.
Stel het initiële operatornotificatiekanaal in via geheimen of
deploymentconfiguratie. Het kan eerst naar een bestaand maintainer- of
operations-kanaal wijzen en daarna naar een speciaal Mantis-kanaal verhuizen
zodra dat bestaat.
Zet geen guild-id's, kanaal-id's, bottokens, browsercookies of VNC-wachtwoorden
in dit document. Sla ze op in GitHub-secrets, de credential broker of de lokale
secretopslag van de operator.
Plaats geen guild-id's, kanaal-id's, bottokens, browsercookies of
VNC-wachtwoorden in dit document. Sla ze op in GitHub-geheimen, de
referentiebroker of de lokale geheimenopslag van de operator.
## Een scenario toevoegen
@ -467,52 +511,53 @@ Een Mantis-scenario moet declareren:
- id en titel
- transport
- vereiste credentials
- baselinerefbeleid
- candidaterefbeleid
- OpenClaw-configuratiepatch
- setupstappen
- vereiste referenties
- baseline-refbeleid
- kandidaat-refbeleid
- OpenClaw-configpatch
- setup-stappen
- stimulus
- verwachte baseline-oracle
- verwachte candidate-oracle
- visuele capturedoelen
- verwachte kandidaat-oracle
- visuele vastlegdoelen
- timeoutbudget
- opruimstappen
- cleanup-stappen
Scenario's moeten de voorkeur geven aan kleine, getypeerde oracles:
- Discord-reactiestatus voor reactiebugs
- Discord-berichtreferenties voor threadingbugs
- Slack-thread-ts en reactie-API-status voor Slack-bugs
- e-mailbericht-id's en headers voor e-mailbugs
- browserscreenshots wanneer de UI de enige betrouwbare observatie is
- Discord-reactiestatus voor reactiefouten
- Discord-berichtreferenties voor threadingfouten
- Slack-thread-ts en reactie-API-status voor Slack-fouten
- e-mailbericht-id's en headers voor e-mailfouten
- browserscreenshots wanneer de UI het enige betrouwbare waarneembare element is
Vision-checks moeten aanvullend zijn. Als een platform-API de bug kan bewijzen,
gebruik dan de API als de pass/fail-oracle en bewaar screenshots voor menselijk
Vision-controles moeten additief zijn. Als een platform-API de bug kan bewijzen,
gebruik de API dan als de pass/fail-oracle en bewaar screenshots voor menselijk
vertrouwen.
## Provideruitbreiding
Na Discord kan dezelfde runner het volgende toevoegen:
Na Discord kan dezelfde runner toevoegen:
- Slack: reacties, threads, appvermeldingen, modals, bestandsuploads.
- E-mail: Gmail-auth en berichtthreading met `gog` wanneer connectors niet
genoeg zijn.
- E-mail: Gmail-auth en berichtthreading met `gog` waar connectors niet genoeg
zijn.
- WhatsApp: QR-login, heridentificatie, berichtbezorging, media, reacties.
- Telegram: gating voor groepsvermeldingen, commando's, reacties waar beschikbaar.
- Matrix: versleutelde rooms, thread- of reply-relaties, hervatten na restart.
- Telegram: gating voor groepsvermeldingen, opdrachten, reacties waar
beschikbaar.
- Matrix: versleutelde rooms, thread- of antwoordrelaties, hervatten na herstart.
Elk transport moet een goedkoop smokescenario en een of meer bugklassescenario's
hebben. Dure visuele scenario's moeten opt-in blijven.
Elk transport moet één goedkoop smoke-scenario en één of meer bugklasse-
scenario's hebben. Dure visuele scenario's moeten opt-in blijven.
## Open vragen
- Welke Discord-bot moet de driver zijn en welke de SUT wanneer de bestaande
- Welke Discord-bot moet de driver zijn, en welke de SUT, wanneer de bestaande
Mantis-bot wordt hergebruikt?
- Moet de observerbrowserlogin in de eerste fase een menselijk Discord-account,
een testaccount of alleen bot-leesbaar REST-bewijs gebruiken?
- Hoe lang moet GitHub Mantis-artifacts voor PR's bewaren?
- Moet de observerbrowserlogin een menselijk Discord-account, een testaccount of
alleen botleesbaar REST-bewijs gebruiken voor de eerste fase?
- Hoe lang moet GitHub Mantis-artefacten voor PR's bewaren?
- Wanneer moet ClawSweeper automatisch Mantis aanbevelen in plaats van te wachten
op een maintainercommando?
- Moeten screenshots worden geredigeerd of bijgesneden voordat ze worden geupload
voor publieke PR's?
op een maintaineropdracht?
- Moeten screenshots worden geredigeerd of bijgesneden voordat ze voor publieke
PR's worden geüpload?

View File

@ -1,20 +1,20 @@
---
read_when:
- Uitleg hoe inkomende berichten antwoorden worden
- Uitleg over hoe inkomende berichten antwoorden worden
- Sessies, wachtrijmodi of streaminggedrag verduidelijken
- Documenteren van de zichtbaarheid van redenering en gevolgen voor gebruik
summary: Berichtenstroom, sessies, wachtrijvorming en zichtbaarheid van redenering
- Zichtbaarheid van redeneringen en gevolgen voor gebruik documenteren
summary: Berichtenstroom, sessies, wachtrijvorming en zichtbaarheid van redeneringen
title: Berichten
x-i18n:
generated_at: "2026-04-30T16:28:07Z"
generated_at: "2026-05-04T07:03:40Z"
model: gpt-5.5
provider: openai
source_hash: fdeee014d92767a725501691fbe0c4ee6b631acc9a2ab5cbbcf321bfee9679b9
source_hash: 15242e21fd17a9f2013561003e108d197204d834caf51bbcdc53ffb3f118b14f
source_path: concepts/messages.md
workflow: 16
---
OpenClaw verwerkt inkomende berichten via een pipeline van sessie-resolutie, wachtrijplaatsing, streaming, tooluitvoering en zichtbaarheid van redenatie. Deze pagina brengt het pad van inkomend bericht naar antwoord in kaart.
OpenClaw verwerkt inkomende berichten via een pipeline van sessieresolutie, wachtrijen, streaming, tooluitvoering en zichtbaarheid van redeneringen. Deze pagina brengt het pad van inkomend bericht naar antwoord in kaart.
## Berichtenstroom (hoog niveau)
@ -26,9 +26,9 @@ Inbound message
-> outbound replies (channel limits + chunking)
```
Belangrijke instellingen staan in de configuratie:
Belangrijke knoppen staan in de configuratie:
- `messages.*` voor voorvoegsels, wachtrijplaatsing en groepsgedrag.
- `messages.*` voor voorvoegsels, wachtrijen en groepsgedrag.
- `agents.defaults.*` voor standaardinstellingen voor blokstreaming en chunking.
- Kanaaloverschrijvingen (`channels.whatsapp.*`, `channels.telegram.*`, enz.) voor limieten en streaming-schakelaars.
@ -36,11 +36,11 @@ Zie [Configuratie](/nl/gateway/configuration) voor het volledige schema.
## Inkomende deduplicatie
Kanalen kunnen hetzelfde bericht opnieuw afleveren na opnieuw verbinden. OpenClaw houdt een kortlevende cache bij, gesleuteld op kanaal/account/peer/sessie/bericht-id, zodat dubbele afleveringen geen extra agent-run starten.
Kanalen kunnen hetzelfde bericht opnieuw afleveren na herverbindingen. OpenClaw houdt een kortlevende cache bij, met als sleutel kanaal/account/peer/sessie/bericht-id, zodat dubbele afleveringen geen nieuwe agent-run starten.
## Inkomende debouncing
Snel opeenvolgende berichten van **dezelfde afzender** kunnen via `messages.inbound` worden samengevoegd tot één agent-turn. Debouncing is begrensd per kanaal + gesprek en gebruikt het meest recente bericht voor antwoord-threading/ID's.
Snelle opeenvolgende berichten van **dezelfde afzender** kunnen via `messages.inbound` worden gebundeld in één agent-beurt. Debouncing is afgebakend per kanaal + gesprek en gebruikt het meest recente bericht voor antwoord-threading/ID's.
Configuratie (globale standaard + overschrijvingen per kanaal):
@ -61,37 +61,37 @@ Configuratie (globale standaard + overschrijvingen per kanaal):
Opmerkingen:
- Debounce geldt voor berichten met **alleen tekst**; media/bijlagen worden direct geflusht.
- Besturingscommando's omzeilen debouncing zodat ze zelfstandig blijven — **behalve** wanneer een kanaal expliciet kiest voor samenvoeging van DM's van dezelfde afzender (bijv. [BlueBubbles `coalesceSameSenderDms`](/nl/channels/bluebubbles#coalescing-split-send-dms-command--url-in-one-composition)), waarbij DM-commando's binnen het debounce-venster wachten zodat een split-send-payload kan aansluiten bij dezelfde agent-turn.
- Debounce geldt voor berichten met **alleen tekst**; media/bijlagen worden onmiddellijk geflusht.
- Besturingscommando's omzeilen debouncing zodat ze zelfstandig blijven — **behalve** wanneer een kanaal expliciet kiest voor DM-samenvoeging van dezelfde afzender (bijv. [BlueBubbles `coalesceSameSenderDms`](/nl/channels/bluebubbles#coalescing-split-send-dms-command--url-in-one-composition)), waarbij DM-commando's binnen het debounce-venster wachten zodat een gesplitst verzonden payload kan aansluiten bij dezelfde agent-beurt.
## Sessies en apparaten
Sessies zijn eigendom van de Gateway, niet van clients.
- Directe chats vallen samen in de hoofdsessiesleutel van de agent.
- Directe chats worden samengevouwen naar de hoofdsessiesleutel van de agent.
- Groepen/kanalen krijgen hun eigen sessiesleutels.
- De sessieopslag en transcripties staan op de Gateway-host.
Meerdere apparaten/kanalen kunnen naar dezelfde sessie verwijzen, maar geschiedenis wordt niet volledig teruggesynchroniseerd naar elke client. Aanbeveling: gebruik één primair apparaat voor lange gesprekken om uiteenlopende context te voorkomen. De Control UI en TUI tonen altijd de door de Gateway ondersteunde sessietranscriptie, dus zij zijn de bron van waarheid.
Meerdere apparaten/kanalen kunnen aan dezelfde sessie worden gekoppeld, maar geschiedenis wordt niet volledig terug gesynchroniseerd naar elke client. Aanbeveling: gebruik één primair apparaat voor lange gesprekken om uiteenlopende context te vermijden. De Control UI en TUI tonen altijd de door de Gateway ondersteunde sessietranscriptie, dus die zijn de bron van waarheid.
Details: [Sessiebeheer](/nl/concepts/session).
## Metadata van toolresultaten
Toolresultaat-`content` is het modelzichtbare resultaat. Toolresultaat-`details` is runtime-metadata voor UI-rendering, diagnostiek, medialevering en plugins.
Toolresultaat `content` is het model-zichtbare resultaat. Toolresultaat `details` is runtime-metadata voor UI-rendering, diagnostiek, media-aflevering en plugins.
OpenClaw houdt die grens expliciet:
- `toolResult.details` wordt verwijderd vóór provider-replay en Compaction-invoer.
- Vastgelegde sessietranscripties bewaren alleen begrensde `details`; te grote metadata wordt vervangen door een compacte samenvatting gemarkeerd met `persistedDetailsTruncated: true`.
- `toolResult.details` wordt gestript vóór provider-replay en Compaction-invoer.
- Gepersisteerde sessietranscripties bewaren alleen begrensde `details`; te grote metadata wordt vervangen door een compacte samenvatting gemarkeerd met `persistedDetailsTruncated: true`.
- Plugins en tools moeten tekst die het model moet lezen in `content` zetten, niet alleen in `details`.
## Inkomende bodies en geschiedeniscontext
OpenClaw scheidt de **prompt-body** van de **commando-body**:
- `BodyForAgent`: primaire modelgerichte tekst voor het huidige bericht. Kanaalplugins moeten dit gericht houden op de huidige promptdragende tekst van de afzender.
- `Body`: legacy prompt-fallback. Dit kan kanaalenveloppen en optionele geschiedenis-wrappers bevatten, maar huidige kanalen moeten er niet op vertrouwen als primaire modelinvoer wanneer `BodyForAgent` beschikbaar is.
- `BodyForAgent`: primaire modelgerichte tekst voor het huidige bericht. Kanaalplugins moeten dit gericht houden op de huidige prompt-dragende tekst van de afzender.
- `Body`: legacy prompt-fallback. Dit kan kanaalenveloppen en optionele geschiedeniswrappers bevatten, maar huidige kanalen moeten er niet op vertrouwen als primaire modelinvoer wanneer `BodyForAgent` beschikbaar is.
- `CommandBody`: ruwe gebruikerstekst voor directive-/commandoparsing.
- `RawBody`: legacy alias voor `CommandBody` (behouden voor compatibiliteit).
@ -100,26 +100,26 @@ Wanneer een kanaal geschiedenis aanlevert, gebruikt het een gedeelde wrapper:
- `[Chat messages since your last reply - for context]`
- `[Current message - respond to this]`
Voor **niet-directe chats** (groepen/kanalen/rooms) wordt de **body van het huidige bericht** voorafgegaan door het afzenderlabel (dezelfde stijl als voor geschiedenisitems). Dit houdt realtime- en wachtrij-/geschiedenisberichten consistent in de agent-prompt.
Voor **niet-directe chats** (groepen/kanalen/ruimtes) krijgt de **huidige berichttekst** het afzenderlabel als voorvoegsel (dezelfde stijl als voor geschiedenisitems). Hierdoor blijven realtime en in de wachtrij geplaatste/geschiedenisberichten consistent in de agent-prompt.
Geschiedenisbuffers zijn **alleen pending**: ze bevatten groepsberichten die _geen_ run hebben gestart (bijvoorbeeld berichten die door mentions zijn gated) en **sluiten** berichten uit die al in de sessietranscriptie staan.
Geschiedenisbuffers zijn **alleen pending**: ze bevatten groepsberichten die _geen_ run hebben geactiveerd (bijvoorbeeld berichten achter mention-gating) en **sluiten** berichten uit die al in de sessietranscriptie staan.
Directive-stripping geldt alleen voor de sectie **huidig bericht**, zodat geschiedenis intact blijft. Kanalen die geschiedenis wrappen, moeten `CommandBody` (of `RawBody`) instellen op de oorspronkelijke berichttekst en `Body` behouden als de gecombineerde prompt. Gestructureerde geschiedenis-, antwoord-, doorgestuurde en kanaalmetadata worden tijdens promptassemblage gerenderd als onvertrouwde contextblokken met gebruikersrol.
Directive-stripping geldt alleen voor de sectie **huidig bericht**, zodat geschiedenis intact blijft. Kanalen die geschiedenis wrappen moeten `CommandBody` (of `RawBody`) instellen op de oorspronkelijke berichttekst en `Body` behouden als de gecombineerde prompt. Gestructureerde geschiedenis, antwoord-, doorgestuurde en kanaalmetadata worden tijdens promptassemblage gerenderd als niet-vertrouwde contextblokken met gebruikersrol.
Geschiedenisbuffers zijn configureerbaar via `messages.groupChat.historyLimit` (globale standaard) en overschrijvingen per kanaal zoals `channels.slack.historyLimit` of `channels.telegram.accounts.<id>.historyLimit` (stel `0` in om uit te schakelen).
## Wachtrijplaatsing en follow-ups
## Wachtrijen en follow-ups
Als er al een run actief is, kunnen inkomende berichten in de wachtrij worden geplaatst, naar de huidige run worden gestuurd of worden verzameld voor een follow-up-turn.
Als er al een run actief is, kunnen inkomende berichten in de wachtrij worden geplaatst, naar de huidige run worden gestuurd of worden verzameld voor een follow-upbeurt.
- Configureer via `messages.queue` (en `messages.queue.byChannel`).
- De standaardmodus is `steer`, met een follow-up-debounce van 500 ms wanneer sturen terugvalt op levering via een follow-up in de wachtrij.
- De standaardmodus is `steer`, met een follow-up-debounce van 500 ms wanneer sturen terugvalt op aflevering als follow-up in de wachtrij.
- Modi: `steer`, `followup`, `collect`, `steer-backlog`, `interrupt` en de legacy één-tegelijk-`queue`-modus.
Details: [Commandowachtrij](/nl/concepts/queue) en [Sturingswachtrij](/nl/concepts/queue-steering).
## Eigendom van kanaalruns
## Eigenaarschap van kanaal-runs
Kanaalplugins kunnen volgorde bewaren, invoer debouncen en transport-backpressure toepassen voordat een bericht de sessiewachtrij binnenkomt. Ze mogen geen aparte timeout afdwingen rond de agent-turn zelf. Zodra een bericht naar een sessie is gerouteerd, wordt langlopende verwerking bestuurd door de sessie-, tool- en runtime-levenscyclus, zodat alle kanalen traag verlopen turns consistent rapporteren en herstellen.
Kanaalplugins mogen volgorde behouden, invoer debouncen en transport-backpressure toepassen voordat een bericht de sessiewachtrij binnenkomt. Ze moeten geen aparte timeout opleggen rond de agent-beurt zelf. Zodra een bericht naar een sessie is gerouteerd, wordt langlopende verwerking beheerd door de sessie-, tool- en runtime-levenscyclus, zodat alle kanalen traag verlopende beurten consistent rapporteren en herstellen.
## Streaming, chunking en batching
@ -130,50 +130,50 @@ Belangrijke instellingen:
- `agents.defaults.blockStreamingDefault` (`on|off`, standaard uit)
- `agents.defaults.blockStreamingBreak` (`text_end|message_end`)
- `agents.defaults.blockStreamingChunk` (`minChars|maxChars|breakPreference`)
- `agents.defaults.blockStreamingCoalesce` (idle-gebaseerde batching)
- `agents.defaults.blockStreamingCoalesce` (batching op basis van idle-tijd)
- `agents.defaults.humanDelay` (mensachtige pauze tussen blokantwoorden)
- Kanaaloverschrijvingen: `*.blockStreaming` en `*.blockStreamingCoalesce` (niet-Telegram-kanalen vereisen expliciet `*.blockStreaming: true`)
Details: [Streaming + chunking](/nl/concepts/streaming).
## Zichtbaarheid van redenatie en tokens
## Zichtbaarheid van redeneringen en tokens
OpenClaw kan modelredenatie tonen of verbergen:
OpenClaw kan modelredenering tonen of verbergen:
- `/reasoning on|off|stream` regelt de zichtbaarheid.
- Redenatie-inhoud telt nog steeds mee voor tokengebruik wanneer die door het model wordt geproduceerd.
- Telegram ondersteunt reasoning-stream naar de conceptballon.
- Redeneercontent telt nog steeds mee voor tokengebruik wanneer die door het model wordt geproduceerd.
- Telegram ondersteunt redeneerstreaming naar een tijdelijke conceptballon die na definitieve aflevering wordt verwijderd; gebruik `/reasoning on` voor blijvende redeneeruitvoer.
Details: [Denk- en redenatie-directives](/nl/tools/thinking) en [Tokengebruik](/nl/reference/token-use).
Details: [Denk- en redeneer-directives](/nl/tools/thinking) en [Tokengebruik](/nl/reference/token-use).
## Voorvoegsels, threading en antwoorden
Opmaak van uitgaande berichten is gecentraliseerd in `messages`:
- `messages.responsePrefix`, `channels.<channel>.responsePrefix` en `channels.<channel>.accounts.<id>.responsePrefix` (cascade voor uitgaand voorvoegsel), plus `channels.whatsapp.messagePrefix` (inkomend WhatsApp-voorvoegsel)
- Antwoord-threading via `replyToMode` en standaardinstellingen per kanaal
- `messages.responsePrefix`, `channels.<channel>.responsePrefix` en `channels.<channel>.accounts.<id>.responsePrefix` (cascade van uitgaande voorvoegsels), plus `channels.whatsapp.messagePrefix` (WhatsApp-voorvoegsel voor inkomende berichten)
- Antwoord-threading via `replyToMode` en standaarden per kanaal
Details: [Configuratie](/nl/gateway/config-agents#messages) en kanaaldocumentatie.
## Stille antwoorden
Het exacte stille token `NO_REPLY` / `no_reply` betekent “lever geen voor de gebruiker zichtbaar antwoord af”.
Wanneer een turn ook pending toolmedia heeft, zoals gegenereerde TTS-audio, verwijdert OpenClaw de stille tekst maar levert het nog steeds de mediabijlage.
OpenClaw bepaalt dat gedrag per gesprekstype:
Wanneer een beurt ook pending toolmedia heeft, zoals gegenereerde TTS-audio, stript OpenClaw de stille tekst maar levert het de mediabijlage nog steeds af.
OpenClaw lost dat gedrag op per gesprekstype:
- Directe gesprekken staan stilte standaard niet toe en herschrijven een kaal stil antwoord naar een korte zichtbare fallback.
- Groepen/kanalen staan stilte standaard toe.
- Interne orkestratie staat stilte standaard toe.
OpenClaw gebruikt ook stille antwoorden voor interne runner-fouten die optreden vóór een assistant-antwoord in niet-directe chats, zodat groepen/kanalen geen standaard Gateway-fouttekst zien. Directe chats tonen standaard compacte fouttekst; ruwe runner-details worden alleen getoond wanneer `/verbose` `on` of `full` is.
OpenClaw gebruikt stille antwoorden ook voor interne runner-fouten die plaatsvinden vóór enig assistent-antwoord in niet-directe chats, zodat groepen/kanalen geen standaard Gateway-fouttekst zien. Directe chats tonen standaard compacte fouttekst; ruwe runner-details worden alleen getoond wanneer `/verbose` `on` of `full` is.
Standaarden staan onder `agents.defaults.silentReply` en `agents.defaults.silentReplyRewrite`; `surfaces.<id>.silentReply` en `surfaces.<id>.silentReplyRewrite` kunnen ze per surface overschrijven.
Wanneer de bovenliggende sessie één of meer pending gespawnde subagent-runs heeft, worden kale stille antwoorden op alle surfaces verwijderd in plaats van herschreven, zodat de parent stil blijft totdat het voltooiingsevent van de child het echte antwoord levert.
Wanneer de bovenliggende sessie één of meer pending gespawnde subagent-runs heeft, worden kale stille antwoorden op alle surfaces gedropt in plaats van herschreven, zodat de parent stil blijft totdat de completion-event van het child het echte antwoord aflevert.
## Gerelateerd
- [Streaming](/nl/concepts/streaming) — realtime berichtlevering
- [Opnieuw proberen](/nl/concepts/retry) — retry-gedrag voor berichtlevering
- [Streaming](/nl/concepts/streaming) — realtime berichtaflevering
- [Opnieuw proberen](/nl/concepts/retry) — retry-gedrag voor berichtaflevering
- [Wachtrij](/nl/concepts/queue) — wachtrij voor berichtverwerking
- [Kanalen](/nl/channels) — integraties met messagingplatforms
- [Kanalen](/nl/channels) — integraties met berichtenplatforms

View File

@ -1,23 +1,28 @@
---
read_when:
- Zichtbare voortgangsupdates configureren voor langlopende chatbeurten
- Kiezen tussen gedeeltelijke, blok- en voortgangsstreamingmodi
- Uitleg over hoe OpenClaw één kanaalbericht bijwerkt terwijl er werk wordt uitgevoerd
- Problemen oplossen met voortgangsconcepten, zelfstandige voortgangsberichten of finalisatie-fallback
summary: 'Voortgangsconcepten: één zichtbaar bericht voor werk in uitvoering dat wordt bijgewerkt terwijl een agent draait'
- Zichtbare voortgangsupdates configureren voor langdurige chatbeurten
- Kiezen tussen streamingmodi voor gedeeltelijke updates, blokken en voortgang
- Uitleg over hoe OpenClaw één kanaalbericht bijwerkt terwijl werk wordt uitgevoerd
- Probleemoplossing voor voortgangsconcepten, zelfstandige voortgangsberichten of terugval bij afronding
summary: 'Voortgangsconcepten: één zichtbaar bericht over werk in uitvoering dat wordt bijgewerkt terwijl een agent draait'
title: Voortgangsconcepten
x-i18n:
generated_at: "2026-05-04T02:23:19Z"
generated_at: "2026-05-04T07:03:55Z"
model: gpt-5.5
provider: openai
source_hash: 8ce19262800f1c3c3e505a3cf1d41ed5c3dffcbca168ad7b7afabdce62eee8fe
source_hash: f78c07866cd7f613012a80a40413e5866c1dd2edd477088f9fc141347f5f3788
source_path: concepts/progress-drafts.md
workflow: 16
---
Voortgangsconcepten laten langlopende agentbeurten levendig aanvoelen in chat zonder het gesprek te veranderen in een stapel tijdelijke statusantwoorden.
Voortgangsconcepten laten langlopende agentbeurten levendig aanvoelen in chat zonder
het gesprek te veranderen in een stapel tijdelijke statusantwoorden.
Wanneer voortgangsconcepten zijn ingeschakeld, maakt OpenClaw pas één zichtbaar werk-in-uitvoering-bericht nadat de beurt bewijst dat er echt werk wordt gedaan, werkt het dit bij terwijl de agent leest, plant, tools aanroept of op goedkeuring wacht, en zet het dat concept daarna om in het definitieve antwoord wanneer het kanaal dat veilig kan doen.
Wanneer voortgangsconcepten zijn ingeschakeld, maakt OpenClaw pas een zichtbaar
werk-in-uitvoeringbericht aan nadat de beurt bewijst dat er echt werk wordt gedaan,
werkt het bij terwijl de agent leest, plant, tools aanroept of op goedkeuring
wacht, en zet dat concept daarna om in het definitieve antwoord wanneer het kanaal
dat veilig kan doen.
```text
Shelling...
@ -26,9 +31,10 @@ Shelling...
🛠️ Exec: run tests
```
Gebruik voortgangsconcepten wanneer je één nette statusmelding wilt tijdens toolintensief werk en het definitieve antwoord wanneer de beurt klaar is.
Gebruik voortgangsconcepten wanneer je één net statusbericht wilt tijdens
toolintensief werk en het definitieve antwoord wanneer de beurt klaar is.
## Snel starten
## Snelstart
Schakel voortgangsconcepten per kanaal in met `streaming.mode: "progress"`:
@ -44,47 +50,59 @@ Schakel voortgangsconcepten per kanaal in met `streaming.mode: "progress"`:
}
```
Dat is meestal genoeg. OpenClaw kiest automatisch een label van één woord, wacht totdat werk minstens vijf seconden duurt of een tweede werkgebeurtenis uitzendt, voegt compacte voortgangsregels toe terwijl nuttig werk plaatsvindt, en onderdrukt dubbele losse voortgangspraat voor die beurt.
Dat is meestal genoeg. OpenClaw kiest automatisch een label van één woord, wacht
tot het werk minstens vijf seconden duurt of een tweede werkgebeurtenis uitstoot,
voegt compacte voortgangsregels toe terwijl nuttig werk plaatsvindt, en onderdrukt
dubbele losse voortgangspraat voor die beurt.
## Wat gebruikers zien
Een voortgangsconcept heeft twee delen:
Een voortgangsconcept heeft twee onderdelen:
| Deel | Doel |
| ----------------- | ---------------------------------------------------------------------------- |
| Label | Een korte titel zoals `Thinking...` of `Shelling...`. |
| Voortgangsregels | Compacte uitvoeringsupdates met dezelfde toollabels en pictogrammen als uitgebreide uitvoer. |
| Onderdeel | Doel |
| ---------------- | --------------------------------------------------------------------------- |
| Label | Een korte titel zoals `Thinking...` of `Shelling...`. |
| Voortgangsregels | Compacte run-updates met dezelfde toollabels en pictogrammen als uitgebreide uitvoer. |
Het label verschijnt nadat de agent betekenisvol werk start en ofwel vijf seconden bezig blijft of een tweede werkgebeurtenis uitzendt. Antwoorden met alleen platte tekst tonen geen voortgangsconcept. Voortgangsregels worden alleen toegevoegd wanneer de agent nuttige werkupdates uitzendt, bijvoorbeeld `🛠️ Exec`, `🔎 Web Search`, of `✍️ Write: to /tmp/file`.
Standaard gebruiken ze dezelfde compacte uitlegmodus als `/verbose`; stel
`agents.defaults.toolProgressDetail: "raw"` in bij het debuggen en wanneer je ook ruwe opdrachten/details toegevoegd wilt hebben.
Het definitieve antwoord vervangt het concept wanneer dat mogelijk is; anders stuurt
OpenClaw het definitieve antwoord normaal en ruimt het het concept op of stopt het met bijwerken volgens het transport van het kanaal.
Het label verschijnt nadat de agent betekenisvol werk start en ofwel vijf
seconden bezig blijft of een tweede werkgebeurtenis uitstoot. Antwoorden met
alleen platte tekst tonen geen voortgangsconcept. Voortgangsregels worden alleen
toegevoegd wanneer de agent nuttige werkupdates uitstoot, bijvoorbeeld
`🛠️ Exec`, `🔎 Web Search` of `✍️ Write: to /tmp/file`. Standaard gebruiken ze
dezelfde compacte uitlegmodus als `/verbose`; stel
`agents.defaults.toolProgressDetail: "raw"` in wanneer je aan het debuggen bent
en ook ruwe opdrachten/details toegevoegd wilt hebben.
Het definitieve antwoord vervangt het concept waar mogelijk; anders verzendt
OpenClaw het definitieve antwoord normaal en ruimt het het concept op of stopt
het met bijwerken volgens het transport van het kanaal.
## Kies een modus
`channels.<channel>.streaming.mode` bepaalt het zichtbare gedrag tijdens uitvoering:
`channels.<channel>.streaming.mode` bepaalt het zichtbare gedrag tijdens werk in uitvoering:
| Modus | Het meest geschikt voor | Wat in chat verschijnt |
| ---------- | --------------------------------- | ------------------------------------------------- |
| `off` | Stille kanalen | Alleen het definitieve antwoord. |
| `partial` | Antwoordtekst zien verschijnen | Eén concept dat wordt bewerkt met de nieuwste antwoordtekst. |
| `block` | Grotere antwoordvoorbeeldblokken | Eén voorbeeld dat wordt bijgewerkt of aangevuld in grotere blokken. |
| Modus | Beste voor | Wat er in chat verschijnt |
| ---------- | -------------------------------- | ------------------------------------------------- |
| `off` | Stille kanalen | Alleen het definitieve antwoord. |
| `partial` | Antwoordtekst zien verschijnen | Eén concept bewerkt met de nieuwste antwoordtekst. |
| `block` | Grotere voorbeeldchunks van antwoorden | Eén voorbeeld dat in grotere chunks wordt bijgewerkt of aangevuld. |
| `progress` | Toolintensieve of langlopende beurten | Eén statusconcept, daarna het definitieve antwoord. |
Kies `progress` wanneer gebruikers meer geven om "wat er gebeurt" dan om de antwoordtekst token voor token te zien streamen.
Kies `progress` wanneer gebruikers meer geven om "wat er gebeurt" dan om de
antwoordtekst token voor token te zien streamen.
Kies `partial` wanneer het antwoord zelf het voortgangssignaal is.
Kies `block` wanneer je conceptvoorbeeldupdates in grotere tekstblokken wilt. Op
Discord en Telegram is `streaming.mode: "block"` nog steeds voorbeeldstreaming, geen normale bloklevering. Gebruik `streaming.block.enabled` of de verouderde
Kies `block` wanneer je conceptvoorbeeldupdates in grotere tekstchunks wilt. Op
Discord en Telegram is `streaming.mode: "block"` nog steeds voorbeeldstreaming,
geen normale bloklevering. Gebruik `streaming.block.enabled` of legacy
`blockStreaming` wanneer je normale blokantwoorden wilt.
## Labels configureren
Voortgangslabels staan onder `channels.<channel>.streaming.progress`.
Het standaardlabel is `auto`, dat kiest uit OpenClaw's ingebouwde labelverzameling van één woord met ellips:
Het standaardlabel is `auto`, dat kiest uit de ingebouwde labelpool van OpenClaw
met één woord en een beletselteken:
```text
Thinking...
@ -126,7 +144,7 @@ Gebruik een vast label:
}
```
Gebruik je eigen automatische labelverzameling:
Gebruik je eigen automatische labelpool:
```json5
{
@ -163,7 +181,9 @@ Verberg het label en toon alleen voortgangsregels:
## Voortgangsregels beheren
Voortgangsregels zijn standaard ingeschakeld in voortgangsmodus. Ze komen uit echte uitvoeringsgebeurtenissen: toolstarts, itemupdates, taakplannen, goedkeuringen, opdrachtuitvoer, patchsamenvattingen en vergelijkbare agentactiviteit.
Voortgangsregels zijn standaard ingeschakeld in voortgangsmodus. Ze komen uit
echte run-gebeurtenissen: toolstarts, itemupdates, taakplannen, goedkeuringen,
opdrachtuitvoer, patchsamenvattingen en vergelijkbare agentactiviteit.
OpenClaw gebruikt dezelfde formatter voor voortgangsconcepten en `/verbose`:
@ -178,13 +198,15 @@ OpenClaw gebruikt dezelfde formatter voor voortgangsconcepten en `/verbose`:
```
`"explain"` is de standaard en houdt concepten stabiel met beknopte labels zoals
`🛠️ Exec: check JS syntax for /tmp/app.js`. `"raw"` voegt de onderliggende opdracht/detail toe wanneer beschikbaar, wat nuttig is tijdens het debuggen maar rumoeriger is in chat.
`🛠️ Exec: check JS syntax for /tmp/app.js`. `"raw"` voegt de onderliggende
opdracht/detail toe wanneer beschikbaar, wat handig is tijdens debuggen maar
drukker is in chat.
Dezelfde opdracht verschijnt bijvoorbeeld anders afhankelijk van de detailmodus:
Dezelfde opdracht verschijnt bijvoorbeeld anders, afhankelijk van de detailmodus:
| Modus | Voortgangsregel |
| --------- | ------------------------------------------------------------------- |
| `explain` | `🛠️ Exec: check JS syntax for /tmp/app.js` |
| Modus | Voortgangsregel |
| --------- | ------------------------------------------------------------------ |
| `explain` | `🛠️ Exec: check JS syntax for /tmp/app.js` |
| `raw` | `🛠️ Exec: check JS syntax for /tmp/app.js, node --check /tmp/app.js` |
Beperk hoeveel regels zichtbaar blijven:
@ -204,7 +226,34 @@ Beperk hoeveel regels zichtbaar blijven:
}
```
Behoud het enkele voortgangsconcept maar verberg tool- en taakregels:
Voortgangsregels worden automatisch gecompacteerd om herschikking van chatballonnen te verminderen terwijl het concept wordt bewerkt.
OpenClaw kapt lange voortgangsregels standaard af zodat herhaalde conceptbewerkingen
niet bij elke update anders teruglopen. Het voorvoegsel blijft leesbaar, en lange
details zoals paden of ruwe opdrachten worden ingekort met een beletselteken.
Slack kan voortgangsregels weergeven als gestructureerde Block Kit-velden in
plaats van één tekstbody:
```json5
{
channels: {
slack: {
streaming: {
mode: "progress",
progress: {
render: "rich",
},
},
},
},
}
```
Rijke weergave behoudt dezelfde plattetekstfallback zodat kanalen en clients die
de rijkere vorm niet ondersteunen nog steeds de compacte voortgangstekst kunnen tonen.
Behoud het ene voortgangsconcept maar verberg tool- en taakregels:
```json5
{
@ -221,58 +270,79 @@ Behoud het enkele voortgangsconcept maar verberg tool- en taakregels:
}
```
Met `toolProgress: false` onderdrukt OpenClaw nog steeds de oudere losse toolvoortgangsberichten voor die beurt. Het kanaal blijft visueel rustig tot het definitieve antwoord, behalve het label als er een is geconfigureerd.
Met `toolProgress: false` onderdrukt OpenClaw nog steeds de oudere losse
toolvoortgangsberichten voor die beurt. Het kanaal blijft visueel rustig tot het
definitieve antwoord, behalve het label als er een is geconfigureerd.
## Kanaalgedrag
Elk kanaal gebruikt het schoonste transport dat het ondersteunt:
| Kanaal | Voortgangstransport | Opmerkingen |
| --------------- | -------------------------------------- | --------------------------------------------------------------------- |
| Discord | Stuur één bericht en bewerk het daarna. | Definitieve tekst wordt ter plekke bewerkt wanneer die in één veilig voorbeeldbericht past. |
| Matrix | Stuur één gebeurtenis en bewerk die daarna. | Streamingconfiguratie op accountniveau beheert concepten op accountniveau. |
| Microsoft Teams | Native Teams-stream in persoonlijke chats. | `streaming.mode: "block"` wordt toegewezen aan Teams-bloklevering. |
| Slack | Native stream of bewerkbaar conceptbericht. | Beschikbaarheid van threads beïnvloedt of native streaming kan worden gebruikt. |
| Telegram | Stuur één bericht en bewerk het daarna. | Oudere zichtbare concepten kunnen worden vervangen zodat definitieve tijdstempels nuttig blijven. |
| Mattermost | Bewerkbaar conceptbericht. | Toolactiviteit wordt samengevouwen in hetzelfde conceptachtige bericht. |
| Kanaal | Voortgangstransport | Opmerkingen |
| --------------- | ------------------------------------ | --------------------------------------------------------------------- |
| Discord | Eén bericht verzenden en daarna bewerken. | Definitieve tekst wordt ter plekke bewerkt wanneer die in één veilig voorbeeldbericht past. |
| Matrix | Eén gebeurtenis verzenden en daarna bewerken. | Streamingconfiguratie op accountniveau beheert concepten op accountniveau. |
| Microsoft Teams | Native Teams-stream in persoonlijke chats. | `streaming.mode: "block"` wordt gekoppeld aan Teams-bloklevering. |
| Slack | Native stream of bewerkbare conceptpost. | Beschikbaarheid van threads beïnvloedt of native streaming kan worden gebruikt. |
| Telegram | Eén bericht verzenden en daarna bewerken. | Oudere zichtbare concepten kunnen worden vervangen zodat definitieve tijdstempels nuttig blijven. |
| Mattermost | Bewerkbare conceptpost. | Toolactiviteit wordt samengevoegd in dezelfde conceptachtige post. |
Kanalen zonder veilige bewerkingsondersteuning vallen meestal terug op typindicatoren of levering met alleen het definitieve antwoord.
Kanalen zonder veilige bewerkingsondersteuning vallen meestal terug op
typindicatoren of levering met alleen het definitieve antwoord.
## Afronding
## Finalisatie
Wanneer het definitieve antwoord klaar is, probeert OpenClaw de chat schoon te houden:
- Als het concept veilig het definitieve antwoord kan worden, bewerkt OpenClaw het ter plekke.
- Als het kanaal native voortgangsstreaming gebruikt, rondt OpenClaw die stream af wanneer het native transport de definitieve tekst accepteert.
- Als het definitieve antwoord media, een goedkeuringsprompt, een expliciet antwoorddoel, te veel chunks of een mislukte bewerking/verzending heeft, stuurt OpenClaw het definitieve antwoord via het normale leveringspad van het kanaal.
- Als het kanaal native voortgangsstreaming gebruikt, finaliseert OpenClaw die stream
wanneer het native transport de definitieve tekst accepteert.
- Als het definitieve antwoord media, een goedkeuringsprompt, een expliciet antwoorddoel,
te veel chunks of een mislukte bewerking/verzending heeft, verzendt OpenClaw het
definitieve antwoord via het normale leveringspad van het kanaal.
Het terugvalpad is opzettelijk. Het is beter om een nieuw definitief antwoord te sturen dan tekst te verliezen, een antwoord in de verkeerde thread te plaatsen of een concept te overschrijven met een payload die het kanaal niet veilig kan weergeven.
Het fallbackpad is opzettelijk. Het is beter om een vers definitief antwoord te
verzenden dan tekst kwijt te raken, een antwoord in de verkeerde thread te plaatsen
of een concept te overschrijven met een payload die het kanaal niet veilig kan weergeven.
## Problemen oplossen
## Probleemoplossing
**Ik zie alleen het definitieve antwoord.**
Controleer of `channels.<channel>.streaming.mode` is ingesteld op `progress` voor het account of kanaal dat het bericht heeft verwerkt. Sommige groeps- of citaatantwoordpaden kunnen conceptvoorbeelden voor een beurt uitschakelen wanneer het kanaal het juiste bericht niet veilig kan bewerken.
Controleer of `channels.<channel>.streaming.mode` is ingesteld op `progress` voor
het account of kanaal dat het bericht heeft verwerkt. Sommige groeps- of
quote-reply-paden kunnen conceptvoorbeelden voor een beurt uitschakelen wanneer
het kanaal niet veilig het juiste bericht kan bewerken.
**Ik zie het label maar geen toolregels.**
Controleer `streaming.progress.toolProgress`. Als dit `false` is, behoudt OpenClaw het gedrag met één concept maar verbergt het tool- en taakvoortgangsregels.
Controleer `streaming.progress.toolProgress`. Als dit `false` is, behoudt
OpenClaw het gedrag met één concept maar verbergt het tool- en taakvoortgangsregels.
**Ik zie een nieuw definitief bericht in plaats van een bewerkt concept.**
Dat is een veiligheidsterugval. Dit kan gebeuren bij media-antwoorden, lange antwoorden, expliciete antwoorddoelen, oude Telegram-concepten, ontbrekende Slack-threaddoelen, verwijderde voorbeeldberichten of mislukte afronding van native streams.
Dat is een veiligheidsfallback. Dit kan gebeuren bij media-antwoorden, lange
antwoorden, expliciete antwoorddoelen, oude Telegram-concepten, ontbrekende
Slack-threaddoelen, verwijderde voorbeeldberichten of mislukte finalisatie van
native streams.
**Ik zie nog steeds losse voortgangsberichten.**
Voortgangsmodus onderdrukt standaard losse toolvoortgangsberichten wanneer een concept actief is. Als losse berichten nog steeds verschijnen, controleer dan of de beurt daadwerkelijk voortgangsmodus gebruikt en niet `streaming.mode: "off"` of een kanaalpad dat geen concept voor dat bericht kan maken.
Voortgangsmodus onderdrukt standaard losse toolvoortgangsberichten wanneer een
concept actief is. Als losse berichten nog steeds verschijnen, controleer dan of
de beurt daadwerkelijk voortgangsmodus gebruikt en niet `streaming.mode: "off"`
of een kanaalpad dat geen concept voor dat bericht kan aanmaken.
**Teams gedraagt zich anders dan Discord of Telegram.**
Microsoft Teams gebruikt een native stream in persoonlijke chats in plaats van het generieke transport voor verzenden-en-bewerken van voorbeelden. Teams behandelt `streaming.mode: "block"` ook als Teams-bloklevering omdat het niet dezelfde blokmodus voor conceptvoorbeelden heeft die Discord en Telegram gebruiken.
Microsoft Teams gebruikt een native stream in persoonlijke chats in plaats van
het generieke voorbeeldtransport met verzenden en bewerken. Teams behandelt
`streaming.mode: "block"` ook als Teams-bloklevering omdat het niet dezelfde
blokmodus voor conceptvoorbeelden heeft die Discord en Telegram gebruiken.
## Gerelateerd
- [Streaming en chunking](/nl/concepts/streaming)
- [Streamen en chunken](/nl/concepts/streaming)
- [Berichten](/nl/concepts/messages)
- [Kanaalconfiguratie](/nl/gateway/config-channels)
- [Discord](/nl/channels/discord)

View File

@ -2,59 +2,60 @@
read_when:
- Begrijpen hoe de QA-stack samenhangt
- qa-lab, qa-channel of een transportadapter uitbreiden
- Repo-ondersteunde QA-scenario's toevoegen
- Door de repository ondersteunde QA-scenario's toevoegen
- Realistischere QA-automatisering rond het Gateway-dashboard bouwen
summary: 'QA-stackoverzicht: qa-lab, qa-channel, door de repo ondersteunde scenario''s, live transportlanes, transportadapters en rapportage.'
summary: 'Overzicht van de QA-stack: qa-lab, qa-channel, repo-ondersteunde scenario''s, live transportlanen, transportadapters en rapportage.'
title: QA-overzicht
x-i18n:
generated_at: "2026-05-03T21:30:50Z"
generated_at: "2026-05-04T07:04:46Z"
model: gpt-5.5
provider: openai
source_hash: 6a1446fddb00855634d34662a0a47be1e5054a9e7bfed5bc9ae21185d87094d8
source_hash: 067f5aa0831724659ae36d548ef2e7bd28b40aad9cef45f325a01a2748003b29
source_path: concepts/qa-e2e-automation.md
workflow: 16
---
De private QA-stack is bedoeld om OpenClaw op een realistischer,
kanaalvormige manier te oefenen dan met een enkele unit test kan.
De private QA-stack is bedoeld om OpenClaw op een realistischere,
kanaalvormige manier te oefenen dan een enkele unit-test kan.
Huidige onderdelen:
- `extensions/qa-channel`: synthetisch berichtenkanaal met oppervlakken voor DM, kanaal, thread,
reactie, bewerking en verwijdering.
- `extensions/qa-lab`: debugger-UI en QA-bus om het transcript te observeren,
inkomende berichten te injecteren en een Markdown-rapport te exporteren.
- `extensions/qa-channel`: synthetisch berichtkanaal met oppervlakken voor DM, kanaal, thread,
reactie, bewerken en verwijderen.
- `extensions/qa-lab`: debugger-UI en QA-bus voor het observeren van het transcript,
het injecteren van inkomende berichten en het exporteren van een Markdown-rapport.
- `extensions/qa-matrix`, toekomstige runner-plugins: live-transportadapters die
een echt kanaal aansturen binnen een onderliggende QA-Gateway.
- `qa/`: repo-ondersteunde seed-assets voor de starttaak en baseline-QA
een echt kanaal aansturen binnen een onderliggende QA-gateway.
- `qa/`: repo-ondersteunde seed-assets voor de starttaak en baseline-QA-
scenario's.
- [Mantis](/nl/concepts/mantis): liveverificatie voor en na voor bugs die
- [Mantis](/nl/concepts/mantis): verificatie voor en na live uitvoering voor bugs die
echte transports, browserscreenshots, VM-status en PR-bewijs nodig hebben.
## Commando-interface
## Commandosurface
Elke QA-flow draait onder `pnpm openclaw qa <subcommand>`. Veel hebben `pnpm qa:*`
scriptaliassen; beide vormen worden ondersteund.
| Commando | Doel |
| --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `qa run` | Gebundelde QA-zelfcontrole; schrijft een Markdown-rapport. |
| `qa suite` | Voer repo-ondersteunde scenario's uit tegen de QA-Gateway-lane. Aliassen: `pnpm openclaw qa suite --runner multipass` voor een wegwerpbare Linux-VM. |
| `qa coverage` | Print de markdown-inventaris voor scenariodekking (`--json` voor machine-uitvoer). |
| `qa parity-report` | Vergelijk twee `qa-suite-summary.json`-bestanden en schrijf het agentische pariteitsrapport. |
| `qa character-eval` | Voer het character-QA-scenario uit over meerdere live modellen met een beoordeeld rapport. Zie [Rapportage](#reporting). |
| `qa manual` | Voer een eenmalige prompt uit tegen de geselecteerde provider/model-lane. |
| `qa ui` | Start de QA-debugger-UI en lokale QA-bus (alias: `pnpm qa:lab:ui`). |
| `qa docker-build-image` | Bouw de voorgebakken QA-Docker-image. |
| `qa docker-scaffold` | Schrijf een docker-compose-scaffold voor het QA-dashboard + de Gateway-lane. |
| `qa up` | Bouw de QA-site, start de Docker-ondersteunde stack, print de URL (alias: `pnpm qa:lab:up`; variant `:fast` voegt `--use-prebuilt-image --bind-ui-dist --skip-ui-build` toe). |
| `qa aimock` | Start alleen de AIMock-provider-server. |
| `qa mock-openai` | Start alleen de scenariobewuste `mock-openai`-provider-server. |
| `qa credentials doctor` / `add` / `list` / `remove` | Beheer de gedeelde Convex-credentialpool. |
| `qa matrix` | Live transport-lane tegen een wegwerpbare Tuwunel-homeserver. Zie [Matrix-QA](/nl/concepts/qa-matrix). |
| `qa telegram` | Live transport-lane tegen een echte private Telegram-groep. |
| `qa discord` | Live transport-lane tegen een echt privaat Discord-guildkanaal. |
| `qa mantis` | Verificatierunner voor en na voor live-transportbugs, met het eerste Discord-statusreactiescenario. Zie [Mantis](/nl/concepts/mantis). |
| Commando | Doel |
| --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `qa run` | Gebundelde QA-zelfcontrole; schrijft een Markdown-rapport. |
| `qa suite` | Voer repo-ondersteunde scenario's uit tegen de QA-gateway-lane. Aliassen: `pnpm openclaw qa suite --runner multipass` voor een wegwerpbare Linux-VM. |
| `qa coverage` | Print de markdown-scenario-dekkingsinventaris (`--json` voor machine-uitvoer). |
| `qa parity-report` | Vergelijk twee `qa-suite-summary.json`-bestanden en schrijf het agentische pariteitsrapport. |
| `qa character-eval` | Voer het character-QA-scenario uit over meerdere live modellen met een beoordeeld rapport. Zie [Rapportage](#reporting). |
| `qa manual` | Voer een eenmalige prompt uit tegen de geselecteerde provider/model-lane. |
| `qa ui` | Start de QA-debugger-UI en lokale QA-bus (alias: `pnpm qa:lab:ui`). |
| `qa docker-build-image` | Bouw de vooraf gebakken QA-Docker-image. |
| `qa docker-scaffold` | Schrijf een docker-compose-scaffold voor het QA-dashboard + gateway-lane. |
| `qa up` | Bouw de QA-site, start de Docker-ondersteunde stack, print de URL (alias: `pnpm qa:lab:up`; `:fast`-variant voegt `--use-prebuilt-image --bind-ui-dist --skip-ui-build` toe). |
| `qa aimock` | Start alleen de AIMock-provider-server. |
| `qa mock-openai` | Start alleen de scenario-bewuste `mock-openai`-provider-server. |
| `qa credentials doctor` / `add` / `list` / `remove` | Beheer de gedeelde Convex-credentialpool. |
| `qa matrix` | Live transport-lane tegen een wegwerpbare Tuwunel-homeserver. Zie [Matrix QA](/nl/concepts/qa-matrix). |
| `qa telegram` | Live transport-lane tegen een echte private Telegram-groep. |
| `qa discord` | Live transport-lane tegen een echt privaat Discord-guildkanaal. |
| `qa slack` | Live transport-lane tegen een echt privaat Slack-kanaal. |
| `qa mantis` | Verificatierunner voor en na voor live transport-bugs, met Discord-statusreactie-bewijs, Crabbox-desktop/browser-smoke en Slack-in-VNC-smoke. Zie [Mantis](/nl/concepts/mantis). |
## Operatorflow
@ -63,19 +64,19 @@ De huidige QA-operatorflow is een QA-site met twee panelen:
- Links: Gateway-dashboard (Control UI) met de agent.
- Rechts: QA Lab, met het Slack-achtige transcript en scenarioplan.
Voer het uit met:
Voer dit uit met:
```bash
pnpm qa:lab:up
```
Dat bouwt de QA-site, start de Docker-ondersteunde Gateway-lane en stelt de
QA Lab-pagina beschikbaar waar een operator of automatiseringslus de agent een
QA-missie kan geven, echt kanaalgedrag kan observeren en kan vastleggen wat werkte, mislukte of
geblokkeerd bleef.
Dat bouwt de QA-site, start de Docker-ondersteunde gateway-lane en stelt de
QA Lab-pagina beschikbaar waar een operator of automatiseringslus de agent een QA-
missie kan geven, echt kanaalgedrag kan observeren en kan vastleggen wat werkte,
mislukte of geblokkeerd bleef.
Voor snellere QA Lab-UI-iteratie zonder de Docker-image telkens opnieuw te bouwen,
start je de stack met een bind-gemounte QA Lab-bundel:
Voor snellere QA Lab-UI-iteratie zonder telkens de Docker-image opnieuw te bouwen,
start je de stack met een bind-mounted QA Lab-bundel:
```bash
pnpm openclaw qa docker-build-image
@ -86,27 +87,27 @@ pnpm qa:lab:watch
`qa:lab:up:fast` houdt de Docker-services op een vooraf gebouwde image en bind-mount
`extensions/qa-lab/web/dist` in de `qa-lab`-container. `qa:lab:watch`
bouwt die bundel opnieuw bij wijzigingen, en de browser herlaadt automatisch wanneer de QA Lab
bouwt die bundel opnieuw bij wijzigingen, en de browser herlaadt automatisch wanneer de QA Lab-
asset-hash verandert.
Voor een lokale OpenTelemetry-trace-smoke voer je uit:
Voor een lokale OpenTelemetry trace-smoke voer je uit:
```bash
pnpm qa:otel:smoke
```
Dat script start een lokale OTLP/HTTP-traceontvanger, voert het
`otel-trace-smoke` QA-scenario uit met de `diagnostics-otel`-plugin ingeschakeld, decodeert daarna
`otel-trace-smoke` QA-scenario uit met de `diagnostics-otel` Plugin ingeschakeld, decodeert daarna
de geëxporteerde protobuf-spans en controleert de releasekritieke vorm:
`openclaw.run`, `openclaw.harness.run`, `openclaw.model.call`,
`openclaw.context.assembled` en `openclaw.message.delivery` moeten aanwezig zijn;
model-calls mogen bij geslaagde turns geen `StreamAbandoned` exporteren; ruwe diagnostische ID's en
modelaanroepen mogen `StreamAbandoned` niet exporteren bij geslaagde turns; ruwe diagnostische ID's en
`openclaw.content.*`-attributen moeten buiten de trace blijven. Het schrijft
`otel-smoke-summary.json` naast de QA-suite-artifacts.
Observability-QA blijft alleen voor source-checkouts. De npm-tarball laat
QA Lab bewust weg, dus package-Docker-release-lanes voeren geen `qa`-commando's uit. Gebruik
`pnpm qa:otel:smoke` vanuit een gebouwde source-checkout wanneer je diagnostische
`pnpm qa:otel:smoke` vanuit een gebouwde source-checkout wanneer je diagnostics-
instrumentatie wijzigt.
Voor een transport-echte Matrix-smoke-lane voer je uit:
@ -115,37 +116,56 @@ Voor een transport-echte Matrix-smoke-lane voer je uit:
pnpm openclaw qa matrix --profile fast --fail-fast
```
De volledige CLI-referentie, profiel-/scenariocatalogus, env vars en artifact-indeling voor deze lane staan in [Matrix-QA](/nl/concepts/qa-matrix). In het kort: het provisiont een wegwerpbare Tuwunel-homeserver in Docker, registreert tijdelijke driver/SUT/observer-gebruikers, voert de echte Matrix-plugin uit binnen een onderliggende QA-Gateway die tot dat transport is beperkt (geen `qa-channel`), en schrijft daarna een Markdown-rapport, JSON-samenvatting, observed-events-artifact en gecombineerd uitvoerlog onder `.artifacts/qa-e2e/matrix-<timestamp>/`.
De volledige CLI-referentie, profiel/scenario-catalogus, env-vars en artifactindeling voor deze lane staan in [Matrix QA](/nl/concepts/qa-matrix). In het kort: het provisiont een wegwerpbare Tuwunel-homeserver in Docker, registreert tijdelijke driver/SUT/observer-gebruikers, voert de echte Matrix-Plugin uit binnen een onderliggende QA-gateway die tot dat transport is beperkt (geen `qa-channel`), en schrijft daarna een Markdown-rapport, JSON-samenvatting, observed-events-artifact en gecombineerde uitvoerlog onder `.artifacts/qa-e2e/matrix-<timestamp>/`.
Voor transport-echte Telegram- en Discord-smoke-lanes:
Voor transport-echte Telegram-, Discord- en Slack-smoke-lanes:
```bash
pnpm openclaw qa telegram
pnpm openclaw qa discord
pnpm openclaw qa slack
```
Beide richten zich op een vooraf bestaand echt kanaal met twee bots (driver + SUT). Vereiste env vars, scenariolijsten, uitvoer-artifacts en de Convex-credentialpool zijn hieronder gedocumenteerd in [Telegram- en Discord-QA-referentie](#telegram-and-discord-qa-reference).
Ze richten zich op een vooraf bestaand echt kanaal met twee bots (driver + SUT). Vereiste env-vars, scenariolijsten, uitvoerartifacts en de Convex-credentialpool zijn hieronder gedocumenteerd in [Telegram-, Discord- en Slack-QA-referentie](#telegram-discord-and-slack-qa-reference).
Voer vóór gebruik van gepoolde live credentials uit:
Voor een volledige Slack-desktop-VM-run met VNC-redding voer je uit:
```bash
pnpm openclaw qa mantis slack-desktop-smoke \
--gateway-setup \
--scenario slack-canary \
--keep-lease
```
Dat commando leaset een Crabbox-desktop/browser-machine, voert de Slack-live-lane
uit binnen de VM, opent Slack Web in de VNC-browser, legt de desktop vast en
kopieert `slack-qa/` plus `slack-desktop-smoke.png` terug naar de Mantis-artifact-
directory. Hergebruik `--lease-id <cbx_...>` nadat je handmatig via VNC bij Slack Web bent ingelogd.
Met `--gateway-setup` laat Mantis een persistente OpenClaw Slack-
gateway draaien binnen de VM op poort `38973`; zonder dit voert het commando de
normale bot-naar-bot Slack-QA-lane uit en stopt het na artifact-vastlegging.
Voer dit uit voordat je gepoolde live credentials gebruikt:
```bash
pnpm openclaw qa credentials doctor
```
De doctor controleert de Convex-broker-env, valideert endpointinstellingen en verifieert admin/list-bereikbaarheid wanneer het maintainer-secret aanwezig is. Hij rapporteert voor secrets alleen de status gezet/ontbrekend.
De doctor controleert de Convex-broker-env, valideert endpointinstellingen en verifieert admin/list-bereikbaarheid wanneer het maintainer-secret aanwezig is. Het rapporteert alleen ingesteld/ontbrekend-status voor secrets.
## Live transport-dekking
Live transport-lanes delen één contract in plaats van elk hun eigen vorm voor scenariolijsten te bedenken. `qa-channel` is de brede synthetische suite voor productgedrag en maakt geen deel uit van de live transport-dekkingsmatrix.
Live transport-lanes delen één contract in plaats van elk hun eigen scenariolijstvorm te bedenken. `qa-channel` is de brede synthetische productgedrag-suite en maakt geen deel uit van de live transport-dekkingsmatrix.
| Lane | Canary | Mention-gating | Bot-naar-bot | Allowlist-blokkade | Top-level antwoord | Herstart hervatten | Thread-follow-up | Thread-isolatie | Reactie-observatie | Help-commando | Registratie van native commando |
| -------- | ------ | -------------- | ------------ | ------------------ | ------------------ | ------------------ | ---------------- | ---------------- | ------------------ | ------------- | ------------------------------- |
| Matrix | x | x | x | x | x | x | x | x | x | | |
| Telegram | x | x | x | | | | | | | x | |
| Discord | x | x | x | | | | | | | | x |
| Lane | Canary | Mention-gating | Bot-naar-bot | Allowlist-blokkade | Top-level antwoord | Herstart hervatten | Thread-opvolging | Thread-isolatie | Reactie-observatie | Helpcommando | Native command-registratie |
| -------- | ------ | -------------- | ------------ | ------------------ | ------------------ | ------------------ | ---------------- | --------------- | ------------------ | ------------ | -------------------------- |
| Matrix | x | x | x | x | x | x | x | x | x | | |
| Telegram | x | x | x | | | | | | | x | |
| Discord | x | x | x | | | | | | | | x |
| Slack | x | x | x | | | | | | | | |
Dit houdt `qa-channel` als de brede suite voor productgedrag, terwijl Matrix,
Telegram en toekomstige live transports één expliciete transportcontract-
Dit houdt `qa-channel` als de brede productgedrag-suite terwijl Matrix,
Telegram en toekomstige live transports één expliciete transport-contract-
checklist delen.
Voor een wegwerpbare Linux-VM-lane zonder Docker in het QA-pad te brengen, voer je uit:
@ -154,50 +174,50 @@ Voor een wegwerpbare Linux-VM-lane zonder Docker in het QA-pad te brengen, voer
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
```
Dit start een verse Multipass-guest, installeert afhankelijkheden, bouwt OpenClaw
binnen de guest, voert `qa suite` uit en kopieert daarna het normale QA-rapport en
de samenvatting terug naar `.artifacts/qa-e2e/...` op de host.
Het hergebruikt hetzelfde scenariokeuzegedrag als `qa suite` op de host.
Host- en Multipass-suite-runs voeren standaard meerdere geselecteerde scenario's parallel uit
met geïsoleerde Gateway-workers. `qa-channel` gebruikt standaard concurrency
4, begrensd door het geselecteerde aantal scenario's. Gebruik `--concurrency <count>` om
het aantal workers af te stemmen, of `--concurrency 1` voor seriële uitvoering.
Het commando eindigt met een niet-nul exitcode wanneer een scenario faalt. Gebruik `--allow-failures` wanneer
je artifacts wilt zonder falende exitcode.
Live runs sturen de ondersteunde QA-auth-invoer door die praktisch is voor de
guest: env-gebaseerde providersleutels, het pad naar de QA-liveproviderconfiguratie en
`CODEX_HOME` wanneer aanwezig. Houd `--output-dir` onder de repo-root zodat de guest
via de gemounte workspace kan terugschrijven.
Hiermee start je een verse Multipass-gast, installeer je afhankelijkheden, bouw je OpenClaw
binnen de gast, voer je `qa suite` uit en kopieer je daarna het normale QA-rapport en de
samenvatting terug naar `.artifacts/qa-e2e/...` op de host.
Het gebruikt hetzelfde scenarioselectiegedrag als `qa suite` op de host.
Host- en Multipass-suite-uitvoeringen voeren standaard meerdere geselecteerde scenario's parallel uit
met geisoleerde Gateway-workers. `qa-channel` gebruikt standaard gelijktijdigheid
4, begrensd door het aantal geselecteerde scenario's. Gebruik `--concurrency <count>` om
het aantal workers af te stemmen, of `--concurrency 1` voor seriele uitvoering.
De opdracht sluit af met een niet-nulstatus wanneer een scenario mislukt. Gebruik `--allow-failures` wanneer
je artefacten wilt zonder een foutieve exitcode.
Live-uitvoeringen sturen de ondersteunde QA-authenticatie-invoer door die praktisch is voor de
gast: op env gebaseerde providersleutels, het pad naar de QA-liveproviderconfiguratie en
`CODEX_HOME` wanneer aanwezig. Houd `--output-dir` onder de repo-root zodat de gast
kan terugschrijven via de aangekoppelde werkruimte.
## Telegram- en Discord-QA-referentie
## Telegram-, Discord- en Slack-QA-referentie
Matrix heeft een [eigen pagina](/nl/concepts/qa-matrix) vanwege het aantal scenario's en de Docker-ondersteunde homeserver-provisioning. Telegram en Discord zijn kleiner — een handvol scenario's elk, geen profielsysteem, tegen vooraf bestaande echte kanalen — dus hun referentie staat hier.
Matrix heeft een [eigen pagina](/nl/concepts/qa-matrix) vanwege het aantal scenario's en Docker-ondersteunde homeserver-provisioning. Telegram, Discord en Slack zijn kleiner: elk een handvol scenario's, geen profielsysteem, tegen vooraf bestaande echte kanalen. Daarom staat hun referentie hier.
### Gedeelde CLI-flags
### Gedeelde CLI-vlaggen
Beide lanes registreren via `extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts` en accepteren dezelfde flags:
Deze lanes registreren via `extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts` en accepteren dezelfde vlaggen:
| Vlag | Standaard | Beschrijving |
| ------------------------------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `--scenario <id>` | — | Voer alleen dit scenario uit. Herhaalbaar. |
| `--output-dir <path>` | `<repo>/.artifacts/qa-e2e/{telegram,discord}-<timestamp>` | Waar rapporten/samenvatting/waargenomen berichten en het uitvoerlogboek worden geschreven. Relatieve paden worden opgelost ten opzichte van `--repo-root`. |
| `--repo-root <path>` | `process.cwd()` | Repository-root wanneer je aanroept vanuit een neutrale cwd. |
| `--sut-account <id>` | `sut` | Tijdelijke account-id binnen de QA Gateway-configuratie. |
| `--provider-mode <mode>` | `live-frontier` | `mock-openai` of `live-frontier` (legacy `live-openai` werkt nog steeds). |
| `--model <ref>` / `--alt-model <ref>` | providerstandaard | Primaire/alternatieve modelrefs. |
| `--fast` | uit | Snelle providermodus waar ondersteund. |
| `--credential-source <env\|convex>` | `env` | Zie [Convex-pool voor inloggegevens](#convex-credential-pool). |
| `--credential-role <maintainer\|ci>` | `ci` in CI, anders `maintainer` | Rol die wordt gebruikt wanneer `--credential-source convex`. |
| Vlag | Standaard | Beschrijving |
| ------------------------------------- | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `--scenario <id>` | — | Voer alleen dit scenario uit. Herhaalbaar. |
| `--output-dir <path>` | `<repo>/.artifacts/qa-e2e/{telegram,discord,slack}-<timestamp>` | Waar rapporten/samenvatting/waargenomen berichten en het uitvoerlog worden weggeschreven. Relatieve paden worden opgelost ten opzichte van `--repo-root`. |
| `--repo-root <path>` | `process.cwd()` | Repo-root wanneer je aanroept vanuit een neutrale cwd. |
| `--sut-account <id>` | `sut` | Tijdelijke account-id binnen de QA-Gatewayconfiguratie. |
| `--provider-mode <mode>` | `live-frontier` | `mock-openai` of `live-frontier` (verouderde `live-openai` werkt nog steeds). |
| `--model <ref>` / `--alt-model <ref>` | providerstandaard | Primaire/alternatieve modelrefs. |
| `--fast` | uit | Snelle providermodus waar ondersteund. |
| `--credential-source <env\|convex>` | `env` | Zie [Convex-referentiepool](#convex-credential-pool). |
| `--credential-role <maintainer\|ci>` | `ci` in CI, anders `maintainer` | Rol die wordt gebruikt wanneer `--credential-source convex`. |
Beide sluiten af met een niet-nulcode bij een mislukt scenario. `--allow-failures` schrijft artefacten zonder een foutieve exitcode in te stellen.
Elke lane sluit af met een niet-nulstatus bij elk mislukt scenario. `--allow-failures` schrijft artefacten zonder een foutieve exitcode in te stellen.
### Telegram QA
### Telegram-QA
```bash
pnpm openclaw qa telegram
```
Richt zich op één echte private Telegram-groep met twee verschillende bots (driver + SUT). De SUT-bot moet een Telegram-gebruikersnaam hebben; bot-naar-bot-observatie werkt het best wanneer beide bots **Bot-to-Bot Communication Mode** hebben ingeschakeld in `@BotFather`.
Richt zich op een echte private Telegram-groep met twee afzonderlijke bots (driver + SUT). De SUT-bot moet een Telegram-gebruikersnaam hebben; bot-naar-botobservatie werkt het best wanneer beide bots **Bot-to-Bot Communication Mode** hebben ingeschakeld in `@BotFather`.
Vereiste env wanneer `--credential-source env`:
@ -224,15 +244,15 @@ Uitvoerartefacten:
- `telegram-qa-report.md`
- `telegram-qa-summary.json` — bevat RTT per antwoord (driver verzendt → waargenomen SUT-antwoord), beginnend met de canary.
- `telegram-qa-observed-messages.json` — inhoud wordt geredigeerd tenzij `OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1`.
- `telegram-qa-observed-messages.json` — inhoud geredigeerd tenzij `OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1`.
### Discord QA
### Discord-QA
```bash
pnpm openclaw qa discord
```
Richt zich op één echt privaat Discord-guildkanaal met twee bots: een driverbot die door de harness wordt bestuurd en een SUT-bot die door de child OpenClaw Gateway wordt gestart via de gebundelde Discord Plugin. Verifieert verwerking van kanaalvermeldingen, dat de SUT-bot de native opdracht `/help` bij Discord heeft geregistreerd, en opt-in Mantis-bewijsscenario's.
Richt zich op een echt privaat Discord-guildkanaal met twee bots: een driverbot die door de harness wordt beheerd en een SUT-bot die door de child-OpenClaw-Gateway wordt gestart via de gebundelde Discord-plugin. Verifieert afhandeling van kanaalvermeldingen, dat de SUT-bot de native `/help`-opdracht bij Discord heeft geregistreerd, en opt-in Mantis-bewijsscenario's.
Vereiste env wanneer `--credential-source env`:
@ -240,7 +260,7 @@ Vereiste env wanneer `--credential-source env`:
- `OPENCLAW_QA_DISCORD_CHANNEL_ID`
- `OPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN`
- `OPENCLAW_QA_DISCORD_SUT_BOT_TOKEN`
- `OPENCLAW_QA_DISCORD_SUT_APPLICATION_ID` — moet overeenkomen met de SUT-botgebruikers-id die door Discord wordt geretourneerd (de lane faalt anders snel).
- `OPENCLAW_QA_DISCORD_SUT_APPLICATION_ID` — moet overeenkomen met de SUT-botgebruiker-id die door Discord wordt geretourneerd (anders faalt de lane snel).
Optioneel:
@ -251,7 +271,7 @@ Scenario's (`extensions/qa-lab/src/live-transports/discord/discord-live.runtime.
- `discord-canary`
- `discord-mention-gating`
- `discord-native-help-command-registration`
- `discord-status-reactions-tool-only` — opt-in Mantis-scenario. Draait zelfstandig omdat het de SUT omschakelt naar altijd-aan, tool-only guildantwoorden met `messages.statusReactions.enabled=true`, en vervolgens een REST-reactietijdlijn plus een HTML/PNG-visueel artefact vastlegt.
- `discord-status-reactions-tool-only` — opt-in Mantis-scenario. Draait op zichzelf omdat het de SUT overschakelt naar altijd-aan, alleen-tools-guildantwoorden met `messages.statusReactions.enabled=true`, en daarna een REST-reactietijdlijn plus een HTML/PNG-visueel artefact vastlegt.
Voer het Mantis-statusreactiescenario expliciet uit:
@ -268,21 +288,51 @@ Uitvoerartefacten:
- `discord-qa-report.md`
- `discord-qa-summary.json`
- `discord-qa-observed-messages.json` — inhoud wordt geredigeerd tenzij `OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1`.
- `discord-qa-observed-messages.json` — inhoud geredigeerd tenzij `OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1`.
- `discord-qa-reaction-timelines.json` en `discord-status-reactions-tool-only-timeline.png` wanneer het statusreactiescenario draait.
### Convex-pool voor inloggegevens
### Slack-QA
Zowel Telegram- als Discord-lanes kunnen inloggegevens leasen uit een gedeelde Convex-pool in plaats van de bovenstaande env-vars te lezen. Geef `--credential-source convex` door (of stel `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` in); QA Lab verkrijgt een exclusieve lease, heartbeats die gedurende de run, en geeft die vrij bij afsluiten. Poolsoorten zijn `"telegram"` en `"discord"`.
```bash
pnpm openclaw qa slack
```
Richt zich op een echt privaat Slack-kanaal met twee afzonderlijke bots: een driverbot die door de harness wordt beheerd en een SUT-bot die door de child-OpenClaw-Gateway wordt gestart via de gebundelde Slack-plugin.
Vereiste env wanneer `--credential-source env`:
- `OPENCLAW_QA_SLACK_CHANNEL_ID`
- `OPENCLAW_QA_SLACK_DRIVER_BOT_TOKEN`
- `OPENCLAW_QA_SLACK_SUT_BOT_TOKEN`
- `OPENCLAW_QA_SLACK_SUT_APP_TOKEN`
Optioneel:
- `OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1` behoudt berichtinhoud in artefacten met waargenomen berichten.
Scenario's (`extensions/qa-lab/src/live-transports/slack/slack-live.runtime.ts:39`):
- `slack-canary`
- `slack-mention-gating`
Uitvoerartefacten:
- `slack-qa-report.md`
- `slack-qa-summary.json`
- `slack-qa-observed-messages.json` — inhoud geredigeerd tenzij `OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1`.
### Convex-referentiepool
Telegram-, Discord- en Slack-lanes kunnen referenties leasen uit een gedeelde Convex-pool in plaats van de env-vars hierboven te lezen. Geef `--credential-source convex` door (of stel `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` in); QA Lab verkrijgt een exclusieve lease, heartbeatt die gedurende de uitvoering en geeft die vrij bij afsluiten. Poolsoorten zijn `"telegram"`, `"discord"` en `"slack"`.
Payloadvormen die de broker valideert op `admin/add`:
- Telegram (`kind: "telegram"`): `{ groupId: string, driverToken: string, sutToken: string }``groupId` moet een numerieke chat-id-string zijn.
- Discord (`kind: "discord"`): `{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string }`.
Operationele env-vars en het endpointcontract van de Convex-broker staan in [Testen → Gedeelde Telegram-inloggegevens via Convex](/nl/help/testing#shared-telegram-credentials-via-convex-v1) (de sectienaam stamt van vóór Discord-ondersteuning; de brokersemantiek is identiek voor beide soorten).
Operationele env-vars en het contract van het Convex-brokerendpoint staan in [Testen → Gedeelde Telegram-referenties via Convex](/nl/help/testing#shared-telegram-credentials-via-convex-v1) (de sectienaam dateert van voor Discord-ondersteuning; de brokersemantiek is identiek voor beide soorten).
## Repository-gesteunde seeds
## Repo-ondersteunde seeds
Seed-assets staan in `qa/`:
@ -293,7 +343,7 @@ Deze staan bewust in git zodat het QA-plan zichtbaar is voor zowel mensen als de
agent.
`qa-lab` moet een generieke markdown-runner blijven. Elk scenario-markdownbestand is
de bron van waarheid voor één testrun en moet definiëren:
de bron van waarheid voor een testuitvoering en moet het volgende definieren:
- scenariometadata
- optionele categorie-, capability-, lane- en risicometadata
@ -302,52 +352,51 @@ de bron van waarheid voor één testrun en moet definiëren:
- optionele Gateway-configuratiepatch
- de uitvoerbare `qa-flow`
Het herbruikbare runtime-oppervlak achter `qa-flow` mag generiek
en cross-cutting blijven. Markdownscenario's kunnen bijvoorbeeld transportzijdige
helpers combineren met browserzijdige helpers die de ingebedde Control UI aansturen via de
Het herbruikbare runtime-oppervlak dat `qa-flow` ondersteunt mag generiek
en cross-cutting blijven. Markdownscenario's kunnen bijvoorbeeld transport-side
helpers combineren met browser-side helpers die de ingebedde Control UI aansturen via de
Gateway-`browser.request`-seam zonder een speciale runner toe te voegen.
Scenariobestanden moeten worden gegroepeerd op productcapability in plaats van op source-tree
map. Houd scenario-id's stabiel wanneer bestanden verplaatsen; gebruik `docsRefs` en `codeRefs`
voor traceerbaarheid van implementatie.
Scenariobestanden moeten worden gegroepeerd op productcapability in plaats van op bronboommap. Houd scenario-id's stabiel wanneer bestanden verplaatsen; gebruik `docsRefs` en `codeRefs`
voor implementatietraceerbaarheid.
De baselinelijst moet breed genoeg blijven om te dekken:
De baselinelijst moet breed genoeg blijven om het volgende te dekken:
- DM- en kanaalchat
- threadgedrag
- levenscyclus van berichtacties
- Cron-callbacks
- geheugenoproep
- cron-callbacks
- geheugenherinnering
- modelwisseling
- overdracht aan subagent
- repository-lezen en docs-lezen
- één kleine buildtaak zoals Lobster Invaders
- repo-lezen en docs-lezen
- een kleine buildtaak zoals Lobster Invaders
## Provider-mocklanes
`qa suite` heeft twee lokale provider-mocklanes:
- `mock-openai` is de scenariobewuste OpenClaw-mock. Deze blijft de standaard
deterministische mocklane voor repository-gesteunde QA en pariteitsgates.
- `aimock` start een AIMock-gesteunde providerserver voor experimentele protocol-,
fixture-, record/replay- en chaosdekking. Deze is additief en vervangt de
- `mock-openai` is de scenario-bewuste OpenClaw-mock. Dit blijft de standaard
deterministische mocklane voor repo-ondersteunde QA en pariteitsgates.
- `aimock` start een AIMock-ondersteunde providerserver voor experimentele protocol-,
fixture-, record/replay- en chaosdekking. Het is aanvullend en vervangt de
`mock-openai`-scenariodispatcher niet.
De implementatie van providerlanes staat onder `extensions/qa-lab/src/providers/`.
Elke provider beheert zijn defaults, lokale serverstart, Gateway-modelconfiguratie,
auth-profielstagingbehoeften en live/mock-capabilityvlaggen. Gedeelde suite- en
Gateway-code moet via het providerregister routeren in plaats van te branchen op
Provider-lane-implementatie staat onder `extensions/qa-lab/src/providers/`.
Elke provider bezit zijn standaardinstellingen, lokale serverstart, Gateway-modelconfiguratie,
stagingbehoeften voor auth-profielen en live/mock-capabilityvlaggen. Gedeelde suite- en
Gateway-code moet via het providerregister routeren in plaats van te vertakken op
providernamen.
## Transportadapters
`qa-lab` beheert een generieke transport-seam voor markdown-QA-scenario's. `qa-channel` is de eerste adapter op die seam, maar het ontwerpdoel is breder: toekomstige echte of synthetische kanalen moeten in dezelfde suite-runner kunnen inpluggen in plaats van een transportspecifieke QA-runner toe te voegen.
`qa-lab` bezit een generieke transport-seam voor markdown-QA-scenario's. `qa-channel` is de eerste adapter op die seam, maar het ontwerpdoel is breder: toekomstige echte of synthetische kanalen moeten in dezelfde suite-runner kunnen worden ingeplugd in plaats van een transportspecifieke QA-runner toe te voegen.
Op architectuurniveau is de splitsing:
- `qa-lab` beheert generieke scenario-uitvoering, workerconcurrency, artefactschrijven en rapportage.
- De transportadapter beheert Gateway-configuratie, gereedheid, inkomende en uitgaande observatie, transportacties en genormaliseerde transportstatus.
- Markdown-scenariobestanden onder `qa/scenarios/` definiëren de testrun; `qa-lab` biedt het herbruikbare runtime-oppervlak dat ze uitvoert.
- `qa-lab` bezit generieke scenario-uitvoering, worker-gelijktijdigheid, artefactschrijven en rapportage.
- De transportadapter bezit Gateway-configuratie, gereedheid, inkomende en uitgaande observatie, transportacties en genormaliseerde transportstatus.
- Markdown-scenariobestanden onder `qa/scenarios/` definieren de testuitvoering; `qa-lab` levert het herbruikbare runtime-oppervlak dat ze uitvoert.
### Een kanaal toevoegen
@ -356,49 +405,49 @@ Een kanaal toevoegen aan het markdown-QA-systeem vereist precies twee dingen:
1. Een transportadapter voor het kanaal.
2. Een scenariopakket dat het kanaalcontract oefent.
Voeg geen nieuwe top-level QA-commandoroot toe wanneer de gedeelde `qa-lab`-host de flow kan beheren.
Voeg geen nieuwe top-level QA-opdrachtroot toe wanneer de gedeelde `qa-lab`-host de flow kan bezitten.
`qa-lab` beheert de gedeelde hostmechanica:
- de `openclaw qa`-commandoroot
- suite-start en teardown
- workerconcurrency
- artefactschrijven
- de commandoroot `openclaw qa`
- het opstarten en afsluiten van suites
- worker-gelijktijdigheid
- schrijven van artefacten
- rapportgeneratie
- scenario-uitvoering
- compatibiliteitsaliassen voor oudere `qa-channel`-scenario's
Runner-Plugins beheren het transportcontract:
Runner-plugins beheren het transportcontract:
- hoe `openclaw qa <runner>` onder de gedeelde `qa`-root wordt gemount
- hoe de Gateway voor dat transport wordt geconfigureerd
- hoe gereedheid wordt gecontroleerd
- hoe inkomende events worden geïnjecteerd
- hoe uitgaande berichten worden waargenomen
- hoe inkomende gebeurtenissen worden geïnjecteerd
- hoe uitgaande berichten worden geobserveerd
- hoe transcripties en genormaliseerde transportstatus worden blootgesteld
- hoe transport-gesteunde acties worden uitgevoerd
- hoe door transport ondersteunde acties worden uitgevoerd
- hoe transportspecifieke reset of opschoning wordt afgehandeld
De minimale adoptiebalk voor een nieuw kanaal:
De minimale adoptiedrempel voor een nieuw kanaal:
1. Houd `qa-lab` als eigenaar van de gedeelde `qa`-root.
2. Implementeer de transportrunner op de gedeelde `qa-lab`-hostseam.
3. Houd transportspecifieke mechanica binnen de runner-Plugin of channel-harness.
4. Mount de runner als `openclaw qa <runner>` in plaats van een concurrerende rootopdracht te registreren. Runner-Plugins moeten `qaRunners` declareren in `openclaw.plugin.json` en een bijbehorende `qaRunnerCliRegistrations`-array exporteren vanuit `runtime-api.ts`. Houd `runtime-api.ts` licht; luie CLI- en runneruitvoering moeten achter aparte entrypoints blijven.
5. Maak of pas markdownscenario's aan onder de thematische `qa/scenarios/`-directories.
2. Implementeer de transportrunner op de gedeelde `qa-lab`-hostnaad.
3. Houd transportspecifieke mechanica binnen de runner-plugin of kanaalharness.
4. Mount de runner als `openclaw qa <runner>` in plaats van een concurrerende rootcommand te registreren. Runner-plugins moeten `qaRunners` declareren in `openclaw.plugin.json` en een overeenkomende array `qaRunnerCliRegistrations` exporteren vanuit `runtime-api.ts`. Houd `runtime-api.ts` licht; luie CLI- en runner-uitvoering moeten achter afzonderlijke entrypoints blijven.
5. Schrijf of pas markdownscenario's aan onder de thematische mappen `qa/scenarios/`.
6. Gebruik de generieke scenariohelpers voor nieuwe scenario's.
7. Houd bestaande compatibiliteitsaliassen werkend tenzij de repository een bewuste migratie uitvoert.
7. Houd bestaande compatibiliteitsaliassen werkend, tenzij de repo een bewuste migratie uitvoert.
De beslisregel is strikt:
- Als gedrag één keer in `qa-lab` kan worden uitgedrukt, plaats het in `qa-lab`.
- Als gedrag afhankelijk is van één kanaaltransport, houd het in die runner-Plugin of Plugin-harness.
- Als een scenario een nieuwe capability nodig heeft die meer dan één kanaal kan gebruiken, voeg dan een generieke helper toe in plaats van een kanaalspecifieke branch in `suite.ts`.
- Als gedrag alleen betekenisvol is voor één transport, houd het scenario transportspecifiek en maak dat expliciet in het scenariocontract.
- Als gedrag één keer in `qa-lab` kan worden uitgedrukt, plaats het dan in `qa-lab`.
- Als gedrag afhankelijk is van één kanaaltransport, houd het dan in die runner-plugin of pluginharness.
- Als een scenario een nieuwe capability nodig heeft die meer dan één kanaal kan gebruiken, voeg dan een generieke helper toe in plaats van een kanaalspecifieke vertakking in `suite.ts`.
- Als gedrag alleen zinvol is voor één transport, houd het scenario dan transportspecifiek en maak dat expliciet in het scenariocontract.
### Namen van scenariohelpers
Voorkeursgenerieke helpers voor nieuwe scenario's:
Voorkeurshelpers voor nieuwe scenario's:
- `waitForTransportReady`
- `waitForChannelReady`
@ -413,22 +462,22 @@ Voorkeursgenerieke helpers voor nieuwe scenario's:
- `formatTransportTranscript`
- `resetTransport`
Compatibiliteitsaliassen blijven beschikbaar voor bestaande scenario's — `waitForQaChannelReady`, `waitForOutboundMessage`, `waitForNoOutbound`, `formatConversationTranscript`, `resetBus` — maar nieuwe scenario's moeten de generieke namen gebruiken. De aliassen bestaan om een alles-in-één migratie te vermijden, niet als het model voor de toekomst.
Compatibiliteitsaliassen blijven beschikbaar voor bestaande scenario's — `waitForQaChannelReady`, `waitForOutboundMessage`, `waitForNoOutbound`, `formatConversationTranscript`, `resetBus` — maar nieuwe scenario's moeten de generieke namen gebruiken. De aliassen bestaan om een flag-day-migratie te vermijden, niet als het model voor de toekomst.
## Rapportage
`qa-lab` exporteert een Markdown-protocolrapport vanuit de waargenomen bustijdlijn.
Het rapport moet antwoord geven op:
`qa-lab` exporteert een Markdown-protocolrapport vanuit de geobserveerde bustijdlijn.
Het rapport moet beantwoorden:
- Wat werkte
- Wat mislukte
- Wat geblokkeerd bleef
- Welke opvolgscenario's het waard zijn om toe te voegen
- Welke vervolgsceanrio's de moeite waard zijn om toe te voegen
Voor de inventaris van beschikbare scenario's — handig bij het inschatten van opvolgwerk of het aansluiten van een nieuw transport — voer `pnpm openclaw qa coverage` uit (voeg `--json` toe voor machineleesbare uitvoer).
Voor de inventaris van beschikbare scenario's — nuttig bij het inschatten van vervolgwerk of het aansluiten van een nieuw transport — voer `pnpm openclaw qa coverage` uit (voeg `--json` toe voor machineleesbare uitvoer).
Voor teken- en stijlcontroles voer je hetzelfde scenario uit over meerdere live modelreferenties
en schrijf je een beoordeeld Markdown-rapport:
Voor teken- en stijlcontroles voer je hetzelfde scenario uit over meerdere live model
refs en schrijf je een beoordeeld Markdown-rapport:
```bash
pnpm openclaw qa character-eval \
@ -447,31 +496,30 @@ pnpm openclaw qa character-eval \
--judge-concurrency 16
```
De opdracht voert lokale onderliggende QA-Gateway-processen uit, geen Docker. Character-eval-
scenario's moeten de persona instellen via `SOUL.md` en daarna gewone gebruikersbeurten
uitvoeren, zoals chat, hulp bij de werkruimte en kleine bestandstaken. Het kandidaatmodel mag
niet te horen krijgen dat het wordt geëvalueerd. De opdracht bewaart elk volledig
transcript, legt basisstatistieken van de run vast en vraagt de beoordelingsmodellen vervolgens in fast-modus met
`xhigh`-redenering, waar ondersteund, om de runs te rangschikken op natuurlijkheid, sfeer en humor.
De command voert lokale QA Gateway-childprocessen uit, geen Docker. Scenario's voor tekenevaluatie
moeten de persona via `SOUL.md` instellen en daarna gewone gebruikersbeurten uitvoeren
zoals chat, workspacehulp en kleine bestandstaken. Het kandidaatmodel mag
niet worden verteld dat het wordt geëvalueerd. De command bewaart elke volledige
transcriptie, legt basisrunstatistieken vast en vraagt daarna de beoordelingsmodellen in snelle modus met
`xhigh`-redenering waar ondersteund om de runs te rangschikken op natuurlijkheid, vibe en humor.
Gebruik `--blind-judge-models` wanneer je providers vergelijkt: de beoordelingsprompt krijgt nog steeds
elk transcript en elke runstatus, maar kandidaat-referenties worden vervangen door neutrale
labels zoals `candidate-01`; het rapport koppelt ranglijsten na het parsen weer terug aan
echte referenties.
elke transcriptie en runstatus, maar kandidaatrefs worden vervangen door neutrale
labels zoals `candidate-01`; het rapport koppelt ranglijsten na parsing terug aan echte refs.
Kandidaatruns gebruiken standaard `high` thinking, met `medium` voor GPT-5.5 en `xhigh`
voor oudere OpenAI-evaluatiereferenties die dit ondersteunen. Overschrijf een specifieke kandidaat inline met
voor oudere OpenAI-evalrefs die dit ondersteunen. Overschrijf een specifieke kandidaat inline met
`--model provider/model,thinking=<level>`. `--thinking <level>` stelt nog steeds een
globale fallback in, en de oudere vorm `--model-thinking <provider/model=level>` blijft
behouden voor compatibiliteit.
OpenAI-kandidaatreferenties gebruiken standaard fast-modus, zodat prioriteitsverwerking wordt gebruikt waar
globale fallback in, en de oudere vorm `--model-thinking <provider/model=level>` wordt
voor compatibiliteit behouden.
OpenAI-kandidaatrefs gebruiken standaard snelle modus, zodat prioriteitsverwerking wordt gebruikt waar
de provider dit ondersteunt. Voeg inline `,fast`, `,no-fast` of `,fast=false` toe wanneer een
enkele kandidaat of beoordelaar een overschrijving nodig heeft. Geef `--fast` alleen door wanneer je
fast-modus voor elk kandidaatmodel wilt afdwingen. Duurmetingen van kandidaat- en beoordelaarsruns worden
enkele kandidaat of beoordelaar een override nodig heeft. Geef `--fast` alleen door wanneer je
snelle modus voor elk kandidaatmodel wilt afdwingen. Kandidaat- en beoordelaarsduur worden
in het rapport vastgelegd voor benchmarkanalyse, maar beoordelingsprompts zeggen expliciet
niet op snelheid te rangschikken.
Runs van kandidaat- en beoordelingsmodellen gebruiken beide standaard concurrency 16. Verlaag
`--concurrency` of `--judge-concurrency` wanneer providerlimieten of lokale Gateway-
belasting een run te ruisachtig maken.
Wanneer geen kandidaat-`--model` wordt doorgegeven, gebruikt character eval standaard
Kandidaat- en beoordelingsmodelruns gebruiken beide standaard gelijktijdigheid 16. Verlaag
`--concurrency` of `--judge-concurrency` wanneer providerlimieten of lokale Gateway-druk
een run te ruisachtig maken.
Wanneer geen kandidaat-`--model` wordt doorgegeven, gebruikt de karakterevaluatie standaard
`openai/gpt-5.5`, `openai/gpt-5.2`, `openai/gpt-5`, `anthropic/claude-opus-4-6`,
`anthropic/claude-sonnet-4-6`, `zai/glm-5.1`,
`moonshot/kimi-k2.5` en
@ -480,9 +528,9 @@ Wanneer geen `--judge-model` wordt doorgegeven, gebruiken de beoordelaars standa
`openai/gpt-5.5,thinking=xhigh,fast` en
`anthropic/claude-opus-4-6,thinking=high`.
## Gerelateerde documentatie
## Gerelateerde docs
- [Matrix-QA](/nl/concepts/qa-matrix)
- [QA-kanaal](/nl/channels/qa-channel)
- [QA Channel](/nl/channels/qa-channel)
- [Testen](/nl/help/testing)
- [Dashboard](/nl/web/dashboard)

View File

@ -1,29 +1,29 @@
---
read_when:
- Uitleg over hoe streaming of chunking in kanalen werkt
- Gedrag voor blokstreaming of kanaalopdeling wijzigen
- Fouten opsporen in dubbele/vroege blokantwoorden of streaming van kanaalvoorbeeldweergaven
summary: Streaming- en chunkinggedrag (blokantwoorden, kanaalvoorbeeldstreaming, modusmapping)
title: Streamen en segmenteren
- Uitleg over hoe streaming of chunking op kanalen werkt
- Gedrag voor blokgewijze streaming of kanaalsegmentering wijzigen
- Debuggen van dubbele/vroege blokantwoorden of kanaalpreview-streaming
summary: Streaming- en chunkinggedrag (blokantwoorden, kanaalpreviewstreaming, modustoewijzing)
title: Streamen en opdelen in fragmenten
x-i18n:
generated_at: "2026-05-03T21:30:59Z"
generated_at: "2026-05-04T07:04:49Z"
model: gpt-5.5
provider: openai
source_hash: 1335f4f5532060bd8bf839683a2b1fbab38f38887c5583135652b4753e0f6a50
source_hash: ff7b6cd8127255352fe16fb746469e9828e7d5aea183d3799ab10cc768515bd1
source_path: concepts/streaming.md
workflow: 16
---
OpenClaw heeft twee afzonderlijke streaminglagen:
- **Blokstreaming (kanalen):** stuur voltooide **blokken** uit terwijl de assistent schrijft. Dit zijn normale kanaalberichten (geen tokendelta's).
- **Previewstreaming (Telegram/Discord/Slack):** werk een tijdelijk **previewbericht** bij tijdens het genereren.
- **Blockstreaming (kanalen):** voltooide **blokken** uitsturen terwijl de assistant schrijft. Dit zijn normale kanaalberichten (geen token-delta's).
- **Previewstreaming (Telegram/Discord/Slack):** een tijdelijk **previewbericht** bijwerken tijdens het genereren.
Er is vandaag **geen echte tokendelta-streaming** naar kanaalberichten. Previewstreaming is berichtgebaseerd (verzenden + bewerkingen/toevoegingen).
Er is tegenwoordig **geen echte token-delta-streaming** naar kanaalberichten. Previewstreaming is berichtgebaseerd (verzenden + bewerkingen/toevoegingen).
## Blokstreaming (kanaalberichten)
## Blockstreaming (kanaalberichten)
Blokstreaming verzendt assistentuitvoer in grove stukken zodra die beschikbaar komt.
Blockstreaming verstuurt assistant-uitvoer in grove stukken zodra die beschikbaar komt.
```
Model output
@ -38,90 +38,90 @@ Model output
Legenda:
- `text_delta/events`: modelstreamgebeurtenissen (kunnen schaars zijn voor niet-streamende modellen).
- `chunker`: `EmbeddedBlockChunker` die min-/maxgrenzen + breukvoorkeur toepast.
- `chunker`: `EmbeddedBlockChunker` die min/max-grenzen + voorkeur voor onderbreking toepast.
- `channel send`: daadwerkelijke uitgaande berichten (blokantwoorden).
**Besturing:**
- `agents.defaults.blockStreamingDefault`: `"on"`/`"off"` (standaard uit).
- Kanaaloverrides: `*.blockStreaming` (en varianten per account) om `"on"`/`"off"` per kanaal af te dwingen.
- Kanaaloverschrijvingen: `*.blockStreaming` (en varianten per account) om `"on"`/`"off"` per kanaal af te dwingen.
- `agents.defaults.blockStreamingBreak`: `"text_end"` of `"message_end"`.
- `agents.defaults.blockStreamingChunk`: `{ minChars, maxChars, breakPreference? }`.
- `agents.defaults.blockStreamingCoalesce`: `{ minChars?, maxChars?, idleMs? }` (gestreamde blokken samenvoegen vóór verzending).
- `agents.defaults.blockStreamingCoalesce`: `{ minChars?, maxChars?, idleMs? }` (gestreamde blokken samenvoegen voor verzending).
- Harde kanaallimiet: `*.textChunkLimit` (bijv. `channels.whatsapp.textChunkLimit`).
- Kanaalchunkmodus: `*.chunkMode` (`length` standaard, `newline` splitst op lege regels (alineagrenzen) vóór chunking op lengte).
- Zachte Discord-limiet: `channels.discord.maxLinesPerMessage` (standaard 17) splitst hoge antwoorden om UI-afkapping te voorkomen.
**Grenssemantiek:**
- `text_end`: stream blokken zodra de chunker ze uitgeeft; flush bij elke `text_end`.
- `message_end`: wacht tot het assistentbericht klaar is en flush dan de gebufferde uitvoer.
- `text_end`: blokken streamen zodra de chunker ze uitstoot; flush bij elke `text_end`.
- `message_end`: wachten tot het assistant-bericht klaar is en dan gebufferde uitvoer flushen.
`message_end` gebruikt nog steeds de chunker als de gebufferde tekst groter is dan `maxChars`, waardoor het aan het einde meerdere chunks kan uitsturen.
`message_end` gebruikt nog steeds de chunker als de gebufferde tekst langer is dan `maxChars`, zodat er aan het einde meerdere chunks kunnen worden uitgestoten.
### Medialevering met blokstreaming
### Medialevering met blockstreaming
`MEDIA:`-instructies zijn normale leveringsmetadata. Wanneer blokstreaming vroeg een
mediablok verzendt, onthoudt OpenClaw die levering voor de beurt. Als de definitieve
assistentpayload dezelfde media-URL herhaalt, verwijdert de definitieve levering de
`MEDIA:`-directieven zijn normale leveringsmetadata. Wanneer blockstreaming vroeg een
mediablok verzendt, onthoudt OpenClaw die levering voor de beurt. Als de finale
assistant-payload dezelfde media-URL herhaalt, verwijdert de finale levering de
dubbele media in plaats van de bijlage opnieuw te verzenden.
Exact dubbele definitieve payloads worden onderdrukt. Als de definitieve payload
aparte tekst toevoegt rond media die al zijn gestreamd, verzendt OpenClaw nog steeds
de nieuwe tekst terwijl de media slechts eenmaal worden geleverd. Dit voorkomt dubbele spraakmemo's
of bestanden op kanalen zoals Telegram wanneer een agent `MEDIA:` uitstoot tijdens
streaming en de provider dit ook in het voltooide antwoord opneemt.
Exact dubbele finale payloads worden onderdrukt. Als de finale payload
aparte tekst toevoegt rond media die al is gestreamd, verzendt OpenClaw nog steeds de
nieuwe tekst terwijl de media slechts eenmaal wordt geleverd. Dit voorkomt dubbele spraaknotities
of bestanden op kanalen zoals Telegram wanneer een agent `MEDIA:` uitzendt tijdens
streaming en de provider dit ook opneemt in het voltooide antwoord.
## Chunking-algoritme (lage/hoge grenzen)
## Chunkingalgoritme (lage/hoge grenzen)
Blokchunking wordt geïmplementeerd door `EmbeddedBlockChunker`:
Blockchunking wordt geïmplementeerd door `EmbeddedBlockChunker`:
- **Lage grens:** geef niets uit totdat buffer >= `minChars` (tenzij geforceerd).
- **Hoge grens:** geef de voorkeur aan splitsingen vóór `maxChars`; indien geforceerd, splits op `maxChars`.
- **Breukvoorkeur:** `paragraph``newline``sentence``whitespace` → harde breuk.
- **Code fences:** splits nooit binnen fences; wanneer geforceerd op `maxChars`, sluit + heropen de fence om Markdown geldig te houden.
- **Lage grens:** niet uitstoten totdat buffer >= `minChars` (tenzij geforceerd).
- **Hoge grens:** voorkeur voor splitsingen vóór `maxChars`; indien geforceerd, splitsen op `maxChars`.
- **Voorkeur voor onderbreking:** `paragraph``newline``sentence``whitespace` → harde onderbreking.
- **Code fences:** nooit splitsen binnen fences; wanneer geforceerd op `maxChars`, de fence sluiten + heropenen om Markdown geldig te houden.
`maxChars` wordt beperkt tot de kanaal-`textChunkLimit`, dus je kunt de limieten per kanaal niet overschrijden.
`maxChars` wordt begrensd op de kanaal-`textChunkLimit`, dus je kunt de limieten per kanaal niet overschrijden.
## Samenvoegen (gestreamde blokken samenvoegen)
Wanneer blokstreaming is ingeschakeld, kan OpenClaw **opeenvolgende blokchunks samenvoegen**
voordat ze worden verzonden. Dit vermindert "spam van losse regels" terwijl nog steeds
progressieve uitvoer wordt geboden.
Wanneer blockstreaming is ingeschakeld, kan OpenClaw **opeenvolgende blokchunks samenvoegen**
voordat ze worden verzonden. Dit vermindert “single-line spam” terwijl er nog steeds
progressieve uitvoer wordt geleverd.
- Samenvoegen wacht op **inactieve pauzes** (`idleMs`) voordat er wordt geflusht.
- Samenvoegen wacht op **inactieve tussenpozen** (`idleMs`) voordat wordt geflusht.
- Buffers worden begrensd door `maxChars` en worden geflusht als ze die overschrijden.
- `minChars` voorkomt dat kleine fragmenten worden verzonden totdat genoeg tekst is verzameld
(de definitieve flush verzendt altijd resterende tekst).
- De samenvoeger wordt afgeleid van `blockStreamingChunk.breakPreference`
(de finale flush verzendt altijd resterende tekst).
- De joiner wordt afgeleid van `blockStreamingChunk.breakPreference`
(`paragraph` → `\n\n`, `newline``\n`, `sentence` → spatie).
- Kanaaloverrides zijn beschikbaar via `*.blockStreamingCoalesce` (inclusief configuraties per account).
- Standaard samenvoeg-`minChars` wordt verhoogd naar 1500 voor Signal/Slack/Discord, tenzij overschreven.
- Kanaaloverschrijvingen zijn beschikbaar via `*.blockStreamingCoalesce` (inclusief configuraties per account).
- Standaard coalesce-`minChars` wordt verhoogd naar 1500 voor Signal/Slack/Discord tenzij overschreven.
## Menselijk tempo tussen blokken
Wanneer blokstreaming is ingeschakeld, kun je een **willekeurige pauze** toevoegen tussen
blokantwoorden (na het eerste blok). Hierdoor voelen antwoorden met meerdere tekstballonnen
Wanneer blockstreaming is ingeschakeld, kun je een **willekeurige pauze** tussen
blokantwoorden toevoegen (na het eerste blok). Hierdoor voelen antwoorden met meerdere tekstballonnen
natuurlijker aan.
- Configuratie: `agents.defaults.humanDelay` (per agent overschrijven via `agents.list[].humanDelay`).
- Modi: `off` (standaard), `natural` (8002500 ms), `custom` (`minMs`/`maxMs`).
- Geldt alleen voor **blokantwoorden**, niet voor definitieve antwoorden of tool-samenvattingen.
- Geldt alleen voor **blokantwoorden**, niet voor finale antwoorden of toolsamenvattingen.
## "Stream chunks of alles"
## "Chunks streamen of alles"
Dit komt overeen met:
- **Stream chunks:** `blockStreamingDefault: "on"` + `blockStreamingBreak: "text_end"` (uitsturen terwijl je gaat). Niet-Telegram-kanalen hebben ook `*.blockStreaming: true` nodig.
- **Stream alles aan het einde:** `blockStreamingBreak: "message_end"` (één keer flushen, mogelijk meerdere chunks als het erg lang is).
- **Geen blokstreaming:** `blockStreamingDefault: "off"` (alleen definitief antwoord).
- **Chunks streamen:** `blockStreamingDefault: "on"` + `blockStreamingBreak: "text_end"` (uitstoten terwijl je bezig bent). Niet-Telegram-kanalen hebben ook `*.blockStreaming: true` nodig.
- **Alles aan het einde streamen:** `blockStreamingBreak: "message_end"` (één keer flushen, mogelijk meerdere chunks als het erg lang is).
- **Geen blockstreaming:** `blockStreamingDefault: "off"` (alleen finale antwoord).
**Kanaalopmerking:** Blokstreaming staat **uit tenzij**
**Kanaalnotitie:** Blockstreaming staat **uit tenzij**
`*.blockStreaming` expliciet op `true` is gezet. Kanalen kunnen een live preview streamen
(`channels.<channel>.streaming`) zonder blokantwoorden.
Configuratielocatie ter herinnering: de `blockStreaming*`-standaarden staan onder
`agents.defaults`, niet in de hoofdconfiguratie.
Configuratielocatie ter herinnering: de `blockStreaming*`-standaardwaarden staan onder
`agents.defaults`, niet in de rootconfiguratie.
## Previewstreamingmodi
@ -129,89 +129,89 @@ Canonieke sleutel: `channels.<channel>.streaming`
Modi:
- `off`: schakel previewstreaming uit.
- `off`: previewstreaming uitschakelen.
- `partial`: één preview die wordt vervangen door de nieuwste tekst.
- `block`: preview wordt bijgewerkt in gechunkte/toegevoegde stappen.
- `progress`: voortgangs-/statuspreview tijdens generatie, definitief antwoord bij voltooiing.
- `progress`: voortgangs-/statuspreview tijdens generatie, finaal antwoord bij voltooiing.
`streaming.mode: "block"` is een previewstreamingmodus voor kanalen die bewerkingen ondersteunen,
zoals Discord en Telegram. Het schakelt daar geen kanaalbloklevering in.
Gebruik `streaming.block.enabled` of de verouderde kanaalsleutel `blockStreaming` wanneer
`streaming.mode: "block"` is een previewstreamingmodus voor kanalen die bewerken ondersteunen,
zoals Discord en Telegram. Deze schakelt daar geen kanaalbloklevering in.
Gebruik `streaming.block.enabled` of de legacy kanaalsleutel `blockStreaming` wanneer
je normale blokantwoorden wilt. Microsoft Teams is de uitzondering: het heeft geen
draft-preview-bloktransport, dus `streaming.mode: "block"` wordt gekoppeld aan Teams-bloklevering
in plaats van native gedeeltelijke/voortgangsstreaming.
bloktransport voor conceptpreviews, dus `streaming.mode: "block"` komt overeen met Teams-bloklevering
in plaats van native partial/progress-streaming.
### Kanaaltoewijzing
| Kanaal | `off` | `partial` | `block` | `progress` |
| ---------- | ----- | --------- | ------- | ----------------------- |
| Telegram | ✅ | ✅ | ✅ | bewerkbare voortgangsdraft |
| Discord | ✅ | ✅ | ✅ | bewerkbare voortgangsdraft |
| Slack | ✅ | ✅ | ✅ | ✅ |
| Mattermost | ✅ | ✅ | ✅ | ✅ |
| MS Teams | ✅ | ✅ | ✅ | native voortgangsstream |
| Kanaal | `off` | `partial` | `block` | `progress` |
| ---------- | ----- | --------- | ------- | ----------------------------- |
| Telegram | ✅ | ✅ | ✅ | bewerkbaar voortgangsconcept |
| Discord | ✅ | ✅ | ✅ | bewerkbaar voortgangsconcept |
| Slack | ✅ | ✅ | ✅ | ✅ |
| Mattermost | ✅ | ✅ | ✅ | ✅ |
| MS Teams | ✅ | ✅ | ✅ | native voortgangsstream |
Alleen Slack:
- `channels.slack.streaming.nativeTransport` schakelt native Slack-streaming-API-aanroepen in of uit wanneer `channels.slack.streaming.mode="partial"` (standaard: `true`).
- Native Slack-streaming en Slack-assistentthreadstatus vereisen een antwoordthreaddoel. DM's op het hoogste niveau tonen die threadachtige preview niet, maar kunnen nog steeds Slack-draftpreviewberichten en bewerkingen gebruiken.
- `channels.slack.streaming.nativeTransport` schakelt Slack-native streaming-API-aanroepen in of uit wanneer `channels.slack.streaming.mode="partial"` (standaard: `true`).
- Slack-native streaming en Slack assistant-threadstatus vereisen een antwoordthreaddoel. DMs op topniveau tonen die threadachtige preview niet, maar kunnen nog steeds Slack-conceptpreviewberichten en bewerkingen gebruiken.
Migratie van verouderde sleutels:
Migratie van legacy sleutel:
- Telegram: verouderde `streamMode`- en scalaire/booleaanse `streaming`-waarden worden gedetecteerd en gemigreerd door doctor-/configcompatibiliteitspaden naar `streaming.mode`.
- Discord: `streamMode` + booleaanse `streaming` migreert automatisch naar de `streaming`-enum.
- Slack: `streamMode` migreert automatisch naar `streaming.mode`; booleaanse `streaming` migreert automatisch naar `streaming.mode` plus `streaming.nativeTransport`; verouderde `nativeStreaming` migreert automatisch naar `streaming.nativeTransport`.
- Telegram: legacy `streamMode` en scalaire/booleaanse `streaming`-waarden worden gedetecteerd en gemigreerd via doctor-/configcompatibiliteitspaden naar `streaming.mode`.
- Discord: `streamMode` + booleaanse `streaming` migreren automatisch naar de `streaming`-enum.
- Slack: `streamMode` migreert automatisch naar `streaming.mode`; booleaanse `streaming` migreert automatisch naar `streaming.mode` plus `streaming.nativeTransport`; legacy `nativeStreaming` migreert automatisch naar `streaming.nativeTransport`.
### Runtimegedrag
Telegram:
- Gebruikt `sendMessage` + `editMessageText`-previewupdates in DM's en groepen/onderwerpen.
- Verzendt een nieuw definitief bericht in plaats van ter plekke te bewerken wanneer een preview ongeveer één minuut zichtbaar is geweest, en ruimt daarna de preview op zodat de tijdstempel van Telegram de voltooiing van het antwoord weerspiegelt.
- Previewstreaming wordt overgeslagen wanneer Telegram-blokstreaming expliciet is ingeschakeld (om dubbele streaming te voorkomen).
- `/reasoning stream` kan redenering naar de preview schrijven.
- Gebruikt `sendMessage` + `editMessageText` voor preview-updates in DMs en groepen/topics.
- Verzendt een nieuw finaal bericht in plaats van ter plekke te bewerken wanneer een preview ongeveer één minuut zichtbaar is geweest, en ruimt daarna de preview op zodat de timestamp van Telegram de voltooiing van het antwoord weergeeft.
- Previewstreaming wordt overgeslagen wanneer Telegram-blockstreaming expliciet is ingeschakeld (om dubbele streaming te voorkomen).
- `/reasoning stream` kan redenering naar een tijdelijke preview schrijven die na finale levering wordt verwijderd.
Discord:
- Gebruikt verzenden + bewerken van previewberichten.
- `block`-modus gebruikt draftchunking (`draftChunk`).
- Previewstreaming wordt overgeslagen wanneer Discord-blokstreaming expliciet is ingeschakeld.
- Definitieve media-, fout- en expliciet-antwoordpayloads annuleren wachtende previews zonder een nieuwe draft te flushen, en gebruiken daarna normale levering.
- `block`-modus gebruikt conceptchunking (`draftChunk`).
- Previewstreaming wordt overgeslagen wanneer Discord-blockstreaming expliciet is ingeschakeld.
- Finale media-, fout- en expliciete antwoordpayloads annuleren wachtende previews zonder een nieuw concept te flushen en gebruiken daarna normale levering.
Slack:
- `partial` kan native Slack-streaming (`chat.startStream`/`append`/`stop`) gebruiken wanneer beschikbaar.
- `block` gebruikt append-stijl draftpreviews.
- `progress` gebruikt statuspreviewtekst en daarna het definitieve antwoord.
- DM's op het hoogste niveau zonder antwoordthread gebruiken draftpreviewberichten en bewerkingen in plaats van native Slack-streaming.
- Native en draftpreviewstreaming onderdrukken blokantwoorden voor die beurt, zodat een Slack-antwoord via slechts één leveringspad wordt gestreamd.
- Definitieve media-/foutpayloads en voortgangsfinales maken geen wegwerp-draftberichten aan; alleen tekst-/blokfinales die de preview kunnen bewerken, flushen wachtende drafttekst.
- `partial` kan Slack-native streaming (`chat.startStream`/`append`/`stop`) gebruiken wanneer beschikbaar.
- `block` gebruikt conceptpreviews in append-stijl.
- `progress` gebruikt statuspreviewtekst en daarna het finale antwoord.
- DMs op topniveau zonder antwoordthread gebruiken conceptpreviewberichten en bewerkingen in plaats van Slack-native streaming.
- Native en conceptpreviewstreaming onderdrukken blokantwoorden voor die beurt, zodat een Slack-antwoord via slechts één leveringspad wordt gestreamd.
- Finale media-/foutpayloads en voortgangsfinales maken geen tijdelijke conceptberichten aan; alleen tekst-/blokfinales die de preview kunnen bewerken flushen wachtende concepttekst.
Mattermost:
- Streamt denken, toolactiviteit en gedeeltelijke antwoordtekst naar één draftpreviewbericht dat ter plekke wordt afgerond wanneer het definitieve antwoord veilig kan worden verzonden.
- Valt terug op het verzenden van een nieuw definitief bericht als het previewbericht is verwijderd of anderszins niet beschikbaar is op het moment van afronden.
- Definitieve media-/foutpayloads annuleren wachtende previewupdates vóór normale levering in plaats van een tijdelijk previewbericht te flushen.
- Streamt denken, toolactiviteit en gedeeltelijke antwoordtekst naar één conceptpreviewbericht dat ter plekke wordt gefinaliseerd wanneer het finale antwoord veilig kan worden verzonden.
- Valt terug op het verzenden van een nieuw finaal bericht als het previewbericht is verwijderd of anderszins niet beschikbaar is op het moment van finaliseren.
- Finale media-/foutpayloads annuleren wachtende preview-updates vóór normale levering in plaats van een tijdelijk previewbericht te flushen.
Matrix:
- Draftpreviews worden ter plekke afgerond wanneer de definitieve tekst de previewgebeurtenis kan hergebruiken.
- Media-only-, fout- en antwoorddoel-mismatchfinales annuleren wachtende previewupdates vóór normale levering; een al zichtbare verouderde preview wordt geredigeerd.
- Conceptpreviews worden ter plekke gefinaliseerd wanneer de finale tekst de previewgebeurtenis kan hergebruiken.
- Finales met alleen media, fouten en niet-overeenkomende antwoorddoelen annuleren wachtende preview-updates vóór normale levering; een al zichtbare verouderde preview wordt geredacteerd.
### Previewupdates voor toolvoortgang
### Toolvoortgangs-preview-updates
Previewstreaming kan ook **toolvoortgangs**updates bevatten — korte statusregels zoals "zoeken op het web", "bestand lezen" of "tool aanroepen" — die in hetzelfde previewbericht verschijnen terwijl tools actief zijn, vóór het definitieve antwoord. Dit houdt toolbeurten met meerdere stappen visueel actief in plaats van stil tussen de eerste denkpreview en het definitieve antwoord.
Previewstreaming kan ook **toolvoortgangs**-updates bevatten — korte statusregels zoals "zoeken op het web", "bestand lezen" of "tool aanroepen" — die in hetzelfde previewbericht verschijnen terwijl tools draaien, vóór het finale antwoord. Zo blijven toolbeurten met meerdere stappen visueel actief in plaats van stil tussen de eerste denkpreview en het finale antwoord.
Ondersteunde oppervlakken:
- **Discord**, **Slack**, **Telegram** en **Matrix** streamen toolvoortgang standaard naar de live previewbewerking wanneer previewstreaming actief is. Microsoft Teams gebruikt zijn native voortgangsstream in persoonlijke chats.
- Telegram wordt sinds `v2026.4.22` geleverd met ingeschakelde previewupdates voor toolvoortgang; ze ingeschakeld houden behoudt dat uitgebrachte gedrag.
- **Mattermost** neemt toolactiviteit al op in zijn enkele draftpreviewbericht (zie hierboven).
- Toolvoortgangsbewerkingen volgen de actieve previewstreamingmodus; ze worden overgeslagen wanneer previewstreaming `off` is of wanneer blokstreaming het bericht heeft overgenomen. Op Telegram is `streaming.mode: "off"` alleen definitief: algemene voortgangspraat wordt ook onderdrukt in plaats van als zelfstandige statusberichten te worden geleverd, terwijl goedkeuringsprompts, mediapayloads en fouten nog steeds normaal worden gerouteerd.
- Om previewstreaming te behouden maar toolvoortgangsregels te verbergen, stel je `streaming.preview.toolProgress` in op `false` voor dat kanaal. Om previewbewerkingen volledig uit te schakelen, stel je `streaming.mode` in op `off`.
- Telegram-antwoorden met geselecteerde citaten zijn een uitzondering: wanneer `replyToMode` niet `"off"` is en geselecteerde citaattekst aanwezig is, slaat OpenClaw de antwoordpreviewstream voor die beurt over, zodat previewregels voor toolvoortgang niet kunnen renderen. Antwoorden op het huidige bericht zonder geselecteerde citaattekst behouden nog steeds previewstreaming. Zie [Telegram-kanaaldocumentatie](/nl/channels/telegram) voor details.
- **Discord**, **Slack**, **Telegram** en **Matrix** streamen standaard toolvoortgang naar de live previewbewerking wanneer previewstreaming actief is. Microsoft Teams gebruikt zijn native voortgangsstream in persoonlijke chats.
- Telegram is sinds `v2026.4.22` uitgebracht met toolvoortgangs-preview-updates ingeschakeld; ze ingeschakeld houden bewaart dat uitgebrachte gedrag.
- **Mattermost** vouwt toolactiviteit al in zijn enkele conceptpreviewbericht (zie hierboven).
- Toolvoortgangsbewerkingen volgen de actieve previewstreamingmodus; ze worden overgeslagen wanneer previewstreaming `off` is of wanneer blockstreaming het bericht heeft overgenomen. Op Telegram is `streaming.mode: "off"` alleen-finaal: generieke voortgangspraat wordt ook onderdrukt in plaats van als zelfstandige statusberichten te worden geleverd, terwijl goedkeuringsprompts, mediapayloads en fouten normaal blijven routeren.
- Om previewstreaming te behouden maar toolvoortgangsregels te verbergen, zet je `streaming.preview.toolProgress` voor dat kanaal op `false`. Om toolvoortgangsregels zichtbaar te houden terwijl command/exec-tekst wordt verborgen, zet je `streaming.preview.commandText` op `"status"` of `streaming.progress.commandText` op `"status"`; de standaard is `"raw"` om uitgebracht gedrag te behouden. Dit beleid wordt gedeeld door concept-/voortgangskanalen die de compacte voortgangsrenderer van OpenClaw gebruiken, waaronder Discord, Matrix, Microsoft Teams, Mattermost, Slack-conceptpreviews en Telegram. Zet `streaming.mode` op `off` om previewbewerkingen volledig uit te schakelen.
- Geselecteerde quote-antwoorden in Telegram zijn een uitzondering: wanneer `replyToMode` niet `"off"` is en geselecteerde quotetekst aanwezig is, slaat OpenClaw de antwoord-previewstream voor die beurt over zodat toolvoortgangs-previewregels niet kunnen renderen. Huidige-berichtantwoorden zonder geselecteerde quotetekst behouden previewstreaming. Zie [Telegram-kanaaldocumentatie](/nl/channels/telegram) voor details.
Voorbeeld:
Houd voortgangsregels zichtbaar, maar verberg ruwe command/exec-tekst:
```json
{
@ -220,7 +220,26 @@ Voorbeeld:
"streaming": {
"mode": "partial",
"preview": {
"toolProgress": false
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
```
Gebruik dezelfde vorm onder een andere compacte voortgangskanaalsleutel, bijvoorbeeld `channels.discord`, `channels.matrix`, `channels.msteams`, `channels.mattermost`, of Slack-conceptvoorbeelden. Zet voor de voortgangsconceptmodus hetzelfde beleid onder `streaming.progress`:
```json
{
"channels": {
"telegram": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
@ -230,7 +249,7 @@ Voorbeeld:
## Gerelateerd
- [Voortgangsdrafts](/nl/concepts/progress-drafts) — zichtbare werk-in-uitvoering-berichten die tijdens lange beurten worden bijgewerkt
- [Berichten](/nl/concepts/messages) — berichtlevenscyclus en levering
- [Opnieuw proberen](/nl/concepts/retry) — gedrag bij opnieuw proberen na leveringsfout
- [Voortgangsconcepten](/nl/concepts/progress-drafts) — zichtbare werk-in-uitvoering-berichten die tijdens lange beurten worden bijgewerkt
- [Berichten](/nl/concepts/messages) — levenscyclus en bezorging van berichten
- [Opnieuw proberen](/nl/concepts/retry) — gedrag voor opnieuw proberen bij mislukte bezorging
- [Kanalen](/nl/channels) — streamingondersteuning per kanaal

View File

@ -1,106 +1,106 @@
---
read_when:
- Tekst van de systeemprompt, hulpmiddelenlijst of tijd-/Heartbeat-secties bewerken
- Bootstrap van werkruimte of gedrag voor Skills-injectie wijzigen
- Systeemprompttekst, lijst met tools of tijd-/Heartbeat-secties bewerken
- Werkruimte-initialisatie- of Skills-injectiegedrag wijzigen
summary: Wat de systeemprompt van OpenClaw bevat en hoe deze wordt samengesteld
title: Systeemprompt
x-i18n:
generated_at: "2026-05-03T21:30:53Z"
generated_at: "2026-05-04T07:04:53Z"
model: gpt-5.5
provider: openai
source_hash: 93533ac8090897a7b5fd82b80e542a4ad573670408314b3519c5e317d0408ade
source_hash: 5e6067e760eccf58106f0a646c2656e902d5951580abd750f342d70b0568b81b
source_path: concepts/system-prompt.md
workflow: 16
---
OpenClaw bouwt een aangepaste systeemprompt voor elke agentrun. De prompt is **eigendom van OpenClaw** en gebruikt niet de standaardprompt van pi-coding-agent.
OpenClaw bouwt een aangepaste systeemprompt voor elke agent-run. De prompt is **eigendom van OpenClaw** en gebruikt niet de standaardprompt van pi-coding-agent.
De prompt wordt door OpenClaw samengesteld en in elke agentrun geïnjecteerd.
De prompt wordt door OpenClaw samengesteld en in elke agent-run geïnjecteerd.
Providerplugins kunnen cachebewuste promptbegeleiding bijdragen zonder de volledige prompt die eigendom is van OpenClaw te vervangen. De providerruntime kan:
Provider-plugins kunnen cachebewuste promptrichtlijnen bijdragen zonder de volledige prompt die eigendom is van OpenClaw te vervangen. De provider-runtime kan:
- een kleine set benoemde kernsecties vervangen (`interaction_style`,
`tool_call_style`, `execution_bias`)
- een **stabiel voorvoegsel** boven de promptcachegrens injecteren
- een **dynamisch achtervoegsel** onder de promptcachegrens injecteren
- een **stabiel prefix** boven de promptcachegrens injecteren
- een **dynamisch suffix** onder de promptcachegrens injecteren
Gebruik bijdragen van de provider voor model-familiespecifieke afstemming. Bewaar verouderde
Gebruik provider-eigen bijdragen voor modelspecifieke afstemming per modelfamilie. Houd legacy
`before_prompt_build`-promptmutatie voor compatibiliteit of echt globale promptwijzigingen, niet voor normaal providergedrag.
De overlay voor de OpenAI GPT-5-familie houdt de kernuitvoeringsregel klein en voegt modelspecifieke begeleiding toe voor persona-vergrendeling, beknopte uitvoer, tooldiscipline, parallel opzoeken, dekking van opleveringen, verificatie, ontbrekende context en hygiëne voor terminaltools.
De OpenAI GPT-5-familieoverlay houdt de kernregel voor uitvoering klein en voegt modelspecifieke richtlijnen toe voor persona-latching, beknopte uitvoer, tooldiscipline, parallel opzoeken, dekking van opleveringen, verificatie, ontbrekende context en hygiëne voor terminaltools.
## Structuur
De prompt is bewust compact en gebruikt vaste secties:
- **Tooling**: herinnering aan gestructureerde tools als bron van waarheid plus runtimebegeleiding voor toolgebruik.
- **Uitvoeringsneiging**: compacte begeleiding voor doorpakken: handel binnen de beurt bij uitvoerbare verzoeken, ga door tot klaar of geblokkeerd, herstel van zwakke toolresultaten, controleer veranderlijke staat live en verifieer vóór afronding.
- **Tooling**: herinnering aan gestructureerde tools als bron van waarheid plus runtime-richtlijnen voor toolgebruik.
- **Uitvoeringsvoorkeur**: compacte richtlijnen voor doorpakken: handel binnen dezelfde beurt bij uitvoerbare verzoeken, ga door tot het klaar is of geblokkeerd raakt, herstel van zwakke toolresultaten, controleer veranderlijke status live en verifieer voordat je afrondt.
- **Veiligheid**: korte guardrail-herinnering om machtszoekend gedrag of het omzeilen van toezicht te vermijden.
- **Skills** (wanneer beschikbaar): vertelt het model hoe het skill-instructies op aanvraag laadt.
- **OpenClaw Self-Update**: hoe je configuratie veilig inspecteert met
`config.schema.lookup`, configuratie patcht met `config.patch`, de volledige
configuratie vervangt met `config.apply` en `update.run` alleen uitvoert op expliciet gebruikersverzoek. De alleen-voor-eigenaar `gateway`-tool weigert ook om
`tools.exec.ask` / `tools.exec.security` te herschrijven, inclusief verouderde `tools.bash.*`-aliassen die naar die beschermde exec-paden normaliseren.
- **Workspace**: werkmap (`agents.defaults.workspace`).
- **Skills** (indien beschikbaar): vertelt het model hoe het skill-instructies op aanvraag laadt.
- **OpenClaw Self-Update**: hoe je config veilig inspecteert met
`config.schema.lookup`, config patcht met `config.patch`, de volledige
config vervangt met `config.apply`, en `update.run` alleen uitvoert op expliciet gebruikersverzoek. De owner-only `gateway`-tool weigert ook
`tools.exec.ask` / `tools.exec.security` te herschrijven, inclusief legacy `tools.bash.*`-aliassen die normaliseren naar die beschermde exec-paden.
- **Werkruimte**: werkdirectory (`agents.defaults.workspace`).
- **Documentatie**: lokaal pad naar OpenClaw-documentatie (repo of npm-pakket) en wanneer die gelezen moet worden.
- **Workspacebestanden (geïnjecteerd)**: geeft aan dat bootstrapbestanden hieronder zijn opgenomen.
- **Sandbox** (wanneer ingeschakeld): geeft sandboxruntime, sandboxpaden en of verhoogde exec beschikbaar is aan.
- **Werkruimtebestanden (geïnjecteerd)**: geeft aan dat bootstrapbestanden hieronder zijn opgenomen.
- **Sandbox** (wanneer ingeschakeld): geeft de gesandboxte runtime, sandboxpaden en of verhoogde exec beschikbaar is aan.
- **Huidige datum en tijd**: lokale tijd van de gebruiker, tijdzone en tijdnotatie.
- **Antwoordtags**: optionele syntaxis voor antwoordtags voor ondersteunde providers.
- **Heartbeats**: Heartbeat-prompt en ack-gedrag, wanneer Heartbeats zijn ingeschakeld voor de standaardagent.
- **Runtime**: host, besturingssysteem, Node, model, reporoot (wanneer gedetecteerd), denkniveau (één regel).
- **Heartbeats**: heartbeat-prompt en ack-gedrag, wanneer heartbeats zijn ingeschakeld voor de standaardagent.
- **Runtime**: host, OS, node, model, repo-root (wanneer gedetecteerd), denkniveau (één regel).
- **Redenering**: huidig zichtbaarheidsniveau + hint voor /reasoning-schakelaar.
OpenClaw houdt grote stabiele inhoud, inclusief **Projectcontext**, boven de interne promptcachegrens. Vluchtige kanaal- en sessiesecties zoals Control UI-insluitbegeleiding, **Messaging**, **Voice**, **Groepschatcontext**, **Reactions**, **Heartbeats** en **Runtime** worden onder die grens toegevoegd, zodat lokale backends met prefixcaches het stabiele workspacevoorvoegsel tussen kanaalbeurten kunnen hergebruiken. Toolbeschrijvingen moeten eveneens vermijden om huidige kanaalnamen op te nemen wanneer het geaccepteerde schema dat runtimedetail al draagt.
OpenClaw houdt grote stabiele content, inclusief **Projectcontext**, boven de interne promptcachegrens. Vluchtige kanaal-/sessiesecties zoals Control UI-inbedrichtlijnen, **Berichten**, **Spraak**, **Groepschatcontext**, **Reacties**, **Heartbeats** en **Runtime** worden onder die grens toegevoegd, zodat lokale backends met prefixcaches het stabiele werkruimteprefix over kanaalbeurten heen kunnen hergebruiken. Toolbeschrijvingen zouden eveneens moeten vermijden huidige kanaalnamen in te bedden wanneer het geaccepteerde schema dat runtimedetail al draagt.
De sectie Tooling bevat ook runtimebegeleiding voor langlopende werkzaamheden:
De Tooling-sectie bevat ook runtime-richtlijnen voor langlopende werkzaamheden:
- gebruik Cron voor toekomstige opvolging (`check back later`, herinneringen, terugkerend werk) in plaats van `exec`-slaaplussen, `yieldMs`-vertragingstrucs of herhaalde `process`-polling
- gebruik cron voor toekomstige follow-up (`check back later`, herinneringen, terugkerend werk) in plaats van `exec`-slaaplussen, `yieldMs`-vertragingstrucs of herhaaldelijk `process` pollen
- gebruik `exec` / `process` alleen voor opdrachten die nu starten en op de achtergrond blijven draaien
- wanneer automatisch wekken bij voltooiing is ingeschakeld, start de opdracht één keer en vertrouw op het pushgebaseerde wekpad wanneer het uitvoer geeft of faalt
- wanneer automatisch wekken bij voltooiing is ingeschakeld, start je de opdracht één keer en vertrouw je op het push-gebaseerde wekpad wanneer het uitvoer produceert of faalt
- gebruik `process` voor logs, status, invoer of interventie wanneer je een draaiende opdracht moet inspecteren
- als de taak groter is, geef dan de voorkeur aan `sessions_spawn`; voltooiing van subagents is pushgebaseerd en kondigt zich automatisch terug aan bij de aanvrager
- als de taak groter is, geef dan de voorkeur aan `sessions_spawn`; voltooiing van subagents is push-gebaseerd en meldt zich automatisch terug bij de aanvrager
- poll `subagents list` / `sessions_list` niet in een lus alleen om op voltooiing te wachten
Wanneer de experimentele tool `update_plan` is ingeschakeld, vertelt Tooling het model ook om die alleen te gebruiken voor niet-triviaal meerstapswerk, precies één `in_progress`-stap te houden en te vermijden het hele plan na elke update te herhalen.
Wanneer de experimentele `update_plan`-tool is ingeschakeld, vertelt Tooling het model ook deze alleen te gebruiken voor niet-triviaal meerstapswerk, precies één `in_progress`-stap aan te houden en te vermijden na elke update het hele plan te herhalen.
Veiligheids-guardrails in de systeemprompt zijn adviserend. Ze sturen modelgedrag, maar handhaven geen beleid. Gebruik toolbeleid, exec-goedkeuringen, sandboxing en kanaaltoelatingslijsten voor harde handhaving; operators kunnen deze bewust uitschakelen.
Veiligheids-guardrails in de systeemprompt zijn adviserend. Ze sturen modelgedrag maar dwingen geen beleid af. Gebruik toolbeleid, exec-goedkeuringen, sandboxing en kanaal-allowlists voor harde afdwinging; operators kunnen deze bewust uitschakelen.
Op kanalen met native goedkeuringskaarten/-knoppen vertelt de runtimeprompt de agent nu om eerst op die native goedkeurings-UI te vertrouwen. Die moet alleen een handmatige `/approve`-opdracht opnemen wanneer het toolresultaat zegt dat chatgoedkeuringen niet beschikbaar zijn of handmatige goedkeuring het enige pad is.
Op kanalen met native goedkeuringskaarten/-knoppen vertelt de runtimeprompt de agent nu eerst op die native goedkeurings-UI te vertrouwen. De agent moet alleen een handmatige `/approve`-opdracht opnemen wanneer het toolresultaat zegt dat chatgoedkeuringen niet beschikbaar zijn of dat handmatige goedkeuring de enige route is.
## Promptmodi
OpenClaw kan kleinere systeemprompts renderen voor subagents. De runtime stelt voor elke run een `promptMode` in (geen gebruikersgerichte configuratie):
OpenClaw kan kleinere systeemprompts renderen voor subagents. De runtime stelt voor elke run een
`promptMode` in (geen gebruikersgerichte config):
- `full` (standaard): bevat alle bovenstaande secties.
- `minimal`: gebruikt voor subagents; laat **Skills**, **Memory Recall**, **OpenClaw
Self-Update**, **Model Aliases**, **User Identity**, **Reply Tags**,
**Messaging**, **Silent Replies** en **Heartbeats** weg. Tooling, **Veiligheid**,
Workspace, Sandbox, Huidige datum en tijd (wanneer bekend), Runtime en geïnjecteerde
context blijven beschikbaar.
Self-Update**, **Modelaliassen**, **Gebruikersidentiteit**, **Antwoordtags**,
**Berichten**, **Stille antwoorden** en **Heartbeats** weg. Tooling, **Veiligheid**,
Werkruimte, Sandbox, Huidige datum en tijd (wanneer bekend), Runtime en geïnjecteerde context blijven beschikbaar.
- `none`: retourneert alleen de basisidentiteitsregel.
Wanneer `promptMode=minimal` is, worden extra geïnjecteerde prompts gelabeld als **Subagentcontext** in plaats van **Groepschatcontext**.
Wanneer `promptMode=minimal`, worden extra geïnjecteerde prompts gelabeld als **Subagentcontext** in plaats van **Groepschatcontext**.
Voor automatische antwoordruns op kanalen kan OpenClaw de algemene sectie **Stille antwoorden** weglaten wanneer de directe/groepschatcontext al het opgeloste gespreksspecifieke `NO_REPLY`-gedrag bevat. Dit voorkomt dat tokenmechanica zowel in de globale systeemprompt als in de kanaalcontext wordt herhaald.
Voor runs met automatisch antwoorden via kanalen kan OpenClaw de generieke sectie **Stille antwoorden** weglaten wanneer de directe/groepschatcontext al het opgeloste gespreksspecifieke `NO_REPLY`-gedrag bevat. Dit voorkomt herhaling van tokenmechanica in zowel de globale systeemprompt als de kanaalcontext.
## Promptsnapshots
OpenClaw bewaart gecommitte promptsnapshots voor het gelukkige pad van de Codex-runtime onder
`test/fixtures/agents/prompt-snapshots/codex-runtime-happy-path/`. Ze renderen geselecteerde app-server thread-/turn-parameters plus een gereconstrueerde modelgebonden promptlaagstack voor directe Telegram-, Discord-groeps- en Heartbeat-beurten. Die stack bevat een vastgezette Codex `gpt-5.5`-modelpromptfixture die is gegenereerd uit de vorm van Codex' modelcatalogus/cache, de developertekst voor Codex-gelukkig-padmachtigingen, OpenClaw-developerinstructies, beurtgebonden instructies voor samenwerkingsmodus wanneer OpenClaw die levert, gebruikersinvoer voor de beurt en verwijzingen naar de dynamische toolspecificaties.
`test/fixtures/agents/prompt-snapshots/codex-runtime-happy-path/`. Ze renderen geselecteerde app-server-thread-/turn-params plus een gereconstrueerde modelgebonden promptlaagstack voor Telegram-direct, Discord-groep en heartbeat-beurten. Die stack bevat een gepinde Codex `gpt-5.5`-modelpromptfixture gegenereerd uit Codex' modelcatalogus-/cachevorm, de Codex-ontwikkelaarstekst voor happy-path-permissies, OpenClaw-ontwikkelaarsinstructies, beurtgebonden instructies voor samenwerkingsmodus wanneer OpenClaw die levert, gebruikersinvoer voor de beurt en verwijzingen naar de dynamische toolspecificaties.
Ververs de vastgezette Codex-modelpromptfixture met
`pnpm prompt:snapshots:sync-codex-model`. Standaard zoekt het script naar de runtimecache van Codex op `$CODEX_HOME/models_cache.json`, daarna
`~/.codex/models_cache.json`, en pas daarna valt het terug op de maintainer-Codex-checkoutconventie op `~/code/codex/codex-rs/models-manager/models.json`. Als geen van die bronnen bestaat, sluit de opdracht af zonder de gecommitte fixture te wijzigen. Geef `--catalog <path>` door om te verversen vanuit een specifiek `models_cache.json`- of `models.json`-bestand.
Ververs de gepinde Codex-modelpromptfixture met
`pnpm prompt:snapshots:sync-codex-model`. Standaard zoekt het script naar Codex' runtimecache op `$CODEX_HOME/models_cache.json`, daarna
`~/.codex/models_cache.json`, en pas daarna valt het terug op de maintainer-Codex-checkoutconventie op `~/code/codex/codex-rs/models-manager/models.json`. Als geen van die bronnen bestaat, sluit de opdracht af zonder de gecommitte fixture te wijzigen. Geef `--catalog <path>` mee om te verversen vanuit een specifiek `models_cache.json`- of `models.json`-bestand.
Deze snapshots zijn nog steeds geen byte-voor-byte onbewerkte OpenAI-requestcapture. Codex kan runtime-eigen workspacecontext toevoegen, zoals `AGENTS.md`, omgevingscontext, herinneringen, app-/plugininstructies en ingebouwde Default-instructies voor samenwerkingsmodus binnen de Codex-runtime nadat OpenClaw thread- en turn-parameters verstuurt.
Deze snapshots zijn nog steeds geen byte-voor-byte ruwe OpenAI-requestcapture. Codex kan runtime-eigen werkruimtecontext toevoegen zoals `AGENTS.md`, omgevingscontext, memories, app-/plugininstructies en ingebouwde Default-instructies voor samenwerkingsmodus binnen de Codex-runtime nadat OpenClaw thread- en turn-params heeft verzonden.
Genereer ze opnieuw met `pnpm prompt:snapshots:gen` en verifieer drift met
`pnpm prompt:snapshots:check`. CI voert de driftcontrole uit in de extra grensshard, zodat promptwijzigingen en snapshotupdates aan dezelfde PR gekoppeld blijven.
`pnpm prompt:snapshots:check`. CI voert de driftcontrole uit in de aanvullende boundary-shard zodat promptwijzigingen en snapshotupdates aan dezelfde PR gekoppeld blijven.
## Workspace-bootstrapinjectie
## Injectie van werkruimte-bootstrap
Bootstrapbestanden worden ingekort en toegevoegd onder **Projectcontext**, zodat het model identiteit en profielcontext ziet zonder expliciete leesacties nodig te hebben:
Bootstrapbestanden worden ingekort en toegevoegd onder **Projectcontext** zodat het model identiteit en profielcontext ziet zonder expliciete reads nodig te hebben:
- `AGENTS.md`
- `SOUL.md`
@ -108,41 +108,41 @@ Bootstrapbestanden worden ingekort en toegevoegd onder **Projectcontext**, zodat
- `IDENTITY.md`
- `USER.md`
- `HEARTBEAT.md`
- `BOOTSTRAP.md` (alleen op gloednieuwe workspaces)
- `BOOTSTRAP.md` (alleen op gloednieuwe werkruimtes)
- `MEMORY.md` wanneer aanwezig
Al deze bestanden worden **in het contextvenster geïnjecteerd** bij elke beurt, tenzij een bestandsspecifieke gate van toepassing is. `HEARTBEAT.md` wordt weggelaten bij normale runs wanneer Heartbeats zijn uitgeschakeld voor de standaardagent of
Al deze bestanden worden **in het contextvenster geïnjecteerd** bij elke beurt tenzij een bestandsspecifieke gate van toepassing is. `HEARTBEAT.md` wordt bij normale runs weggelaten wanneer heartbeats zijn uitgeschakeld voor de standaardagent of
`agents.defaults.heartbeat.includeSystemPromptSection` false is. Houd geïnjecteerde bestanden beknopt — vooral `MEMORY.md`, dat na verloop van tijd kan groeien en kan leiden tot onverwacht hoog contextgebruik en frequentere Compaction.
Wanneer een sessie draait op de native Codex-harness, laadt Codex `AGENTS.md`
via zijn eigen projectdocumentdetectie. OpenClaw lost nog steeds de resterende bootstrapbestanden op en stuurt ze door als Codex-configuratie-instructies, zodat `SOUL.md`,
Wanneer een sessie op de native Codex-harness draait, laadt Codex `AGENTS.md` via zijn eigen projectdoc-discovery. OpenClaw resolved nog steeds de resterende bootstrapbestanden en stuurt ze door als Codex-configinstructies, zodat `SOUL.md`,
`TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md` en
`MEMORY.md` dezelfde workspacecontextrol behouden zonder `AGENTS.md` te dupliceren.
`MEMORY.md` dezelfde werkruimtecontextrol behouden zonder `AGENTS.md` te dupliceren.
<Note>
Dagelijkse bestanden in `memory/*.md` maken **geen** deel uit van de normale bootstrap-Projectcontext. Bij gewone beurten worden ze op aanvraag benaderd via de tools `memory_search` en `memory_get`, zodat ze niet meetellen voor het contextvenster tenzij het model ze expliciet leest. Kale `/new`- en `/reset`-beurten zijn de uitzondering: de runtime kan recente dagelijkse herinnering vooraf toevoegen als een eenmalig startup-contextblok voor die eerste beurt.
Dagelijkse bestanden in `memory/*.md` maken **geen** deel uit van de normale bootstrap-Projectcontext. Op gewone beurten worden ze op aanvraag benaderd via de tools `memory_search` en `memory_get`, zodat ze niet meetellen voor het contextvenster tenzij het model ze expliciet leest. Kale `/new`- en `/reset`-beurten zijn de uitzondering: de runtime kan recente dagelijkse memory vooraf toevoegen als een eenmalig startup-contextblok voor die eerste beurt.
</Note>
Grote bestanden worden afgekapt met een markering. De maximale grootte per bestand wordt beheerd door
`agents.defaults.bootstrapMaxChars` (standaard: 12000). Totale geïnjecteerde bootstrapinhoud over bestanden heen is begrensd door `agents.defaults.bootstrapTotalMaxChars`
(standaard: 60000). Ontbrekende bestanden injecteren een korte ontbrekend-bestandmarkering. Wanneer afkapping plaatsvindt, kan OpenClaw een waarschuwingsblok in Projectcontext injecteren; beheer dit met
Grote bestanden worden afgekapt met een marker. De maximale grootte per bestand wordt beheerd door
`agents.defaults.bootstrapMaxChars` (standaard: 12000). De totale geïnjecteerde bootstrapcontent over bestanden heen wordt begrensd door `agents.defaults.bootstrapTotalMaxChars`
(standaard: 60000). Ontbrekende bestanden injecteren een korte marker voor ontbrekend bestand. Wanneer afkapping optreedt, kan OpenClaw een beknopte waarschuwingsmelding in de systeemprompt injecteren; beheer dit met
`agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always`;
standaard: `once`).
standaard: `once`). Gedetailleerde raw-/geïnjecteerde aantallen blijven beschikbaar in diagnostics zoals
`/context`, `/status`, doctor en logs.
Subagentsessies injecteren alleen `AGENTS.md` en `TOOLS.md` (andere bootstrapbestanden worden uitgefilterd om de subagentcontext klein te houden).
Subagentsessies injecteren alleen `AGENTS.md` en `TOOLS.md` (andere bootstrapbestanden worden eruit gefilterd om de subagentcontext klein te houden).
Interne hooks kunnen deze stap onderscheppen via `agent:bootstrap` om de geïnjecteerde bootstrapbestanden te muteren of te vervangen (bijvoorbeeld `SOUL.md` omwisselen voor een alternatieve persona).
Als je de agent minder generiek wilt laten klinken, begin dan met
[SOUL.md-persoonlijkheidsgids](/nl/concepts/soul).
[SOUL.md Persoonlijkheidsgids](/nl/concepts/soul).
Gebruik `/context list` of `/context detail` om te inspecteren hoeveel elk geïnjecteerd bestand bijdraagt (onbewerkt versus geïnjecteerd, afkapping, plus overhead van toolschema's). Zie [Context](/nl/concepts/context).
Gebruik `/context list` of `/context detail` om te inspecteren hoeveel elk geïnjecteerd bestand bijdraagt (raw versus geïnjecteerd, afkapping, plus overhead van toolschema's). Zie [Context](/nl/concepts/context).
## Tijdafhandeling
## Tijdverwerking
De systeemprompt bevat een speciale sectie **Huidige datum en tijd** wanneer de tijdzone van de gebruiker bekend is. Om de prompt cache-stabiel te houden, bevat die nu alleen de **tijdzone** (geen dynamische klok of tijdnotatie).
De systeemprompt bevat een speciale sectie **Huidige datum en tijd** wanneer de tijdzone van de gebruiker bekend is. Om de prompt cache-stabiel te houden, bevat deze nu alleen de **tijdzone** (geen dynamische klok of tijdnotatie).
Gebruik `session_status` wanneer de agent de huidige tijd nodig heeft; de statuskaart bevat een tijdstempelregel. Dezelfde tool kan optioneel een modelspecifieke override per sessie instellen (`model=default` wist die).
Gebruik `session_status` wanneer de agent de huidige tijd nodig heeft; de statuskaart bevat een timestampregel. Dezelfde tool kan optioneel een modelspecifieke override per sessie instellen (`model=default` wist die).
Configureer met:
@ -153,13 +153,13 @@ Zie [Datum en tijd](/nl/date-time) voor volledige gedragsdetails.
## Skills
Wanneer geschikte Skills bestaan, injecteert OpenClaw een compacte **lijst met beschikbare Skills**
(`formatSkillsForPrompt`) die het **bestandspad** voor elke skill bevat. De prompt instrueert het model om `read` te gebruiken om de SKILL.md op de vermelde locatie te laden (workspace, beheerd of gebundeld). Als geen Skills geschikt zijn, wordt de sectie Skills weggelaten.
Wanneer geschikte skills bestaan, injecteert OpenClaw een compacte **lijst met beschikbare skills**
(`formatSkillsForPrompt`) die het **bestandspad** voor elke skill bevat. De prompt instrueert het model `read` te gebruiken om de SKILL.md op de vermelde locatie te laden (werkruimte, beheerd of gebundeld). Als er geen skills geschikt zijn, wordt de sectie Skills weggelaten.
Geschiktheid omvat gates voor skillmetadata, runtimeomgeving-/configuratiecontroles en de effectieve toelatingslijst voor agentskills wanneer `agents.defaults.skills` of
Geschiktheid omvat gates voor skillmetadata, runtime-omgeving-/configcontroles en de effectieve allowlist voor agentskills wanneer `agents.defaults.skills` of
`agents.list[].skills` is geconfigureerd.
Plugin-gebundelde Skills zijn alleen geschikt wanneer hun eigenaarsplugin is ingeschakeld. Hierdoor kunnen toolplugins diepere bedieningsgidsen beschikbaar stellen zonder al die begeleiding rechtstreeks in elke toolbeschrijving op te nemen.
Plugin-gebundelde skills zijn alleen geschikt wanneer hun eigenaar-Plugin is ingeschakeld. Hierdoor kunnen tool-plugins diepere bedieningsgidsen aanbieden zonder al die richtlijnen direct in elke toolbeschrijving in te bedden.
```
<available_skills>
@ -171,28 +171,28 @@ Plugin-gebundelde Skills zijn alleen geschikt wanneer hun eigenaarsplugin is ing
</available_skills>
```
Dit houdt de basisprompt klein terwijl gericht gebruik van Skills toch mogelijk blijft.
Dit houdt de basisprompt klein terwijl gericht skillgebruik nog steeds mogelijk blijft.
Het budget voor de Skills-lijst is eigendom van het Skills-subsysteem:
Het budget voor de skillslijst is eigendom van het skillssubsysteem:
- Globale standaard: `skills.limits.maxSkillsPromptChars`
- Override per agent: `agents.list[].skillsLimits.maxSkillsPromptChars`
- Globale standaardwaarde: `skills.limits.maxSkillsPromptChars`
- Overschrijving per agent: `agents.list[].skillsLimits.maxSkillsPromptChars`
Generieke begrensde fragmenten van de uitvoeringsomgeving gebruiken een ander oppervlak:
Algemene begrensde runtime-fragmenten gebruiken een ander oppervlak:
- `agents.defaults.contextLimits.*`
- `agents.list[].contextLimits.*`
Die scheiding houdt de groottebepaling van Skills gescheiden van de groottebepaling voor lezen/injectie tijdens uitvoering, zoals `memory_get`, live toolresultaten en AGENTS.md-verversingen na Compaction.
Die scheiding houdt Skills-grootte gescheiden van de grootte voor runtime-lezen/-injectie, zoals `memory_get`, live toolresultaten en AGENTS.md-verversingen na Compaction.
## Documentatie
De systeemprompt bevat een sectie **Documentatie**. Wanneer lokale documentatie beschikbaar is, verwijst die naar de lokale OpenClaw-documentatiemap (`docs/` in een Git-checkout of de documentatie uit het meegeleverde npm-pakket). Als lokale documentatie niet beschikbaar is, valt die terug op [https://docs.openclaw.ai](https://docs.openclaw.ai).
De systeemprompt bevat een sectie **Documentatie**. Wanneer lokale documentatie beschikbaar is, verwijst deze naar de lokale OpenClaw-documentatiemap (`docs/` in een Git-checkout of de gebundelde documentatie van het npm-pakket). Als lokale documentatie niet beschikbaar is, valt deze terug op [https://docs.openclaw.ai](https://docs.openclaw.ai).
Dezelfde sectie bevat ook de OpenClaw-bronlocatie. Git-checkouts stellen de lokale bronroot beschikbaar zodat de agent code rechtstreeks kan inspecteren. Pakketinstallaties bevatten de GitHub-bron-URL en vertellen de agent om daar de bron te bekijken wanneer de documentatie onvolledig of verouderd is. De prompt vermeldt ook de openbare documentatiespiegel, de community-Discord en ClawHub ([https://clawhub.ai](https://clawhub.ai)) voor het ontdekken van Skills. Die vertelt het model om eerst de documentatie te raadplegen voor OpenClaw-gedrag, -opdrachten, -configuratie of -architectuur, en om waar mogelijk zelf `openclaw status` uit te voeren (en de gebruiker alleen te vragen wanneer het geen toegang heeft). Specifiek voor configuratie verwijst die agents naar de `gateway`-toolactie `config.schema.lookup` voor exacte documentatie en beperkingen op veldniveau, en daarna naar `docs/gateway/configuration.md` en `docs/gateway/configuration-reference.md` voor bredere richtlijnen.
Dezelfde sectie bevat ook de OpenClaw-bronlocatie. Git-checkouts tonen de lokale bronroot zodat de agent code rechtstreeks kan inspecteren. Pakketinstallaties bevatten de GitHub-bron-URL en vertellen de agent de bron daar te bekijken wanneer de documentatie onvolledig of verouderd is. De prompt vermeldt ook de openbare documentatiespiegel, community-Discord en ClawHub ([https://clawhub.ai](https://clawhub.ai)) voor het ontdekken van Skills. Deze vertelt het model eerst de documentatie te raadplegen voor OpenClaw-gedrag, opdrachten, configuratie of architectuur, en waar mogelijk zelf `openclaw status` uit te voeren (waarbij de gebruiker alleen wordt gevraagd wanneer er geen toegang is). Specifiek voor configuratie wijst deze agents op de `gateway`-toolactie `config.schema.lookup` voor exacte documentatie en beperkingen op veldniveau, en daarna op `docs/gateway/configuration.md` en `docs/gateway/configuration-reference.md` voor bredere richtlijnen.
## Gerelateerd
- [Agentuitvoeringsomgeving](/nl/concepts/agent)
- [Agentwerkruimte](/nl/concepts/agent-workspace)
- [Agent-runtime](/nl/concepts/agent)
- [Agent-werkruimte](/nl/concepts/agent-workspace)
- [Context-engine](/nl/concepts/context-engine)

View File

@ -1,20 +1,20 @@
---
read_when:
- Standaardinstellingen voor agents afstemmen (modellen, denken, werkruimte, Heartbeat, media, Skills)
- Routering en bindingen voor meerdere agenten configureren
- Sessies, berichtbezorging en gedrag van de praatmodus aanpassen
summary: Standaardinstellingen voor agenten, multi-agent-routering, sessie, berichten en gespreksconfiguratie
title: Configuratie — agents
- Multi-agentroutering en bindingen configureren
- Sessiegedrag, berichtbezorging en gedrag in praatmodus aanpassen
summary: Standaardinstellingen voor agents, multi-agentroutering, sessie, berichten en talk-configuratie
title: Configuratie — agenten
x-i18n:
generated_at: "2026-05-03T11:09:21Z"
generated_at: "2026-05-04T07:05:06Z"
model: gpt-5.5
provider: openai
source_hash: b25371c34b9f8b0cacce021879e43e6a65b86d626dc87d5bfa05dcae80ac32e4
source_hash: 9d339b82b8b3b82e55820ca6568b3ed569fe64135e698515fa7f316c3afbbfd9
source_path: gateway/config-agents.md
workflow: 16
---
Agent-gebonden configuratiesleutels onder `agents.*`, `multiAgent.*`, `session.*`,
Configuratiesleutels op agentniveau onder `agents.*`, `multiAgent.*`, `session.*`,
`messages.*` en `talk.*`. Zie voor kanalen, tools, Gateway-runtime en andere
toplevelsleutels de [Configuratiereferentie](/nl/gateway/configuration-reference).
@ -32,7 +32,7 @@ Standaard: `~/.openclaw/workspace`.
### `agents.defaults.repoRoot`
Optionele repositoryroot die wordt getoond in de Runtime-regel van de systeemprompt. Als dit niet is ingesteld, detecteert OpenClaw deze automatisch door vanaf de workspace omhoog te lopen.
Optionele repository-root die wordt getoond in de Runtime-regel van de systeemprompt. Als dit niet is ingesteld, detecteert OpenClaw dit automatisch door vanaf de werkruimte omhoog te lopen.
```json5
{
@ -42,8 +42,8 @@ Optionele repositoryroot die wordt getoond in de Runtime-regel van de systeempro
### `agents.defaults.skills`
Optionele standaard allowlist voor Skills voor agents die geen
`agents.list[].skills` instellen.
Optionele standaard-toestemmingslijst voor Skills voor agents die
`agents.list[].skills` niet instellen.
```json5
{
@ -59,14 +59,14 @@ Optionele standaard allowlist voor Skills voor agents die geen
```
- Laat `agents.defaults.skills` weg voor standaard onbeperkte Skills.
- Laat `agents.list[].skills` weg om de standaardwaarden te erven.
- Laat `agents.list[].skills` weg om de standaardwaarden over te nemen.
- Stel `agents.list[].skills: []` in voor geen Skills.
- Een niet-lege lijst `agents.list[].skills` is de definitieve set voor die agent; deze
wordt niet samengevoegd met standaardwaarden.
- Een niet-lege lijst `agents.list[].skills` is de uiteindelijke set voor die agent; deze
wordt niet samengevoegd met de standaardwaarden.
### `agents.defaults.skipBootstrap`
Schakelt het automatisch maken van workspace-bootstrapbestanden uit (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`).
Schakelt automatische aanmaak van bootstrapbestanden voor de werkruimte uit (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`).
```json5
{
@ -76,7 +76,7 @@ Schakelt het automatisch maken van workspace-bootstrapbestanden uit (`AGENTS.md`
### `agents.defaults.skipOptionalBootstrapFiles`
Slaat het maken van geselecteerde optionele workspace-bestanden over terwijl vereiste bootstrapbestanden nog steeds worden geschreven. Geldige waarden: `SOUL.md`, `USER.md`, `HEARTBEAT.md` en `IDENTITY.md`.
Slaat het aanmaken van geselecteerde optionele werkruimtebestanden over, terwijl vereiste bootstrapbestanden nog steeds worden geschreven. Geldige waarden: `SOUL.md`, `USER.md`, `HEARTBEAT.md` en `IDENTITY.md`.
```json5
{
@ -90,10 +90,10 @@ Slaat het maken van geselecteerde optionele workspace-bestanden over terwijl ver
### `agents.defaults.contextInjection`
Bepaalt wanneer workspace-bootstrapbestanden in de systeemprompt worden ingevoegd. Standaard: `"always"`.
Bepaalt wanneer bootstrapbestanden van de werkruimte in de systeemprompt worden geïnjecteerd. Standaard: `"always"`.
- `"continuation-skip"`: veilige vervolgbeurten (na een voltooide assistentrespons) slaan het opnieuw invoegen van workspace-bootstrap over, waardoor de promptgrootte afneemt. Heartbeat-runs en pogingen na Compaction bouwen de context nog steeds opnieuw op.
- `"never"`: schakel workspace-bootstrap en contextbestandinjectie bij elke beurt uit. Gebruik dit alleen voor agents die hun promptlevenscyclus volledig zelf beheren (aangepaste context-engines, native runtimes die hun eigen context bouwen, of gespecialiseerde workflows zonder bootstrap). Heartbeat- en Compaction-herstelbeurten slaan injectie ook over.
- `"continuation-skip"`: veilige vervolgbeurten (na een voltooide assistentrespons) slaan het opnieuw injecteren van de werkruimtebootstrap over, waardoor de promptgrootte afneemt. Heartbeat-runs en pogingen na Compaction bouwen de context nog steeds opnieuw op.
- `"never"`: schakel werkruimtebootstrap en injectie van contextbestanden bij elke beurt uit. Gebruik dit alleen voor agents die hun promptlevenscyclus volledig zelf beheren (aangepaste context-engines, native runtimes die hun eigen context bouwen, of gespecialiseerde workflows zonder bootstrap). Heartbeat- en herstelbeurten na Compaction slaan injectie ook over.
```json5
{
@ -103,7 +103,7 @@ Bepaalt wanneer workspace-bootstrapbestanden in de systeemprompt worden ingevoeg
### `agents.defaults.bootstrapMaxChars`
Maximaal aantal tekens per workspace-bootstrapbestand vóór afkapping. Standaard: `12000`.
Maximumaantal tekens per bootstrapbestand van de werkruimte vóór afkapping. Standaard: `12000`.
```json5
{
@ -113,7 +113,7 @@ Maximaal aantal tekens per workspace-bootstrapbestand vóór afkapping. Standaar
### `agents.defaults.bootstrapTotalMaxChars`
Maximaal totaal aantal tekens dat over alle workspace-bootstrapbestanden heen wordt ingevoegd. Standaard: `60000`.
Maximumaantal tekens dat in totaal over alle bootstrapbestanden van de werkruimte wordt geïnjecteerd. Standaard: `60000`.
```json5
{
@ -123,12 +123,16 @@ Maximaal totaal aantal tekens dat over alle workspace-bootstrapbestanden heen wo
### `agents.defaults.bootstrapPromptTruncationWarning`
Bepaalt de voor de agent zichtbare waarschuwingstekst wanneer bootstrapcontext wordt afgekapt.
Bepaalt de voor de agent zichtbare melding in de systeemprompt wanneer bootstrapcontext wordt afgekapt.
Standaard: `"once"`.
- `"off"`: voeg nooit waarschuwingstekst in de systeemprompt in.
- `"once"`: voeg de waarschuwing eenmaal in per unieke afkappingssignatuur (aanbevolen).
- `"always"`: voeg de waarschuwing bij elke run in wanneer er afkapping is.
- `"off"`: injecteer nooit meldingstekst over afkapping in de systeemprompt.
- `"once"`: injecteer eenmaal per unieke afkappingssignatuur een beknopte melding (aanbevolen).
- `"always"`: injecteer bij elke run een beknopte melding wanneer er afkapping bestaat.
Gedetailleerde ruwe/geïnjecteerde aantallen en velden voor configuratieafstemming blijven in diagnostiek zoals
context-/statusrapporten en logs; routinematige WebChat-gebruikers-/runtimecontext krijgt alleen
de beknopte herstelmelding.
```json5
{
@ -138,25 +142,25 @@ Standaard: `"once"`.
### Eigendomskaart voor contextbudgetten
OpenClaw heeft meerdere prompt-/contextbudgetten met hoog volume, en deze zijn
bewust opgesplitst per subsysteem in plaats van allemaal via een algemene
OpenClaw heeft meerdere prompt-/contextbudgetten met hoog volume, en die zijn
bewust per subsysteem gesplitst in plaats van allemaal via één generieke
knop te lopen.
- `agents.defaults.bootstrapMaxChars` /
`agents.defaults.bootstrapTotalMaxChars`:
normale workspace-bootstrapinjectie.
normale injectie van werkruimtebootstrap.
- `agents.defaults.startupContext.*`:
eenmalige prelude voor reset-/opstartmodelruns, inclusief recente dagelijkse
`memory/*.md`-bestanden. Kale chatcommando's `/new` en `/reset` worden
eenmalige prelude voor modelruns bij reset/opstarten, inclusief recente dagelijkse
`memory/*.md`-bestanden. Kale chatopdrachten `/new` en `/reset` worden
bevestigd zonder het model aan te roepen.
- `skills.limits.*`:
de compacte Skills-lijst die in de systeemprompt wordt ingevoegd.
de compacte Skills-lijst die in de systeemprompt wordt geïnjecteerd.
- `agents.defaults.contextLimits.*`:
begrensde runtimefragmenten en ingevoegde blokken die eigendom zijn van de runtime.
begrensde runtimefragmenten en geïnjecteerde blokken die eigendom zijn van de runtime.
- `memory.qmd.limits.*`:
grootte-instellingen voor geindexeerde geheugenzoekfragmenten en injectie.
fragmentgrootte en injectiegrootte voor geïndexeerd zoeken in geheugen.
Gebruik de bijbehorende per-agent-override alleen wanneer een agent een ander
Gebruik de overeenkomende override per agent alleen wanneer één agent een ander
budget nodig heeft:
- `agents.list[].skillsLimits.maxSkillsPromptChars`
@ -164,9 +168,9 @@ budget nodig heeft:
#### `agents.defaults.startupContext`
Bepaalt de opstartprelude voor de eerste beurt die wordt ingevoegd bij reset-/opstartmodelruns.
Kale chatcommando's `/new` en `/reset` bevestigen de reset zonder het model aan te roepen,
dus laden ze deze prelude niet.
Bepaalt de prelude voor de eerste beurt die wordt geïnjecteerd bij reset-/opstartmodelruns.
Kale chatopdrachten `/new` en `/reset` bevestigen de reset zonder het model aan te roepen,
dus zij laden deze prelude niet.
```json5
{
@ -187,7 +191,7 @@ dus laden ze deze prelude niet.
#### `agents.defaults.contextLimits`
Gedeelde standaardwaarden voor begrensde runtime-contextoppervlakken.
Gedeelde standaardwaarden voor begrensde runtimecontextoppervlakken.
```json5
{
@ -204,19 +208,15 @@ Gedeelde standaardwaarden voor begrensde runtime-contextoppervlakken.
}
```
- `memoryGetMaxChars`: standaardlimiet voor `memory_get`-fragmenten voordat afkappingsmetadata
en vervolgmelding worden toegevoegd.
- `memoryGetDefaultLines`: standaardregelvenster voor `memory_get` wanneer `lines` is
weggelaten.
- `toolResultMaxChars`: limiet voor live toolresultaten die wordt gebruikt voor persistente resultaten en
overloopherstel.
- `postCompactionMaxChars`: fragmentlimiet voor AGENTS.md die wordt gebruikt tijdens
vernieuwingsinjectie na Compaction.
- `memoryGetMaxChars`: standaardlimiet voor `memory_get`-fragmenten voordat afkappingsmetadata en een vervolgaanwijzing worden toegevoegd.
- `memoryGetDefaultLines`: standaardregelvenster voor `memory_get` wanneer `lines` wordt weggelaten.
- `toolResultMaxChars`: limiet voor live toolresultaten die wordt gebruikt voor opgeslagen resultaten en herstel bij overloop.
- `postCompactionMaxChars`: limiet voor AGENTS.md-fragmenten die wordt gebruikt tijdens vernieuwingsinjectie na Compaction.
#### `agents.list[].contextLimits`
Per-agent-override voor de gedeelde `contextLimits`-knoppen. Weggelaten velden erven
van `agents.defaults.contextLimits`.
Override per agent voor de gedeelde `contextLimits`-knoppen. Weggelaten velden nemen
waarden over van `agents.defaults.contextLimits`.
```json5
{
@ -242,7 +242,7 @@ van `agents.defaults.contextLimits`.
#### `skills.limits.maxSkillsPromptChars`
Globale limiet voor de compacte Skills-lijst die in de systeemprompt wordt ingevoegd. Dit
Globale limiet voor de compacte Skills-lijst die in de systeemprompt wordt geïnjecteerd. Dit
heeft geen invloed op het op aanvraag lezen van `SKILL.md`-bestanden.
```json5
@ -257,7 +257,7 @@ heeft geen invloed op het op aanvraag lezen van `SKILL.md`-bestanden.
#### `agents.list[].skillsLimits.maxSkillsPromptChars`
Per-agent-override voor het Skills-promptbudget.
Override per agent voor het Skills-promptbudget.
```json5
{
@ -276,10 +276,10 @@ Per-agent-override voor het Skills-promptbudget.
### `agents.defaults.imageMaxDimensionPx`
Maximale pixelgrootte voor de langste zijde van afbeeldingen in transcript-/toolafbeeldingsblokken vóór provider-aanroepen.
Maximale pixelgrootte voor de langste zijde van een afbeelding in transcript-/toolafbeeldingsblokken vóór provideraanroepen.
Standaard: `1200`.
Lagere waarden verminderen meestal het gebruik van vision-tokens en de grootte van requestpayloads voor runs met veel screenshots.
Lagere waarden verminderen meestal het gebruik van vision-tokens en de grootte van de aanvraagpayload bij runs met veel screenshots.
Hogere waarden behouden meer visueel detail.
```json5
@ -346,6 +346,7 @@ Tijdnotatie in de systeemprompt. Standaard: `auto` (OS-voorkeur).
pdfMaxPages: 20,
thinkingDefault: "low",
verboseDefault: "off",
toolProgressDetail: "explain",
reasoningDefault: "off",
elevatedDefault: "on",
timeoutSeconds: 600,
@ -361,55 +362,56 @@ Tijdnotatie in de systeemprompt. Standaard: `auto` (OS-voorkeur).
- De stringvorm stelt alleen het primaire model in.
- De objectvorm stelt het primaire model plus geordende failovermodellen in.
- `imageModel`: accepteert een string (`"provider/model"`) of een object (`{ primary, fallbacks }`).
- Wordt door het `image`-toolpad gebruikt als de configuratie voor het vision-model.
- Wordt ook gebruikt voor fallback-routering wanneer het geselecteerde/standaardmodel geen afbeeldingsinvoer kan accepteren.
- Geef de voorkeur aan expliciete `provider/model`-verwijzingen. Kale ID's worden geaccepteerd voor compatibiliteit; als een kaal ID uniek overeenkomt met een geconfigureerde afbeeldingsgeschikte vermelding in `models.providers.*.models`, kwalificeert OpenClaw dit naar die provider. Ambigue geconfigureerde overeenkomsten vereisen een expliciet providerprefix.
- Wordt door het `image`-toolpad gebruikt als configuratie voor het vision-model.
- Wordt ook gebruikt als fallbackroutering wanneer het geselecteerde/standaardmodel geen afbeeldingsinvoer kan accepteren.
- Geef de voorkeur aan expliciete `provider/model`-referenties. Kale id's worden voor compatibiliteit geaccepteerd; als een kaal id uniek overeenkomt met een geconfigureerde image-capable vermelding in `models.providers.*.models`, kwalificeert OpenClaw het naar die provider. Dubbelzinnige geconfigureerde overeenkomsten vereisen een expliciet providerprefix.
- `imageGenerationModel`: accepteert een string (`"provider/model"`) of een object (`{ primary, fallbacks }`).
- Wordt gebruikt door de gedeelde mogelijkheid voor afbeeldingsgeneratie en elk toekomstig tool-/Plugin-oppervlak dat afbeeldingen genereert.
- Typische waarden: `google/gemini-3.1-flash-image-preview` voor native Gemini-afbeeldingsgeneratie, `fal/fal-ai/flux/dev` voor fal, `openai/gpt-image-2` voor OpenAI Images, of `openai/gpt-image-1.5` voor OpenAI PNG/WebP-uitvoer met transparante achtergrond.
- Typische waarden: `google/gemini-3.1-flash-image-preview` voor native Gemini-afbeeldingsgeneratie, `fal/fal-ai/flux/dev` voor fal, `openai/gpt-image-2` voor OpenAI Images, of `openai/gpt-image-1.5` voor OpenAI PNG-/WebP-uitvoer met transparante achtergrond.
- Als je rechtstreeks een provider/model selecteert, configureer dan ook de bijbehorende provider-authenticatie (bijvoorbeeld `GEMINI_API_KEY` of `GOOGLE_API_KEY` voor `google/*`, `OPENAI_API_KEY` of OpenAI Codex OAuth voor `openai/gpt-image-2` / `openai/gpt-image-1.5`, `FAL_KEY` voor `fal/*`).
- Als dit wordt weggelaten, kan `image_generate` nog steeds een door authenticatie ondersteunde providerstandaard afleiden. Het probeert eerst de huidige standaardprovider en daarna de resterende geregistreerde providers voor afbeeldingsgeneratie in volgorde van provider-id.
- Als dit wordt weggelaten, kan `image_generate` nog steeds een providerstandaard met authenticatie afleiden. Het probeert eerst de huidige standaardprovider en daarna de resterende geregistreerde providers voor afbeeldingsgeneratie in volgorde van provider-id.
- `musicGenerationModel`: accepteert een string (`"provider/model"`) of een object (`{ primary, fallbacks }`).
- Wordt gebruikt door de gedeelde mogelijkheid voor muziekgeneratie en de ingebouwde `music_generate`-tool.
- Typische waarden: `google/lyria-3-clip-preview`, `google/lyria-3-pro-preview`, of `minimax/music-2.6`.
- Als dit wordt weggelaten, kan `music_generate` nog steeds een door authenticatie ondersteunde providerstandaard afleiden. Het probeert eerst de huidige standaardprovider en daarna de resterende geregistreerde providers voor muziekgeneratie in volgorde van provider-id.
- Als dit wordt weggelaten, kan `music_generate` nog steeds een providerstandaard met authenticatie afleiden. Het probeert eerst de huidige standaardprovider en daarna de resterende geregistreerde providers voor muziekgeneratie in volgorde van provider-id.
- Als je rechtstreeks een provider/model selecteert, configureer dan ook de bijbehorende provider-authenticatie/API-sleutel.
- `videoGenerationModel`: accepteert een string (`"provider/model"`) of een object (`{ primary, fallbacks }`).
- Wordt gebruikt door de gedeelde mogelijkheid voor videogeneratie en de ingebouwde `video_generate`-tool.
- Typische waarden: `qwen/wan2.6-t2v`, `qwen/wan2.6-i2v`, `qwen/wan2.6-r2v`, `qwen/wan2.6-r2v-flash`, of `qwen/wan2.7-r2v`.
- Als dit wordt weggelaten, kan `video_generate` nog steeds een door authenticatie ondersteunde providerstandaard afleiden. Het probeert eerst de huidige standaardprovider en daarna de resterende geregistreerde providers voor videogeneratie in volgorde van provider-id.
- Als dit wordt weggelaten, kan `video_generate` nog steeds een providerstandaard met authenticatie afleiden. Het probeert eerst de huidige standaardprovider en daarna de resterende geregistreerde providers voor videogeneratie in volgorde van provider-id.
- Als je rechtstreeks een provider/model selecteert, configureer dan ook de bijbehorende provider-authenticatie/API-sleutel.
- De gebundelde Qwen-provider voor videogeneratie ondersteunt maximaal 1 uitvoervideo, 1 invoerafbeelding, 4 invoervideo's, een duur van 10 seconden en provideropties op providerniveau voor `size`, `aspectRatio`, `resolution`, `audio` en `watermark`.
- De gebundelde Qwen-provider voor videogeneratie ondersteunt maximaal 1 uitvoervideo, 1 invoerafbeelding, 4 invoervideo's, 10 seconden duur, en opties op providerniveau voor `size`, `aspectRatio`, `resolution`, `audio` en `watermark`.
- `pdfModel`: accepteert een string (`"provider/model"`) of een object (`{ primary, fallbacks }`).
- Wordt door de `pdf`-tool gebruikt voor modelroutering.
- Als dit wordt weggelaten, valt de PDF-tool terug op `imageModel` en daarna op het opgeloste sessie-/standaardmodel.
- `pdfMaxBytesMb`: standaardlimiet voor PDF-grootte voor de `pdf`-tool wanneer `maxBytesMb` niet tijdens de aanroep wordt doorgegeven.
- `pdfMaxPages`: standaard maximumaantal pagina's dat door de extractiefallbackmodus in de `pdf`-tool wordt meegenomen.
- `pdfMaxBytesMb`: standaardlimiet voor PDF-grootte voor de `pdf`-tool wanneer `maxBytesMb` niet bij aanroeptijd wordt meegegeven.
- `pdfMaxPages`: standaardmaximum aantal pagina's dat wordt meegenomen door de extractie-fallbackmodus in de `pdf`-tool.
- `verboseDefault`: standaard verbose-niveau voor agents. Waarden: `"off"`, `"on"`, `"full"`. Standaard: `"off"`.
- `reasoningDefault`: standaardzichtbaarheid van redeneerstappen voor agents. Waarden: `"off"`, `"on"`, `"stream"`. Per-agent `agents.list[].reasoningDefault` overschrijft deze standaard. Geconfigureerde redeneerstandaarden worden alleen toegepast voor eigenaren, geautoriseerde afzenders of operator-admin Gateway-contexten wanneer er geen redeneeroverschrijving per bericht of sessie is ingesteld.
- `elevatedDefault`: standaardniveau voor verhoogde uitvoer voor agents. Waarden: `"off"`, `"on"`, `"ask"`, `"full"`. Standaard: `"on"`.
- `model.primary`: formaat `provider/model` (bijv. `openai/gpt-5.5` voor toegang met API-sleutel of `openai-codex/gpt-5.5` voor Codex OAuth). Als je de provider weglaat, probeert OpenClaw eerst een alias, daarna een unieke geconfigureerde-providerovereenkomst voor exact dat model-id, en pas daarna valt het terug op de geconfigureerde standaardprovider (verouderd compatibiliteitsgedrag, dus geef de voorkeur aan expliciet `provider/model`). Als die provider het geconfigureerde standaardmodel niet meer aanbiedt, valt OpenClaw terug op de eerste geconfigureerde provider/model in plaats van een verouderde standaard van een verwijderde provider te tonen.
- `toolProgressDetail`: detailmodus voor `/verbose`-toolsamenvattingen en toolregels in voortgangsconcepten. Waarden: `"explain"` (standaard, compacte menselijke labels) of `"raw"` (voegt ruwe opdracht/details toe wanneer beschikbaar). Per-agent `agents.list[].toolProgressDetail` overschrijft deze standaard.
- `reasoningDefault`: standaard zichtbaarheid van reasoning voor agents. Waarden: `"off"`, `"on"`, `"stream"`. Per-agent `agents.list[].reasoningDefault` overschrijft deze standaard. Geconfigureerde reasoning-standaarden worden alleen toegepast voor eigenaren, geautoriseerde afzenders of operator-admin-Gateway-contexten wanneer er geen reasoning-override per bericht of sessie is ingesteld.
- `elevatedDefault`: standaardniveau voor elevated-output voor agents. Waarden: `"off"`, `"on"`, `"ask"`, `"full"`. Standaard: `"on"`.
- `model.primary`: indeling `provider/model` (bijv. `openai/gpt-5.5` voor toegang met API-sleutel of `openai-codex/gpt-5.5` voor Codex OAuth). Als je de provider weglaat, probeert OpenClaw eerst een alias, daarna een unieke overeenkomst met geconfigureerde provider voor dat exacte model-id, en pas daarna valt het terug op de geconfigureerde standaardprovider (verouderd compatibiliteitsgedrag, dus geef de voorkeur aan expliciete `provider/model`). Als die provider het geconfigureerde standaardmodel niet meer aanbiedt, valt OpenClaw terug op de eerste geconfigureerde provider/model in plaats van een verouderde standaard van een verwijderde provider te tonen.
- `models`: de geconfigureerde modelcatalogus en allowlist voor `/model`. Elke vermelding kan `alias` (snelkoppeling) en `params` bevatten (providerspecifiek, bijvoorbeeld `temperature`, `maxTokens`, `cacheRetention`, `context1m`, `responsesServerCompaction`, `responsesCompactThreshold`, `chat_template_kwargs`, `extra_body`/`extraBody`).
- Veilige bewerkingen: gebruik `openclaw config set agents.defaults.models '<json>' --strict-json --merge` om vermeldingen toe te voegen. `config set` weigert vervangingen die bestaande allowlist-vermeldingen zouden verwijderen, tenzij je `--replace` doorgeeft.
- Configureer-/onboardingstromen met providerscope voegen geselecteerde providermodellen samen in deze map en behouden niet-gerelateerde providers die al zijn geconfigureerd.
- Voor directe OpenAI Responses-modellen wordt server-side Compaction automatisch ingeschakeld. Gebruik `params.responsesServerCompaction: false` om het injecteren van `context_management` te stoppen, of `params.responsesCompactThreshold` om de drempel te overschrijven. Zie [OpenAI server-side compaction](/nl/providers/openai#server-side-compaction-responses-api).
- `params`: globale standaardproviderparameters die op alle modellen worden toegepast. Ingesteld op `agents.defaults.params` (bijv. `{ cacheRetention: "long" }`).
- Samenvoegvolgorde voor `params` (configuratie): `agents.defaults.params` (globale basis) wordt overschreven door `agents.defaults.models["provider/model"].params` (per model), daarna overschrijft `agents.list[].params` (overeenkomende agent-id) per sleutel. Zie [Prompt Caching](/nl/reference/prompt-caching) voor details.
- `params.extra_body`/`params.extraBody`: geavanceerde pass-through-JSON die wordt samengevoegd in `api: "openai-completions"`-requestbodies voor OpenAI-compatibele proxies. Als dit botst met gegenereerde requestsleutels, wint de extra body; niet-native completions-routes verwijderen daarna nog steeds OpenAI-only `store`.
- `params.chat_template_kwargs`: vLLM/OpenAI-compatibele chat-template-argumenten die worden samengevoegd in top-level `api: "openai-completions"`-requestbodies. Voor `vllm/nemotron-3-*` met denken uit stuurt de gebundelde vLLM-Plugin automatisch `enable_thinking: false` en `force_nonempty_content: true`; expliciete `chat_template_kwargs` overschrijven gegenereerde standaarden, en `extra_body.chat_template_kwargs` heeft nog steeds de uiteindelijke prioriteit. Stel voor Qwen-denkbesturing in vLLM `params.qwenThinkingFormat` in op `"chat-template"` of `"top-level"` op die modelvermelding.
- `compat.supportedReasoningEfforts`: OpenAI-compatibele lijst met redeneerinspanning per model. Neem `"xhigh"` op voor aangepaste endpoints die dit echt accepteren; OpenClaw toont dan `/think xhigh` in commandmenu's, Gateway-sessierijen, sessiepatchvalidatie, agent-CLI-validatie en `llm-task`-validatie voor die geconfigureerde provider/model. Gebruik `compat.reasoningEffortMap` wanneer de backend een providerspecifieke waarde wil voor een canoniek niveau.
- `params.preserveThinking`: alleen voor Z.AI opt-in voor bewaard denken. Wanneer ingeschakeld en denken aan staat, stuurt OpenClaw `thinking.clear_thinking: false` en speelt het eerdere `reasoning_content` opnieuw af; zie [Z.AI-denken en bewaard denken](/nl/providers/zai#thinking-and-preserved-thinking).
- `agentRuntime`: standaard low-level agent-runtimebeleid. Weggelaten id gebruikt standaard OpenClaw Pi. Gebruik `id: "pi"` om de ingebouwde PI-harness af te dwingen, `id: "auto"` om geregistreerde Plugin-harnassen ondersteunde modellen te laten claimen en PI te gebruiken wanneer niets overeenkomt, een geregistreerd harness-id zoals `id: "codex"` om die harness te vereisen, of een ondersteunde CLI-backendalias zoals `id: "claude-cli"`. Expliciete Plugin-runtimes falen gesloten wanneer de harness niet beschikbaar is of faalt. Houd modelverwijzingen canoniek als `provider/model`; selecteer Codex, Claude CLI, Gemini CLI en andere uitvoeringsbackends via runtimeconfiguratie in plaats van verouderde runtime-providerprefixes. Zie [Agent-runtimes](/nl/concepts/agent-runtimes) voor hoe dit verschilt van provider/model-selectie.
- Configuratieschrijvers die deze velden wijzigen (bijvoorbeeld `/models set`, `/models set-image` en opdrachten om fallbacks toe te voegen/te verwijderen) slaan de canonieke objectvorm op en behouden bestaande fallbacklijsten waar mogelijk.
- `maxConcurrent`: maximaal aantal parallelle agent-runs over sessies heen (elke sessie blijft geserialiseerd). Standaard: 4.
- Veilige bewerkingen: gebruik `openclaw config set agents.defaults.models '<json>' --strict-json --merge` om vermeldingen toe te voegen. `config set` weigert vervangingen die bestaande allowlist-vermeldingen zouden verwijderen, tenzij je `--replace` meegeeft.
- Providerspecifieke configure-/onboarding-flows voegen geselecteerde providermodellen samen in deze map en behouden niet-gerelateerde providers die al geconfigureerd zijn.
- Voor directe OpenAI Responses-modellen wordt server-side compaction automatisch ingeschakeld. Gebruik `params.responsesServerCompaction: false` om het injecteren van `context_management` te stoppen, of `params.responsesCompactThreshold` om de drempel te overschrijven. Zie [OpenAI server-side compaction](/nl/providers/openai#server-side-compaction-responses-api).
- `params`: globale standaardproviderparameters die op alle modellen worden toegepast. Stel in op `agents.defaults.params` (bijv. `{ cacheRetention: "long" }`).
- Samenvoegingsprioriteit van `params` (configuratie): `agents.defaults.params` (globale basis) wordt overschreven door `agents.defaults.models["provider/model"].params` (per model), waarna `agents.list[].params` (overeenkomend agent-id) per sleutel overschrijft. Zie [Prompt Caching](/nl/reference/prompt-caching) voor details.
- `params.extra_body`/`params.extraBody`: geavanceerde pass-through-JSON die wordt samengevoegd in `api: "openai-completions"`-request bodies voor OpenAI-compatibele proxy's. Als dit botst met gegenereerde requestsleutels, wint de extra body; niet-native completions-routes verwijderen daarna nog steeds OpenAI-only `store`.
- `params.chat_template_kwargs`: vLLM/OpenAI-compatibele chat-template-argumenten die worden samengevoegd in top-level `api: "openai-completions"`-request bodies. Voor `vllm/nemotron-3-*` met thinking uit stuurt de gebundelde vLLM-Plugin automatisch `enable_thinking: false` en `force_nonempty_content: true`; expliciete `chat_template_kwargs` overschrijven gegenereerde standaarden, en `extra_body.chat_template_kwargs` heeft nog steeds de uiteindelijke prioriteit. Stel voor vLLM Qwen-thinking-regelaars `params.qwenThinkingFormat` in op `"chat-template"` of `"top-level"` op die modelvermelding.
- `compat.supportedReasoningEfforts`: per-model lijst met OpenAI-compatibele reasoning-effort. Neem `"xhigh"` op voor aangepaste endpoints die het echt accepteren; OpenClaw toont dan `/think xhigh` in opdrachtmenu's, Gateway-sessierijen, sessiepatchvalidatie, agent-CLI-validatie en `llm-task`-validatie voor die geconfigureerde provider/model. Gebruik `compat.reasoningEffortMap` wanneer de backend een providerspecifieke waarde wil voor een canoniek niveau.
- `params.preserveThinking`: alleen voor Z.AI opt-in voor preserved thinking. Wanneer dit is ingeschakeld en thinking aan staat, stuurt OpenClaw `thinking.clear_thinking: false` en speelt eerdere `reasoning_content` opnieuw af; zie [Z.AI thinking en preserved thinking](/nl/providers/zai#thinking-and-preserved-thinking).
- `agentRuntime`: standaard low-level agentruntimebeleid. Weggelaten id staat standaard op OpenClaw Pi. Gebruik `id: "pi"` om het ingebouwde PI-harnas af te dwingen, `id: "auto"` om geregistreerde Plugin-harnassen ondersteunde modellen te laten claimen en PI te gebruiken wanneer er geen match is, een geregistreerd harnas-id zoals `id: "codex"` om dat harnas te vereisen, of een ondersteunde CLI-backendalias zoals `id: "claude-cli"`. Expliciete Plugin-runtimes falen gesloten wanneer het harnas niet beschikbaar is of faalt. Houd modelreferenties canoniek als `provider/model`; selecteer Codex, Claude CLI, Gemini CLI en andere uitvoeringsbackends via runtimeconfiguratie in plaats van verouderde runtime-providerprefixen. Zie [Agentruntimes](/nl/concepts/agent-runtimes) voor hoe dit verschilt van provider/model-selectie.
- Configuratieschrijvers die deze velden muteren (bijvoorbeeld `/models set`, `/models set-image` en fallback-opdrachten voor toevoegen/verwijderen) slaan de canonieke objectvorm op en behouden bestaande fallbacklijsten waar mogelijk.
- `maxConcurrent`: maximaal aantal parallelle agentruns over sessies heen (elke sessie blijft geserialiseerd). Standaard: 4.
### `agents.defaults.agentRuntime`
`agentRuntime` bepaalt welke low-level executor agentbeurten uitvoert. De meeste
implementaties zouden de standaard OpenClaw Pi-runtime moeten behouden. Gebruik die wanneer een vertrouwde
Plugin een native harness levert, zoals de gebundelde Codex app-server-harness,
implementaties zouden de standaard OpenClaw Pi-runtime moeten behouden. Gebruik deze wanneer een vertrouwde
Plugin een native harnas levert, zoals het gebundelde Codex app-server-harnas,
of wanneer je een ondersteunde CLI-backend zoals Claude CLI wilt. Zie voor het mentale
model [Agent-runtimes](/nl/concepts/agent-runtimes).
model [Agentruntimes](/nl/concepts/agent-runtimes).
```json5
{
@ -424,14 +426,14 @@ model [Agent-runtimes](/nl/concepts/agent-runtimes).
}
```
- `id`: `"auto"`, `"pi"`, een geregistreerd Plugin-harness-id, of een ondersteunde CLI-backendalias. De gebundelde Codex-Plugin registreert `codex`; de gebundelde Anthropic-Plugin biedt de `claude-cli` CLI-backend.
- `id: "auto"` laat geregistreerde Plugin-harnassen ondersteunde beurten claimen en gebruikt PI wanneer geen harness overeenkomt. Een expliciete Plugin-runtime zoals `id: "codex"` vereist die harness en faalt gesloten als die niet beschikbaar is of faalt.
- Omgevingsoverschrijving: `OPENCLAW_AGENT_RUNTIME=<id|auto|pi>` overschrijft `id` voor dat proces.
- Voor alleen-Codex-implementaties stel je `model: "openai/gpt-5.5"` en `agentRuntime.id: "codex"` in.
- Voor Claude CLI-implementaties geef je de voorkeur aan `model: "anthropic/claude-opus-4-7"` plus `agentRuntime.id: "claude-cli"`. Verouderde `claude-cli/claude-opus-4-7`-modelverwijzingen werken nog steeds voor compatibiliteit, maar nieuwe configuratie moet provider/model-selectie canoniek houden en de uitvoeringsbackend in `agentRuntime.id` zetten.
- Oudere runtime-beleidssleutels worden door `openclaw doctor --fix` herschreven naar `agentRuntime`.
- De harnesskeuze wordt per sessie-id vastgezet na de eerste embedded run. Config-/env-wijzigingen beïnvloeden nieuwe of geresette sessies, niet een bestaand transcript. Verouderde sessies met transcriptgeschiedenis maar zonder geregistreerde pin worden behandeld als PI-vastgezet. `/status` rapporteert de effectieve runtime, bijvoorbeeld `Runtime: OpenClaw Pi Default` of `Runtime: OpenAI Codex`.
- Dit beheert alleen de uitvoering van tekst-agentbeurten. Mediageneratie, vision, PDF, muziek, video en TTS blijven hun provider/model-instellingen gebruiken.
- `id`: `"auto"`, `"pi"`, een geregistreerd Plugin-harnas-id, of een ondersteunde CLI-backendalias. De gebundelde Codex-Plugin registreert `codex`; de gebundelde Anthropic-Plugin biedt de `claude-cli` CLI-backend.
- `id: "auto"` laat geregistreerde Plugin-harnassen ondersteunde beurten claimen en gebruikt PI wanneer geen harnas overeenkomt. Een expliciete Plugin-runtime zoals `id: "codex"` vereist dat harnas en faalt gesloten als het niet beschikbaar is of faalt.
- Omgevingsoverride: `OPENCLAW_AGENT_RUNTIME=<id|auto|pi>` overschrijft `id` voor dat proces.
- Voor Codex-only implementaties stel je `model: "openai/gpt-5.5"` en `agentRuntime.id: "codex"` in.
- Voor Claude CLI-implementaties geef je de voorkeur aan `model: "anthropic/claude-opus-4-7"` plus `agentRuntime.id: "claude-cli"`. Verouderde `claude-cli/claude-opus-4-7`-modelreferenties werken nog steeds voor compatibiliteit, maar nieuwe configuratie moet provider/model-selectie canoniek houden en de uitvoeringsbackend in `agentRuntime.id` plaatsen.
- Oudere runtimebeleidssleutels worden door `openclaw doctor --fix` herschreven naar `agentRuntime`.
- De harnaskeuze wordt per sessie-id vastgezet na de eerste embedded run. Config-/env-wijzigingen beïnvloeden nieuwe of geresette sessies, niet een bestaand transcript. Verouderde sessies met transcriptgeschiedenis maar zonder geregistreerde pin worden behandeld als PI-vastgezet. `/status` rapporteert de effectieve runtime, bijvoorbeeld `Runtime: OpenClaw Pi Default` of `Runtime: OpenAI Codex`.
- Dit regelt alleen de uitvoering van tekstuele agentbeurten. Mediageneratie, vision, PDF, muziek, video en TTS gebruiken nog steeds hun provider/model-instellingen.
**Ingebouwde aliasverkortingen** (alleen van toepassing wanneer het model in `agents.defaults.models` staat):
@ -448,13 +450,13 @@ model [Agent-runtimes](/nl/concepts/agent-runtimes).
Je geconfigureerde aliassen winnen altijd van standaarden.
Z.AI GLM-4.x-modellen schakelen automatisch thinking mode in, tenzij je `--thinking off` instelt of zelf `agents.defaults.models["zai/<model>"].params.thinking` definieert.
Z.AI-modellen schakelen `tool_stream` standaard in voor tool call-streaming. Stel `agents.defaults.models["zai/<model>"].params.tool_stream` in op `false` om dit uit te schakelen.
Anthropic Claude 4.6-modellen gebruiken standaard `adaptive` thinking wanneer er geen expliciet thinking-niveau is ingesteld.
Z.AI GLM-4.x-modellen schakelen de denkmodus automatisch in, tenzij je `--thinking off` instelt of zelf `agents.defaults.models["zai/<model>"].params.thinking` definieert.
Z.AI-modellen schakelen standaard `tool_stream` in voor het streamen van toolaanroepen. Stel `agents.defaults.models["zai/<model>"].params.tool_stream` in op `false` om dit uit te schakelen.
Anthropic Claude 4.6-modellen gebruiken standaard `adaptive` denken wanneer er geen expliciet denkniveau is ingesteld.
### `agents.defaults.cliBackends`
Optionele CLI-backends voor tekst-only fallback-runs (geen tool calls). Handig als back-up wanneer API-providers falen.
Optionele CLI-backends voor tekst-only fallback-runs (geen toolaanroepen). Nuttig als back-up wanneer API-providers falen.
```json5
{
@ -483,13 +485,13 @@ Optionele CLI-backends voor tekst-only fallback-runs (geen tool calls). Handig a
}
```
- CLI-backends zijn tekst-first; tools zijn altijd uitgeschakeld.
- CLI-backends zijn tekstgericht; tools zijn altijd uitgeschakeld.
- Sessies worden ondersteund wanneer `sessionArg` is ingesteld.
- Image pass-through wordt ondersteund wanneer `imageArg` bestandspaden accepteert.
- Doorvoer van afbeeldingen wordt ondersteund wanneer `imageArg` bestandspaden accepteert.
### `agents.defaults.systemPromptOverride`
Vervang de volledige door OpenClaw samengestelde systeemprompt door een vaste string. Stel dit in op default-niveau (`agents.defaults.systemPromptOverride`) of per agent (`agents.list[].systemPromptOverride`). Waarden per agent hebben voorrang; een lege waarde of een waarde met alleen witruimte wordt genegeerd. Handig voor gecontroleerde prompt-experimenten.
Vervang de volledige door OpenClaw samengestelde systeemprompt door een vaste tekenreeks. Stel dit in op standaardniveau (`agents.defaults.systemPromptOverride`) of per agent (`agents.list[].systemPromptOverride`). Waarden per agent hebben voorrang; een lege waarde of een waarde met alleen witruimte wordt genegeerd. Nuttig voor gecontroleerde prompt-experimenten.
```json5
{
@ -503,7 +505,7 @@ Vervang de volledige door OpenClaw samengestelde systeemprompt door een vaste st
### `agents.defaults.promptOverlays`
Providersonafhankelijke prompt-overlays toegepast per modelfamilie. Model-id's uit de GPT-5-familie krijgen het gedeelde gedragscontract voor alle providers; `personality` beheert alleen de vriendelijke laag voor interactiestijl.
Provider-onafhankelijke prompt-overlays die per modelfamilie worden toegepast. Model-id's uit de GPT-5-familie ontvangen het gedeelde gedragscontract over providers heen; `personality` bepaalt alleen de vriendelijke laag voor interactiestijl.
```json5
{
@ -521,7 +523,7 @@ Providersonafhankelijke prompt-overlays toegepast per modelfamilie. Model-id's u
- `"friendly"` (standaard) en `"on"` schakelen de vriendelijke laag voor interactiestijl in.
- `"off"` schakelt alleen de vriendelijke laag uit; het getagde GPT-5-gedragscontract blijft ingeschakeld.
- Legacy `plugins.entries.openai.config.personality` wordt nog steeds gelezen wanneer deze gedeelde instelling niet is ingesteld.
- Verouderde `plugins.entries.openai.config.personality` wordt nog steeds gelezen wanneer deze gedeelde instelling niet is ingesteld.
### `agents.defaults.heartbeat`
@ -553,14 +555,14 @@ Periodieke Heartbeat-runs.
}
```
- `every`: duurstring (ms/s/m/u). Standaard: `30m` (API-key-authenticatie) of `1h` (OAuth-authenticatie). Stel in op `0m` om uit te schakelen.
- `includeSystemPromptSection`: wanneer false, wordt de Heartbeat-sectie uit de systeemprompt weggelaten en wordt `HEARTBEAT.md`-injectie in bootstrapcontext overgeslagen. Standaard: `true`.
- `suppressToolErrorWarnings`: wanneer true, worden waarschuwingspayloads voor toolfouten onderdrukt tijdens Heartbeat-runs.
- `every`: duurtekenreeks (ms/s/m/h). Standaard: `30m` (API-sleutelauthenticatie) of `1h` (OAuth-authenticatie). Stel in op `0m` om uit te schakelen.
- `includeSystemPromptSection`: wanneer dit false is, wordt de Heartbeat-sectie weggelaten uit de systeemprompt en wordt `HEARTBEAT.md`-injectie in de bootstrap-context overgeslagen. Standaard: `true`.
- `suppressToolErrorWarnings`: wanneer dit true is, worden payloads met waarschuwingen over toolfouten tijdens Heartbeat-runs onderdrukt.
- `timeoutSeconds`: maximale tijd in seconden die is toegestaan voor een Heartbeat-agentbeurt voordat deze wordt afgebroken. Laat niet ingesteld om `agents.defaults.timeoutSeconds` te gebruiken.
- `directPolicy`: beleid voor directe/DM-bezorging. `allow` (standaard) staat bezorging aan directe doelen toe. `block` onderdrukt bezorging aan directe doelen en geeft `reason=dm-blocked` uit.
- `lightContext`: wanneer true, gebruiken Heartbeat-runs lichte bootstrapcontext en behouden ze alleen `HEARTBEAT.md` uit bootstrapbestanden van de workspace.
- `isolatedSession`: wanneer true, draait elke Heartbeat in een nieuwe sessie zonder eerdere gespreksgeschiedenis. Hetzelfde isolatiepatroon als Cron `sessionTarget: "isolated"`. Verlaagt de tokenkosten per Heartbeat van ongeveer 100K naar ongeveer 2-5K tokens.
- `skipWhenBusy`: wanneer true, stellen Heartbeat-runs uit bij extra drukke banen: subagent- of genest commandowerk. Cron-banen stellen Heartbeats altijd uit, zelfs zonder deze vlag.
- `directPolicy`: beleid voor directe/DM-bezorging. `allow` (standaard) staat bezorging naar directe doelen toe. `block` onderdrukt bezorging naar directe doelen en geeft `reason=dm-blocked` uit.
- `lightContext`: wanneer dit true is, gebruiken Heartbeat-runs een lichtgewicht bootstrap-context en behouden ze alleen `HEARTBEAT.md` uit de bootstrap-bestanden van de workspace.
- `isolatedSession`: wanneer dit true is, wordt elke Heartbeat uitgevoerd in een nieuwe sessie zonder eerdere gespreksgeschiedenis. Hetzelfde isolatiepatroon als cron `sessionTarget: "isolated"`. Vermindert de tokenkosten per Heartbeat van ~100K naar ~2-5K tokens.
- `skipWhenBusy`: wanneer dit true is, stellen Heartbeat-runs uit op extra bezette banen: subagent- of genest commandowerk. Cron-banen stellen Heartbeats altijd uit, ook zonder deze vlag.
- Per agent: stel `agents.list[].heartbeat` in. Wanneer een agent `heartbeat` definieert, voeren **alleen die agents** Heartbeats uit.
- Heartbeats voeren volledige agentbeurten uit — kortere intervallen verbruiken meer tokens.
@ -599,22 +601,22 @@ Periodieke Heartbeat-runs.
```
- `mode`: `default` of `safeguard` (samenvatten in chunks voor lange geschiedenissen). Zie [Compaction](/nl/concepts/compaction).
- `provider`: id van een geregistreerde Compaction-provider-Plugin. Wanneer ingesteld, wordt de `summarize()` van de provider aangeroepen in plaats van ingebouwde LLM-samenvatting. Valt terug op ingebouwd bij falen. Het instellen van een provider forceert `mode: "safeguard"`. Zie [Compaction](/nl/concepts/compaction).
- `provider`: id van een geregistreerde Plugin voor compaction-providers. Wanneer dit is ingesteld, wordt de `summarize()` van de provider aangeroepen in plaats van de ingebouwde LLM-samenvatting. Valt bij falen terug op de ingebouwde optie. Het instellen van een provider forceert `mode: "safeguard"`. Zie [Compaction](/nl/concepts/compaction).
- `timeoutSeconds`: maximaal aantal seconden dat is toegestaan voor een enkele Compaction-bewerking voordat OpenClaw deze afbreekt. Standaard: `900`.
- `keepRecentTokens`: Pi-cutpointbudget om de meest recente transcriptstaart letterlijk te behouden. Handmatige `/compact` respecteert dit wanneer het expliciet is ingesteld; anders is handmatige Compaction een hard checkpoint.
- `identifierPolicy`: `strict` (standaard), `off` of `custom`. `strict` voegt ingebouwde richtlijnen voor behoud van ondoorzichtige identifiers toe aan het begin tijdens Compaction-samenvatting.
- `keepRecentTokens`: Pi-budget voor het knippunt om de meest recente transcriptstaart letterlijk te behouden. Handmatige `/compact` respecteert dit wanneer het expliciet is ingesteld; anders is handmatige Compaction een hard controlepunt.
- `identifierPolicy`: `strict` (standaard), `off` of `custom`. `strict` voegt ingebouwde richtlijnen voor behoud van ondoorzichtige identifiers toe tijdens Compaction-samenvatting.
- `identifierInstructions`: optionele aangepaste tekst voor identifierbehoud die wordt gebruikt wanneer `identifierPolicy=custom`.
- `qualityGuard`: retry-on-malformed-output-controles voor safeguard-samenvattingen. Standaard ingeschakeld in safeguard-modus; stel `enabled: false` in om de audit over te slaan.
- `midTurnPrecheck`: optionele Pi-tool-loop-drukcontrole. Wanneer `enabled: true`, controleert OpenClaw de contextdruk nadat toolresultaten zijn toegevoegd en vóór de volgende modelaanroep. Als de context niet meer past, breekt het de huidige poging af voordat de prompt wordt ingediend en hergebruikt het het bestaande precheck-herstelpad om toolresultaten af te kappen of te compacten en opnieuw te proberen. Werkt met zowel `default`- als `safeguard`-Compaction-modi. Standaard: uitgeschakeld.
- `postCompactionSections`: optionele AGENTS.md H2/H3-sectienamen om opnieuw te injecteren na Compaction. Standaard `["Session Startup", "Red Lines"]`; stel `[]` in om herinjectie uit te schakelen. Wanneer niet ingesteld of expliciet ingesteld op dat standaardpaar, worden oudere koppen `Every Session`/`Safety` ook geaccepteerd als legacy fallback.
- `model`: optionele `provider/model-id`-override alleen voor Compaction-samenvatting. Gebruik dit wanneer de hoofdsessie één model moet behouden maar Compaction-samenvattingen op een ander model moeten draaien; wanneer niet ingesteld, gebruikt Compaction het primaire model van de sessie.
- `maxActiveTranscriptBytes`: optionele bytedrempel (`number` of strings zoals `"20mb"`) die normale lokale Compaction triggert vóór een run wanneer de actieve JSONL voorbij de drempel groeit. Vereist `truncateAfterCompaction`, zodat succesvolle Compaction kan roteren naar een kleiner opvolgend transcript. Uitgeschakeld wanneer niet ingesteld of `0`.
- `qualityGuard`: controles voor opnieuw proberen bij ongeldig gevormde uitvoer voor safeguard-samenvattingen. Standaard ingeschakeld in safeguard-modus; stel `enabled: false` in om de audit over te slaan.
- `midTurnPrecheck`: optionele Pi-drukcontrole voor de tool-loop. Wanneer `enabled: true` is, controleert OpenClaw de contextdruk nadat toolresultaten zijn toegevoegd en voordat de volgende modelaanroep plaatsvindt. Als de context niet meer past, breekt dit de huidige poging af voordat de prompt wordt ingediend en hergebruikt het het bestaande herstelpad voor prechecks om toolresultaten in te korten of te compacten en opnieuw te proberen. Werkt met zowel `default`- als `safeguard`-Compaction-modi. Standaard: uitgeschakeld.
- `postCompactionSections`: optionele H2/H3-sectienamen uit AGENTS.md om na Compaction opnieuw te injecteren. Standaard `["Session Startup", "Red Lines"]`; stel `[]` in om herinjectie uit te schakelen. Wanneer niet ingesteld of expliciet ingesteld op dat standaardpaar, worden oudere koppen `Every Session`/`Safety` ook geaccepteerd als legacy-fallback.
- `model`: optionele override `provider/model-id` alleen voor Compaction-samenvatting. Gebruik dit wanneer de hoofdsessie één model moet behouden, maar Compaction-samenvattingen op een ander model moeten draaien; wanneer niet ingesteld, gebruikt Compaction het primaire model van de sessie.
- `maxActiveTranscriptBytes`: optionele byte-drempel (`number` of tekenreeksen zoals `"20mb"`) die normale lokale Compaction triggert vóór een run wanneer de actieve JSONL groter wordt dan de drempel. Vereist `truncateAfterCompaction` zodat succesvolle Compaction kan roteren naar een kleiner opvolgend transcript. Uitgeschakeld wanneer niet ingesteld of `0`.
- `notifyUser`: wanneer `true`, stuurt korte meldingen naar de gebruiker wanneer Compaction start en wanneer deze is voltooid (bijvoorbeeld "Context compacten..." en "Compaction voltooid"). Standaard uitgeschakeld om Compaction stil te houden.
- `memoryFlush`: stille agentische beurt vóór auto-Compaction om duurzame herinneringen op te slaan. Stel `model` in op een exact provider/model zoals `ollama/qwen3:8b` wanneer deze housekeeping-beurt op een lokaal model moet blijven; de override erft de actieve sessie-fallbackketen niet. Overgeslagen wanneer de workspace read-only is.
- `memoryFlush`: stille agentische beurt vóór automatische Compaction om duurzame herinneringen op te slaan. Stel `model` in op een exacte provider/model zoals `ollama/qwen3:8b` wanneer deze onderhoudsbeurt op een lokaal model moet blijven; de override erft de fallback-keten van de actieve sessie niet. Wordt overgeslagen wanneer de workspace read-only is.
### `agents.defaults.contextPruning`
Snoeit **oude toolresultaten** uit in-memory context voordat deze naar de LLM wordt verzonden. Wijzigt de sessiegeschiedenis op schijf **niet**.
Snoeit **oude toolresultaten** uit de in-memory context voordat deze naar de LLM wordt verzonden. Wijzigt **niet** de sessiegeschiedenis op schijf.
```json5
{
@ -639,18 +641,18 @@ Snoeit **oude toolresultaten** uit in-memory context voordat deze naar de LLM wo
<Accordion title="gedrag van cache-ttl-modus">
- `mode: "cache-ttl"` schakelt snoeipasses in.
- `ttl` bepaalt hoe vaak snoeien opnieuw kan draaien (na de laatste cache-aanraking).
- Snoeien soft-trimt eerst te grote toolresultaten en hard-cleart daarna oudere toolresultaten indien nodig.
- `ttl` bepaalt hoe vaak snoeien opnieuw kan worden uitgevoerd (na de laatste cache-aanraking).
- Snoeien past eerst zachte inkorting toe op te grote toolresultaten en wist daarna oudere toolresultaten hard als dat nodig is.
**Soft-trim** behoudt begin + einde en voegt `...` in het midden in.
**Zachte inkorting** behoudt begin + einde en voegt `...` in het midden in.
**Hard-clear** vervangt het volledige toolresultaat door de placeholder.
**Hard wissen** vervangt het volledige toolresultaat door de placeholder.
Opmerkingen:
- Afbeeldingsblokken worden nooit getrimd/gewist.
- Verhoudingen zijn gebaseerd op tekens (bij benadering), niet op exacte tokentellingen.
- Als er minder dan `keepLastAssistants` assistant-berichten bestaan, wordt snoeien overgeslagen.
- Afbeeldingsblokken worden nooit ingekort/gewist.
- Ratio's zijn gebaseerd op tekens (bij benadering), niet op exacte tokenaantallen.
- Als er minder dan `keepLastAssistants` assistentberichten bestaan, wordt snoeien overgeslagen.
</Accordion>
@ -674,11 +676,11 @@ Zie [Sessiesnoei](/nl/concepts/session-pruning) voor gedragsdetails.
- Niet-Telegram-kanalen vereisen expliciet `*.blockStreaming: true` om blokantwoorden in te schakelen.
- Kanaaloverrides: `channels.<channel>.blockStreamingCoalesce` (en varianten per account). Signal/Slack/Discord/Google Chat gebruiken standaard `minChars: 1500`.
- `humanDelay`: gerandomiseerde pauze tussen blokantwoorden. `natural` = 800-2500 ms. Override per agent: `agents.list[].humanDelay`.
- `humanDelay`: willekeurige pauze tussen blokantwoorden. `natural` = 8002500ms. Override per agent: `agents.list[].humanDelay`.
Zie [Streaming](/nl/concepts/streaming) voor gedrag + details over chunking.
Zie [Streaming](/nl/concepts/streaming) voor gedrags- en chunkingdetails.
### Type-indicatoren
### Typindicatoren
```json5
{
@ -691,8 +693,8 @@ Zie [Streaming](/nl/concepts/streaming) voor gedrag + details over chunking.
}
```
- Standaarden: `instant` voor directe chats/vermeldingen, `message` voor groepschats zonder vermelding.
- Overschrijvingen per sessie: `session.typingMode`, `session.typingIntervalSeconds`.
- Standaardwaarden: `instant` voor directe chats/vermeldingen, `message` voor groepschats zonder vermelding.
- Overrides per sessie: `session.typingMode`, `session.typingIntervalSeconds`.
Zie [Typindicatoren](/nl/concepts/typing-indicators).
@ -700,7 +702,7 @@ Zie [Typindicatoren](/nl/concepts/typing-indicators).
### `agents.defaults.sandbox`
Optionele sandboxing voor de ingebedde agent. Zie [Sandboxing](/nl/gateway/sandboxing) voor de volledige handleiding.
Optionele sandboxing voor de ingebedde agent. Zie [Sandboxing](/nl/gateway/sandboxing) voor de volledige gids.
```json5
{
@ -795,46 +797,46 @@ Optionele sandboxing voor de ingebedde agent. Zie [Sandboxing](/nl/gateway/sandb
}
```
<Accordion title="Sandboxdetails">
<Accordion title="Sandbox details">
**Backend:**
- `docker`: lokale Docker-runtime (standaard)
- `ssh`: generieke remote runtime met SSH-backend
- `ssh`: generieke, door SSH ondersteunde externe runtime
- `openshell`: OpenShell-runtime
Wanneer `backend: "openshell"` is geselecteerd, verplaatsen runtime-specifieke instellingen naar
Wanneer `backend: "openshell"` is geselecteerd, worden runtime-specifieke instellingen verplaatst naar
`plugins.entries.openshell.config`.
**Configuratie van SSH-backend:**
- `target`: SSH-doel in de vorm `user@host[:port]`
- `command`: SSH-clientopdracht (standaard: `ssh`)
- `workspaceRoot`: absolute remote root die wordt gebruikt voor werkruimten per scope
- `workspaceRoot`: absolute externe root die wordt gebruikt voor werkruimten per scope
- `identityFile` / `certificateFile` / `knownHostsFile`: bestaande lokale bestanden die aan OpenSSH worden doorgegeven
- `identityData` / `certificateData` / `knownHostsData`: inline-inhoud of SecretRefs die OpenClaw tijdens runtime materialiseert naar tijdelijke bestanden
- `strictHostKeyChecking` / `updateHostKeys`: OpenSSH-beleidsknoppen voor hostsleutels
- `identityData` / `certificateData` / `knownHostsData`: inline-inhoud of SecretRefs die OpenClaw tijdens runtime materialiseert in tijdelijke bestanden
- `strictHostKeyChecking` / `updateHostKeys`: OpenSSH-knoppen voor host-keybeleid
**Voorrang voor SSH-authenticatie:**
- `identityData` wint van `identityFile`
- `certificateData` wint van `certificateFile`
- `knownHostsData` wint van `knownHostsFile`
- SecretRef-ondersteunde `*Data`-waarden worden opgelost uit de actieve runtime-snapshot met geheimen voordat de sandboxsessie start
- Door SecretRef ondersteunde `*Data`-waarden worden opgelost vanuit de actieve runtime-snapshot met geheimen voordat de sandboxsessie start
**Gedrag van SSH-backend:**
- seedt de remote werkruimte eenmaal na aanmaken of opnieuw aanmaken
- houdt daarna de remote SSH-werkruimte canoniek
- initialiseert de externe werkruimte eenmaal na maken of opnieuw maken
- houdt daarna de externe SSH-werkruimte canoniek
- routeert `exec`, bestandstools en mediapaden via SSH
- synchroniseert remote wijzigingen niet automatisch terug naar de host
- synchroniseert externe wijzigingen niet automatisch terug naar de host
- ondersteunt geen sandbox-browsercontainers
**Werkruimtetoegang:**
- `none`: sandboxwerkruimte per scope onder `~/.openclaw/sandboxes`
- `ro`: sandboxwerkruimte op `/workspace`, agentwerkruimte alleen-lezen aangekoppeld op `/agent`
- `rw`: agentwerkruimte lezen/schrijven aangekoppeld op `/workspace`
- `ro`: sandboxwerkruimte op `/workspace`, agentwerkruimte read-only gemount op `/agent`
- `rw`: agentwerkruimte read/write gemount op `/workspace`
**Scope:**
@ -842,7 +844,7 @@ Wanneer `backend: "openshell"` is geselecteerd, verplaatsen runtime-specifieke i
- `agent`: één container + werkruimte per agent (standaard)
- `shared`: gedeelde container en werkruimte (geen isolatie tussen sessies)
**OpenShell Plugin-configuratie:**
**OpenShell-Pluginconfiguratie:**
```json5
{
@ -870,29 +872,29 @@ Wanneer `backend: "openshell"` is geselecteerd, verplaatsen runtime-specifieke i
**OpenShell-modus:**
- `mirror`: seed remote vanaf lokaal vóór exec, synchroniseer terug na exec; lokale werkruimte blijft canoniek
- `remote`: seed remote eenmaal wanneer de sandbox wordt aangemaakt, houd daarna de remote werkruimte canoniek
- `mirror`: initieer extern vanuit lokaal vóór exec, synchroniseer terug na exec; lokale werkruimte blijft canoniek
- `remote`: initieer extern eenmaal wanneer de sandbox wordt gemaakt en houd daarna de externe werkruimte canoniek
In `remote`-modus worden host-lokale bewerkingen die buiten OpenClaw zijn gemaakt na de seedstap niet automatisch naar de sandbox gesynchroniseerd.
Transport is SSH naar de OpenShell-sandbox, maar de Plugin beheert de sandboxlevenscyclus en optionele mirrorsynchronisatie.
In `remote`-modus worden lokale hostbewerkingen die buiten OpenClaw zijn gedaan niet automatisch naar de sandbox gesynchroniseerd na de initialisatiestap.
Transport verloopt via SSH naar de OpenShell-sandbox, maar de Plugin beheert de sandboxlevenscyclus en optionele mirrorsynchronisatie.
**`setupCommand`** wordt eenmaal uitgevoerd na het aanmaken van de container (via `sh -lc`). Vereist netwerkegress, schrijfbare root en rootgebruiker.
**`setupCommand`** wordt eenmaal uitgevoerd na het maken van de container (via `sh -lc`). Vereist netwerkegress, schrijfbare root en rootgebruiker.
**Containers gebruiken standaard `network: "none"`** — stel dit in op `"bridge"` (of een aangepast bridge-netwerk) als de agent uitgaande toegang nodig heeft.
**Containers gebruiken standaard `network: "none"`** — stel in op `"bridge"` (of een aangepast bridgenetwerk) als de agent uitgaande toegang nodig heeft.
`"host"` is geblokkeerd. `"container:<id>"` is standaard geblokkeerd, tenzij je expliciet
`sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true` instelt (noodgreep).
`sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true` instelt (noodoptie).
**Inkomende bijlagen** worden geplaatst in `media/inbound/*` in de actieve werkruimte.
**Binnenkomende bijlagen** worden klaargezet in `media/inbound/*` in de actieve werkruimte.
**`docker.binds`** koppelt extra hostmappen aan; globale binds en binds per agent worden samengevoegd.
**`docker.binds`** mount aanvullende hostmappen; globale en per-agent binds worden samengevoegd.
**Sandboxbrowser** (`sandbox.browser.enabled`): Chromium + CDP in een container. noVNC-URL wordt in de systeemprompt geïnjecteerd. Vereist geen `browser.enabled` in `openclaw.json`.
noVNC-waarnemerstoegang gebruikt standaard VNC-authenticatie en OpenClaw geeft een kortlevende token-URL uit (in plaats van het wachtwoord in de gedeelde URL bloot te stellen).
**Browser in sandbox** (`sandbox.browser.enabled`): Chromium + CDP in een container. noVNC-URL wordt geïnjecteerd in de systeemprompt. Vereist geen `browser.enabled` in `openclaw.json`.
noVNC-observertoegang gebruikt standaard VNC-authenticatie en OpenClaw geeft een kortlevende token-URL uit (in plaats van het wachtwoord in de gedeelde URL bloot te stellen).
- `allowHostControl: false` (standaard) voorkomt dat sandboxsessies de hostbrowser targeten.
- `network` is standaard `openclaw-sandbox-browser` (toegewijd bridge-netwerk). Stel dit alleen in op `bridge` wanneer je expliciet globale bridge-connectiviteit wilt.
- `allowHostControl: false` (standaard) blokkeert sandboxsessies om de hostbrowser aan te sturen.
- `network` staat standaard op `openclaw-sandbox-browser` (speciaal bridgenetwerk). Stel alleen in op `bridge` wanneer je expliciet globale bridgeconnectiviteit wilt.
- `cdpSourceRange` beperkt optioneel CDP-ingress aan de containerrand tot een CIDR-bereik (bijvoorbeeld `172.21.0.1/32`).
- `sandbox.browser.binds` koppelt extra hostmappen alleen in de sandboxbrowsercontainer aan. Wanneer ingesteld (inclusief `[]`), vervangt dit `docker.binds` voor de browsercontainer.
- `sandbox.browser.binds` mount aanvullende hostmappen alleen in de sandbox-browsercontainer. Wanneer ingesteld (ook `[]`), vervangt dit `docker.binds` voor de browsercontainer.
- Startstandaarden zijn gedefinieerd in `scripts/sandbox-browser-entrypoint.sh` en afgestemd op containerhosts:
- `--remote-debugging-address=127.0.0.1`
- `--remote-debugging-port=<derived from OPENCLAW_BROWSER_CDP_PORT>`
@ -917,32 +919,32 @@ noVNC-waarnemerstoegang gebruikt standaard VNC-authenticatie en OpenClaw geeft e
- `OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0` schakelt extensies opnieuw in als je workflow
ervan afhankelijk is.
- `--renderer-process-limit=2` kan worden gewijzigd met
`OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>`; stel `0` in om de
standaardproceslimiet van Chromium te gebruiken.
`OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>`; stel `0` in om de standaardproceslimiet
van Chromium te gebruiken.
- plus `--no-sandbox` wanneer `noSandbox` is ingeschakeld.
- Standaarden zijn de basislijn van de containerimage; gebruik een aangepaste browserimage met een aangepast
- Standaarden zijn de baseline van de containerimage; gebruik een aangepaste browserimage met een aangepast
entrypoint om containerstandaarden te wijzigen.
</Accordion>
Browsersandboxing en `sandbox.docker.binds` zijn alleen voor Docker.
Images bouwen (vanuit een source checkout):
Bouw images (vanuit een bron-checkout):
```bash
scripts/sandbox-setup.sh # main sandbox image
scripts/sandbox-browser-setup.sh # optional browser image
```
Voor npm-installaties zonder source checkout, zie [Sandboxing § Images en installatie](/nl/gateway/sandboxing#images-and-setup) voor inline `docker build`-opdrachten.
Voor npm-installaties zonder bron-checkout, zie [Sandboxing § Images en setup](/nl/gateway/sandboxing#images-and-setup) voor inline `docker build`-opdrachten.
### `agents.list` (overschrijvingen per agent)
### `agents.list` (overrides per agent)
Gebruik `agents.list[].tts` om een agent zijn eigen TTS-provider, stem, model,
stijl of automatische TTS-modus te geven. Het agentblok wordt diep samengevoegd over globale
`messages.tts`, zodat gedeelde referenties op één plek kunnen blijven terwijl individuele
agents alleen de stem- of providervelden overschrijven die ze nodig hebben. De overschrijving van de actieve agent
geldt voor automatische gesproken antwoorden, `/tts audio`, `/tts status` en
Gebruik `agents.list[].tts` om een agent een eigen TTS-provider, stem, model,
stijl of automatische TTS-modus te geven. Het agentblok wordt diep samengevoegd bovenop globale
`messages.tts`, zodat gedeelde referenties op één plek kunnen blijven terwijl afzonderlijke
agents alleen de stem- of providervelden overschrijven die ze nodig hebben. De override van de actieve agent
geldt voor automatisch gesproken antwoorden, `/tts audio`, `/tts status` en
de agenttool `tts`. Zie [Tekst-naar-spraak](/nl/tools/tts#per-agent-voice-overrides)
voor providervoorbeelden en voorrang.
@ -999,27 +1001,27 @@ voor providervoorbeelden en voorrang.
```
- `id`: stabiele agent-id (vereist).
- `default`: wanneer er meerdere zijn ingesteld, wint de eerste (waarschuwing wordt gelogd). Als er geen is ingesteld, is de eerste lijstvermelding de standaard.
- `model`: stringvorm stelt een strikte primaire per agent in zonder model-fallback; objectvorm `{ primary }` is ook strikt, tenzij je `fallbacks` toevoegt. Gebruik `{ primary, fallbacks: [...] }` om die agent fallback te laten gebruiken, of `{ primary, fallbacks: [] }` om strikt gedrag expliciet te maken. Cron-taken die alleen `primary` overschrijven, erven nog steeds standaardfallbacks tenzij je `fallbacks: []` instelt.
- `params`: streamparameters per agent, samengevoegd over de geselecteerde modelvermelding in `agents.defaults.models`. Gebruik dit voor agentspecifieke overschrijvingen zoals `cacheRetention`, `temperature` of `maxTokens` zonder de hele modelcatalogus te dupliceren.
- `tts`: optionele per-agent overschrijvingen voor tekst-naar-spraak. Het blok wordt diep samengevoegd over `messages.tts`, dus houd gedeelde providerreferenties en fallbackbeleid in `messages.tts` en stel hier alleen persona-specifieke waarden in, zoals provider, stem, model, stijl of automatische modus.
- `skills`: optionele allowlist voor Skills per agent. Als dit wordt weggelaten, erft de agent `agents.defaults.skills` wanneer die is ingesteld; een expliciete lijst vervangt standaardwaarden in plaats van samen te voegen, en `[]` betekent geen Skills.
- `thinkingDefault`: optioneel standaard-denkniveau per agent (`off | minimal | low | medium | high | xhigh | adaptive | max`). Overschrijft `agents.defaults.thinkingDefault` voor deze agent wanneer er geen overschrijving per bericht of sessie is ingesteld. Het geselecteerde provider-/modelprofiel bepaalt welke waarden geldig zijn; voor Google Gemini behoudt `adaptive` providerbeheerd dynamisch denken (`thinkingLevel` weggelaten bij Gemini 3/3.1, `thinkingBudget: -1` bij Gemini 2.5).
- `reasoningDefault`: optionele standaardzichtbaarheid van redenering per agent (`on | off | stream`). Overschrijft `agents.defaults.reasoningDefault` voor deze agent wanneer er geen redeneringsoverschrijving per bericht of sessie is ingesteld.
- `fastModeDefault`: optionele standaardwaarde per agent voor snelle modus (`true | false`). Geldt wanneer er geen overschrijving per bericht of sessie voor snelle modus is ingesteld.
- `agentRuntime`: optionele overschrijving van low-level runtimebeleid per agent. Gebruik `{ id: "codex" }` om één agent alleen Codex te laten gebruiken terwijl andere agents de standaard PI-fallback in `auto`-modus behouden.
- `runtime`: optionele runtimebeschrijving per agent. Gebruik `type: "acp"` met standaardwaarden van `runtime.acp` (`agent`, `backend`, `mode`, `cwd`) wanneer de agent standaard ACP-harness-sessies moet gebruiken.
- `default`: wanneer er meerdere zijn ingesteld, wint de eerste (waarschuwing gelogd). Als er geen is ingesteld, is de eerste lijstvermelding de standaardwaarde.
- `model`: de tekenreeksvorm stelt een strikte primaire per agent in zonder model-fallback; de objectvorm `{ primary }` is ook strikt, tenzij je `fallbacks` toevoegt. Gebruik `{ primary, fallbacks: [...] }` om fallback voor die agent in te schakelen, of `{ primary, fallbacks: [] }` om strikt gedrag expliciet te maken. Cron-taken die alleen `primary` overschrijven, erven nog steeds standaardfallbacks tenzij je `fallbacks: []` instelt.
- `params`: streamparameters per agent die worden samengevoegd over de geselecteerde modelvermelding in `agents.defaults.models`. Gebruik dit voor agent-specifieke overschrijvingen zoals `cacheRetention`, `temperature` of `maxTokens` zonder de volledige modelcatalogus te dupliceren.
- `tts`: optionele text-to-speech-overschrijvingen per agent. Het blok wordt diep samengevoegd over `messages.tts`, dus bewaar gedeelde providerreferenties en fallbackbeleid in `messages.tts` en stel hier alleen persona-specifieke waarden in, zoals provider, voice, model, style of auto mode.
- `skills`: optionele Skills-toestemmingslijst per agent. Als dit wordt weggelaten, erft de agent `agents.defaults.skills` wanneer dit is ingesteld; een expliciete lijst vervangt standaardwaarden in plaats van samen te voegen, en `[]` betekent geen Skills.
- `thinkingDefault`: optioneel standaarddenkniveau per agent (`off | minimal | low | medium | high | xhigh | adaptive | max`). Overschrijft `agents.defaults.thinkingDefault` voor deze agent wanneer er geen overschrijving per bericht of sessie is ingesteld. Het geselecteerde provider-/modelprofiel bepaalt welke waarden geldig zijn; voor Google Gemini behoudt `adaptive` het provider-eigen dynamische denken (`thinkingLevel` weggelaten op Gemini 3/3.1, `thinkingBudget: -1` op Gemini 2.5).
- `reasoningDefault`: optionele standaardzichtbaarheid van redeneren per agent (`on | off | stream`). Overschrijft `agents.defaults.reasoningDefault` voor deze agent wanneer er geen redeneringsoverschrijving per bericht of sessie is ingesteld.
- `fastModeDefault`: optionele standaardwaarde per agent voor snelle modus (`true | false`). Wordt toegepast wanneer er geen overschrijving per bericht of sessie voor snelle modus is ingesteld.
- `agentRuntime`: optionele low-level runtimebeleid-overschrijving per agent. Gebruik `{ id: "codex" }` om één agent alleen Codex te laten gebruiken terwijl andere agents de standaard Pi-fallback in `auto`-modus behouden.
- `runtime`: optionele runtimebeschrijving per agent. Gebruik `type: "acp"` met `runtime.acp`-standaardwaarden (`agent`, `backend`, `mode`, `cwd`) wanneer de agent standaard ACP-harness-sessies moet gebruiken.
- `identity.avatar`: werkruimte-relatief pad, `http(s)`-URL of `data:`-URI.
- `identity` leidt standaardwaarden af: `ackReaction` uit `emoji`, `mentionPatterns` uit `name`/`emoji`.
- `subagents.allowAgents`: allowlist van agent-id's voor expliciete `sessions_spawn.agentId`-doelen (`["*"]` = willekeurig; standaard: alleen dezelfde agent). Neem de requester-id op wanneer zelfgerichte `agentId`-aanroepen toegestaan moeten zijn.
- Overervingsguard voor sandbox: als de requester-sessie in een sandbox draait, wijst `sessions_spawn` doelen af die zonder sandbox zouden worden uitgevoerd.
- `subagents.allowAgents`: toestemmingslijst van agent-id's voor expliciete `sessions_spawn.agentId`-doelen (`["*"]` = elke; standaard: alleen dezelfde agent). Neem de requester-id op wanneer zelfgerichte `agentId`-aanroepen toegestaan moeten zijn.
- Sandbox-overervingsguard: als de requester-sessie in een sandbox draait, weigert `sessions_spawn` doelen die zonder sandbox zouden draaien.
- `subagents.requireAgentId`: wanneer true, blokkeer `sessions_spawn`-aanroepen die `agentId` weglaten (dwingt expliciete profielselectie af; standaard: false).
---
## Routering voor meerdere agents
## Multi-agentroutering
Voer meerdere geïsoleerde agents uit binnen één Gateway. Zie [Meerdere agents](/nl/concepts/multi-agent).
Voer meerdere geïsoleerde agents uit binnen één Gateway. Zie [Multi-Agent](/nl/concepts/multi-agent).
```json5
{
@ -1036,9 +1038,9 @@ Voer meerdere geïsoleerde agents uit binnen één Gateway. Zie [Meerdere agents
}
```
### Matchvelden voor bindings
### Velden voor bindingmatch
- `type` (optioneel): `route` voor normale routering (ontbrekend type gebruikt standaard route), `acp` voor persistente ACP-gespreksbindings.
- `type` (optioneel): `route` voor normale routering (ontbrekend type gebruikt standaard route), `acp` voor permanente ACP-gespreksbindings.
- `match.channel` (vereist)
- `match.accountId` (optioneel; `*` = elk account; weggelaten = standaardaccount)
- `match.peer` (optioneel; `{ kind: direct|group|channel, id }`)
@ -1056,11 +1058,11 @@ Voer meerdere geïsoleerde agents uit binnen één Gateway. Zie [Meerdere agents
Binnen elke laag wint de eerste overeenkomende `bindings`-vermelding.
Voor vermeldingen met `type: "acp"` lost OpenClaw op via exacte gespreksidentiteit (`match.channel` + account + `match.peer.id`) en gebruikt het de routebinding-laagvolgorde hierboven niet.
Voor `type: "acp"`-vermeldingen resolveert OpenClaw op exacte gespreksidentiteit (`match.channel` + account + `match.peer.id`) en gebruikt het de routebindingslaagvolgorde hierboven niet.
### Toegangsprofielen per agent
<Accordion title="Full access (no sandbox)">
<Accordion title="Volledige toegang (geen sandbox)">
```json5
{
@ -1078,7 +1080,7 @@ Voor vermeldingen met `type: "acp"` lost OpenClaw op via exacte gespreksidentite
</Accordion>
<Accordion title="Read-only tools + workspace">
<Accordion title="Read-only tools + werkruimte">
```json5
{
@ -1153,7 +1155,7 @@ Voor vermeldingen met `type: "acp"` lost OpenClaw op via exacte gespreksidentite
</Accordion>
Zie [Multi-Agent-sandbox en tools](/nl/tools/multi-agent-sandbox-tools) voor details over voorrang.
Zie [Multi-Agent-sandbox en -tools](/nl/tools/multi-agent-sandbox-tools) voor details over voorrang.
---
@ -1204,33 +1206,33 @@ Zie [Multi-Agent-sandbox en tools](/nl/tools/multi-agent-sandbox-tools) voor det
<Accordion title="Details van sessievelden">
- **`scope`**: basisstrategie voor sessiegroepering in groepschatcontexten.
- **`scope`**: basisstrategie voor het groeperen van sessies in groepschatcontexten.
- `per-sender` (standaard): elke afzender krijgt een geïsoleerde sessie binnen een kanaalcontext.
- `global`: alle deelnemers in een kanaalcontext delen één sessie (gebruik dit alleen wanneer gedeelde context bedoeld is).
- **`dmScope`**: hoe DM's worden gegroepeerd.
- `main`: alle DM's delen de hoofdsessie.
- `per-peer`: isoleren op afzender-id over kanalen heen.
- `per-channel-peer`: isoleren per kanaal + afzender (aanbevolen voor inboxen met meerdere gebruikers).
- `per-account-channel-peer`: isoleren per account + kanaal + afzender (aanbevolen voor meerdere accounts).
- **`identityLinks`**: koppelt canonieke id's aan peers met providerprefix voor sessiedeling tussen kanalen. Dock-opdrachten zoals `/dock_discord` gebruiken dezelfde map om de antwoordroute van de actieve sessie naar een andere gekoppelde kanaalpeer te schakelen; zie [Kanaaldocking](/nl/concepts/channel-docking).
- **`reset`**: primair resetbeleid. `daily` reset op lokale tijd `atHour`; `idle` reset na `idleMinutes`. Wanneer beide zijn geconfigureerd, wint wat het eerst verloopt. De versheid van dagelijkse resets gebruikt `sessionStartedAt` van de sessierij; de versheid van idle-resets gebruikt `lastInteractionAt`. Schrijfbewerkingen door achtergrond-/systeemgebeurtenissen zoals Heartbeat, Cron-wakeups, exec-meldingen en Gateway-boekhouding kunnen `updatedAt` bijwerken, maar houden dagelijkse/idle-sessies niet vers.
- `per-peer`: isoleer op afzender-id over kanalen heen.
- `per-channel-peer`: isoleer per kanaal + afzender (aanbevolen voor inboxen met meerdere gebruikers).
- `per-account-channel-peer`: isoleer per account + kanaal + afzender (aanbevolen voor meerdere accounts).
- **`identityLinks`**: koppel canonieke id's aan peers met providerprefix voor sessiedeling tussen kanalen. Dock-opdrachten zoals `/dock_discord` gebruiken dezelfde map om de antwoordroute van de actieve sessie naar een andere gekoppelde kanaalpeer te schakelen; zie [Kanaal-docking](/nl/concepts/channel-docking).
- **`reset`**: primair resetbeleid. `daily` reset op lokale tijd `atHour`; `idle` reset na `idleMinutes`. Wanneer beide zijn geconfigureerd, wint degene die het eerst verloopt. Versheid van dagelijkse resets gebruikt `sessionStartedAt` van de sessierij; versheid van idle-resets gebruikt `lastInteractionAt`. Schrijfacties op de achtergrond of door systeemgebeurtenissen, zoals heartbeat, cron-wakeups, exec-meldingen en Gateway-boekhouding, kunnen `updatedAt` bijwerken, maar houden dagelijkse/idle-sessies niet vers.
- **`resetByType`**: overrides per type (`direct`, `group`, `thread`). Verouderde `dm` wordt geaccepteerd als alias voor `direct`.
- **`mainKey`**: verouderd veld. Runtime gebruikt altijd `"main"` voor de hoofdbucket voor directe chat.
- **`agentToAgent.maxPingPongTurns`**: maximaal aantal antwoord-terugbeurten tussen agents tijdens agent-naar-agent-uitwisselingen (integer, bereik: `0`-`5`). `0` schakelt pingpongketens uit.
- **`sendPolicy`**: match op `channel`, `chatType` (`direct|group|channel`, met verouderde alias `dm`), `keyPrefix` of `rawKeyPrefix`. De eerste weigering wint.
- **`maintenance`**: opschoning van sessiestore + retentiecontroles.
- **`mainKey`**: verouderd veld. De runtime gebruikt altijd `"main"` voor de hoofd-bucket voor directe chats.
- **`agentToAgent.maxPingPongTurns`**: maximaal aantal terug-antwoordbeurten tussen agents tijdens agent-naar-agent-uitwisselingen (integer, bereik: `0``5`). `0` schakelt pingpongketening uit.
- **`sendPolicy`**: match op `channel`, `chatType` (`direct|group|channel`, met verouderde `dm` als alias), `keyPrefix` of `rawKeyPrefix`. De eerste deny wint.
- **`maintenance`**: opschoning en bewaarbeheer voor de sessiestore.
- `mode`: `warn` geeft alleen waarschuwingen; `enforce` past opschoning toe.
- `pruneAfter`: leeftijdsgrens voor verouderde items (standaard `30d`).
- `maxEntries`: maximumaantal items in `sessions.json` (standaard `500`). Runtime schrijft batchopschoning met een kleine high-waterbuffer voor limieten op productieschaal; `openclaw sessions cleanup --enforce` past de limiet direct toe.
- `pruneAfter`: leeftijdsgrens voor verouderde vermeldingen (standaard `30d`).
- `maxEntries`: maximaal aantal vermeldingen in `sessions.json` (standaard `500`). De runtime schrijft batchopschoning met een kleine high-water-buffer voor productiegrote limieten; `openclaw sessions cleanup --enforce` past de limiet onmiddellijk toe.
- `rotateBytes`: verouderd en genegeerd; `openclaw doctor --fix` verwijdert dit uit oudere configuraties.
- `resetArchiveRetention`: retentie voor transcriptarchieven met `*.reset.<timestamp>`. Standaard gelijk aan `pruneAfter`; stel in op `false` om uit te schakelen.
- `resetArchiveRetention`: bewaartermijn voor `*.reset.<timestamp>`-transcriptarchieven. Standaard gelijk aan `pruneAfter`; stel in op `false` om uit te schakelen.
- `maxDiskBytes`: optioneel schijfbudget voor de sessiemap. In `warn`-modus logt dit waarschuwingen; in `enforce`-modus verwijdert dit eerst de oudste artefacten/sessies.
- `highWaterBytes`: optioneel doel na budgetopschoning. Standaard `80%` van `maxDiskBytes`.
- **`threadBindings`**: globale standaarden voor functies voor thread-gebonden sessies.
- `enabled`: centrale standaardschakelaar (providers kunnen dit overschrijven; Discord gebruikt `channels.discord.threadBindings.enabled`)
- `idleHours`: standaard automatisch ontfocussen na inactiviteit in uren (`0` schakelt uit; providers kunnen dit overschrijven)
- `maxAgeHours`: standaard harde maximumleeftijd in uren (`0` schakelt uit; providers kunnen dit overschrijven)
- `spawnSessions`: standaardpoort voor het maken van thread-gebonden werksessies vanuit `sessions_spawn` en ACP-threadspawns. Standaard `true` wanneer threadbindingen zijn ingeschakeld; providers/accounts kunnen dit overschrijven.
- **`threadBindings`**: globale standaardwaarden voor functies voor thread-gebonden sessies.
- `enabled`: hoofdschakelaar voor de standaardinstelling (providers kunnen overschrijven; Discord gebruikt `channels.discord.threadBindings.enabled`)
- `idleHours`: standaard automatische ontfocus bij inactiviteit in uren (`0` schakelt uit; providers kunnen overschrijven)
- `maxAgeHours`: standaard harde maximale leeftijd in uren (`0` schakelt uit; providers kunnen overschrijven)
- `spawnSessions`: standaardpoort voor het maken van thread-gebonden werksessies vanuit `sessions_spawn` en ACP-thread-spawns. Standaard `true` wanneer thread-bindings zijn ingeschakeld; providers/accounts kunnen overschrijven.
- `defaultSpawnContext`: standaard native subagentcontext voor thread-gebonden spawns (`"fork"` of `"isolated"`). Standaard `"fork"`.
</Accordion>
@ -1269,36 +1271,36 @@ Zie [Multi-Agent-sandbox en tools](/nl/tools/multi-agent-sandbox-tools) voor det
### Antwoordprefix
Overschrijvingen per kanaal/account: `channels.<channel>.responsePrefix`, `channels.<channel>.accounts.<id>.responsePrefix`.
Overrides per kanaal/account: `channels.<channel>.responsePrefix`, `channels.<channel>.accounts.<id>.responsePrefix`.
Resolutie (meest specifiek wint): account → kanaal → globaal. `""` schakelt uit en stopt de cascade. `"auto"` leidt `[{identity.name}]` af.
Resolutie (meest specifieke wint): account → kanaal → globaal. `""` schakelt uit en stopt cascade. `"auto"` leidt `[{identity.name}]` af.
**Sjabloonvariabelen:**
| Variabele | Beschrijving | Voorbeeld |
| ----------------- | ------------------------ | --------------------------- |
| `{model}` | Korte modelnaam | `claude-opus-4-6` |
| `{modelFull}` | Volledige model-ID | `anthropic/claude-opus-4-6` |
| `{provider}` | Providernaam | `anthropic` |
| `{thinkingLevel}` | Huidig denkniveau | `high`, `low`, `off` |
| `{identity.name}` | Naam van agentidentiteit | (hetzelfde als `"auto"`) |
| Variabele | Beschrijving | Voorbeeld |
| ----------------- | ---------------------------- | --------------------------- |
| `{model}` | Korte modelnaam | `claude-opus-4-6` |
| `{modelFull}` | Volledige model-ID | `anthropic/claude-opus-4-6` |
| `{provider}` | Providernaam | `anthropic` |
| `{thinkingLevel}` | Huidig denkniveau | `high`, `low`, `off` |
| `{identity.name}` | Naam van agentidentiteit | (hetzelfde als `"auto"`) |
Variabelen zijn hoofdletterongevoelig. `{think}` is een alias voor `{thinkingLevel}`.
Variabelen zijn niet hoofdlettergevoelig. `{think}` is een alias voor `{thinkingLevel}`.
### Ack-reactie
- Standaard ingesteld op `identity.emoji` van de actieve agent, anders `"👀"`. Stel in op `""` om uit te schakelen.
- Overschrijvingen per kanaal: `channels.<channel>.ackReaction`, `channels.<channel>.accounts.<id>.ackReaction`.
- Resolutievolgorde: account → kanaal → `messages.ackReaction` → identiteitsfallback.
- Standaard de `identity.emoji` van de actieve agent, anders `"👀"`. Stel in op `""` om uit te schakelen.
- Overrides per kanaal: `channels.<channel>.ackReaction`, `channels.<channel>.accounts.<id>.ackReaction`.
- Resolutievolgorde: account → kanaal → `messages.ackReaction` → identiteitsterugval.
- Bereik: `group-mentions` (standaard), `group-all`, `direct`, `all`.
- `removeAckAfterReply`: verwijdert ack na antwoord op kanalen die reacties ondersteunen, zoals Slack, Discord, Telegram, WhatsApp en BlueBubbles.
- `removeAckAfterReply`: verwijdert ack na antwoord op kanalen met reactieondersteuning zoals Slack, Discord, Telegram, WhatsApp en BlueBubbles.
- `messages.statusReactions.enabled`: schakelt levenscyclusstatusreacties in op Slack, Discord en Telegram.
Op Slack en Discord blijven statusreacties ingeschakeld wanneer ack-reacties actief zijn als dit niet is ingesteld.
Op Telegram moet je dit expliciet instellen op `true` om levenscyclusstatusreacties in te schakelen.
Stel dit op Telegram expliciet in op `true` om levenscyclusstatusreacties in te schakelen.
### Inkomende debounce
Bundelt snelle tekst-only berichten van dezelfde afzender in één agentbeurt. Media/bijlagen worden onmiddellijk doorgespoeld. Bedieningsopdrachten omzeilen debounce.
Bundelt snelle tekst-only berichten van dezelfde afzender in één agentbeurt. Media/bijlagen worden onmiddellijk geflusht. Besturingscommando's omzeilen debouncing.
### TTS (tekst-naar-spraak)
@ -1348,19 +1350,19 @@ Bundelt snelle tekst-only berichten van dezelfde afzender in één agentbeurt. M
}
```
- `auto` bepaalt de standaard automatische TTS-modus: `off`, `always`, `inbound` of `tagged`. `/tts on|off` kan lokale voorkeuren overschrijven, en `/tts status` toont de effectieve status.
- `auto` bepaalt de standaardmodus voor auto-TTS: `off`, `always`, `inbound` of `tagged`. `/tts on|off` kan lokale voorkeuren overschrijven, en `/tts status` toont de effectieve status.
- `summaryModel` overschrijft `agents.defaults.model.primary` voor automatische samenvatting.
- `modelOverrides` is standaard ingeschakeld; `modelOverrides.allowProvider` is standaard `false` (opt-in).
- API-sleutels vallen terug op `ELEVENLABS_API_KEY`/`XI_API_KEY` en `OPENAI_API_KEY`.
- Meegeleverde spraakproviders zijn eigendom van Plugins. Als `plugins.allow` is ingesteld, neem dan elke TTS-provider-Plugin op die je wilt gebruiken, bijvoorbeeld `microsoft` voor Edge TTS. De verouderde provider-ID `edge` wordt geaccepteerd als alias voor `microsoft`.
- Gebundelde spraakproviders zijn eigendom van Plugins. Als `plugins.allow` is ingesteld, neem dan elke TTS-provider-Plugin op die je wilt gebruiken, bijvoorbeeld `microsoft` voor Edge TTS. De verouderde provider-ID `edge` wordt geaccepteerd als alias voor `microsoft`.
- `providers.openai.baseUrl` overschrijft het OpenAI TTS-eindpunt. De resolutievolgorde is configuratie, daarna `OPENAI_TTS_BASE_URL`, daarna `https://api.openai.com/v1`.
- Wanneer `providers.openai.baseUrl` naar een niet-OpenAI-eindpunt verwijst, behandelt OpenClaw dit als een OpenAI-compatibele TTS-server en versoepelt het model-/stemvalidatie.
---
## Praten
## Talk
Standaardinstellingen voor Talk-modus (macOS/iOS/Android).
Standaarden voor Talk-modus (macOS/iOS/Android).
```json5
{
@ -1390,15 +1392,15 @@ Standaardinstellingen voor Talk-modus (macOS/iOS/Android).
```
- `talk.provider` moet overeenkomen met een sleutel in `talk.providers` wanneer meerdere Talk-providers zijn geconfigureerd.
- Verouderde platte Talk-sleutels (`talk.voiceId`, `talk.voiceAliases`, `talk.modelId`, `talk.outputFormat`, `talk.apiKey`) zijn alleen bedoeld voor compatibiliteit en worden automatisch gemigreerd naar `talk.providers.<provider>`.
- Verouderde platte Talk-sleutels (`talk.voiceId`, `talk.voiceAliases`, `talk.modelId`, `talk.outputFormat`, `talk.apiKey`) zijn alleen voor compatibiliteit en worden automatisch gemigreerd naar `talk.providers.<provider>`.
- Stem-ID's vallen terug op `ELEVENLABS_VOICE_ID` of `SAG_VOICE_ID`.
- `providers.*.apiKey` accepteert platte tekststrings of SecretRef-objecten.
- De fallback `ELEVENLABS_API_KEY` is alleen van toepassing wanneer er geen Talk-API-sleutel is geconfigureerd.
- Met `providers.*.voiceAliases` kunnen Talk-richtlijnen beschrijvende namen gebruiken.
- `providers.mlx.modelId` selecteert de Hugging Face-repo die wordt gebruikt door de lokale MLX-helper van macOS. Als dit wordt weggelaten, gebruikt macOS `mlx-community/Soprano-80M-bf16`.
- MLX-afspelen op macOS loopt via de meegeleverde `openclaw-mlx-tts`-helper wanneer aanwezig, of via een uitvoerbaar bestand op `PATH`; `OPENCLAW_MLX_TTS_BIN` overschrijft het helperpad voor ontwikkeling.
- `speechLocale` stelt de BCP 47-locale-ID in die wordt gebruikt door iOS/macOS Talk-spraakherkenning. Laat dit leeg om de apparaatstandaard te gebruiken.
- `silenceTimeoutMs` bepaalt hoe lang Talk-modus na stilte van de gebruiker wacht voordat het transcript wordt verzonden. Niet instellen behoudt het standaard pauzevenster van het platform (`700 ms on macOS and Android, 900 ms on iOS`).
- Terugval naar `ELEVENLABS_API_KEY` geldt alleen wanneer er geen Talk-API-sleutel is geconfigureerd.
- Met `providers.*.voiceAliases` kunnen Talk-instructies vriendelijke namen gebruiken.
- `providers.mlx.modelId` selecteert de Hugging Face-repo die door de macOS lokale MLX-helper wordt gebruikt. Indien weggelaten, gebruikt macOS `mlx-community/Soprano-80M-bf16`.
- macOS MLX-weergave loopt via de gebundelde `openclaw-mlx-tts`-helper wanneer aanwezig, of via een uitvoerbaar bestand op `PATH`; `OPENCLAW_MLX_TTS_BIN` overschrijft het helperpad voor ontwikkeling.
- `speechLocale` stelt de BCP 47-locale-ID in die wordt gebruikt door iOS/macOS Talk-spraakherkenning. Laat dit niet ingesteld om de apparaatstandaard te gebruiken.
- `silenceTimeoutMs` bepaalt hoelang de Talk-modus wacht na stilte van de gebruiker voordat het transcript wordt verzonden. Niet ingesteld behoudt het standaard pauzevenster van het platform (`700 ms on macOS and Android, 900 ms on iOS`).
---

View File

@ -2,21 +2,21 @@
read_when:
- Een kanaal-Plugin configureren (authenticatie, toegangscontrole, meerdere accounts)
- Probleemoplossing voor configuratiesleutels per kanaal
- DM-beleid, groepsbeleid of mention gating controleren
summary: 'Kanaalconfiguratie: toegangscontrole, koppeling, kanaalspecifieke sleutels voor Slack, Discord, Telegram, WhatsApp, Matrix, iMessage en meer'
- Controleren van DM-beleid, groepsbeleid of vermeldingsbeperking
summary: 'Kanaalconfiguratie: toegangsbeheer, koppeling, sleutels per kanaal voor Slack, Discord, Telegram, WhatsApp, Matrix, iMessage en meer'
title: Configuratie — kanalen
x-i18n:
generated_at: "2026-05-03T21:31:44Z"
generated_at: "2026-05-04T07:05:43Z"
model: gpt-5.5
provider: openai
source_hash: 366bcee632c649219bbf6cf44d64cc13d966ec813abc74d54088d89de640b47c
source_hash: 57dcc0b5148324ea6fdee51b7b6e97ec7bd7dc3ca89518ab0816fe4172feefbc
source_path: gateway/config-channels.md
workflow: 16
---
Configuratiesleutels per kanaal onder `channels.*`. Behandelt DM- en groepstoegang,
set-ups met meerdere accounts, vermelding-gating en sleutels per kanaal voor Slack, Discord,
Telegram, WhatsApp, Matrix, iMessage en de andere meegeleverde kanaal-plugins.
set-ups met meerdere accounts, mention-gating en sleutels per kanaal voor Slack, Discord,
Telegram, WhatsApp, Matrix, iMessage en de andere gebundelde kanaalplugins.
Voor agents, tools, Gateway-runtime en andere sleutels op topniveau, zie
[Configuratiereferentie](/nl/gateway/configuration-reference).
@ -29,28 +29,28 @@ Elk kanaal start automatisch wanneer de configuratiesectie bestaat (tenzij `enab
Alle kanalen ondersteunen DM-beleid en groepsbeleid:
| DM-beleid | Gedrag |
| ------------------- | ----------------------------------------------------------------- |
| DM-beleid | Gedrag |
| ------------------- | ------------------------------------------------------------- |
| `pairing` (standaard) | Onbekende afzenders krijgen een eenmalige koppelingscode; eigenaar moet goedkeuren |
| `allowlist` | Alleen afzenders in `allowFrom` (of gekoppelde allow-opslag) |
| `open` | Alle inkomende DM's toestaan (vereist `allowFrom: ["*"]`) |
| `disabled` | Alle inkomende DM's negeren |
| `allowlist` | Alleen afzenders in `allowFrom` (of gekoppelde allow-store) |
| `open` | Alle inkomende DM's toestaan (vereist `allowFrom: ["*"]`) |
| `disabled` | Alle inkomende DM's negeren |
| Groepsbeleid | Gedrag |
| --------------------- | -------------------------------------------------------- |
| Groepsbeleid | Gedrag |
| --------------------- | ---------------------------------------------------- |
| `allowlist` (standaard) | Alleen groepen die overeenkomen met de geconfigureerde allowlist |
| `open` | Groeps-allowlists omzeilen (vermelding-gating blijft gelden) |
| `disabled` | Alle groeps-/roomberichten blokkeren |
| `open` | Groepsallowlists omzeilen (mention-gating blijft van toepassing) |
| `disabled` | Alle groeps-/roomberichten blokkeren |
<Note>
`channels.defaults.groupPolicy` stelt de standaard in wanneer `groupPolicy` van een provider niet is ingesteld.
Koppelingscodes verlopen na 1 uur. Wachtende DM-koppelingsverzoeken zijn beperkt tot **3 per kanaal**.
Als een providerblok volledig ontbreekt (`channels.<provider>` afwezig), valt het runtime-groepsbeleid terug op `allowlist` (fail-closed) met een opstartwaarschuwing.
`channels.defaults.groupPolicy` stelt de standaard in wanneer de `groupPolicy` van een provider niet is ingesteld.
Koppelingscodes verlopen na 1 uur. Openstaande DM-koppelingsverzoeken zijn beperkt tot **3 per kanaal**.
Als een providerblok volledig ontbreekt (`channels.<provider>` ontbreekt), valt het groepsbeleid tijdens runtime terug op `allowlist` (fail-closed) met een opstartwaarschuwing.
</Note>
### Kanaalmodel-overschrijvingen
### Modeloverschrijvingen per kanaal
Gebruik `channels.modelByChannel` om specifieke kanaal-ID's aan een model vast te pinnen. Waarden accepteren `provider/model` of geconfigureerde modelaliassen. De kanaaltoewijzing wordt toegepast wanneer een sessie nog geen modeloverschrijving heeft (bijvoorbeeld ingesteld via `/model`).
Gebruik `channels.modelByChannel` om specifieke kanaal-ID's vast te zetten op een model. Waarden accepteren `provider/model` of geconfigureerde modelaliassen. De kanaaltoewijzing wordt toegepast wanneer een sessie nog geen modeloverschrijving heeft (bijvoorbeeld ingesteld via `/model`).
```json5
{
@ -73,7 +73,7 @@ Gebruik `channels.modelByChannel` om specifieke kanaal-ID's aan een model vast t
### Kanaalstandaarden en Heartbeat
Gebruik `channels.defaults` voor gedeeld groepsbeleid en Heartbeat-gedrag over providers heen:
Gebruik `channels.defaults` voor gedeeld groepsbeleid en Heartbeat-gedrag tussen providers:
```json5
{
@ -91,11 +91,11 @@ Gebruik `channels.defaults` voor gedeeld groepsbeleid en Heartbeat-gedrag over p
}
```
- `channels.defaults.groupPolicy`: terugval-groepsbeleid wanneer `groupPolicy` op providerniveau niet is ingesteld.
- `channels.defaults.contextVisibility`: standaardzichtbaarheidsmodus voor aanvullende context voor alle kanalen. Waarden: `all` (standaard, neem alle geciteerde/thread-/geschiedeniscontext op), `allowlist` (neem alleen context op van afzenders op de allowlist), `allowlist_quote` (hetzelfde als allowlist, maar behoud expliciete citaat-/antwoordcontext). Overschrijving per kanaal: `channels.<channel>.contextVisibility`.
- `channels.defaults.groupPolicy`: terugvalbeleid voor groepen wanneer een `groupPolicy` op providerniveau niet is ingesteld.
- `channels.defaults.contextVisibility`: standaardmodus voor zichtbaarheid van aanvullende context voor alle kanalen. Waarden: `all` (standaard, alle geciteerde/thread-/geschiedeniscontext opnemen), `allowlist` (alleen context opnemen van afzenders op de allowlist), `allowlist_quote` (hetzelfde als allowlist maar expliciete citaat-/antwoordcontext behouden). Overschrijving per kanaal: `channels.<channel>.contextVisibility`.
- `channels.defaults.heartbeat.showOk`: gezonde kanaalstatussen opnemen in Heartbeat-uitvoer.
- `channels.defaults.heartbeat.showAlerts`: verslechterde/foutstatussen opnemen in Heartbeat-uitvoer.
- `channels.defaults.heartbeat.useIndicator`: compacte Heartbeat-uitvoer in indicatorstijl renderen.
- `channels.defaults.heartbeat.showAlerts`: gedegradeerde/foutstatussen opnemen in Heartbeat-uitvoer.
- `channels.defaults.heartbeat.useIndicator`: compacte indicatorstijl-Heartbeat-uitvoer weergeven.
### WhatsApp
@ -155,9 +155,9 @@ WhatsApp draait via het webkanaal van de Gateway (Baileys Web). Het start automa
}
```
- Uitgaande opdrachten gebruiken standaard account `default` als dit aanwezig is; anders de eerste geconfigureerde account-ID (gesorteerd).
- Optioneel overschrijft `channels.whatsapp.defaultAccount` die terugvalselectie van het standaardaccount wanneer deze overeenkomt met een geconfigureerde account-ID.
- De verouderde Baileys-authenticatiemap voor één account wordt door `openclaw doctor` gemigreerd naar `whatsapp/default`.
- Uitgaande opdrachten gebruiken standaard account `default` als dat aanwezig is; anders de eerste geconfigureerde account-id (gesorteerd).
- Optionele `channels.whatsapp.defaultAccount` overschrijft die terugvalselectie voor het standaardaccount wanneer deze overeenkomt met een geconfigureerde account-id.
- Verouderde Baileys-authenticatiemap voor één account wordt door `openclaw doctor` gemigreerd naar `whatsapp/default`.
- Overschrijvingen per account: `channels.whatsapp.accounts.<id>.sendReadReceipts`, `channels.whatsapp.accounts.<id>.dmPolicy`, `channels.whatsapp.accounts.<id>.allowFrom`.
</Accordion>
@ -219,11 +219,11 @@ WhatsApp draait via het webkanaal van de Gateway (Baileys Web). Het start automa
- Bottoken: `channels.telegram.botToken` of `channels.telegram.tokenFile` (alleen regulier bestand; symlinks geweigerd), met `TELEGRAM_BOT_TOKEN` als terugval voor het standaardaccount.
- `apiRoot` is alleen de Telegram Bot API-root. Gebruik `https://api.telegram.org` of je zelfgehoste/proxy-root, niet `https://api.telegram.org/bot<TOKEN>`; `openclaw doctor --fix` verwijdert een per ongeluk toegevoegde afsluitende `/bot<TOKEN>`-suffix.
- Optioneel overschrijft `channels.telegram.defaultAccount` de standaardaccountselectie wanneer deze overeenkomt met een geconfigureerde account-ID.
- Stel in set-ups met meerdere accounts (2+ account-ID's) een expliciete standaard in (`channels.telegram.defaultAccount` of `channels.telegram.accounts.default`) om terugvalroutering te voorkomen; `openclaw doctor` waarschuwt wanneer deze ontbreekt of ongeldig is.
- Optionele `channels.telegram.defaultAccount` overschrijft de standaardaccountselectie wanneer deze overeenkomt met een geconfigureerde account-id.
- Stel in set-ups met meerdere accounts (2+ account-id's) een expliciete standaard in (`channels.telegram.defaultAccount` of `channels.telegram.accounts.default`) om terugvalroutering te vermijden; `openclaw doctor` waarschuwt wanneer dit ontbreekt of ongeldig is.
- `configWrites: false` blokkeert door Telegram geïnitieerde configuratieschrijfacties (supergroep-ID-migraties, `/config set|unset`).
- Items op topniveau in `bindings[]` met `type: "acp"` configureren persistente ACP-bindingen voor forumonderwerpen (gebruik canonieke `chatId:topic:topicId` in `match.peer.id`). Veldsemantiek wordt gedeeld in [ACP Agents](/nl/tools/acp-agents#persistent-channel-bindings).
- Telegram-streamvoorvertoningen gebruiken `sendMessage` + `editMessageText` (werkt in directe en groepschats).
- Items op topniveau in `bindings[]` met `type: "acp"` configureren persistente ACP-bindingen voor forumonderwerpen (gebruik canonieke `chatId:topic:topicId` in `match.peer.id`). Veldsemantiek wordt gedeeld in [ACP-agents](/nl/tools/acp-agents#persistent-channel-bindings).
- Telegram-streamvoorbeelden gebruiken `sendMessage` + `editMessageText` (werkt in directe en groepschats).
- Retrybeleid: zie [Retrybeleid](/nl/concepts/retry).
### Discord
@ -330,40 +330,40 @@ WhatsApp draait via het webkanaal van de Gateway (Baileys Web). Het start automa
```
- Token: `channels.discord.token`, met `DISCORD_BOT_TOKEN` als fallback voor het standaardaccount.
- Directe uitgaande aanroepen die een expliciete Discord-`token` opgeven, gebruiken die token voor de aanroep; instellingen voor accountretry/beleid komen nog steeds uit het geselecteerde account in de actieve runtime-snapshot.
- Optioneel `channels.discord.defaultAccount` overschrijft de selectie van het standaardaccount wanneer dit overeenkomt met een geconfigureerde account-id.
- Gebruik `user:<id>` (DM) of `channel:<id>` (guild-kanaal) voor bezorgdoelen; kale numerieke ID's worden geweigerd.
- Guild-slugs zijn kleine letters waarbij spaties zijn vervangen door `-`; kanaalsleutels gebruiken de gesluggede naam (zonder `#`). Geef de voorkeur aan guild-ID's.
- Door bots geschreven berichten worden standaard genegeerd. `allowBots: true` schakelt ze in; gebruik `allowBots: "mentions"` om alleen botberichten te accepteren die de bot vermelden (eigen berichten blijven gefilterd).
- `channels.discord.guilds.<id>.ignoreOtherMentions` (en kanaaloverschrijvingen) laat berichten vallen die een andere gebruiker of rol vermelden maar niet de bot (met uitzondering van @everyone/@here).
- `channels.discord.mentionAliases` koppelt stabiele uitgaande `@handle`-tekst aan Discord-gebruikers-ID's vóór verzending, zodat bekende teamgenoten deterministisch kunnen worden vermeld, zelfs wanneer de tijdelijke directorycache leeg is. Overschrijvingen per account staan onder `channels.discord.accounts.<accountId>.mentionAliases`.
- `maxLinesPerMessage` (standaard 17) splitst hoge berichten, zelfs wanneer ze onder 2000 tekens blijven.
- `channels.discord.threadBindings` beheert Discord-routering voor thread-gebonden sessies:
- Directe uitgaande aanroepen die een expliciete Discord `token` leveren, gebruiken die token voor de aanroep; accountinstellingen voor opnieuw proberen/beleid komen nog steeds uit het geselecteerde account in de actieve runtime-snapshot.
- Optioneel `channels.discord.defaultAccount` overschrijft de standaardaccountselectie wanneer dit overeenkomt met een geconfigureerde account-id.
- Gebruik `user:<id>` (DM) of `channel:<id>` (guild-kanaal) voor bezorgdoelen; losse numerieke ID's worden geweigerd.
- Guild-slugs zijn kleine letters waarbij spaties zijn vervangen door `-`; kanaalsleutels gebruiken de gesluggificeerde naam (zonder `#`). Geef de voorkeur aan guild-ID's.
- Berichten die door bots zijn opgesteld, worden standaard genegeerd. `allowBots: true` schakelt ze in; gebruik `allowBots: "mentions"` om alleen botberichten te accepteren die de bot vermelden (eigen berichten worden nog steeds gefilterd).
- `channels.discord.guilds.<id>.ignoreOtherMentions` (en kanaaloverschrijvingen) verwijdert berichten die een andere gebruiker of rol vermelden maar niet de bot (met uitzondering van @everyone/@here).
- `channels.discord.mentionAliases` koppelt stabiele uitgaande `@handle`-tekst aan Discord-gebruikers-ID's voordat er wordt verzonden, zodat bekende teamgenoten deterministisch kunnen worden vermeld, zelfs wanneer de tijdelijke directorycache leeg is. Overschrijvingen per account staan onder `channels.discord.accounts.<accountId>.mentionAliases`.
- `maxLinesPerMessage` (standaard 17) splitst hoge berichten, zelfs wanneer ze minder dan 2000 tekens bevatten.
- `channels.discord.threadBindings` beheert thread-gebonden routering voor Discord:
- `enabled`: Discord-overschrijving voor thread-gebonden sessiefuncties (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`, en gebonden bezorging/routering)
- `idleHours`: Discord-overschrijving voor automatische unfocus bij inactiviteit in uren (`0` schakelt uit)
- `idleHours`: Discord-overschrijving voor automatisch ontfocussen bij inactiviteit in uren (`0` schakelt uit)
- `maxAgeHours`: Discord-overschrijving voor harde maximale leeftijd in uren (`0` schakelt uit)
- `spawnSessions`: schakelaar voor `sessions_spawn({ thread: true })` en automatische thread-aanmaak/-binding bij ACP thread-spawn (standaard: `true`)
- `spawnSessions`: schakelaar voor `sessions_spawn({ thread: true })` en automatisch maken/binden van threads bij ACP-thread-spawn (standaard: `true`)
- `defaultSpawnContext`: native subagent-context voor thread-gebonden spawns (standaard `"fork"`)
- Top-level `bindings[]`-items met `type: "acp"` configureren persistente ACP-bindingen voor kanalen en threads (gebruik kanaal-/thread-id in `match.peer.id`). Veldsemantiek wordt gedeeld in [ACP Agents](/nl/tools/acp-agents#persistent-channel-bindings).
- `channels.discord.ui.components.accentColor` stelt de accentkleur in voor Discord components v2-containers.
- `channels.discord.voice` schakelt Discord-spraakkanaalgesprekken in en optionele overschrijvingen voor automatisch deelnemen + LLM + TTS. Tekst-only Discord-configuraties laten spraak standaard uit; stel `channels.discord.voice.enabled=true` in om deel te nemen.
- `channels.discord.voice.model` overschrijft optioneel het LLM-model dat wordt gebruikt voor Discord-spraakkanaalantwoorden.
- `channels.discord.voice.daveEncryption` en `channels.discord.voice.decryptionFailureTolerance` worden doorgegeven aan `@discordjs/voice` DAVE-opties (standaard `true` en `24`).
- `channels.discord.voice.connectTimeoutMs` beheert de initiële `@discordjs/voice` Ready-wachttijd voor `/vc join` en pogingen tot automatisch deelnemen (standaard `30000`).
- `channels.discord.voice.reconnectGraceMs` beheert hoe lang een verbroken spraaksessie mag duren om reconnect-signalering te bereiken voordat OpenClaw deze vernietigt (standaard `15000`).
- OpenClaw probeert daarnaast spraakontvangst te herstellen door een spraaksessie te verlaten en opnieuw te joinen na herhaalde decryptiefouten.
- `channels.discord.streaming` is de canonieke sleutel voor streammodus. Legacy `streamMode` en booleaanse `streaming`-waarden worden automatisch gemigreerd.
- `channels.discord.autoPresence` koppelt runtime-beschikbaarheid aan botaanwezigheid (healthy => online, degraded => idle, exhausted => dnd) en staat optionele overschrijvingen van statustekst toe.
- `channels.discord.dangerouslyAllowNameMatching` schakelt veranderlijke naam-/tagmatching opnieuw in (break-glass-compatibiliteitsmodus).
- `channels.discord.execApprovals`: Discord-native levering van exec-goedkeuringen en autorisatie van goedkeurders.
- `enabled`: `true`, `false` of `"auto"` (standaard). In automodus worden exec-goedkeuringen geactiveerd wanneer goedkeurders kunnen worden opgelost uit `approvers` of `commands.ownerAllowFrom`.
- `approvers`: Discord-gebruikers-ID's die exec-verzoeken mogen goedkeuren. Valt terug op `commands.ownerAllowFrom` wanneer weggelaten.
- `channels.discord.ui.components.accentColor` stelt de accentkleur in voor Discord-components v2-containers.
- `channels.discord.voice` schakelt Discord-spraakkanaalgesprekken en optionele overschrijvingen voor automatisch deelnemen + LLM + TTS in. Tekst-only Discord-configuraties laten spraak standaard uit; stel `channels.discord.voice.enabled=true` in om je aan te melden.
- `channels.discord.voice.model` overschrijft optioneel het LLM-model dat wordt gebruikt voor antwoorden in Discord-spraakkanalen.
- `channels.discord.voice.daveEncryption` en `channels.discord.voice.decryptionFailureTolerance` worden doorgegeven aan DAVE-opties van `@discordjs/voice` (standaard `true` en `24`).
- `channels.discord.voice.connectTimeoutMs` beheert de initiële Ready-wachttijd van `@discordjs/voice` voor `/vc join` en pogingen tot automatisch deelnemen (standaard `30000`).
- `channels.discord.voice.reconnectGraceMs` bepaalt hoe lang een verbroken spraaksessie mag duren om reconnect-signalering te bereiken voordat OpenClaw deze vernietigt (standaard `15000`).
- OpenClaw probeert daarnaast spraakontvangst te herstellen door een spraaksessie na herhaalde decryptiefouten te verlaten en opnieuw deel te nemen.
- `channels.discord.streaming` is de canonieke sleutel voor streammodus. Verouderde `streamMode`- en booleaanse `streaming`-waarden worden automatisch gemigreerd.
- `channels.discord.autoPresence` koppelt runtime-beschikbaarheid aan bot-aanwezigheid (healthy => online, degraded => idle, exhausted => dnd) en staat optionele overschrijvingen van statustekst toe.
- `channels.discord.dangerouslyAllowNameMatching` schakelt veranderlijke naam-/tag-matching opnieuw in (compatibiliteitsmodus voor noodgevallen).
- `channels.discord.execApprovals`: Discord-native bezorging van exec-goedkeuringen en autorisatie van goedkeurders.
- `enabled`: `true`, `false` of `"auto"` (standaard). In auto-modus worden exec-goedkeuringen geactiveerd wanneer goedkeurders kunnen worden opgelost uit `approvers` of `commands.ownerAllowFrom`.
- `approvers`: Discord-gebruikers-ID's die exec-aanvragen mogen goedkeuren. Valt terug op `commands.ownerAllowFrom` wanneer weggelaten.
- `agentFilter`: optionele allowlist met agent-ID's. Laat weg om goedkeuringen voor alle agents door te sturen.
- `sessionFilter`: optionele sessiesleutelpatronen (substring of regex).
- `target`: waar goedkeuringsprompts naartoe worden gestuurd. `"dm"` (standaard) stuurt naar DM's van goedkeurders, `"channel"` stuurt naar het oorspronkelijke kanaal, `"both"` stuurt naar beide. Wanneer target `"channel"` bevat, zijn knoppen alleen bruikbaar door opgeloste goedkeurders.
- `cleanupAfterResolve`: wanneer `true`, verwijdert goedkeurings-DM's na goedkeuring, weigering of time-out.
- `cleanupAfterResolve`: wanneer `true`, verwijdert goedkeurings-DM's na goedkeuring, afwijzing of time-out.
**Modi voor reactiemeldingen:** `off` (geen), `own` (berichten van de bot, standaard), `all` (alle berichten), `allowlist` (uit `guilds.<id>.users` op alle berichten).
**Reactiemeldingsmodi:** `off` (geen), `own` (berichten van de bot, standaard), `all` (alle berichten), `allowlist` (uit `guilds.<id>.users` voor alle berichten).
### Google Chat
@ -394,11 +394,11 @@ WhatsApp draait via het webkanaal van de Gateway (Baileys Web). Het start automa
}
```
- Serviceaccount-JSON: inline (`serviceAccount`) of bestandsgebaseerd (`serviceAccountFile`).
- Serviceaccount SecretRef wordt ook ondersteund (`serviceAccountRef`).
- Serviceaccount-JSON: inline (`serviceAccount`) of op bestand gebaseerd (`serviceAccountFile`).
- Serviceaccount-SecretRef wordt ook ondersteund (`serviceAccountRef`).
- Env-fallbacks: `GOOGLE_CHAT_SERVICE_ACCOUNT` of `GOOGLE_CHAT_SERVICE_ACCOUNT_FILE`.
- Gebruik `spaces/<spaceId>` of `users/<userId>` voor bezorgdoelen.
- `channels.googlechat.dangerouslyAllowNameMatching` schakelt veranderlijke matching van e-mailprincipals opnieuw in (break-glass-compatibiliteitsmodus).
- `channels.googlechat.dangerouslyAllowNameMatching` schakelt veranderlijke e-mail-principal-matching opnieuw in (compatibiliteitsmodus voor noodgevallen).
### Slack
@ -470,35 +470,44 @@ WhatsApp draait via het webkanaal van de Gateway (Baileys Web). Het start automa
}
```
- **Socket mode** vereist zowel `botToken` als `appToken` (`SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` voor env-fallback van het standaardaccount).
- **HTTP mode** vereist `botToken` plus `signingSecret` (op rootniveau of per account).
- `socketMode` geeft Slack SDK Socket Mode-transportafstemming door aan de publieke Bolt receiver-API. Gebruik dit alleen bij onderzoek naar ping/pong-time-outs of verouderd websocketgedrag.
- `botToken`, `appToken`, `signingSecret` en `userToken` accepteren platte-tekststrings of SecretRef-objecten.
- Slack-accountsnapshots tonen bron-/statusvelden per credential, zoals `botTokenSource`, `botTokenStatus`, `appTokenStatus` en, in HTTP mode, `signingSecretStatus`. `configured_unavailable` betekent dat het account via SecretRef is geconfigureerd, maar dat het huidige commando-/runtimepad de geheime waarde niet kon oplossen.
- `configWrites: false` blokkeert door Slack geïnitieerde configschrijfacties.
- Optioneel `channels.slack.defaultAccount` overschrijft de selectie van het standaardaccount wanneer dit overeenkomt met een geconfigureerde account-id.
- `channels.slack.streaming.mode` is de canonieke sleutel voor Slack-streammodus. `channels.slack.streaming.nativeTransport` beheert het native streamingtransport van Slack. Legacy `streamMode`, booleaanse `streaming` en `nativeStreaming`-waarden worden automatisch gemigreerd.
- **Socket mode** vereist zowel `botToken` als `appToken` (`SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` voor de env-fallback van het standaardaccount).
- **HTTP-modus** vereist `botToken` plus `signingSecret` (op rootniveau of per account).
- `socketMode` geeft transportafstemming voor Slack SDK Socket Mode door aan de publieke Bolt receiver-API. Gebruik dit alleen bij onderzoek naar ping/pong-time-outs of verouderd websocket-gedrag.
- `botToken`, `appToken`, `signingSecret` en `userToken` accepteren plaintext
strings of SecretRef-objecten.
- Slack-accountsnapshots tonen bron-/statusvelden per credential, zoals
`botTokenSource`, `botTokenStatus`, `appTokenStatus` en, in HTTP-modus,
`signingSecretStatus`. `configured_unavailable` betekent dat het account is
geconfigureerd via SecretRef, maar dat het huidige commando-/runtime-pad de
secretwaarde niet kon oplossen.
- `configWrites: false` blokkeert door Slack geïnitieerde configuratieschrijfacties.
- Optioneel `channels.slack.defaultAccount` overschrijft de standaardaccountselectie wanneer dit overeenkomt met een geconfigureerde account-id.
- `channels.slack.streaming.mode` is de canonieke sleutel voor de Slack-streammodus. `channels.slack.streaming.nativeTransport` beheert het native streamingtransport van Slack. Verouderde `streamMode`-, booleaanse `streaming`- en `nativeStreaming`-waarden worden automatisch gemigreerd.
- Gebruik `user:<id>` (DM) of `channel:<id>` voor bezorgdoelen.
**Modi voor reactiemeldingen:** `off`, `own` (standaard), `all`, `allowlist` (uit `reactionAllowlist`).
**Reactiemeldingsmodi:** `off`, `own` (standaard), `all`, `allowlist` (uit `reactionAllowlist`).
**Threadsessie-isolatie:** `thread.historyScope` is per thread (standaard) of gedeeld over het kanaal. `thread.inheritParent` kopieert het transcript van het bovenliggende kanaal naar nieuwe threads.
**Thread-sessie-isolatie:** `thread.historyScope` is per thread (standaard) of gedeeld over kanaal. `thread.inheritParent` kopieert het transcript van het bovenliggende kanaal naar nieuwe threads.
- Slack native streaming plus de Slack assistant-achtige threadstatus "is typing..." vereisen een antwoordthreaddoel. Top-level DM's blijven standaard buiten threads, zodat ze nog steeds kunnen streamen via Slack-conceptvoorbeelden met plaatsen-en-bewerken in plaats van de thread-achtige native stream-/statuspreview te tonen.
- `typingReaction` voegt een tijdelijke reactie toe aan het inkomende Slack-bericht terwijl een antwoord wordt uitgevoerd, en verwijdert deze vervolgens bij voltooiing. Gebruik een Slack-emoji-shortcode zoals `"hourglass_flowing_sand"`.
- `channels.slack.execApprovals`: Slack-native levering van exec-goedkeuringen en autorisatie van goedkeurders. Zelfde schema als Discord: `enabled` (`true`/`false`/`"auto"`), `approvers` (Slack-gebruikers-ID's), `agentFilter`, `sessionFilter` en `target` (`"dm"`, `"channel"` of `"both"`).
- Slack-native streaming plus de Slack-assistant-achtige threadstatus "is aan het typen..." vereisen een antwoordthreaddoel. Top-level DM's blijven standaard buiten threads, zodat ze nog steeds kunnen streamen via Slack-concept-post-and-editvoorvertoningen in plaats van de thread-achtige native stream-/statusvoorvertoning te tonen.
- `typingReaction` voegt een tijdelijke reactie toe aan het inkomende Slack-bericht terwijl een antwoord loopt en verwijdert die daarna bij voltooiing. Gebruik een Slack-emoji-shortcode zoals `"hourglass_flowing_sand"`.
- `channels.slack.execApprovals`: Slack-native bezorging van exec-goedkeuringen en autorisatie van goedkeurders. Zelfde schema als Discord: `enabled` (`true`/`false`/`"auto"`), `approvers` (Slack-gebruikers-ID's), `agentFilter`, `sessionFilter` en `target` (`"dm"`, `"channel"` of `"both"`).
| Actiegroep | Standaard | Opmerkingen |
| ---------- | --------- | --------------------------- |
| reactions | enabled | Reageren + reacties tonen |
| messages | enabled | Lezen/verzenden/bewerken/verwijderen |
| pins | enabled | Vastzetten/losmaken/tonen |
| memberInfo | enabled | Lidgegevens |
| emojiList | enabled | Aangepaste-emojilijst |
| Actiegroep | Standaard | Opmerkingen |
| ------------ | ------------ | ----------------------------- |
| reactions | ingeschakeld | Reageren + reacties weergeven |
| messages | ingeschakeld | Lezen/verzenden/bewerken/verwijderen |
| pins | ingeschakeld | Vastmaken/losmaken/weergeven |
| memberInfo | ingeschakeld | Lidgegevens |
| emojiList | ingeschakeld | Aangepaste emoji-lijst |
### Mattermost
Mattermost wordt geleverd als een gebundelde Plugin in huidige OpenClaw-releases. Oudere of aangepaste builds kunnen een actueel npm-pakket installeren met `openclaw plugins install @openclaw/mattermost`. Controleer [npmjs.com/package/@openclaw/mattermost](https://www.npmjs.com/package/@openclaw/mattermost) op de huidige dist-tags voordat je een versie vastpint.
Mattermost wordt in huidige OpenClaw-releases geleverd als gebundelde Plugin. Oudere of
aangepaste builds kunnen een huidig npm-pakket installeren met
`openclaw plugins install @openclaw/mattermost`. Controleer
[npmjs.com/package/@openclaw/mattermost](https://www.npmjs.com/package/@openclaw/mattermost)
voor de huidige dist-tags voordat je een versie vastzet.
```json5
{
@ -528,23 +537,18 @@ Mattermost wordt geleverd als een gebundelde Plugin in huidige OpenClaw-releases
}
```
Chatmodi: `oncall` (reageer op @-vermelding, standaard), `onmessage` (elk bericht), `onchar` (berichten die beginnen met triggerprefix).
Chatmodi: `oncall` (reageren op @-vermelding, standaard), `onmessage` (elk bericht), `onchar` (berichten die beginnen met triggerprefix).
Wanneer native Mattermost-commando's zijn ingeschakeld:
- `commands.callbackPath` moet een pad zijn (bijvoorbeeld `/api/channels/mattermost/command`), geen volledige URL.
- `commands.callbackUrl` moet worden omgezet naar het OpenClaw Gateway-eindpunt en bereikbaar zijn vanaf de Mattermost-server.
- Native slash-callbacks worden geverifieerd met de tokens per opdracht die
door Mattermost worden geretourneerd tijdens registratie van slash-opdrachten. Als registratie mislukt of er geen
opdrachten zijn geactiveerd, wijst OpenClaw callbacks af met
`Unauthorized: invalid command token.`
- Voor private/tailnet/interne callbackhosts kan Mattermost vereisen
dat `ServiceSettings.AllowedUntrustedInternalConnections` de callbackhost/het callbackdomein bevat.
Gebruik host-/domeinwaarden, geen volledige URL's.
- `commands.callbackUrl` moet naar het OpenClaw Gateway-eindpunt verwijzen en bereikbaar zijn vanaf de Mattermost-server.
- Native slash-callbacks worden geauthenticeerd met de tokens per opdracht die door Mattermost worden geretourneerd tijdens de registratie van slash-opdrachten. Als registratie mislukt of er geen opdrachten zijn geactiveerd, weigert OpenClaw callbacks met `Unauthorized: invalid command token.`
- Voor private/tailnet/interne callbackhosts kan Mattermost vereisen dat `ServiceSettings.AllowedUntrustedInternalConnections` de callbackhost/het callbackdomein bevat. Gebruik host-/domeinwaarden, geen volledige URL's.
- `channels.mattermost.configWrites`: sta door Mattermost geïnitieerde configuratieschrijfacties toe of weiger ze.
- `channels.mattermost.requireMention`: vereis `@mention` voordat er in kanalen wordt geantwoord.
- `channels.mattermost.groups.<channelId>.requireMention`: override per kanaal voor vermelding-afscherming (`"*"` voor standaard).
- Optioneel: `channels.mattermost.defaultAccount` overschrijft de standaardaccountselectie wanneer deze overeenkomt met een geconfigureerde account-id.
- `channels.mattermost.groups.<channelId>.requireMention`: override per kanaal voor vermeldingsgating (`"*"` voor standaard).
- Optionele `channels.mattermost.defaultAccount` overschrijft de standaard accountselectie wanneer deze overeenkomt met een geconfigureerde account-id.
### Signal
@ -565,15 +569,15 @@ Wanneer native Mattermost-commando's zijn ingeschakeld:
}
```
**Modi voor reactiemeldingen:** `off`, `own` (standaard), `all`, `allowlist` (uit `reactionAllowlist`).
**Reactiemeldingsmodi:** `off`, `own` (standaard), `all`, `allowlist` (van `reactionAllowlist`).
- `channels.signal.account`: zet het opstarten van het kanaal vast op een specifieke Signal-accountidentiteit.
- `channels.signal.account`: pin het opstarten van het kanaal aan een specifieke Signal-accountidentiteit.
- `channels.signal.configWrites`: sta door Signal geïnitieerde configuratieschrijfacties toe of weiger ze.
- Optioneel: `channels.signal.defaultAccount` overschrijft de standaardaccountselectie wanneer deze overeenkomt met een geconfigureerde account-id.
- Optionele `channels.signal.defaultAccount` overschrijft de standaard accountselectie wanneer deze overeenkomt met een geconfigureerde account-id.
### BlueBubbles
BlueBubbles is het aanbevolen iMessage-pad (door Plugin ondersteund, geconfigureerd onder `channels.bluebubbles`).
BlueBubbles is het aanbevolen iMessage-pad (Plugin-ondersteund, geconfigureerd onder `channels.bluebubbles`).
```json5
{
@ -589,8 +593,8 @@ BlueBubbles is het aanbevolen iMessage-pad (door Plugin ondersteund, geconfigure
```
- Kernsleutelpaden die hier worden behandeld: `channels.bluebubbles`, `channels.bluebubbles.dmPolicy`.
- Optioneel: `channels.bluebubbles.defaultAccount` overschrijft de standaardaccountselectie wanneer deze overeenkomt met een geconfigureerde account-id.
- Items op topniveau in `bindings[]` met `type: "acp"` kunnen BlueBubbles-gesprekken aan persistente ACP-sessies binden. Gebruik een BlueBubbles-handle of doeltekenreeks (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) in `match.peer.id`. Gedeelde veldsemantiek: [ACP-agenten](/nl/tools/acp-agents#persistent-channel-bindings).
- Optionele `channels.bluebubbles.defaultAccount` overschrijft de standaard accountselectie wanneer deze overeenkomt met een geconfigureerde account-id.
- Top-level `bindings[]`-vermeldingen met `type: "acp"` kunnen BlueBubbles-gesprekken binden aan persistente ACP-sessies. Gebruik een BlueBubbles-handle of doelstring (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) in `match.peer.id`. Gedeelde veldsemantiek: [ACP-agenten](/nl/tools/acp-agents#persistent-channel-bindings).
- De volledige BlueBubbles-kanaalconfiguratie is gedocumenteerd in [BlueBubbles](/nl/channels/bluebubbles).
### iMessage
@ -619,15 +623,15 @@ OpenClaw start `imsg rpc` (JSON-RPC via stdio). Geen daemon of poort vereist.
}
```
- Optioneel: `channels.imessage.defaultAccount` overschrijft de standaardaccountselectie wanneer deze overeenkomt met een geconfigureerde account-id.
- Optionele `channels.imessage.defaultAccount` overschrijft de standaard accountselectie wanneer deze overeenkomt met een geconfigureerde account-id.
- Vereist volledige schijftoegang tot de Messages-DB.
- Geef de voorkeur aan `chat_id:<id>`-doelen. Gebruik `imsg chats --limit 20` om chats te tonen.
- `cliPath` kan naar een SSH-wrapper verwijzen; stel `remoteHost` (`host` of `user@host`) in voor het ophalen van bijlagen via SCP.
- Vereist Volledige schijftoegang tot de Messages-DB.
- Geef de voorkeur aan `chat_id:<id>`-doelen. Gebruik `imsg chats --limit 20` om chats weer te geven.
- `cliPath` kan naar een SSH-wrapper verwijzen; stel `remoteHost` (`host` of `user@host`) in voor het ophalen van SCP-bijlagen.
- `attachmentRoots` en `remoteAttachmentRoots` beperken inkomende bijlagepaden (standaard: `/Users/*/Library/Messages/Attachments`).
- SCP gebruikt strikte host-keycontrole, dus zorg dat de host-key van de relayhost al bestaat in `~/.ssh/known_hosts`.
- SCP gebruikt strikte host-sleutelcontrole, dus zorg dat de sleutel van de relayhost al bestaat in `~/.ssh/known_hosts`.
- `channels.imessage.configWrites`: sta door iMessage geïnitieerde configuratieschrijfacties toe of weiger ze.
- Items op topniveau in `bindings[]` met `type: "acp"` kunnen iMessage-gesprekken aan persistente ACP-sessies binden. Gebruik een genormaliseerde handle of expliciet chatdoel (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) in `match.peer.id`. Gedeelde veldsemantiek: [ACP-agenten](/nl/tools/acp-agents#persistent-channel-bindings).
- Top-level `bindings[]`-vermeldingen met `type: "acp"` kunnen iMessage-gesprekken binden aan persistente ACP-sessies. Gebruik een genormaliseerde handle of expliciet chatdoel (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) in `match.peer.id`. Gedeelde veldsemantiek: [ACP-agenten](/nl/tools/acp-agents#persistent-channel-bindings).
<Accordion title="iMessage SSH wrapper example">
@ -640,7 +644,7 @@ exec ssh -T gateway-host imsg "$@"
### Matrix
Matrix wordt ondersteund door een Plugin en geconfigureerd onder `channels.matrix`.
Matrix is Plugin-ondersteund en geconfigureerd onder `channels.matrix`.
```json5
{
@ -672,23 +676,23 @@ Matrix wordt ondersteund door een Plugin en geconfigureerd onder `channels.matri
- Tokenauthenticatie gebruikt `accessToken`; wachtwoordauthenticatie gebruikt `userId` + `password`.
- `channels.matrix.proxy` routeert Matrix-HTTP-verkeer via een expliciete HTTP(S)-proxy. Benoemde accounts kunnen dit overschrijven met `channels.matrix.accounts.<id>.proxy`.
- `channels.matrix.network.dangerouslyAllowPrivateNetwork` staat private/interne homeservers toe. `proxy` en deze netwerk-opt-in zijn onafhankelijke controles.
- `channels.matrix.defaultAccount` selecteert het voorkeursaccount in multi-accountconfiguraties.
- `channels.matrix.autoJoin` is standaard `off`, dus uitgenodigde rooms en nieuwe DM-achtige uitnodigingen worden genegeerd totdat je `autoJoin: "allowlist"` met `autoJoinAllowlist` of `autoJoin: "always"` instelt.
- `channels.matrix.execApprovals`: Matrix-native levering van exec-goedkeuringen en autorisatie van goedkeurders.
- `enabled`: `true`, `false` of `"auto"` (standaard). In de automatische modus worden exec-goedkeuringen geactiveerd wanneer goedkeurders kunnen worden herleid uit `approvers` of `commands.ownerAllowFrom`.
- `approvers`: Matrix-gebruikers-ID's (bijv. `@owner:example.org`) die exec-aanvragen mogen goedkeuren.
- `channels.matrix.network.dangerouslyAllowPrivateNetwork` staat private/interne homeservers toe. `proxy` en deze netwerkopt-in zijn onafhankelijke besturingen.
- `channels.matrix.defaultAccount` selecteert het voorkeursaccount in setups met meerdere accounts.
- `channels.matrix.autoJoin` staat standaard op `off`, dus uitgenodigde rooms en nieuwe DM-achtige uitnodigingen worden genegeerd totdat je `autoJoin: "allowlist"` met `autoJoinAllowlist` of `autoJoin: "always"` instelt.
- `channels.matrix.execApprovals`: Matrix-native levering van uitvoeringsgoedkeuringen en autorisatie van goedkeurders.
- `enabled`: `true`, `false` of `"auto"` (standaard). In automatische modus worden uitvoeringsgoedkeuringen geactiveerd wanneer goedkeurders kunnen worden opgelost uit `approvers` of `commands.ownerAllowFrom`.
- `approvers`: Matrix-gebruikers-ID's (bijv. `@owner:example.org`) die uitvoeringsverzoeken mogen goedkeuren.
- `agentFilter`: optionele allowlist met agent-ID's. Laat weg om goedkeuringen voor alle agenten door te sturen.
- `sessionFilter`: optionele sessiesleutelpatronen (substring of regex).
- `target`: waar goedkeuringsprompts naartoe worden gestuurd. `"dm"` (standaard), `"channel"` (oorspronkelijke room) of `"both"`.
- Overrides per account: `channels.matrix.accounts.<id>.execApprovals`.
- `channels.matrix.dm.sessionScope` bepaalt hoe Matrix-DM's in sessies worden gegroepeerd: `per-user` (standaard) deelt per gerouteerde peer, terwijl `per-room` elke DM-room isoleert.
- Matrix-statusprobes en live directory-lookups gebruiken hetzelfde proxybeleid als runtimeverkeer.
- Volledige Matrix-configuratie, doelregels en configuratievoorbeelden zijn gedocumenteerd in [Matrix](/nl/channels/matrix).
- `channels.matrix.dm.sessionScope` bepaalt hoe Matrix-DM's in sessies worden gegroepeerd: `per-user` (standaard) deelt op basis van gerouteerde peer, terwijl `per-room` elke DM-room isoleert.
- Matrix-statusprobes en live directory-lookups gebruiken hetzelfde proxybeleid als runtime-verkeer.
- Volledige Matrix-configuratie, targetingregels en setupvoorbeelden zijn gedocumenteerd in [Matrix](/nl/channels/matrix).
### Microsoft Teams
Microsoft Teams wordt ondersteund door een Plugin en geconfigureerd onder `channels.msteams`.
Microsoft Teams is Plugin-ondersteund en geconfigureerd onder `channels.msteams`.
```json5
{
@ -704,11 +708,11 @@ Microsoft Teams wordt ondersteund door een Plugin en geconfigureerd onder `chann
```
- Kernsleutelpaden die hier worden behandeld: `channels.msteams`, `channels.msteams.configWrites`.
- De volledige Teams-configuratie (referenties, Webhook, DM-/groepsbeleid, overrides per team/per kanaal) is gedocumenteerd in [Microsoft Teams](/nl/channels/msteams).
- Volledige Teams-configuratie (referenties, Webhook, DM-/groepsbeleid, overrides per team/per kanaal) is gedocumenteerd in [Microsoft Teams](/nl/channels/msteams).
### IRC
IRC wordt ondersteund door een Plugin en geconfigureerd onder `channels.irc`.
IRC is Plugin-ondersteund en geconfigureerd onder `channels.irc`.
```json5
{
@ -730,10 +734,10 @@ IRC wordt ondersteund door een Plugin en geconfigureerd onder `channels.irc`.
```
- Kernsleutelpaden die hier worden behandeld: `channels.irc`, `channels.irc.dmPolicy`, `channels.irc.configWrites`, `channels.irc.nickserv.*`.
- Optioneel: `channels.irc.defaultAccount` overschrijft de standaardaccountselectie wanneer deze overeenkomt met een geconfigureerde account-id.
- De volledige IRC-kanaalconfiguratie (host/poort/TLS/kanalen/allowlists/vermelding-afscherming) is gedocumenteerd in [IRC](/nl/channels/irc).
- Optionele `channels.irc.defaultAccount` overschrijft de standaard accountselectie wanneer deze overeenkomt met een geconfigureerde account-id.
- Volledige IRC-kanaalconfiguratie (host/poort/TLS/kanalen/allowlists/vermeldingsgating) is gedocumenteerd in [IRC](/nl/channels/irc).
### Multi-account (alle kanalen)
### Meerdere accounts (alle kanalen)
Voer meerdere accounts per kanaal uit (elk met een eigen `accountId`):
@ -756,34 +760,36 @@ Voer meerdere accounts per kanaal uit (elk met een eigen `accountId`):
}
```
- `default` wordt gebruikt wanneer `accountId` wordt weggelaten (CLI + routering).
- Env-tokens gelden alleen voor het **standaard**account.
- `default` wordt gebruikt wanneer `accountId` is weggelaten (CLI + routing).
- Env-tokens gelden alleen voor het **standaard** account.
- Basiskanaalinstellingen gelden voor alle accounts, tenzij ze per account worden overschreven.
- Gebruik `bindings[].match.accountId` om elk account naar een andere agent te routeren.
- Als je een niet-standaardaccount toevoegt via `openclaw channels add` (of kanaalonboarding) terwijl je nog een enkel-accountkanaalconfiguratie op topniveau gebruikt, promoveert OpenClaw eerst account-gescopeerde enkel-accountwaarden op topniveau naar de accountmap van het kanaal, zodat het oorspronkelijke account blijft werken. De meeste kanalen verplaatsen ze naar `channels.<channel>.accounts.default`; Matrix kan in plaats daarvan een bestaand overeenkomend benoemd/standaarddoel behouden.
- Bestaande kanaal-only bindings (geen `accountId`) blijven overeenkomen met het standaardaccount; account-gescopeerde bindings blijven optioneel.
- `openclaw doctor --fix` repareert ook gemengde vormen door account-gescopeerde enkel-accountwaarden op topniveau te verplaatsen naar het gepromoveerde account dat voor dat kanaal is gekozen. De meeste kanalen gebruiken `accounts.default`; Matrix kan in plaats daarvan een bestaand overeenkomend benoemd/standaarddoel behouden.
- Als je een niet-standaard account toevoegt via `openclaw channels add` (of kanaalonboarding) terwijl je nog een top-level kanaalconfiguratie met één account gebruikt, promoveert OpenClaw eerst account-scoped top-level waarden voor één account naar de accountmap van het kanaal, zodat het oorspronkelijke account blijft werken. De meeste kanalen verplaatsen ze naar `channels.<channel>.accounts.default`; Matrix kan in plaats daarvan een bestaand overeenkomend benoemd/standaard doel behouden.
- Bestaande kanaal-only bindings (zonder `accountId`) blijven overeenkomen met het standaard account; account-scoped bindings blijven optioneel.
- `openclaw doctor --fix` herstelt ook gemengde vormen door account-scoped top-level waarden voor één account te verplaatsen naar het gepromoveerde account dat voor dat kanaal is gekozen. De meeste kanalen gebruiken `accounts.default`; Matrix kan in plaats daarvan een bestaand overeenkomend benoemd/standaard doel behouden.
### Andere Plugin-kanalen
Veel Plugin-kanalen worden geconfigureerd als `channels.<id>` en gedocumenteerd op hun eigen kanaalpagina's (bijvoorbeeld Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat en Twitch).
Zie de volledige kanaalindex: [Kanalen](/nl/channels).
### Vermelding-afscherming voor groepschat
### Vermeldingsgating voor groepschats
Groepsberichten vereisen standaard een **vermelding** (metadatavermelding of veilige regex-patronen). Van toepassing op WhatsApp, Telegram, Discord, Google Chat en iMessage-groepschats.
Groepsberichten vereisen standaard een **vermelding** (metadatavermelding of veilige regex-patronen). Geldt voor WhatsApp, Telegram, Discord, Google Chat en iMessage-groepschats.
Zichtbare antwoorden worden apart beheerd. Groeps-/kanaalrooms zijn standaard `messages.groupChat.visibleReplies: "message_tool"`: OpenClaw verwerkt de beurt nog steeds, maar normale eindantwoorden blijven privé en zichtbare roomuitvoer vereist `message(action=send)`. Stel `"automatic"` alleen in wanneer je het legacygedrag wilt waarbij normale antwoorden terug naar de room worden geplaatst. Als je hetzelfde tool-only gedrag voor zichtbare antwoorden ook op directe chats wilt toepassen, stel dan `messages.visibleReplies: "message_tool"` in; de Codex-harness gebruikt dat tool-only gedrag ook als zijn niet-ingestelde standaard voor directe chats.
Zichtbare antwoorden worden apart geregeld. Groeps-/kanaalrooms staan standaard op `messages.groupChat.visibleReplies: "message_tool"`: OpenClaw verwerkt de beurt nog steeds, maar normale eindantwoorden blijven privé en zichtbare room-uitvoer vereist `message(action=send)`. Stel `"automatic"` alleen in wanneer je het legacy-gedrag wilt waarbij normale antwoorden terug naar de room worden geplaatst. Om hetzelfde tool-only gedrag voor zichtbare antwoorden ook op directe chats toe te passen, stel je `messages.visibleReplies: "message_tool"` in; de Codex-harness gebruikt dat tool-only gedrag ook als zijn niet-ingestelde standaard voor directe chats.
Als de berichtentool niet beschikbaar is onder het actieve toolbeleid, valt OpenClaw terug op automatische zichtbare antwoorden in plaats van de respons stilzwijgend te onderdrukken. `openclaw doctor` waarschuwt voor deze mismatch.
Tool-only zichtbare antwoorden vereisen een model/runtime die betrouwbaar tools aanroept. Als het sessielog assistenttekst toont met `didSendViaMessagingTool: false`, heeft het model een privé-eindantwoord geproduceerd in plaats van de message tool aan te roepen. Schakel over naar een sterker tool-aanroepend model voor dat kanaal, of stel `messages.groupChat.visibleReplies: "automatic"` in om legacy zichtbare eindantwoorden te herstellen.
De Gateway hot-reloadt de `messages`-configuratie nadat het bestand is opgeslagen. Herstart alleen wanneer bestandsbewaking of configuratieherlading in de deployment is uitgeschakeld.
Als de message tool niet beschikbaar is onder het actieve toolbeleid, valt OpenClaw terug op automatische zichtbare antwoorden in plaats van de reactie stil te onderdrukken. `openclaw doctor` waarschuwt voor deze mismatch.
De Gateway hot-reloadt de `messages`-configuratie nadat het bestand is opgeslagen. Herstart alleen wanneer file watching of config reload in de deployment is uitgeschakeld.
**Vermeldingstypen:**
- **Metadatavermeldingen**: Native platform-@-vermeldingen. Genegeerd in de WhatsApp-zelfchatmodus.
- **Metadatavermeldingen**: Native platform-@-vermeldingen. Genegeerd in WhatsApp-zelfchatmodus.
- **Tekstpatronen**: Veilige regex-patronen in `agents.list[].groupChat.mentionPatterns`. Ongeldige patronen en onveilige geneste herhaling worden genegeerd.
- Vermelding-afscherming wordt alleen afgedwongen wanneer detectie mogelijk is (native vermeldingen of ten minste één patroon).
- Vermeldingsfiltering wordt alleen afgedwongen wanneer detectie mogelijk is (native vermeldingen of ten minste één patroon).
```json5
{
@ -802,9 +808,9 @@ De Gateway hot-reloadt de `messages`-configuratie nadat het bestand is opgeslage
`messages.groupChat.historyLimit` stelt de globale standaard in. Kanalen kunnen dit overschrijven met `channels.<channel>.historyLimit` (of per account). Stel in op `0` om uit te schakelen.
`messages.visibleReplies` is de globale standaard voor bronbeurten; `messages.groupChat.visibleReplies` overschrijft dit voor groeps-/kanaalbronbeurten. Wanneer `messages.visibleReplies` niet is ingesteld, kan een harness zijn eigen directe/bronstandaard leveren; de Codex-harness gebruikt standaard `message_tool`. Kanaal-allowlists en vermeldingsgating bepalen nog steeds of een beurt wordt verwerkt.
`messages.visibleReplies` is de globale standaard voor source-turns; `messages.groupChat.visibleReplies` overschrijft deze voor groeps-/kanaal-source-turns. Wanneer `messages.visibleReplies` niet is ingesteld, kan een harness zijn eigen standaard voor direct/source leveren; de Codex-harness gebruikt standaard `message_tool`. Kanaal-allowlists en vermeldingsfiltering bepalen nog steeds of een turn wordt verwerkt.
#### Limieten voor DM-geschiedenis
#### DM-geschiedenislimieten
```json5
{
@ -819,7 +825,7 @@ De Gateway hot-reloadt de `messages`-configuratie nadat het bestand is opgeslage
}
```
Resolutie: overschrijving per DM → providerstandaard → geen limiet (alles behouden).
Resolutie: per-DM-overschrijving → providerstandaard → geen limiet (alles behouden).
Ondersteund: `telegram`, `whatsapp`, `discord`, `slack`, `signal`, `imessage`, `msteams`.
@ -846,7 +852,7 @@ Neem je eigen nummer op in `allowFrom` om zelfchatmodus in te schakelen (negeert
}
```
### Opdrachten (afhandeling van chatopdrachten)
### Commando's (afhandeling van chatcommando's)
```json5
{
@ -873,34 +879,34 @@ Neem je eigen nummer op in `allowFrom` om zelfchatmodus in te schakelen (negeert
}
```
<Accordion title="Opdrachtdetails">
<Accordion title="Command details">
- Dit blok configureert opdrachtoppervlakken. Zie [Slash-opdrachten](/nl/tools/slash-commands) voor de huidige ingebouwde en gebundelde opdrachtcatalogus.
- Deze pagina is een **configuratiesleutelreferentie**, niet de volledige opdrachtcatalogus. Kanaal-/pluginbeheerde opdrachten zoals QQ Bot `/bot-ping` `/bot-help` `/bot-logs`, LINE `/card`, apparaatkoppeling `/pair`, geheugen `/dreaming`, telefoonbediening `/phone` en Talk `/voice` worden gedocumenteerd op hun kanaal-/pluginpagina's plus [Slash-opdrachten](/nl/tools/slash-commands).
- Tekstopdrachten moeten **losstaande** berichten zijn met een voorafgaande `/`.
- `native: "auto"` schakelt native opdrachten in voor Discord/Telegram en laat Slack uit.
- `nativeSkills: "auto"` schakelt native Skills-opdrachten in voor Discord/Telegram en laat Slack uit.
- Overschrijf per kanaal: `channels.discord.commands.native` (boolean of `"auto"`). Voor Discord slaat `false` native opdrachtregistratie en opschoning tijdens het opstarten over.
- Dit blok configureert commandosurfaces. Zie [Slash Commands](/nl/tools/slash-commands) voor de huidige ingebouwde + gebundelde commandocatalogus.
- Deze pagina is een **configuratiesleutelreferentie**, niet de volledige commandocatalogus. Commando's die eigendom zijn van kanalen/Plugins, zoals QQ Bot `/bot-ping` `/bot-help` `/bot-logs`, LINE `/card`, device-pair `/pair`, memory `/dreaming`, phone-control `/phone` en Talk `/voice`, zijn gedocumenteerd op hun kanaal-/Plugin-pagina's plus [Slash Commands](/nl/tools/slash-commands).
- Tekstcommando's moeten **zelfstandige** berichten zijn met een voorafgaande `/`.
- `native: "auto"` schakelt native commando's in voor Discord/Telegram, en laat Slack uit.
- `nativeSkills: "auto"` schakelt native Skills-commando's in voor Discord/Telegram, en laat Slack uit.
- Overschrijf per kanaal: `channels.discord.commands.native` (bool of `"auto"`). Voor Discord slaat `false` registratie en opschoning van native commando's tijdens het opstarten over.
- Overschrijf native Skills-registratie per kanaal met `channels.<provider>.commands.nativeSkills`.
- `channels.telegram.customCommands` voegt extra Telegram-botmenu-items toe.
- `bash: true` schakelt `! <cmd>` in voor de hostshell. Vereist `tools.elevated.enabled` en afzender in `tools.elevated.allowFrom.<channel>`.
- `config: true` schakelt `/config` in (leest/schrijft `openclaw.json`). Voor Gateway-`chat.send`-clients vereisen persistente `/config set|unset`-schrijfbewerkingen ook `operator.admin`; alleen-lezen `/config show` blijft beschikbaar voor normale operatorclients met schrijfbereik.
- `mcp: true` schakelt `/mcp` in voor door OpenClaw beheerde MCP-serverconfiguratie onder `mcp.servers`.
- `plugins: true` schakelt `/plugins` in voor Plugindetectie, installatie en bediening voor inschakelen/uitschakelen.
- `config: true` schakelt `/config` in (leest/schrijft `openclaw.json`). Voor Gateway-`chat.send`-clients vereisen persistente `/config set|unset`-schrijfacties ook `operator.admin`; alleen-lezen `/config show` blijft beschikbaar voor normale operatorclients met schrijfbereik.
- `mcp: true` schakelt `/mcp` in voor OpenClaw-beheerde MCP-serverconfiguratie onder `mcp.servers`.
- `plugins: true` schakelt `/plugins` in voor Plugin-ontdekking, installatie en besturing voor inschakelen/uitschakelen.
- `channels.<provider>.configWrites` begrenst configuratiemutaties per kanaal (standaard: true).
- Voor kanalen met meerdere accounts begrenst `channels.<provider>.accounts.<id>.configWrites` ook schrijfbewerkingen die op dat account zijn gericht (bijvoorbeeld `/allowlist --config --account <id>` of `/config set channels.<provider>.accounts.<id>...`).
- Voor multi-accountkanalen begrenst `channels.<provider>.accounts.<id>.configWrites` ook schrijfacties die op dat account zijn gericht (bijvoorbeeld `/allowlist --config --account <id>` of `/config set channels.<provider>.accounts.<id>...`).
- `restart: false` schakelt `/restart` en Gateway-herstarttoolacties uit. Standaard: `true`.
- `ownerAllowFrom` is de expliciete owner-allowlist voor opdrachten/tools die alleen voor de eigenaar zijn. Deze staat los van `allowFrom`.
- `ownerAllowFrom` is de expliciete owner-allowlist voor owner-only commando's/tools. Deze staat los van `allowFrom`.
- `ownerDisplay: "hash"` hasht owner-id's in de systeemprompt. Stel `ownerDisplaySecret` in om hashing te beheren.
- `allowFrom` is per provider. Wanneer ingesteld, is dit de **enige** autorisatiebron (kanaal-allowlists/koppeling en `useAccessGroups` worden genegeerd).
- `useAccessGroups: false` staat toe dat opdrachten toegangsbeleid op basis van toegangsgroepen omzeilen wanneer `allowFrom` niet is ingesteld.
- Kaart van opdrachtdocumentatie:
- ingebouwde en gebundelde catalogus: [Slash-opdrachten](/nl/tools/slash-commands)
- kanaalspecifieke opdrachtoppervlakken: [Kanalen](/nl/channels)
- QQ Bot-opdrachten: [QQ Bot](/nl/channels/qqbot)
- koppelingsopdrachten: [Koppelen](/nl/channels/pairing)
- LINE-kaartopdracht: [LINE](/nl/channels/line)
- geheugen-dreaming: [Dreaming](/nl/concepts/dreaming)
- `useAccessGroups: false` staat toe dat commando's toegangsgroepbeleid omzeilen wanneer `allowFrom` niet is ingesteld.
- Commandodocumentatiekaart:
- ingebouwde + gebundelde catalogus: [Slash Commands](/nl/tools/slash-commands)
- kanaalspecifieke commandosurfaces: [Kanalen](/nl/channels)
- QQ Bot-commando's: [QQ Bot](/nl/channels/qqbot)
- koppelingscommando's: [Koppeling](/nl/channels/pairing)
- LINE-kaartcommando: [LINE](/nl/channels/line)
- memory dreaming: [Dreaming](/nl/concepts/dreaming)
</Accordion>

View File

@ -1,22 +1,22 @@
---
read_when:
- Leren hoe je OpenClaw configureert
- Leren hoe u OpenClaw configureert
- Configuratievoorbeelden zoeken
- OpenClaw voor het eerst instellen
summary: Schema-getrouwe configuratievoorbeelden voor gangbare OpenClaw-installaties
summary: Schemagetrouwe configuratievoorbeelden voor gangbare OpenClaw-configuraties
title: Configuratievoorbeelden
x-i18n:
generated_at: "2026-04-29T22:43:19Z"
generated_at: "2026-05-04T07:05:58Z"
model: gpt-5.5
provider: openai
source_hash: 8bc1f8877bc635d6e3aafd911852d61e71fa08de9144751209542fd67c70f0ba
source_hash: 60c8c2d731f8dce93c4d14657041d72043bc36e3d71ab6cb13c02993ba90dbe3
source_path: gateway/configuration-examples.md
workflow: 16
---
Voorbeelden hieronder zijn afgestemd op het huidige configuratieschema. Zie [Configuratie](/nl/gateway/configuration) voor de volledige referentie en opmerkingen per veld.
Onderstaande voorbeelden zijn afgestemd op het huidige configuratieschema. Zie [Configuratie](/nl/gateway/configuration) voor de volledige referentie en opmerkingen per veld.
## Snelstart
## Snel aan de slag
### Absoluut minimum
@ -57,7 +57,7 @@ Sla op als `~/.openclaw/openclaw.json` en je kunt de bot vanaf dat nummer een DM
}
```
## Uitgebreid voorbeeld (belangrijke opties)
## Uitgebreid voorbeeld (belangrijkste opties)
> Met JSON5 kun je opmerkingen en afsluitende komma's gebruiken. Gewone JSON werkt ook.
@ -256,6 +256,7 @@ Sla op als `~/.openclaw/openclaw.json` en je kunt de bot vanaf dat nummer een DM
skills: ["github", "weather"], // inherited by agents that omit list[].skills
thinkingDefault: "low",
verboseDefault: "off",
toolProgressDetail: "explain",
reasoningDefault: "off",
elevatedDefault: "on",
blockStreamingDefault: "off",
@ -472,7 +473,7 @@ Sla op als `~/.openclaw/openclaw.json` en je kunt de bot vanaf dat nummer een DM
## Veelvoorkomende patronen
### Gedeelde Skills-baseline met één overschrijving
### Gedeelde Skills-basislijn met één overschrijving
```json5
{
@ -489,11 +490,11 @@ Sla op als `~/.openclaw/openclaw.json` en je kunt de bot vanaf dat nummer een DM
}
```
- `agents.defaults.skills` is de gedeelde basislijn.
- `agents.list[].skills` vervangt die basislijn voor één agent.
- `agents.defaults.skills` is de gedeelde basis.
- `agents.list[].skills` vervangt die basis voor één agent.
- Gebruik `skills: []` wanneer een agent geen Skills mag zien.
### Setup voor meerdere platforms
### Multiplatform-installatie
```json5
{
@ -514,11 +515,11 @@ Sla op als `~/.openclaw/openclaw.json` en je kunt de bot vanaf dat nummer een DM
}
```
### Automatische goedkeuring voor vertrouwd Node-netwerk
### Automatische goedkeuring voor vertrouwde Node-netwerken
Houd apparaatkoppeling handmatig, tenzij je het netwerkpad beheert. Voor een toegewezen
lab of tailnet-subnet kun je je aanmelden voor automatische goedkeuring van Node-apparaten
bij de eerste keer met exacte CIDR's of IP's:
lab- of tailnet-subnet kun je je aanmelden voor automatische goedkeuring van Node-apparaten
bij de eerste koppeling met exacte CIDR's of IP's:
```json5
{
@ -532,13 +533,13 @@ bij de eerste keer met exacte CIDR's of IP's:
}
```
Dit blijft uitgeschakeld wanneer het niet is ingesteld. Het geldt alleen voor nieuwe `role: node`-koppeling zonder
aangevraagde scopes. Operator-/browserclients en upgrades voor rol, scope, metadata of
openbare sleutel vereisen nog steeds handmatige goedkeuring.
Dit blijft uitgeschakeld wanneer het niet is ingesteld. Het is alleen van toepassing op nieuwe `role: node`-koppelingen met
geen aangevraagde scopes. Operator-/browserclients en upgrades van rol, scope, metadata of
publieke sleutel vereisen nog steeds handmatige goedkeuring.
### Beveiligde DM-modus (gedeelde inbox / DM's voor meerdere gebruikers)
### Veilige DM-modus (gedeelde inbox / DM's met meerdere gebruikers)
Als meer dan één persoon je bot een DM kan sturen (meerdere items in `allowFrom`, koppelingsgoedkeuringen voor meerdere personen of `dmPolicy: "open"`), schakel dan **beveiligde DM-modus** in zodat DM's van verschillende afzenders standaard niet één context delen:
Als meer dan één persoon je bot kan DM'en (meerdere vermeldingen in `allowFrom`, koppelingsgoedkeuringen voor meerdere personen, of `dmPolicy: "open"`), schakel dan **veilige DM-modus** in zodat DM's van verschillende afzenders standaard geen context delen:
```json5
{
@ -563,9 +564,9 @@ Als meer dan één persoon je bot een DM kan sturen (meerdere items in `allowFro
```
Voor Discord/Slack/Google Chat/Microsoft Teams/Mattermost/IRC is afzenderautorisatie standaard eerst op ID gebaseerd.
Schakel directe, wijzigbare matching op naam/e-mail/bijnaam alleen in met `dangerouslyAllowNameMatching: true` van elk kanaal als je dat risico expliciet accepteert.
Schakel directe, wijzigbare matching op naam/e-mail/bijnaam alleen in met de `dangerouslyAllowNameMatching: true` van elk kanaal als je dat risico expliciet accepteert.
### Anthropic API-sleutel + MiniMax-fallback
### Anthropic API-sleutel + MiniMax-terugval
```json5
{
@ -658,10 +659,10 @@ Schakel directe, wijzigbare matching op naam/e-mail/bijnaam alleen in met `dange
## Tips
- Als je `dmPolicy: "open"` instelt, moet de bijbehorende lijst `allowFrom` `"*"` bevatten.
- Als je `dmPolicy: "open"` instelt, moet de bijbehorende `allowFrom`-lijst `"*"` bevatten.
- Provider-ID's verschillen (telefoonnummers, gebruikers-ID's, kanaal-ID's). Gebruik de providerdocumentatie om de indeling te bevestigen.
- Optionele secties om later toe te voegen: `web`, `browser`, `ui`, `discovery`, `canvasHost`, `talk`, `signal`, `imessage`.
- Zie [Providers](/nl/providers) en [Probleemoplossing](/nl/gateway/troubleshooting) voor uitgebreidere setupnotities.
- Zie [Providers](/nl/providers) en [Probleemoplossing](/nl/gateway/troubleshooting) voor uitgebreidere installatienotities.
## Gerelateerd

View File

@ -1,39 +1,40 @@
---
read_when:
- Je wilt OpenClaw-modelgebruik, berichtenstroom of sessiestatistieken naar een OpenTelemetry-collector sturen
- Je koppelt traces, metrieken of logs aan Grafana, Datadog, Honeycomb, New Relic, Tempo of een andere OTLP-backend
- Je hebt de exacte metrieknamen, spannamen of attribuutstructuren nodig om dashboards of waarschuwingen te bouwen
summary: Exporteer OpenClaw-diagnostiek naar elke OpenTelemetry-collector via de diagnostics-otel Plugin (OTLP/HTTP)
- Je wilt OpenClaw-modelgebruik, berichtenstroom of sessiemetrieken naar een OpenTelemetry-collector sturen
- Je koppelt tracegegevens, metrieken of logboeken aan Grafana, Datadog, Honeycomb, New Relic, Tempo of een andere OTLP-backend
- Je hebt de exacte metriek-namen, span-namen of attribuutstructuren nodig om dashboards of waarschuwingen te bouwen
summary: Exporteer OpenClaw-diagnostiek naar elke OpenTelemetry-collector via de diagnostics-otel-Plugin (OTLP/HTTP)
title: OpenTelemetry-export
x-i18n:
generated_at: "2026-05-03T21:32:47Z"
generated_at: "2026-05-04T07:06:17Z"
model: gpt-5.5
provider: openai
source_hash: c8091aa633a3e10593681f94913a858587a5dc69d9947e0c0d4132f6e897b00b
source_hash: d0b5be99b29fe5f13132b03cfeaf3ce978ee16f29e307aa76769bc414b5ca35f
source_path: gateway/opentelemetry.md
workflow: 16
---
OpenClaw exporteert diagnostiek via de officiële `diagnostics-otel`-Plugin
met **OTLP/HTTP (protobuf)**. Elke collector of backend die OTLP/HTTP accepteert,
werkt zonder codewijzigingen. Zie [Logboekregistratie](/nl/logging) voor lokale bestandslogs en hoe je ze leest.
OpenClaw exporteert diagnostiek via de officiële `diagnostics-otel` plugin
met **OTLP/HTTP (protobuf)**. Elke collector of backend die OTLP/HTTP
accepteert, werkt zonder codewijzigingen. Voor lokale bestandslogs en hoe je ze leest, zie
[Logboekregistratie](/nl/logging).
## Hoe het samenhangt
- **Diagnostische events** zijn gestructureerde records binnen het proces die worden uitgezonden door de
Gateway en meegeleverde Plugins voor modeluitvoeringen, berichtenstroom, sessies, wachtrijen
- **Diagnostiekgebeurtenissen** zijn gestructureerde, in-process records die worden uitgezonden door de
Gateway en meegeleverde plugins voor modelruns, berichtenstroom, sessies, wachtrijen
en exec.
- De **`diagnostics-otel`-Plugin** abonneert zich op die events en exporteert ze als
OpenTelemetry-**metrics**, **traces** en **logs** via OTLP/HTTP.
- **Provider-aanroepen** ontvangen een W3C `traceparent`-header vanuit OpenClaw's
vertrouwde spancontext voor modelaanroepen wanneer het providertransport aangepaste
headers accepteert. Door Plugins uitgezonden tracecontext wordt niet doorgegeven.
- Exporters worden alleen gekoppeld wanneer zowel het diagnostiekoppervlak als de Plugin zijn
ingeschakeld, zodat de kosten binnen het proces standaard vrijwel nul blijven.
- **`diagnostics-otel` plugin** abonneert zich op die gebeurtenissen en exporteert ze als
OpenTelemetry **metrics**, **traces** en **logs** via OTLP/HTTP.
- **Provideraanroepen** ontvangen een W3C `traceparent`-header van de
vertrouwde model-call spancontext van OpenClaw wanneer het providertransport aangepaste
headers accepteert. Door plugins uitgezonden tracecontext wordt niet doorgegeven.
- Exporters worden alleen gekoppeld wanneer zowel het diagnostiekoppervlak als de plugin zijn
ingeschakeld, zodat de in-process kosten standaard bijna nul blijven.
## Snel aan de slag
Installeer voor pakketinstallaties eerst de Plugin:
Installeer voor pakketinstallaties eerst de plugin:
```bash
openclaw plugins install clawhub:@openclaw/diagnostics-otel
@ -64,7 +65,7 @@ openclaw plugins install clawhub:@openclaw/diagnostics-otel
}
```
Je kunt de Plugin ook inschakelen vanuit de CLI:
Je kunt de plugin ook inschakelen vanuit de CLI:
```bash
openclaw plugins enable diagnostics-otel
@ -76,11 +77,11 @@ openclaw plugins enable diagnostics-otel
## Geëxporteerde signalen
| Signaal | Wat erin gaat |
| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| **Metrics** | Tellers en histogrammen voor tokengebruik, kosten, uitvoeringsduur, berichtenstroom, wachtrijlanes, sessiestatus, exec en geheugendruk. |
| **Traces** | Spans voor modelgebruik, modelaanroepen, harness-levenscyclus, tooluitvoering, exec, webhook-/berichtverwerking, contextopbouw en toollussen. |
| **Logs** | Gestructureerde `logging.file`-records die via OTLP worden geëxporteerd wanneer `diagnostics.otel.logs` is ingeschakeld. |
| Signaal | Wat erin gaat |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **Metrics** | Counters en histogrammen voor tokengebruik, kosten, runduur, berichtenstroom, wachtrijlanes, sessiestatus, exec en geheugendruk. |
| **Traces** | Spans voor modelgebruik, modelaanroepen, harness-levenscyclus, tooluitvoering, exec, webhook-/berichtverwerking, contextopbouw en tool-loops. |
| **Logs** | Gestructureerde `logging.file`-records die via OTLP worden geëxporteerd wanneer `diagnostics.otel.logs` is ingeschakeld. |
Schakel `traces`, `metrics` en `logs` onafhankelijk van elkaar in of uit. Alle drie staan standaard aan
wanneer `diagnostics.otel.enabled` true is.
@ -120,39 +121,39 @@ wanneer `diagnostics.otel.enabled` true is.
### Omgevingsvariabelen
| Variabele | Doel |
| ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | Overschrijft `diagnostics.otel.endpoint`. Als de waarde al `/v1/traces`, `/v1/metrics` of `/v1/logs` bevat, wordt die ongewijzigd gebruikt. |
| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` / `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` / `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | Signaalspecifieke endpoint-overschrijvingen die worden gebruikt wanneer de overeenkomende configuratiesleutel `diagnostics.otel.*Endpoint` niet is ingesteld. Signaalspecifieke configuratie wint van signaalspecifieke env, die wint van het gedeelde endpoint. |
| `OTEL_SERVICE_NAME` | Overschrijft `diagnostics.otel.serviceName`. |
| `OTEL_EXPORTER_OTLP_PROTOCOL` | Overschrijft het wireprotocol (alleen `http/protobuf` wordt vandaag ondersteund). |
| `OTEL_SEMCONV_STABILITY_OPT_IN` | Stel in op `gen_ai_latest_experimental` om het nieuwste experimentele GenAI-spanattribuut (`gen_ai.provider.name`) uit te zenden in plaats van het legacy `gen_ai.system`. GenAI-metrics gebruiken altijd begrensde semantische attributen met lage cardinaliteit. |
| `OPENCLAW_OTEL_PRELOADED` | Stel in op `1` wanneer een andere preload of hostproces de globale OpenTelemetry SDK al heeft geregistreerd. De Plugin slaat dan zijn eigen NodeSDK-levenscyclus over, maar verbindt nog steeds diagnostische listeners en respecteert `traces`/`metrics`/`logs`. |
| Variabele | Doel |
| ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | Overschrijft `diagnostics.otel.endpoint`. Als de waarde al `/v1/traces`, `/v1/metrics` of `/v1/logs` bevat, wordt deze ongewijzigd gebruikt. |
| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` / `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` / `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | Signaalspecifieke endpoint-overschrijvingen die worden gebruikt wanneer de bijbehorende configsleutel `diagnostics.otel.*Endpoint` niet is ingesteld. Signaalspecifieke config gaat vóór signaalspecifieke env, die vóór het gedeelde endpoint gaat. |
| `OTEL_SERVICE_NAME` | Overschrijft `diagnostics.otel.serviceName`. |
| `OTEL_EXPORTER_OTLP_PROTOCOL` | Overschrijft het wire-protocol (alleen `http/protobuf` wordt momenteel gehonoreerd). |
| `OTEL_SEMCONV_STABILITY_OPT_IN` | Stel in op `gen_ai_latest_experimental` om het nieuwste experimentele GenAI-spanattribuut (`gen_ai.provider.name`) uit te zenden in plaats van het oudere `gen_ai.system`. GenAI-metrics gebruiken altijd begrensde semantische attributen met lage cardinaliteit. |
| `OPENCLAW_OTEL_PRELOADED` | Stel in op `1` wanneer een andere preload of hostproces de globale OpenTelemetry SDK al heeft geregistreerd. De plugin slaat dan zijn eigen NodeSDK-levenscyclus over, maar koppelt nog steeds diagnostische listeners en respecteert `traces`/`metrics`/`logs`. |
## Privacy en inhoud vastleggen
## Privacy en contentvastlegging
Ruwe model-/toolinhoud wordt standaard **niet** geëxporteerd. Spans bevatten begrensde
identificatoren (kanaal, provider, model, foutcategorie, alleen gehashte aanvraag-id's)
en bevatten nooit prompttekst, antwoordtekst, toolinvoer, tooluitvoer of
Ruwe model-/toolcontent wordt standaard **niet** geëxporteerd. Spans bevatten begrensde
identifiers (kanaal, provider, model, foutcategorie, request-id's alleen als hash)
en bevatten nooit prompttekst, antwoordtekst, toolinputs, tooloutputs of
sessiesleutels.
Uitgaande modelaanvragen kunnen een W3C `traceparent`-header bevatten. Die header wordt
alleen gegenereerd vanuit diagnostische tracecontext die eigendom is van OpenClaw voor de actieve modelaanroep.
Bestaande door de aanroeper geleverde `traceparent`-headers worden vervangen, zodat Plugins of
aangepaste provideropties geen trace-afkomst tussen services kunnen vervalsen.
Uitgaande modelrequests kunnen een W3C `traceparent`-header bevatten. Die header wordt
alleen gegenereerd vanuit door OpenClaw beheerde diagnostische tracecontext voor de actieve modelaanroep.
Bestaande door de aanroeper geleverde `traceparent`-headers worden vervangen, zodat plugins of
aangepaste provideropties geen trace-afstamming tussen services kunnen spoofen.
Zet `diagnostics.otel.captureContent.*` alleen op `true` wanneer je collector en
retentiebeleid zijn goedgekeurd voor prompt-, antwoord-, tool- of systeemprompttekst.
Elke subsleutel is afzonderlijk opt-in:
Stel `diagnostics.otel.captureContent.*` alleen in op `true` wanneer je collector en
retentiebeleid zijn goedgekeurd voor prompt-, antwoord-, tool- of system-prompt-
tekst. Elke subsleutel is afzonderlijk opt-in:
- `inputMessages` — inhoud van gebruikersprompts.
- `outputMessages` — inhoud van modelantwoorden.
- `toolInputs` — payloads met toolargumenten.
- `toolOutputs` — payloads met toolresultaten.
- `systemPrompt` — samengestelde systeem-/ontwikkelaarsprompt.
- `toolInputs` — payloads van toolargumenten.
- `toolOutputs` — payloads van toolresultaten.
- `systemPrompt` — samengestelde system-/developerprompt.
Wanneer een subsleutel is ingeschakeld, krijgen model- en toolspans alleen voor die klasse begrensde, geredigeerde
`openclaw.content.*`-attributen.
Wanneer een subsleutel is ingeschakeld, krijgen model- en toolspans begrensde, geredigeerde
`openclaw.content.*`-attributen alleen voor die klasse.
## Sampling en flushen
@ -160,16 +161,16 @@ Wanneer een subsleutel is ingeschakeld, krijgen model- en toolspans alleen voor
`1.0` behoudt alles).
- **Metrics:** `diagnostics.otel.flushIntervalMs` (minimum `1000`).
- **Logs:** OTLP-logs respecteren `logging.level` (bestandslogniveau). Ze gebruiken het
redactiepad voor diagnostische logrecords, niet consoleopmaak. Installaties met hoog volume
moeten de voorkeur geven aan sampling/filtering in de OTLP-collector boven lokale sampling.
- **Bestandslogcorrelatie:** JSONL-bestandslogs bevatten `traceId`,
`spanId`, `parentSpanId` en `traceFlags` op het hoogste niveau wanneer de logaanroep een geldige
diagnostische tracecontext bevat, waardoor logprocessors lokale logregels kunnen koppelen aan
redactiepad voor diagnostische logrecords, niet consoleformattering. Installaties met hoog volume
moeten OTLP collector-sampling/-filtering verkiezen boven lokale sampling.
- **Bestandslogcorrelatie:** JSONL-bestandslogs bevatten top-level `traceId`,
`spanId`, `parentSpanId` en `traceFlags` wanneer de logaanroep een geldige
diagnostische tracecontext bevat, zodat logprocessors lokale logregels kunnen koppelen aan
geëxporteerde spans.
- **Aanvraagcorrelatie:** Gateway-HTTP-aanvragen en WebSocket-frames maken een
interne aanvraag-tracescope. Logs en diagnostische events binnen die scope
erven standaard de aanvraagtrace, terwijl agentuitvoerings- en modelaanroeppans als
kinderen worden gemaakt zodat provider-`traceparent`-headers op dezelfde trace blijven.
- **Requestcorrelatie:** Gateway HTTP-requests en WebSocket-frames maken een
intern request-tracebereik aan. Logs en diagnostiekgebeurtenissen binnen dat bereik
erven standaard de request-trace, terwijl agentrun- en model-call-spans als kinderen worden
aangemaakt zodat provider-`traceparent`-headers op dezelfde trace blijven.
## Geëxporteerde metrics
@ -182,9 +183,9 @@ Wanneer een subsleutel is ingeschakeld, krijgen model- en toolspans alleen voor
- `gen_ai.client.token.usage` (histogram, GenAI semantic-conventions metric, attrs: `gen_ai.token.type` = `input`/`output`, `gen_ai.provider.name`, `gen_ai.operation.name`, `gen_ai.request.model`)
- `gen_ai.client.operation.duration` (histogram, seconden, GenAI semantic-conventions metric, attrs: `gen_ai.provider.name`, `gen_ai.operation.name`, `gen_ai.request.model`, optioneel `error.type`)
- `openclaw.model_call.duration_ms` (histogram, attrs: `openclaw.provider`, `openclaw.model`, `openclaw.api`, `openclaw.transport`, plus `openclaw.errorCategory` en `openclaw.failureKind` bij geclassificeerde fouten)
- `openclaw.model_call.request_bytes` (histogram, UTF-8-bytegrootte van de uiteindelijke payload voor de modelaanvraag; geen ruwe payloadinhoud)
- `openclaw.model_call.response_bytes` (histogram, UTF-8-bytegrootte van gestreamde modelantwoordevents; geen ruwe antwoordinhoud)
- `openclaw.model_call.time_to_first_byte_ms` (histogram, verstreken tijd vóór het eerste gestreamde antwoordevent)
- `openclaw.model_call.request_bytes` (histogram, UTF-8-bytegrootte van de uiteindelijke modelrequestpayload; geen ruwe payloadcontent)
- `openclaw.model_call.response_bytes` (histogram, UTF-8-bytegrootte van gestreamde modelantwoordgebeurtenissen; geen ruwe antwoordcontent)
- `openclaw.model_call.time_to_first_byte_ms` (histogram, verstreken tijd vóór de eerste gestreamde antwoordgebeurtenis)
### Berichtenstroom
@ -208,63 +209,63 @@ Wanneer een subsleutel is ingeschakeld, krijgen model- en toolspans alleen voor
- `openclaw.session.stuck_age_ms` (histogram, attrs: `openclaw.state`; alleen uitgezonden voor verouderde sessieboekhouding zonder actief werk)
- `openclaw.run.attempt` (counter, attrs: `openclaw.attempt`)
### Telemetrie voor sessie-levendigheid
### Telemetrie voor sessie-liveness
`diagnostics.stuckSessionWarnMs` is de leeftijdsdrempel zonder voortgang voor diagnostiek van
sessie-levendigheid. Een `processing`-sessie veroudert niet richting deze drempel
terwijl OpenClaw voortgang in antwoord, tool, status, blok of ACP-runtime waarneemt.
Typing-keepalives tellen niet als voortgang, zodat een stil model of harness nog steeds
kan worden gedetecteerd.
sessie-liveness. Een `processing`-sessie telt niet mee richting deze drempel
terwijl OpenClaw voortgang in antwoord, tool, status, block of ACP-runtime waarneemt.
Typing-keepalives worden niet als voortgang geteld, zodat een stil model of harness
nog steeds kan worden gedetecteerd.
OpenClaw classificeert sessies op basis van het werk dat het nog kan waarnemen:
- `session.long_running`: actief ingebed werk, modelaanroepen of toolaanroepen maken
nog steeds voortgang.
- `session.stalled`: er bestaat actief werk, maar de actieve run heeft geen
recente voortgang gemeld. Vastgelopen ingebedde runs blijven eerst alleen-observeren en
gaan daarna abort-drain na minstens 10 minuten en 5x `diagnostics.stuckSessionWarnMs`
zonder voortgang, zodat wachtrijbeurten achter de lane kunnen worden hervat.
- `session.stalled`: actief werk bestaat, maar de actieve run heeft geen
recente voortgang gemeld. Vastgelopen ingebedde runs blijven eerst alleen-ter-observatie en gaan daarna
over op abort-drain na minstens 10 minuten en 5x `diagnostics.stuckSessionWarnMs`
zonder voortgang, zodat in de wachtrij geplaatste beurten achter de lane kunnen hervatten.
- `session.stuck`: verouderde sessieboekhouding zonder actief werk. Dit geeft
de betrokken sessie-lane onmiddellijk vrij.
de getroffen sessielane onmiddellijk vrij.
Alleen `session.stuck` emitteert de teller `openclaw.session.stuck`, het
Alleen `session.stuck` verstuurt de teller `openclaw.session.stuck`, het
histogram `openclaw.session.stuck_age_ms` en de span `openclaw.session.stuck`.
Herhaalde `session.stuck`-diagnostics bouwen vertraging op zolang de sessie
Herhaalde `session.stuck`-diagnostiek trekt zich terug zolang de sessie
ongewijzigd blijft, dus dashboards moeten waarschuwen bij aanhoudende stijgingen in plaats van bij elke
heartbeat-tick. Zie voor de configuratieknop en standaardwaarden de
Heartbeat-tick. Zie voor de configuratieknop en standaardwaarden
[Configuratiereferentie](/nl/gateway/configuration-reference#diagnostics).
### Harness-levenscyclus
### Levenscyclus van de harness
- `openclaw.harness.duration_ms` (histogram, attrs: `openclaw.harness.id`, `openclaw.harness.plugin`, `openclaw.outcome`, `openclaw.harness.phase` bij fouten)
- `openclaw.harness.duration_ms` (histogram, attributen: `openclaw.harness.id`, `openclaw.harness.plugin`, `openclaw.outcome`, `openclaw.harness.phase` bij fouten)
### Exec
- `openclaw.exec.duration_ms` (histogram, attrs: `openclaw.exec.target`, `openclaw.exec.mode`, `openclaw.outcome`, `openclaw.failureKind`)
- `openclaw.exec.duration_ms` (histogram, attributen: `openclaw.exec.target`, `openclaw.exec.mode`, `openclaw.outcome`, `openclaw.failureKind`)
### Interne diagnostics (geheugen en tool-loop)
### Interne diagnostiek (geheugen en toollus)
- `openclaw.memory.heap_used_bytes` (histogram, attrs: `openclaw.memory.kind`)
- `openclaw.memory.heap_used_bytes` (histogram, attributen: `openclaw.memory.kind`)
- `openclaw.memory.rss_bytes` (histogram)
- `openclaw.memory.pressure` (teller, attrs: `openclaw.memory.level`)
- `openclaw.tool.loop.iterations` (teller, attrs: `openclaw.toolName`, `openclaw.outcome`)
- `openclaw.tool.loop.duration_ms` (histogram, attrs: `openclaw.toolName`, `openclaw.outcome`)
- `openclaw.memory.pressure` (teller, attributen: `openclaw.memory.level`)
- `openclaw.tool.loop.iterations` (teller, attributen: `openclaw.toolName`, `openclaw.outcome`)
- `openclaw.tool.loop.duration_ms` (histogram, attributen: `openclaw.toolName`, `openclaw.outcome`)
## Geëxporteerde spans
- `openclaw.model.usage`
- `openclaw.channel`, `openclaw.provider`, `openclaw.model`
- `openclaw.tokens.*` (input/output/cache_read/cache_write/total)
- `gen_ai.system` standaard, of `gen_ai.provider.name` wanneer de nieuwste GenAI semantische conventies zijn ingeschakeld
- standaard `gen_ai.system`, of `gen_ai.provider.name` wanneer de nieuwste semantische GenAI-conventies zijn ingeschakeld
- `gen_ai.request.model`, `gen_ai.operation.name`, `gen_ai.usage.*`
- `openclaw.run`
- `openclaw.outcome`, `openclaw.channel`, `openclaw.provider`, `openclaw.model`, `openclaw.errorCategory`
- `openclaw.model.call`
- `gen_ai.system` standaard, of `gen_ai.provider.name` wanneer de nieuwste GenAI semantische conventies zijn ingeschakeld
- standaard `gen_ai.system`, of `gen_ai.provider.name` wanneer de nieuwste semantische GenAI-conventies zijn ingeschakeld
- `gen_ai.request.model`, `gen_ai.operation.name`, `openclaw.provider`, `openclaw.model`, `openclaw.api`, `openclaw.transport`
- `openclaw.errorCategory` en optioneel `openclaw.failureKind` bij fouten
- `openclaw.model_call.request_bytes`, `openclaw.model_call.response_bytes`, `openclaw.model_call.time_to_first_byte_ms`
- `openclaw.provider.request_id_hash` (begrensde SHA-gebaseerde hash van de upstream provider-request-id; ruwe id's worden niet geëxporteerd)
- `openclaw.provider.request_id_hash` (begrensde SHA-gebaseerde hash van de request-id van de upstreamprovider; ruwe id's worden niet geëxporteerd)
- `openclaw.harness.run`
- `openclaw.harness.id`, `openclaw.harness.plugin`, `openclaw.outcome`, `openclaw.provider`, `openclaw.model`, `openclaw.channel`
- Bij voltooiing: `openclaw.harness.result_classification`, `openclaw.harness.yield_detected`, `openclaw.harness.items.started`, `openclaw.harness.items.completed`, `openclaw.harness.items.active`
@ -274,37 +275,37 @@ heartbeat-tick. Zie voor de configuratieknop en standaardwaarden de
- `openclaw.exec`
- `openclaw.exec.target`, `openclaw.exec.mode`, `openclaw.outcome`, `openclaw.failureKind`, `openclaw.exec.command_length`, `openclaw.exec.exit_code`, `openclaw.exec.timed_out`
- `openclaw.webhook.processed`
- `openclaw.channel`, `openclaw.webhook`, `openclaw.chatId`
- `openclaw.channel`, `openclaw.webhook`
- `openclaw.webhook.error`
- `openclaw.channel`, `openclaw.webhook`, `openclaw.chatId`, `openclaw.error`
- `openclaw.channel`, `openclaw.webhook`, `openclaw.error`
- `openclaw.message.processed`
- `openclaw.channel`, `openclaw.outcome`, `openclaw.chatId`, `openclaw.messageId`, `openclaw.reason`
- `openclaw.channel`, `openclaw.outcome`, `openclaw.reason`
- `openclaw.message.delivery`
- `openclaw.channel`, `openclaw.delivery.kind`, `openclaw.outcome`, `openclaw.errorCategory`, `openclaw.delivery.result_count`
- `openclaw.session.stuck`
- `openclaw.state`, `openclaw.ageMs`, `openclaw.queueDepth`
- `openclaw.context.assembled`
- `openclaw.prompt.size`, `openclaw.history.size`, `openclaw.context.tokens`, `openclaw.errorCategory` (geen prompt-, geschiedenis-, reactie- of session-key-inhoud)
- `openclaw.prompt.size`, `openclaw.history.size`, `openclaw.context.tokens`, `openclaw.errorCategory` (geen prompt-, geschiedenis-, respons- of sessiesleutelinhoud)
- `openclaw.tool.loop`
- `openclaw.toolName`, `openclaw.outcome`, `openclaw.iterations`, `openclaw.errorCategory` (geen loop-berichten, params of tooluitvoer)
- `openclaw.toolName`, `openclaw.outcome`, `openclaw.iterations`, `openclaw.errorCategory` (geen lusberichten, parameters of tooluitvoer)
- `openclaw.memory.pressure`
- `openclaw.memory.level`, `openclaw.memory.heap_used_bytes`, `openclaw.memory.rss_bytes`
Wanneer inhoudsvastlegging expliciet is ingeschakeld, kunnen model- en tool-spans ook
Wanneer inhoudsregistratie expliciet is ingeschakeld, kunnen model- en toolspans ook
begrensde, geredigeerde `openclaw.content.*`-attributen bevatten voor de specifieke
inhoudsklassen waarvoor je hebt gekozen.
## Catalogus met diagnostic-events
## Catalogus met diagnostische events
De onderstaande events ondersteunen de metrics en spans hierboven. Plugins kunnen zich er ook
rechtstreeks op abonneren zonder OTLP-export.
De onderstaande events ondersteunen de bovenstaande metrics en spans. Plugins kunnen zich er ook rechtstreeks op abonneren
zonder OTLP-export.
**Modelgebruik**
- `model.usage` — tokens, kosten, duur, context, provider/model/kanaal,
sessie-id's. `usage` is provider-/beurtboekhouding voor kosten en telemetrie;
`context.used` is de huidige prompt-/context-snapshot en kan lager zijn dan
provider `usage.total` wanneer gecachte invoer of tool-loop-aanroepen betrokken zijn.
`context.used` is de huidige prompt-/contextsnapshot en kan lager zijn dan
provider `usage.total` wanneer gecachte invoer of toollusaanroepen betrokken zijn.
**Berichtenstroom**
@ -319,10 +320,10 @@ rechtstreeks op abonneren zonder OTLP-export.
- `run.attempt` / `run.progress`
- `diagnostic.heartbeat` (geaggregeerde tellers: webhooks/wachtrij/sessie)
**Harness-levenscyclus**
**Levenscyclus van de harness**
- `harness.run.started` / `harness.run.completed` / `harness.run.error`
levenscyclus per run voor de agent-harness. Bevat `harnessId`, optioneel
levenscyclus per run voor de agentharness. Bevat `harnessId`, optioneel
`pluginId`, provider/model/kanaal en run-id. Voltooiing voegt
`durationMs`, `outcome`, optioneel `resultClassification`, `yieldDetected`,
en `itemLifecycle`-aantallen toe. Fouten voegen `phase`
@ -337,7 +338,7 @@ rechtstreeks op abonneren zonder OTLP-export.
## Zonder exporter
Je kunt diagnostics-events beschikbaar houden voor plugins of aangepaste sinks zonder
Je kunt diagnostische events beschikbaar houden voor Plugins of aangepaste sinks zonder
`diagnostics-otel` uit te voeren:
```json5
@ -346,8 +347,8 @@ Je kunt diagnostics-events beschikbaar houden voor plugins of aangepaste sinks z
}
```
Gebruik diagnostics-flags voor gerichte debuguitvoer zonder `logging.level` te verhogen.
Flags zijn hoofdletterongevoelig en ondersteunen wildcards (bijv. `telegram.*` of
Gebruik diagnostiekvlaggen voor gerichte debuguitvoer zonder `logging.level` te verhogen.
Vlaggen zijn niet hoofdlettergevoelig en ondersteunen wildcards (bijv. `telegram.*` of
`*`):
```json5
@ -362,9 +363,9 @@ Of als een eenmalige env-override:
OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload openclaw gateway
```
Flag-uitvoer gaat naar het standaard logbestand (`logging.file`) en wordt nog steeds
Vlaguitvoer gaat naar het standaardlogbestand (`logging.file`) en wordt nog steeds
geredigeerd door `logging.redactSensitive`. Volledige handleiding:
[Diagnostics-flags](/nl/diagnostics/flags).
[Diagnostiekvlaggen](/nl/diagnostics/flags).
## Uitschakelen
@ -374,13 +375,13 @@ geredigeerd door `logging.redactSensitive`. Volledige handleiding:
}
```
Je kunt `diagnostics-otel` ook uit `plugins.allow` laten, of
Je kunt `diagnostics-otel` ook weglaten uit `plugins.allow`, of
`openclaw plugins disable diagnostics-otel` uitvoeren.
## Gerelateerd
- [Logging](/nl/logging) — bestandslogs, console-uitvoer, CLI-tailing en het tabblad Logs in de Control UI
- [Interne Gateway-logging](/nl/gateway/logging) — WS-logstijlen, subsysteemprefixen en consolevastlegging
- [Diagnostics-flags](/nl/diagnostics/flags) — gerichte debug-logflags
- [Diagnostics-export](/nl/gateway/diagnostics) — supportbundeltool voor operators (los van OTEL-export)
- [Configuratiereferentie](/nl/gateway/configuration-reference#diagnostics) — volledige referentie voor `diagnostics.*`-velden
- [Diagnostiekvlaggen](/nl/diagnostics/flags) — gerichte debuglogvlaggen
- [Diagnostiekexport](/nl/gateway/diagnostics) — tool voor operator-supportbundels (los van OTEL-export)
- [Configuratiereferentie](/nl/gateway/configuration-reference#diagnostics) — volledige veldreferentie voor `diagnostics.*`

View File

@ -1,23 +1,23 @@
---
read_when:
- Fouten door een ontbrekend operatorbereik debuggen
- Fouten met ontbrekende operatorscope opsporen
- Goedkeuringen voor apparaat- of Node-koppelingen beoordelen
- Gateway-RPC-methoden toevoegen of classificeren
summary: Operatorrollen, scopes en controles tijdens goedkeuring voor Gateway-clients
summary: Operatorrollen, bereiken en controles op het moment van goedkeuring voor Gateway-clients
title: Operatorbereiken
x-i18n:
generated_at: "2026-05-03T11:10:04Z"
generated_at: "2026-05-04T07:06:21Z"
model: gpt-5.5
provider: openai
source_hash: 48f59f96b41333af9124ad4083ac5442eedb2d6cebdfff74e3ba256f06d36add
source_hash: f05d6bdbf9bdad2aef1c9664bb7ebb4b6241334b8aefac7993104e9977e40450
source_path: gateway/operator-scopes.md
workflow: 16
---
Operator-scopes bepalen wat een Gateway-client mag doen nadat deze is geauthenticeerd.
Ze zijn een beschermingsmaatregel voor het besturingsvlak binnen één vertrouwd Gateway-operatordomein,
geen isolatie voor vijandige multi-tenancy. Als je sterke scheiding nodig hebt tussen
personen, teams of machines, voer dan afzonderlijke Gateways uit onder afzonderlijke OS-gebruikers of
Operatorbereiken definiëren wat een Gateway-client mag doen nadat deze is geauthenticeerd.
Ze zijn een besturingsvlak-beveiliging binnen één vertrouwd Gateway-operatordomein,
geen vijandige multi-tenant-isolatie. Als je sterke scheiding nodig hebt tussen
mensen, teams of machines, voer dan aparte Gateways uit onder aparte OS-gebruikers of
hosts.
Gerelateerd: [Beveiliging](/nl/gateway/security), [Gateway-protocol](/nl/gateway/protocol),
@ -25,92 +25,94 @@ Gerelateerd: [Beveiliging](/nl/gateway/security), [Gateway-protocol](/nl/gateway
## Rollen
Gateway WebSocket-clients verbinden met één rol:
Gateway WebSocket-clients maken verbinding met één rol:
- `operator`: besturingsvlakclients zoals CLI, Control UI, automatisering en
- `operator`: besturingsvlak-clients zoals CLI, Control UI, automatisering en
vertrouwde hulpprocessen.
- `node`: capaciteitshosts zoals macOS, iOS, Android of headless nodes die
- `node`: capaciteitshosts zoals macOS, iOS, Android of headless Nodes die
opdrachten beschikbaar maken via `node.invoke`.
Operator-RPC-methoden vereisen de rol `operator`. Methoden afkomstig van een node
Operator-RPC-methoden vereisen de rol `operator`. Methoden die door Node worden geïnitieerd
vereisen de rol `node`.
## Scopeniveaus
## Bereikniveaus
| Scope | Betekenis |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `operator.read` | Alleen-lezen status, lijsten, catalogus, logboeken, sessielezingen en andere niet-muterende besturingsvlak-aanroepen. |
| `operator.write` | Normale muterende operatoracties zoals berichten verzenden, tools aanroepen, talk/voice-instellingen bijwerken en node-opdrachtrelay. Voldoet ook aan `operator.read`. |
| `operator.admin` | Administratieve toegang tot het besturingsvlak. Voldoet aan elke `operator.*`-scope. Vereist voor configuratiemutatie, updates, native hooks, gevoelige gereserveerde namespaces en goedkeuringen met hoog risico. |
| `operator.pairing` | Beheer van apparaat- en node-koppeling, inclusief het weergeven, goedkeuren, afwijzen, verwijderen, roteren en intrekken van koppelingsrecords of apparaattokens. |
| `operator.approvals` | Exec- en Plugin-goedkeurings-API's. |
| `operator.talk.secrets` | Talk-configuratie lezen inclusief geheimen. |
| Bereik | Betekenis |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `operator.read` | Alleen-lezen status, lijsten, catalogus, logs, sessielezingen en andere niet-mutatieve besturingsvlak-aanroepen. |
| `operator.write` | Normale mutatieve operatoracties zoals berichten verzenden, tools aanroepen, talk-/voice-instellingen bijwerken en relais voor Node-opdrachten. Voldoet ook aan `operator.read`. |
| `operator.admin` | Administratieve toegang tot het besturingsvlak. Voldoet aan elk `operator.*`-bereik. Vereist voor configuratiemutatie, updates, native hooks, gevoelige gereserveerde namespaces en goedkeuringen met hoog risico. |
| `operator.pairing` | Beheer van apparaat- en Node-koppeling, inclusief het weergeven, goedkeuren, afwijzen, verwijderen, roteren en intrekken van koppelingsrecords of apparaattokens. |
| `operator.approvals` | Exec- en Plugin-goedkeurings-API's. |
| `operator.talk.secrets` | Talk-configuratie lezen met geheimen inbegrepen. |
Onbekende toekomstige `operator.*`-scopes vereisen een exacte match, tenzij de aanroeper
Onbekende toekomstige `operator.*`-bereiken vereisen een exacte match, tenzij de aanroeper
`operator.admin` heeft.
## Methode-scope is alleen de eerste poort
## Methodebereik is alleen de eerste poort
Elke Gateway-RPC heeft een methode-scope met minste privileges. Die methode-scope bepaalt
Elke Gateway-RPC heeft een methodebereik met minimale privileges. Dat methodebereik bepaalt
of de aanvraag de handler kan bereiken. Sommige handlers passen daarna strengere
controles op goedkeuringsmoment toe op basis van het concrete onderdeel dat wordt goedgekeurd of gemuteerd.
controles bij goedkeuring toe op basis van het concrete item dat wordt goedgekeurd of gemuteerd.
Voorbeelden:
- `device.pair.approve` is bereikbaar met `operator.pairing`, maar het goedkeuren van een
operatorapparaat kan alleen scopes uitgeven of behouden die de aanroeper al heeft.
- `node.pair.approve` is bereikbaar met `operator.pairing`, en leidt daarna extra
goedkeuringsscopes af uit de lijst met wachtende node-opdrachten.
- `chat.send` is normaal een methode met write-scope, maar persistente `/config set`
operatorapparaat kan alleen bereiken minten of behouden die de aanroeper al heeft.
- `node.pair.approve` is bereikbaar met `operator.pairing` en leidt vervolgens extra
goedkeuringsbereiken af uit de lijst met wachtende Node-opdrachten.
- `chat.send` is normaal een methode met schrijfrechten, maar persistente `/config set`
en `/config unset` vereisen `operator.admin` op opdrachtniveau.
Hierdoor kunnen operators met lagere scopes koppelingsacties met laag risico uitvoeren zonder
alle koppelingsgoedkeuringen alleen voor admins te maken.
Hierdoor kunnen operators met een lager bereik koppelingsacties met laag risico uitvoeren zonder
alle koppelingsgoedkeuringen alleen voor beheerders te maken.
## Goedkeuringen voor apparaatkoppeling
Apparaatkoppelingsrecords zijn de duurzame bron van goedgekeurde rollen en scopes.
Al gekoppelde apparaten krijgen niet stilzwijgend bredere toegang: opnieuw verbinden met een aanvraag
voor een bredere rol of bredere scopes maakt een nieuwe wachtende upgradeaanvraag aan.
Apparaatkoppelingsrecords zijn de duurzame bron van goedgekeurde rollen en bereiken.
Al gekoppelde apparaten krijgen niet stilzwijgend bredere toegang: nieuwe verbindingen die vragen
om een bredere rol of bredere bereiken maken een nieuw wachtend upgradeverzoek aan.
Bij het goedkeuren van een apparaataanvraag:
Bij het goedkeuren van een apparaatverzoek:
- Een aanvraag zonder operatorrol heeft geen goedkeuring voor operator-tokenscopes nodig.
- Een aanvraag voor `operator.read`, `operator.write`, `operator.approvals`,
- Een verzoek zonder operatorrol heeft geen goedkeuring voor het bereik van het operatortoken nodig.
- Een verzoek voor `operator.read`, `operator.write`, `operator.approvals`,
`operator.pairing` of `operator.talk.secrets` vereist dat de aanroeper
die scopes heeft, of `operator.admin`.
- Een aanvraag voor `operator.admin` vereist `operator.admin`.
- Een reparatieaanvraag zonder expliciete scopes kan de bestaande operator-
tokenscopes overnemen. Als dat bestaande token admin-scope heeft, vereist goedkeuring nog steeds
die bereiken heeft, of `operator.admin`.
- Een verzoek voor `operator.admin` vereist `operator.admin`.
- Een herstelverzoek zonder expliciete bereiken kan de bestaande operatortokenbereiken
overnemen. Als dat bestaande token een admin-bereik heeft, vereist goedkeuring nog steeds
`operator.admin`.
Voor tokensessies van gekoppelde apparaten is beheer self-scoped tenzij de aanroeper
ook `operator.admin` heeft: niet-admin-aanroepers kunnen alleen hun eigen apparaatvermelding
roteren, intrekken of verwijderen.
Voor gekoppelde-apparaat-tokensessies is beheer zelfbereikt, tenzij de aanroeper
ook `operator.admin` heeft: niet-admin-aanroepers zien alleen hun eigen koppelingsvermeldingen,
kunnen alleen hun eigen wachtende verzoek goedkeuren of afwijzen, en kunnen alleen
hun eigen apparaatvermelding roteren, intrekken of verwijderen.
## Goedkeuringen voor node-koppeling
## Goedkeuringen voor Node-koppeling
Legacy `node.pair.*` gebruikt een afzonderlijke door Gateway beheerde node-koppelingsopslag. WS-nodes
gebruiken apparaatkoppeling met `role: node`, maar dezelfde vocabulaire op goedkeuringsniveau
Legacy `node.pair.*` gebruikt een aparte, door Gateway beheerde Node-koppelingsopslag. WS-Nodes
gebruiken apparaatkoppeling met `role: node`, maar dezelfde woordenschat op goedkeuringsniveau
is van toepassing.
`node.pair.approve` gebruikt de lijst met opdrachten in de wachtende aanvraag om aanvullende
vereiste scopes af te leiden:
`node.pair.approve` gebruikt de lijst met opdrachten in het wachtende verzoek om aanvullende
vereiste bereiken af te leiden:
- Aanvraag zonder opdrachten: `operator.pairing`
- Niet-exec node-opdrachten: `operator.pairing` + `operator.write`
- Verzoek zonder opdrachten: `operator.pairing`
- Niet-exec Node-opdrachten: `operator.pairing` + `operator.write`
- `system.run`, `system.run.prepare` of `system.which`:
`operator.pairing` + `operator.admin`
Node-koppeling stelt identiteit en vertrouwen vast. Het vervangt niet het eigen
`system.run` exec-goedkeuringsbeleid van de node.
`system.run` exec-goedkeuringsbeleid van de Node.
## Shared-secret-authenticatie
## Authenticatie met gedeeld geheim
Authenticatie met gedeeld gateway-token/wachtwoord wordt behandeld als vertrouwde operatortoegang voor
Authenticatie met een gedeeld gateway-token/wachtwoord wordt behandeld als vertrouwde operatortoegang voor
die Gateway. OpenAI-compatibele HTTP-oppervlakken en `/tools/invoke` herstellen de
normale volledige standaardscopeset voor operators voor shared-secret bearer-authenticatie, zelfs als een
aanroeper smallere gedeclareerde scopes verstuurt.
normale volledige standaardset operatorbereiken voor bearer-authenticatie met gedeeld geheim, zelfs als een
aanroeper smallere gedeclareerde bereiken verzendt.
Identiteitsdragende modi, zoals vertrouwde proxy-authenticatie of private-ingress `none`,
kunnen nog steeds expliciet gedeclareerde scopes respecteren. Gebruik afzonderlijke Gateways voor echte scheiding van vertrouwensgrenzen.
Modi met identiteit, zoals vertrouwde-proxy-authenticatie of private-ingress `none`,
kunnen nog steeds expliciet gedeclareerde bereiken respecteren. Gebruik aparte Gateways voor echte
scheiding van vertrouwensgrenzen.

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,14 @@
---
read_when:
- OpenClaw bijwerken
- Er werkt iets niet meer na een update
summary: OpenClaw veilig bijwerken (globale installatie of broncode), plus rollbackstrategie
- Er gaat iets mis na een update
summary: OpenClaw veilig bijwerken (globale installatie of broncode), plus terugdraaistrategie
title: Bijwerken
x-i18n:
generated_at: "2026-05-03T21:34:37Z"
generated_at: "2026-05-04T07:06:31Z"
model: gpt-5.5
provider: openai
source_hash: f9e26ea71748dfd1573cdca01126bf29ebc56be56eac604e2b6a009b463820d1
source_hash: 3c9ff1d70d74f45efea3c148718e5cbc74001ce3d924b760edc4d68622d23714
source_path: install/updating.md
workflow: 16
---
@ -17,13 +17,13 @@ Houd OpenClaw up-to-date.
## Aanbevolen: `openclaw update`
De snelste manier om bij te werken. Dit detecteert je installatietype (npm of git), haalt de nieuwste versie op, voert `openclaw doctor` uit en herstart de Gateway.
De snelste manier om te updaten. Het detecteert je installatietype (npm of git), haalt de nieuwste versie op, voert `openclaw doctor` uit en herstart de Gateway.
```bash
openclaw update
```
Om van kanaal te wisselen of een specifieke versie te kiezen:
Om van kanaal te wisselen of een specifieke versie te gebruiken:
```bash
openclaw update --channel beta
@ -33,21 +33,21 @@ openclaw update --dry-run # preview without applying
```
`openclaw update` accepteert geen `--verbose`. Gebruik voor updatediagnostiek
`--dry-run` om de geplande acties vooraf te bekijken, `--json` voor gestructureerde resultaten, of
`openclaw update status --json` om de kanaal- en beschikbaarheidsstatus te bekijken. De
installer heeft een eigen `--verbose`-vlag, maar die vlag maakt geen deel uit van
`--dry-run` om een voorbeeld van de geplande acties te bekijken, `--json` voor gestructureerde resultaten, of
`openclaw update status --json` om de kanaal- en beschikbaarheidsstatus te bekijken. Het
installatieprogramma heeft een eigen `--verbose`-vlag, maar die vlag maakt geen deel uit van
`openclaw update`.
`--channel beta` geeft de voorkeur aan bèta, maar de runtime valt terug op stable/latest wanneer
de beta-tag ontbreekt of ouder is dan de nieuwste stabiele release. Gebruik `--tag beta`
als je de ruwe npm beta dist-tag wilt voor een eenmalige pakketupdate.
`--channel beta` geeft de voorkeur aan beta, maar de runtime valt terug op stable/latest wanneer
de betatag ontbreekt of ouder is dan de nieuwste stabiele release. Gebruik `--tag beta`
als je de ruwe npm-beta-dist-tag wilt voor een eenmalige pakketupdate.
Zie [Ontwikkelingskanalen](/nl/install/development-channels) voor kanaalsemantiek.
## Wisselen tussen npm- en git-installaties
Gebruik kanalen wanneer je het installatietype wilt wijzigen. De updater behoudt je
status, configuratie, inloggegevens en workspace in `~/.openclaw`; hij wijzigt alleen
status, configuratie, referenties en werkruimte in `~/.openclaw`; hij wijzigt alleen
welke OpenClaw-code-installatie de CLI en Gateway gebruiken.
```bash
@ -58,30 +58,30 @@ openclaw update --channel dev
openclaw update --channel stable
```
Voer eerst uit met `--dry-run` om de exacte wissel van installatiemodus vooraf te bekijken:
Voer eerst uit met `--dry-run` om de exacte wijziging van installatiemodus te bekijken:
```bash
openclaw update --channel dev --dry-run
openclaw update --channel stable --dry-run
```
Het `dev`-kanaal zorgt voor een git-checkout, bouwt deze en installeert de globale CLI
Het `dev`-kanaal zorgt voor een git-checkout, bouwt die en installeert de globale CLI
vanuit die checkout. De `stable`- en `beta`-kanalen gebruiken pakketinstallaties. Als de
Gateway al is geïnstalleerd, vernieuwt `openclaw update` de servicemetadata
Gateway al is geinstalleerd, vernieuwt `openclaw update` de servicemetadata
en herstart deze, tenzij je `--no-restart` meegeeft.
## Alternatief: voer de installer opnieuw uit
## Alternatief: voer het installatieprogramma opnieuw uit
```bash
curl -fsSL https://openclaw.ai/install.sh | bash
```
Voeg `--no-onboard` toe om onboarding over te slaan. Om via de
installer een specifiek installatietype af te dwingen, geef je `--install-method git --no-onboard` of
Voeg `--no-onboard` toe om onboarding over te slaan. Om een specifiek installatietype via
het installatieprogramma af te dwingen, geef je `--install-method git --no-onboard` of
`--install-method npm --no-onboard` mee.
Als `openclaw update` mislukt na de installatiefase van het npm-pakket, voer je de
installer opnieuw uit. De installer roept de oude updater niet aan; hij voert de globale
Als `openclaw update` mislukt na de npm-pakketinstallatiefase, voer dan het
installatieprogramma opnieuw uit. Het installatieprogramma roept de oude updater niet aan; het voert de globale
pakketinstallatie rechtstreeks uit en kan een gedeeltelijk bijgewerkte npm-installatie herstellen.
```bash
@ -94,17 +94,22 @@ Om het herstel vast te zetten op een specifieke versie of dist-tag, voeg je `--v
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method npm --version <version-or-dist-tag>
```
## Alternatief: handmatige npm, pnpm of bun
## Alternatief: handmatig npm, pnpm of bun
```bash
npm i -g openclaw@latest
```
Wanneer `openclaw update` een globale npm-installatie beheert, installeert het doel eerst
in een tijdelijke npm-prefix, verifieert het de verpakte `dist`-inventaris en wisselt het daarna
de schone pakketboom naar de echte globale prefix. Daardoor wordt voorkomen dat npm een
nieuw pakket over verouderde bestanden van het oude pakket heen legt. Als de installatieopdracht mislukt,
probeert OpenClaw het één keer opnieuw met `--omit=optional`. Die nieuwe poging helpt hosts waar native
Gebruik bij voorkeur `openclaw update` voor beheerde installaties, omdat dit de
pakketwisseling kan coordineren met de actieve Gateway-service. Als je handmatig bijwerkt terwijl een
beheerde Gateway actief is, herstart de Gateway dan direct nadat de pakketbeheerder
klaar is, zodat het oude proces niet blijft serveren vanuit vervangen pakketbestanden.
Wanneer `openclaw update` een globale npm-installatie beheert, installeert het het doel eerst in
een tijdelijke npm-prefix, verifieert het de verpakte `dist`-inventaris en wisselt het daarna
de schone pakketstructuur in de echte globale prefix. Zo wordt voorkomen dat npm een
nieuw pakket over verouderde bestanden uit het oude pakket heen legt. Als de installatieopdracht mislukt,
probeert OpenClaw het eenmaal opnieuw met `--omit=optional`. Die nieuwe poging helpt hosts waarop native
optionele afhankelijkheden niet kunnen compileren, terwijl de oorspronkelijke fout zichtbaar blijft
als de fallback ook mislukt.
@ -119,22 +124,22 @@ bun add -g openclaw@latest
### Geavanceerde npm-installatieonderwerpen
<AccordionGroup>
<Accordion title="Alleen-lezen pakketboom">
OpenClaw behandelt verpakte globale installaties tijdens runtime als alleen-lezen, zelfs wanneer de globale pakketmap beschrijfbaar is voor de huidige gebruiker. Plugin-pakketinstallaties bevinden zich in door OpenClaw beheerde npm/git-roots onder de configuratiemap van de gebruiker, en het opstarten van de Gateway wijzigt de OpenClaw-pakketboom niet.
<Accordion title="Alleen-lezen pakketstructuur">
OpenClaw behandelt verpakte globale installaties tijdens runtime als alleen-lezen, zelfs wanneer de globale pakketmap schrijfbaar is voor de huidige gebruiker. Plugin-pakketinstallaties staan in door OpenClaw beheerde npm/git-roots onder de gebruikersconfiguratiemap, en het opstarten van de Gateway wijzigt de OpenClaw-pakketstructuur niet.
Sommige Linux-npm-setups installeren globale pakketten onder mappen die eigendom zijn van root, zoals `/usr/lib/node_modules/openclaw`. OpenClaw ondersteunt die indeling omdat installatie- en updateopdrachten voor plugins buiten die globale pakketmap schrijven.
Sommige Linux-npm-configuraties installeren globale pakketten onder root-beheerde mappen zoals `/usr/lib/node_modules/openclaw`. OpenClaw ondersteunt die indeling omdat Plugin-installatie- en updateopdrachten buiten die globale pakketmap schrijven.
</Accordion>
<Accordion title="Versterkte systemd-units">
Geef OpenClaw schrijftoegang tot de roots voor configuratie/status, zodat expliciete Plugin-installaties, Plugin-updates en doctor-opruiming hun wijzigingen kunnen bewaren:
Geef OpenClaw schrijfrechten op zijn configuratie- en statusroots, zodat expliciete Plugin-installaties, Plugin-updates en doctor-opruiming hun wijzigingen kunnen bewaren:
```ini
ReadWritePaths=/var/lib/openclaw /home/openclaw/.openclaw /tmp
```
</Accordion>
<Accordion title="Schijfruimte-preflight">
Vóór pakketupdates en expliciete Plugin-installaties probeert OpenClaw een best-effort schijfruimtecontrole voor het doelvolume uit te voeren. Weinig ruimte levert een waarschuwing op met het gecontroleerde pad, maar blokkeert de update niet omdat bestandssysteemquota, snapshots en netwerkvolumes na de controle kunnen veranderen. De daadwerkelijke installatie via de pakketbeheerder en de verificatie na installatie blijven gezaghebbend.
<Accordion title="Schijfruimtecontrole vooraf">
Voor pakketupdates en expliciete Plugin-installaties probeert OpenClaw een best-effort schijfruimtecontrole voor het doelvolume uit te voeren. Weinig ruimte levert een waarschuwing op met het gecontroleerde pad, maar blokkeert de update niet omdat bestandssysteemquota, snapshots en netwerkvolumes na de controle kunnen veranderen. De daadwerkelijke pakketbeheerinstallatie en verificatie na installatie blijven gezaghebbend.
</Accordion>
</AccordionGroup>
@ -156,23 +161,23 @@ De auto-updater staat standaard uit. Schakel deze in `~/.openclaw/openclaw.json`
}
```
| Kanaal | Gedrag |
| -------- | ------------------------------------------------------------------------------------------------------------- |
| `stable` | Wacht `stableDelayHours` en past daarna toe met deterministische jitter over `stableJitterHours` (gespreide uitrol). |
| `beta` | Controleert elke `betaCheckIntervalHours` (standaard: elk uur) en past onmiddellijk toe. |
| `dev` | Geen automatische toepassing. Gebruik `openclaw update` handmatig. |
| Kanaal | Gedrag |
| -------- | ------------------------------------------------------------------------------------------------------------------------- |
| `stable` | Wacht `stableDelayHours` en past daarna toe met deterministische jitter over `stableJitterHours` (gespreide uitrol). |
| `beta` | Controleert elke `betaCheckIntervalHours` (standaard: elk uur) en past onmiddellijk toe. |
| `dev` | Geen automatische toepassing. Gebruik `openclaw update` handmatig. |
De Gateway logt ook een updatehint bij het opstarten (uitschakelen met `update.checkOnStart: false`).
Voor downgrade of herstel na een incident stel je `OPENCLAW_NO_AUTO_UPDATE=1` in de Gateway-omgeving in om automatische toepassingen te blokkeren, zelfs wanneer `update.auto.enabled` is geconfigureerd. Opstart-updatehints kunnen nog steeds worden uitgevoerd, tenzij `update.checkOnStart` ook is uitgeschakeld.
Updates via de pakketbeheerder die worden aangevraagd via de live Gateway-control-plane-handler
forceren na de pakketwissel een niet-uitgestelde updateherstart zonder cooldown. Dat
Pakketbeheerupdates die via de live Gateway-control-plane-handler worden aangevraagd,
forceren na de pakketwisseling een niet-uitgestelde updateherstart zonder cooldown. Dat
voorkomt dat een oud in-memory proces lang genoeg blijft bestaan om chunks lazy te laden
uit een pakketboom die al is vervangen. Shell `openclaw update`
blijft het aanbevolen pad voor beheerde installaties omdat dit de service rond de update kan stoppen en
uit een pakketstructuur die al is vervangen. Shell-`openclaw update`
blijft het voorkeursproces voor beheerde installaties, omdat het de service rond de update kan stoppen en
herstarten.
## Na het bijwerken
## Na het updaten
<Steps>
@ -212,7 +217,7 @@ openclaw gateway restart
`npm view openclaw version` toont de huidige gepubliceerde versie.
</Tip>
### Zet een commit vast (broncode)
### Zet een commit vast (source)
```bash
git fetch origin
@ -226,7 +231,7 @@ Om terug te keren naar de nieuwste versie: `git checkout main && git pull`.
## Als je vastloopt
- Voer `openclaw doctor` opnieuw uit en lees de uitvoer zorgvuldig.
- Voor `openclaw update --channel dev` op source-checkouts bootstrapt de updater `pnpm` automatisch wanneer dat nodig is. Als je een pnpm/corepack-bootstrapfout ziet, installeer dan `pnpm` handmatig (of schakel `corepack` opnieuw in) en voer de update opnieuw uit.
- Voor `openclaw update --channel dev` op source-checkouts bootstrapt de updater `pnpm` automatisch wanneer dat nodig is. Als je een pnpm/corepack-bootstrapfout ziet, installeer `pnpm` dan handmatig (of schakel `corepack` opnieuw in) en voer de update opnieuw uit.
- Controleer: [Probleemoplossing](/nl/gateway/troubleshooting)
- Vraag het in Discord: [https://discord.gg/clawd](https://discord.gg/clawd)

View File

@ -1,63 +1,65 @@
---
read_when:
- Je wilt een nieuwe OpenClaw-plugin maken
- Je hebt een snelstartgids voor Plugin-ontwikkeling nodig
- Je voegt een nieuw kanaal, een nieuwe provider, tool of andere mogelijkheid toe aan OpenClaw
- Je wilt een nieuwe OpenClaw-Plugin maken
- Je hebt een snelstart voor Plugin-ontwikkeling nodig
- Je voegt een nieuw kanaal, een nieuwe provider, een nieuwe tool of een andere mogelijkheid toe aan OpenClaw
sidebarTitle: Getting Started
summary: Maak binnen enkele minuten je eerste OpenClaw Plugin
summary: Maak in enkele minuten je eerste OpenClaw Plugin
title: Plugins bouwen
x-i18n:
generated_at: "2026-05-02T20:46:12Z"
generated_at: "2026-05-04T07:06:44Z"
model: gpt-5.5
provider: openai
source_hash: b42170b40094f89a63b1497c08ec31e397931dd536bd6faeeb8bc3c123ae45d1
source_hash: 3e6c55c551629da54b3f150ce6299694186fe4434cfd7978a2d43d175d33a5d9
source_path: plugins/building-plugins.md
workflow: 16
---
Plugins breiden OpenClaw uit met nieuwe mogelijkheden: kanalen, modelproviders,
spraak, realtime transcriptie, realtime spraak, mediabegrip, beeldgeneratie,
videogeneratie, web fetch, web search, agenttools, of elke combinatie daarvan.
spraak, realtime transcriptie, realtime spraak, mediabegrip, afbeelding
genereren, video genereren, web-fetch, webzoekopdrachten, agent-tools of elke
combinatie daarvan.
Je hoeft je plugin niet toe te voegen aan de OpenClaw-repository. Publiceer naar
Je hoeft je Plugin niet aan de OpenClaw-repository toe te voegen. Publiceer naar
[ClawHub](/nl/tools/clawhub) en gebruikers installeren met
`openclaw plugins install clawhub:<package-name>`. Kale pakketspecificaties
installeren tijdens de launch-overgang nog steeds vanaf npm.
installeren tijdens de lanceringsomschakeling nog steeds vanaf npm.
## Vereisten
- Node >= 22 en een pakketbeheerder (npm of pnpm)
- Bekendheid met TypeScript (ESM)
- Voor plugins in de repository: repository gekloond en `pnpm install` uitgevoerd. Pluginontwikkeling via een source checkout is alleen pnpm, omdat OpenClaw gebundelde
plugins laadt uit de `extensions/*`-workspacepakketten.
- Node >= 22 en een package manager (npm of pnpm)
- Vertrouwdheid met TypeScript (ESM)
- Voor Plugins in de repository: repository gekloond en `pnpm install` uitgevoerd. Pluginontwikkeling vanuit een source-checkout is alleen pnpm, omdat OpenClaw gebundelde
Plugins laadt vanuit de workspace-pakketten `extensions/*`.
## Welk soort plugin?
## Wat voor soort Plugin?
<CardGroup cols={3}>
<Card title="Kanaalplugin" icon="messages-square" href="/nl/plugins/sdk-channel-plugins">
<Card title="Kanaal-Plugin" icon="messages-square" href="/nl/plugins/sdk-channel-plugins">
Verbind OpenClaw met een berichtenplatform (Discord, IRC, enz.)
</Card>
<Card title="Providerplugin" icon="cpu" href="/nl/plugins/sdk-provider-plugins">
Voeg een modelprovider toe (LLM, proxy of aangepaste endpoint)
<Card title="Provider-Plugin" icon="cpu" href="/nl/plugins/sdk-provider-plugins">
Voeg een modelprovider toe (LLM, proxy of aangepast endpoint)
</Card>
<Card title="Tool- / hook-plugin" icon="wrench" href="/nl/plugins/hooks">
Registreer agenttools, eventhooks of services — ga hieronder verder
<Card title="Tool- / hook-Plugin" icon="wrench" href="/nl/plugins/hooks">
Registreer agent-tools, event-hooks of services — ga hieronder verder
</Card>
</CardGroup>
Gebruik voor een kanaalplugin waarvan niet gegarandeerd is dat die is geïnstalleerd wanneer onboarding/setup
wordt uitgevoerd `createOptionalChannelSetupSurface(...)` uit
`openclaw/plugin-sdk/channel-setup`. Dit produceert een setupadapter + wizardpaar
dat de installatievereiste aankondigt en gesloten faalt bij echte configuratieschrijfacties
totdat de plugin is geïnstalleerd.
Gebruik voor een kanaal-Plugin waarvan niet gegarandeerd is dat die is
geïnstalleerd wanneer onboarding/setup wordt uitgevoerd
`createOptionalChannelSetupSurface(...)` uit
`openclaw/plugin-sdk/channel-setup`. Dit maakt een setup-adapter + wizard-paar
dat de installatievereiste aangeeft en echte configuratieschrijfacties gesloten
laat falen totdat de Plugin is geïnstalleerd.
## Snelstart: toolplugin
## Snelstart: tool-Plugin
Deze walkthrough maakt een minimale plugin die een agenttool registreert. Kanaal-
en providerplugins hebben eigen handleidingen die hierboven zijn gelinkt.
Deze walkthrough maakt een minimale Plugin die een agent-tool registreert. Kanaal-
en provider-Plugins hebben eigen handleidingen die hierboven zijn gelinkt.
<Steps>
<Step title="Maak het pakket en het manifest">
<Step title="Maak het pakket en manifest">
<CodeGroup>
```json package.json
{
@ -97,10 +99,10 @@ en providerplugins hebben eigen handleidingen die hierboven zijn gelinkt.
```
</CodeGroup>
Elke plugin heeft een manifest nodig, zelfs zonder configuratie. Runtime-geregistreerde tools
moeten worden vermeld in `contracts.tools`, zodat OpenClaw de eigenaar-plugin kan ontdekken
zonder elke pluginruntime te laden. Plugins moeten ook
`activation.onStartup` bewust declareren. Dit voorbeeld stelt dit in op `true`. Zie
Elke Plugin heeft een manifest nodig, zelfs zonder configuratie. Runtime-geregistreerde tools
moeten in `contracts.tools` worden vermeld, zodat OpenClaw de eigenaar-
Plugin kan vinden zonder elke Plugin-runtime te laden. Plugins moeten ook
`activation.onStartup` bewust declareren. Dit voorbeeld zet dit op `true`. Zie
[Manifest](/nl/plugins/manifest) voor het volledige schema. De canonieke ClawHub-
publicatiesnippets staan in `docs/snippets/plugin-publish/`.
@ -130,15 +132,15 @@ en providerplugins hebben eigen handleidingen die hierboven zijn gelinkt.
});
```
`definePluginEntry` is bedoeld voor niet-kanaalplugins. Gebruik voor kanalen
`defineChannelPluginEntry` — zie [Kanaalplugins](/nl/plugins/sdk-channel-plugins).
`definePluginEntry` is voor niet-kanaal-Plugins. Gebruik voor kanalen
`defineChannelPluginEntry` — zie [Kanaal-Plugins](/nl/plugins/sdk-channel-plugins).
Zie [Entrypoints](/nl/plugins/sdk-entrypoints) voor alle entrypointopties.
</Step>
<Step title="Test en publiceer">
**Externe plugins:** valideer en publiceer met ClawHub, installeer daarna:
**Externe Plugins:** valideer en publiceer met ClawHub, en installeer daarna:
```bash
clawhub package publish your-org/your-plugin --dry-run
@ -147,9 +149,9 @@ en providerplugins hebben eigen handleidingen die hierboven zijn gelinkt.
```
Kale pakketspecificaties zoals `@myorg/openclaw-my-plugin` installeren tijdens
de launch-overgang vanaf npm. Gebruik `clawhub:` wanneer je ClawHub-resolutie wilt.
de lanceringsomschakeling vanaf npm. Gebruik `clawhub:` wanneer je ClawHub-resolutie wilt.
**Plugins in de repository:** plaats ze onder de gebundelde plugin-workspaceboom — ze worden automatisch ontdekt.
**Plugins in de repository:** plaats ze onder de workspace-boom voor gebundelde Plugins — automatisch ontdekt.
```bash
pnpm test -- <bundled-plugin-root>/my-plugin/
@ -158,70 +160,70 @@ en providerplugins hebben eigen handleidingen die hierboven zijn gelinkt.
</Step>
</Steps>
## Plugin-mogelijkheden
## Pluginmogelijkheden
Eén plugin kan elk aantal mogelijkheden registreren via het `api`-object:
Een enkele Plugin kan elk aantal mogelijkheden registreren via het `api`-object:
| Mogelijkheid | Registratiemethode | Gedetailleerde handleiding |
| ---------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------- |
| Tekstinferentie (LLM) | `api.registerProvider(...)` | [Providerplugins](/nl/plugins/sdk-provider-plugins) |
| Tekstinferentie (LLM) | `api.registerProvider(...)` | [Provider-Plugins](/nl/plugins/sdk-provider-plugins) |
| CLI-inferentiebackend | `api.registerCliBackend(...)` | [CLI-backends](/nl/gateway/cli-backends) |
| Kanaal / messaging | `api.registerChannel(...)` | [Kanaalplugins](/nl/plugins/sdk-channel-plugins) |
| Spraak (TTS/STT) | `api.registerSpeechProvider(...)` | [Providerplugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Realtime transcriptie | `api.registerRealtimeTranscriptionProvider(...)` | [Providerplugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Realtime spraak | `api.registerRealtimeVoiceProvider(...)` | [Providerplugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Mediabegrip | `api.registerMediaUnderstandingProvider(...)` | [Providerplugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Beeldgeneratie | `api.registerImageGenerationProvider(...)` | [Providerplugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Muziekgeneratie | `api.registerMusicGenerationProvider(...)` | [Providerplugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Videogeneratie | `api.registerVideoGenerationProvider(...)` | [Providerplugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Web fetch | `api.registerWebFetchProvider(...)` | [Providerplugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Web search | `api.registerWebSearchProvider(...)` | [Providerplugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Toolresultaat-middleware | `api.registerAgentToolResultMiddleware(...)` | [SDK-overzicht](/nl/plugins/sdk-overview#registration-api) |
| Agenttools | `api.registerTool(...)` | Hieronder |
| Kanaal / berichten | `api.registerChannel(...)` | [Kanaal-Plugins](/nl/plugins/sdk-channel-plugins) |
| Spraak (TTS/STT) | `api.registerSpeechProvider(...)` | [Provider-Plugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Realtime transcriptie | `api.registerRealtimeTranscriptionProvider(...)` | [Provider-Plugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Realtime spraak | `api.registerRealtimeVoiceProvider(...)` | [Provider-Plugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Mediabegrip | `api.registerMediaUnderstandingProvider(...)` | [Provider-Plugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Afbeelding genereren | `api.registerImageGenerationProvider(...)` | [Provider-Plugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Muziek genereren | `api.registerMusicGenerationProvider(...)` | [Provider-Plugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Video genereren | `api.registerVideoGenerationProvider(...)` | [Provider-Plugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Web-fetch | `api.registerWebFetchProvider(...)` | [Provider-Plugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Webzoekopdracht | `api.registerWebSearchProvider(...)` | [Provider-Plugins](/nl/plugins/sdk-provider-plugins#step-5-add-extra-capabilities) |
| Middleware voor toolresultaten | `api.registerAgentToolResultMiddleware(...)` | [SDK-overzicht](/nl/plugins/sdk-overview#registration-api) |
| Agent-tools | `api.registerTool(...)` | Hieronder |
| Aangepaste opdrachten | `api.registerCommand(...)` | [Entrypoints](/nl/plugins/sdk-entrypoints) |
| Pluginhooks | `api.on(...)` | [Pluginhooks](/nl/plugins/hooks) |
| Interne eventhooks | `api.registerHook(...)` | [Entrypoints](/nl/plugins/sdk-entrypoints) |
| Plugin-hooks | `api.on(...)` | [Plugin-hooks](/nl/plugins/hooks) |
| Interne event-hooks | `api.registerHook(...)` | [Entrypoints](/nl/plugins/sdk-entrypoints) |
| HTTP-routes | `api.registerHttpRoute(...)` | [Internals](/nl/plugins/architecture-internals#gateway-http-routes) |
| CLI-subopdrachten | `api.registerCli(...)` | [Entrypoints](/nl/plugins/sdk-entrypoints) |
Zie [SDK-overzicht](/nl/plugins/sdk-overview#registration-api) voor de volledige registratie-API.
Gebundelde plugins kunnen `api.registerAgentToolResultMiddleware(...)` gebruiken wanneer ze
asynchrone herschrijving van toolresultaten nodig hebben voordat het model de uitvoer ziet. Declareer de
beoogde runtimes in `contracts.agentToolResultMiddleware`, bijvoorbeeld
`["pi", "codex"]`. Dit is een vertrouwde seam voor gebundelde plugins; externe
plugins moeten gewone OpenClaw-pluginhooks verkiezen, tenzij OpenClaw een
Gebundelde Plugins kunnen `api.registerAgentToolResultMiddleware(...)` gebruiken wanneer ze
asynchroon herschrijven van toolresultaten nodig hebben voordat het model de uitvoer ziet. Declareer de
gerichte runtimes in `contracts.agentToolResultMiddleware`, bijvoorbeeld
`["pi", "codex"]`. Dit is een vertrouwde naad voor gebundelde Plugins; externe
Plugins moeten de voorkeur geven aan gewone OpenClaw Plugin-hooks, tenzij OpenClaw een
expliciet vertrouwensbeleid voor deze mogelijkheid krijgt.
Als je plugin aangepaste Gateway-RPC-methoden registreert, houd die dan op een
pluginspecifiek prefix. Core-adminnamespaces (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) blijven gereserveerd en worden altijd opgelost naar
`operator.admin`, zelfs als een plugin om een smallere scope vraagt.
Als je Plugin aangepaste Gateway-RPC-methoden registreert, houd die dan op een
Plugin-specifiek prefix. Core-adminnamespaces (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) blijven gereserveerd en resolven altijd naar
`operator.admin`, zelfs als een Plugin om een beperktere scope vraagt.
Hook-guardsemantiek om in gedachten te houden:
Hook-guardsemantiek om rekening mee te houden:
- `before_tool_call`: `{ block: true }` is terminaal en stopt handlers met lagere prioriteit.
- `before_tool_call`: `{ block: false }` wordt behandeld als geen beslissing.
- `before_tool_call`: `{ requireApproval: true }` pauzeert agentuitvoering en vraagt de gebruiker om goedkeuring via de exec-goedkeuringsoverlay, Telegram-knoppen, Discord-interacties of de `/approve`-opdracht op elk kanaal.
- `before_tool_call`: `{ requireApproval: true }` pauzeert de agentuitvoering en vraagt de gebruiker om goedkeuring via de exec-goedkeuringsoverlay, Telegram-knoppen, Discord-interacties of de opdracht `/approve` op elk kanaal.
- `before_install`: `{ block: true }` is terminaal en stopt handlers met lagere prioriteit.
- `before_install`: `{ block: false }` wordt behandeld als geen beslissing.
- `message_sending`: `{ cancel: true }` is terminaal en stopt handlers met lagere prioriteit.
- `message_sending`: `{ cancel: false }` wordt behandeld als geen beslissing.
- `message_received`: geef de voorkeur aan het getypte veld `threadId` wanneer je routering van inkomende threads/onderwerpen nodig hebt. Houd `metadata` voor kanaalspecifieke extra's.
- `message_received`: geef de voorkeur aan het getypte veld `threadId` wanneer je routering voor inkomende threads/topics nodig hebt. Houd `metadata` voor kanaalspecifieke extra's.
- `message_sending`: geef de voorkeur aan getypte routeringsvelden `replyToId` / `threadId` boven kanaalspecifieke metadatasleutels.
De opdracht `/approve` verwerkt zowel exec- als plugingoedkeuringen met begrensde fallback: wanneer een exec-goedkeurings-id niet wordt gevonden, probeert OpenClaw hetzelfde id opnieuw via plugingoedkeuringen. Doorsturen van plugingoedkeuringen kan onafhankelijk worden geconfigureerd via `approvals.plugin` in config.
De opdracht `/approve` verwerkt zowel exec- als Plugin-goedkeuringen met begrensde fallback: wanneer een exec-goedkeurings-id niet wordt gevonden, probeert OpenClaw hetzelfde id opnieuw via Plugin-goedkeuringen. Doorsturen van Plugin-goedkeuringen kan onafhankelijk worden geconfigureerd via `approvals.plugin` in de configuratie.
Als aangepaste goedkeuringsplumbing dezelfde begrensde fallbackcase moet detecteren,
gebruik dan liever `isApprovalNotFoundError` uit `openclaw/plugin-sdk/error-runtime`
in plaats van goedkeuring-vervalstrings handmatig te matchen.
Als aangepaste goedkeuringsplumbing diezelfde begrensde fallbackcase moet detecteren,
geef dan de voorkeur aan `isApprovalNotFoundError` uit `openclaw/plugin-sdk/error-runtime`
in plaats van handmatig goedkeuringsverloopstrings te matchen.
Zie [Pluginhooks](/nl/plugins/hooks) voor voorbeelden en de hookreferentie.
Zie [Plugin-hooks](/nl/plugins/hooks) voor voorbeelden en de hookreferentie.
## Agenttools registreren
## Agent-tools registreren
Tools zijn getypeerde functies die de LLM kan aanroepen. Ze kunnen vereist (altijd
beschikbaar) of optioneel (gebruiker opt-in) zijn:
Tools zijn getypte functies die de LLM kan aanroepen. Ze kunnen vereist zijn (altijd
beschikbaar) of optioneel (opt-in door gebruiker):
```typescript
register(api) {
@ -250,23 +252,31 @@ register(api) {
}
```
Elke tool die met `api.registerTool(...)` is geregistreerd, moet ook worden gedeclareerd in het
pluginmanifest:
Elke tool die met `api.registerTool(...)` is geregistreerd, moet ook in het
Plugin-manifest worden gedeclareerd:
```json
{
"contracts": {
"tools": ["my_tool", "workflow_tool"]
},
"toolMetadata": {
"workflow_tool": {
"optional": true
}
}
}
```
OpenClaw legt de gevalideerde descriptor van de geregistreerde tool vast en cachet die,
zodat plugins geen `description`- of schemagegevens in het manifest dupliceren. Het
manifestcontract declareert alleen eigenaarschap en ontdekking; uitvoering roept nog steeds
OpenClaw legt de gevalideerde descriptor van de geregistreerde tool vast en cachet deze,
zodat plugins geen `description` of schemagegevens in het manifest dupliceren. Het
manifestcontract declareert alleen eigenaarschap en discovery; uitvoering roept nog steeds
de live geregistreerde toolimplementatie aan.
Stel `toolMetadata.<tool>.optional: true` in voor tools die zijn geregistreerd met
`api.registerTool(..., { optional: true })`, zodat OpenClaw het laden van die
pluginruntime kan vermijden totdat de tool expliciet op de allowlist staat.
Gebruikers schakelen optionele tools in config in:
Gebruikers schakelen optionele tools in via de configuratie:
```json5
{
@ -274,16 +284,16 @@ Gebruikers schakelen optionele tools in config in:
}
```
- Toolnamen mogen niet botsen met kerntools (conflicten worden overgeslagen)
- Tools met misvormde registratieobjecten, inclusief ontbrekende `parameters`, worden overgeslagen en gemeld in plugindiagnostiek in plaats van agentruns te onderbreken
- Gebruik `optional: true` voor tools met neveneffecten of extra binaire vereisten
- Toolnamen mogen niet botsen met core-tools (conflicten worden overgeslagen)
- Tools met onjuist gevormde registratieobjecten, inclusief ontbrekende `parameters`, worden overgeslagen en gerapporteerd in plugindiagnostiek in plaats van agentruns te breken
- Gebruik `optional: true` voor tools met bijwerkingen of extra binaire vereisten
- Gebruikers kunnen alle tools van een plugin inschakelen door de plugin-id toe te voegen aan `tools.allow`
## CLI-opdrachten registreren
## CLI-commando's registreren
Plugins kunnen root-`openclaw`-opdrachtgroepen toevoegen met `api.registerCli`. Geef
`descriptors` op voor elke root van een opdracht op het hoogste niveau, zodat OpenClaw
de opdracht kan tonen en routeren zonder elke plugin-runtime vooraf te laden.
Plugins kunnen root-`openclaw`-commandogroepen toevoegen met `api.registerCli`. Geef
`descriptors` op voor elke commandoroot op het hoogste niveau, zodat OpenClaw het
commando kan tonen en routeren zonder elke pluginruntime eager te laden.
```typescript
register(api) {
@ -313,7 +323,7 @@ register(api) {
}
```
Controleer na installatie de runtime-registratie en voer de opdracht uit:
Controleer na installatie de runtimeregistratie en voer het commando uit:
```bash
openclaw plugins inspect demo-plugin --runtime --json
@ -334,49 +344,49 @@ import { ... } from "openclaw/plugin-sdk";
Zie [SDK-overzicht](/nl/plugins/sdk-overview) voor de volledige subpath-referentie.
Gebruik binnen je plugin lokale barrelbestanden (`api.ts`, `runtime-api.ts`) voor
interne imports; importeer je eigen plugin nooit via het SDK-pad ervan.
Gebruik binnen je plugin lokale barrel-bestanden (`api.ts`, `runtime-api.ts`) voor
interne imports importeer je eigen plugin nooit via het SDK-pad ervan.
Voor providerplugins bewaar je providerspecifieke helpers in die package-root
Houd voor providerplugins provider-specifieke helpers in die package-root
barrels, tenzij de seam echt generiek is. Huidige gebundelde voorbeelden:
- Anthropic: Claude-streamwrappers en `service_tier`-/bètahelpers
- OpenAI: providerbuilders, helpers voor standaardmodellen, realtimeproviders
- Anthropic: Claude-streamwrappers en `service_tier` / betahelpers
- OpenAI: providerbuilders, helpers voor standaardmodellen, realtime providers
- OpenRouter: providerbuilder plus onboarding-/configuratiehelpers
Als een helper alleen nuttig is binnen één gebundeld providerpakket, bewaar deze dan op die
Als een helper alleen nuttig is binnen één gebundeld providerpackage, houd die dan op die
package-root seam in plaats van deze te promoveren naar `openclaw/plugin-sdk/*`.
Sommige gegenereerde `openclaw/plugin-sdk/<bundled-id>`-helperseams bestaan nog steeds voor
onderhoud van gebundelde plugins wanneer ze bijgehouden eigenaargebruik hebben. Behandel die als
onderhoud van gebundelde plugins wanneer ze bijgehouden eigenaarsgebruik hebben. Behandel deze als
gereserveerde oppervlakken, niet als het standaardpatroon voor nieuwe plugins van derden.
## Checklist vóór indiening
<Check>**package.json** heeft correcte `openclaw`-metadata</Check>
<Check>**openclaw.plugin.json**-manifest is aanwezig en geldig</Check>
<Check>Entrypoint gebruikt `defineChannelPluginEntry` of `definePluginEntry`</Check>
<Check>Entry point gebruikt `defineChannelPluginEntry` of `definePluginEntry`</Check>
<Check>Alle imports gebruiken gerichte `plugin-sdk/<subpath>`-paden</Check>
<Check>Interne imports gebruiken lokale modules, geen SDK-self-imports</Check>
<Check>Tests slagen (`pnpm test -- <bundled-plugin-root>/my-plugin/`)</Check>
<Check>`pnpm check` slaagt (plugins in de repo)</Check>
<Check>`pnpm check` slaagt (plugins binnen de repo)</Check>
## Bètarelease testen
## Betareleasetests
1. Let op GitHub-releasetags op [openclaw/openclaw](https://github.com/openclaw/openclaw/releases) en abonneer je via `Watch` > `Releases`. Bèta-tags zien eruit als `v2026.3.N-beta.1`. Je kunt ook meldingen inschakelen voor het officiële OpenClaw X-account [@openclaw](https://x.com/openclaw) voor releaseaankondigingen.
2. Test je plugin tegen de bèta-tag zodra deze verschijnt. Het tijdvenster vóór stable is meestal maar een paar uur.
3. Plaats na het testen in de thread van je plugin in het Discord-kanaal `plugin-forum` met `all good` of wat er kapotging. Als je nog geen thread hebt, maak er dan een.
4. Als er iets kapotgaat, open of update een issue met de titel `Beta blocker: <plugin-name> - <summary>` en pas het label `beta-blocker` toe. Zet de issuelink in je thread.
5. Open een PR naar `main` met de titel `fix(<plugin-id>): beta blocker - <summary>` en link het issue in zowel de PR als je Discord-thread. Contributors kunnen PR's niet labelen, dus de titel is het signaal aan de PR-kant voor maintainers en automatisering. Blockers met een PR worden gemerged; blockers zonder PR kunnen toch worden uitgebracht. Maintainers volgen deze threads tijdens bètatests.
6. Stilte betekent groen. Als je het tijdvenster mist, landt je fix waarschijnlijk in de volgende cyclus.
1. Let op GitHub-releasetags op [openclaw/openclaw](https://github.com/openclaw/openclaw/releases) en abonneer je via `Watch` > `Releases`. Betatags zien eruit als `v2026.3.N-beta.1`. Je kunt ook meldingen inschakelen voor het officiële OpenClaw X-account [@openclaw](https://x.com/openclaw) voor releaseaankondigingen.
2. Test je plugin tegen de betatag zodra deze verschijnt. De periode vóór stable is meestal maar een paar uur.
3. Plaats na het testen een bericht in de thread van je plugin in het Discord-kanaal `plugin-forum` met `all good` of wat er kapotging. Als je nog geen thread hebt, maak er dan een.
4. Als er iets kapotgaat, open of update dan een issue met de titel `Beta blocker: <plugin-name> - <summary>` en pas het label `beta-blocker` toe. Zet de issuelink in je thread.
5. Open een PR naar `main` met de titel `fix(<plugin-id>): beta blocker - <summary>` en link het issue zowel in de PR als in je Discord-thread. Contributors kunnen PR's niet labelen, dus de titel is het PR-signaal voor maintainers en automatisering. Blockers met een PR worden gemerged; blockers zonder PR worden mogelijk toch gereleased. Maintainers volgen deze threads tijdens betatests.
6. Stilte betekent groen. Als je de periode mist, komt je fix waarschijnlijk in de volgende cyclus terecht.
## Volgende stappen
<CardGroup cols={2}>
<Card title="Kanaalplugins" icon="messages-square" href="/nl/plugins/sdk-channel-plugins">
Bouw een messagingkanaalplugin
<Card title="Channel Plugins" icon="messages-square" href="/nl/plugins/sdk-channel-plugins">
Bouw een messaging-channelplugin
</Card>
<Card title="Providerplugins" icon="cpu" href="/nl/plugins/sdk-provider-plugins">
<Card title="Provider Plugins" icon="cpu" href="/nl/plugins/sdk-provider-plugins">
Bouw een modelproviderplugin
</Card>
<Card title="SDK-overzicht" icon="book-open" href="/nl/plugins/sdk-overview">
@ -386,7 +396,7 @@ gereserveerde oppervlakken, niet als het standaardpatroon voor nieuwe plugins va
TTS, zoeken, subagent via api.runtime
</Card>
<Card title="Testen" icon="test-tubes" href="/nl/plugins/sdk-testing">
Testhulpprogramma's en patronen
Testhulpmiddelen en patronen
</Card>
<Card title="Pluginmanifest" icon="file-json" href="/nl/plugins/manifest">
Volledige referentie voor manifestschema
@ -395,8 +405,8 @@ gereserveerde oppervlakken, niet als het standaardpatroon voor nieuwe plugins va
## Gerelateerd
- [Pluginarchitectuur](/nl/plugins/architecture) — diepgaande uitleg van interne architectuur
- [SDK-overzicht](/nl/plugins/sdk-overview) — Plugin-SDK-referentie
- [Manifest](/nl/plugins/manifest) — pluginmanifestformaat
- [Kanaalplugins](/nl/plugins/sdk-channel-plugins) — kanaalplugins bouwen
- [Providerplugins](/nl/plugins/sdk-provider-plugins) — providerplugins bouwen
- [Pluginarchitectuur](/nl/plugins/architecture) — interne architectuur-deep dive
- [SDK-overzicht](/nl/plugins/sdk-overview) — Plugin SDK-referentie
- [Manifest](/nl/plugins/manifest) — pluginmanifestindeling
- [Channel Plugins](/nl/plugins/sdk-channel-plugins) — channelplugins bouwen
- [Provider Plugins](/nl/plugins/sdk-provider-plugins) — providerplugins bouwen

File diff suppressed because it is too large Load Diff

View File

@ -1,82 +1,82 @@
---
read_when:
- Je wilt blijvende kennis die verder gaat dan gewone MEMORY.md-notities
- Je configureert de gebundelde memory-wiki Plugin
- Je wilt wiki_search, wiki_get of brugmodus begrijpen
summary: 'memory-wiki: gecompileerde kennisopslag met herkomst, claims, dashboards en bridge-modus'
- Je configureert de meegeleverde memory-wiki Plugin
- Je wilt wiki_search, wiki_get of de bridge-modus begrijpen
summary: 'memory-wiki: samengestelde kennisopslag met herkomst, beweringen, overzichtspanelen en brugmodus'
title: Geheugenwiki
x-i18n:
generated_at: "2026-04-29T23:03:41Z"
generated_at: "2026-05-04T07:07:18Z"
model: gpt-5.5
provider: openai
source_hash: 744d569f8b0c9b668ea54dc057f808544359eaae87d5557de2e6acd1b31acd89
source_hash: b070177b7c1217e9102bc57680b4009265e3584ede7ad6dc3ba7b6393260fefe
source_path: plugins/memory-wiki.md
workflow: 16
---
`memory-wiki` is een gebundelde Plugin die duurzame memory omzet in een gecompileerde
`memory-wiki` is een gebundelde plugin die duurzame memory omzet in een gecompileerde
kennisvault.
Het vervangt de Active Memory Plugin **niet**. De Active Memory Plugin blijft
Deze vervangt de Active Memory-plugin **niet**. De Active Memory-plugin blijft
eigenaar van recall, promotie, indexering en Dreaming. `memory-wiki` staat ernaast
en compileert duurzame kennis naar een navigeerbare wiki met deterministische pagina's,
gestructureerde claims, herkomst, dashboards en machinaal leesbare digests.
en compileert duurzame kennis tot een navigeerbare wiki met deterministische pagina's,
gestructureerde claims, herkomst, dashboards en machineleesbare digests.
Gebruik het wanneer je wilt dat memory zich meer gedraagt als een onderhouden kennislaag en
Gebruik deze wanneer je wilt dat memory zich meer gedraagt als een onderhouden kennislaag en
minder als een stapel Markdown-bestanden.
## Wat het toevoegt
- Een dedicated wiki-vault met deterministische pagina-indeling
- Gestructureerde claim- en bewijsmetadata, niet alleen proza
- Gestructureerde claim- en evidence-metadata, niet alleen proza
- Herkomst, vertrouwen, tegenstrijdigheden en open vragen op paginaniveau
- Gecompileerde digests voor agent-/runtime-consumenten
- Gecompileerde digests voor agent-/runtimeconsumenten
- Wiki-native zoek-/ophaal-/toepas-/lint-tools
- Optionele bridge-modus die publieke artefacten uit de Active Memory Plugin importeert
- Optionele Obsidian-vriendelijke render-modus en CLI-integratie
- Optionele bridge-modus die publieke artefacten importeert uit de Active Memory-plugin
- Optionele Obsidian-vriendelijke rendermodus en CLI-integratie
## Hoe het past bij memory
Zie de scheiding als volgt:
Zie de splitsing zo:
| Laag | Is eigenaar van |
| ------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| Active Memory Plugin (`memory-core`, QMD, Honcho, enz.) | Recall, semantisch zoeken, promotie, Dreaming, memory-runtime |
| Active Memory-plugin (`memory-core`, QMD, Honcho, enz.) | Recall, semantisch zoeken, promotie, Dreaming, memory-runtime |
| `memory-wiki` | Gecompileerde wikipagina's, syntheses met rijke herkomst, dashboards, wiki-specifiek zoeken/ophalen/toepassen |
Als de Active Memory Plugin gedeelde recall-artefacten aanbiedt, kan OpenClaw
beide lagen in één keer doorzoeken met `memory_search corpus=all`.
Als de Active Memory-plugin gedeelde recall-artefacten beschikbaar stelt, kan OpenClaw
beide lagen in één doorgang doorzoeken met `memory_search corpus=all`.
Wanneer je wiki-specifieke rangschikking, herkomst of directe paginatoegang nodig hebt, gebruik je
Wanneer je wiki-specifieke ranking, herkomst of directe paginatoegang nodig hebt, gebruik je
in plaats daarvan de wiki-native tools.
## Aanbevolen hybride patroon
Een sterke standaard voor local-first setups is:
- QMD als Active Memory-backend voor recall en brede semantische zoekopdrachten
- `memory-wiki` in `bridge`-modus voor duurzame gesynthetiseerde kennispagina's
- QMD als de Active Memory-backend voor recall en brede semantische zoekopdrachten
- `memory-wiki` in `bridge`-modus voor duurzame, gesynthetiseerde kennispagina's
Die scheiding werkt goed omdat elke laag gefocust blijft:
Die splitsing werkt goed omdat elke laag gefocust blijft:
- QMD houdt ruwe notities, sessie-exports en extra collecties doorzoekbaar
- `memory-wiki` compileert stabiele entiteiten, claims, dashboards en bronpagina's
Praktische regel:
- gebruik `memory_search` wanneer je één brede recall-pass over memory wilt
- gebruik `memory_search` wanneer je één brede recall-doorgang over memory wilt
- gebruik `wiki_search` en `wiki_get` wanneer je wikiresultaten met herkomstbewustzijn wilt
- gebruik `memory_search corpus=all` wanneer je wilt dat gedeeld zoeken beide lagen omvat
- gebruik `memory_search corpus=all` wanneer je gedeeld zoeken over beide lagen wilt laten lopen
Als bridge-modus nul geëxporteerde artefacten meldt, stelt de Active Memory Plugin
momenteel nog geen publieke bridge-inputs beschikbaar. Voer eerst `openclaw wiki doctor` uit
en bevestig daarna dat de Active Memory Plugin publieke artefacten ondersteunt.
Als bridge-modus nul geëxporteerde artefacten meldt, stelt de Active Memory-plugin
momenteel nog geen publieke bridge-invoer beschikbaar. Voer eerst `openclaw wiki doctor` uit,
en bevestig daarna dat de Active Memory-plugin publieke artefacten ondersteunt.
Wanneer bridge-modus actief is en `bridge.readMemoryArtifacts` is ingeschakeld,
lezen `openclaw wiki status`, `openclaw wiki doctor` en `openclaw wiki bridge
import` via de draaiende Gateway. Dat houdt CLI-bridgecontroles afgestemd
op de runtimecontext van de memory-Plugin. Als bridge is uitgeschakeld of artefact-reads
zijn uitgeschakeld, behouden die commando's hun lokale/offline gedrag.
import` via de draaiende Gateway. Dat houdt CLI-bridgecontroles afgestemd op
de runtimecontext van de memory-plugin. Als bridge is uitgeschakeld of artefactlezingen
uitstaan, behouden die opdrachten hun lokale/offline gedrag.
## Vault-modi
@ -90,31 +90,31 @@ Gebruik dit wanneer je wilt dat de wiki zijn eigen gecureerde kennisopslag is.
### `bridge`
Leest publieke memory-artefacten en memory-events van de Active Memory Plugin
via publieke Plugin SDK-seams.
Leest publieke memory-artefacten en memory-events uit de Active Memory-plugin
via publieke plugin-SDK-seams.
Gebruik dit wanneer je wilt dat de wiki de geëxporteerde artefacten van de memory-Plugin
compileert en organiseert zonder private Plugin-internals te benaderen.
Gebruik dit wanneer je wilt dat de wiki de geëxporteerde artefacten van de memory-plugin
compileert en organiseert zonder in private plugin-internals te grijpen.
Bridge-modus kan indexeren:
- geëxporteerde memory-artefacten
- droomrapporten
- Dreaming-rapporten
- dagelijkse notities
- memory-rootbestanden
- memory-eventlogs
### `unsafe-local`
Expliciete same-machine escape hatch voor lokale private paden.
Expliciete escape hatch op dezelfde machine voor lokale private paden.
Deze modus is bewust experimenteel en niet-portabel. Gebruik hem alleen wanneer je
Deze modus is opzettelijk experimenteel en niet-portabel. Gebruik deze alleen wanneer je
de vertrouwensgrens begrijpt en specifiek lokale bestandssysteemtoegang nodig hebt die
bridge-modus niet kan bieden.
## Vault-indeling
De Plugin initialiseert een vault als volgt:
De plugin initialiseert een vault als volgt:
```text
<vault>/
@ -137,12 +137,12 @@ Beheerde inhoud blijft binnen gegenereerde blokken. Menselijke notitieblokken bl
De belangrijkste paginagroepen zijn:
- `sources/` voor geïmporteerd ruw materiaal en bridge-ondersteunde pagina's
- `entities/` voor duurzame dingen, mensen, systemen, projecten en objecten
- `entities/` voor duurzame dingen, personen, systemen, projecten en objecten
- `concepts/` voor ideeën, abstracties, patronen en beleid
- `syntheses/` voor gecompileerde samenvattingen en onderhouden rollups
- `reports/` voor gegenereerde dashboards
## Gestructureerde claims en bewijs
## Gestructureerde claims en evidence
Pagina's kunnen gestructureerde `claims`-frontmatter bevatten, niet alleen vrije tekst.
@ -155,7 +155,7 @@ Elke claim kan bevatten:
- `evidence[]`
- `updatedAt`
Bewijsitems kunnen bevatten:
Evidence-vermeldingen kunnen bevatten:
- `kind`
- `sourceId`
@ -167,29 +167,29 @@ Bewijsitems kunnen bevatten:
- `note`
- `updatedAt`
Dit zorgt ervoor dat de wiki meer werkt als een overtuigingslaag dan als een passieve notitie-
dump. Claims kunnen worden gevolgd, gescoord, betwist en teruggevoerd naar bronnen.
Dit zorgt ervoor dat de wiki meer als een overtuigingslaag werkt dan als een passieve
notitiedump. Claims kunnen worden gevolgd, gescoord, betwist en teruggeleid naar bronnen.
## Entiteitsmetadata voor agents
## Agentgerichte entiteitsmetadata
Entiteitspagina's kunnen ook routeringsmetadata voor agentgebruik bevatten. Dit is generieke
frontmatter, dus het werkt voor mensen, teams, systemen, projecten of elk ander
frontmatter, dus het werkt voor personen, teams, systemen, projecten of elk ander
entiteitstype.
Veelvoorkomende velden zijn:
- `entityType`: bijvoorbeeld `person`, `team`, `system` of `project`
- `canonicalId`: stabiele identiteitssleutel die over aliassen en imports heen wordt gebruikt
- `canonicalId`: stabiele identiteitssleutel die wordt gebruikt voor aliassen en imports
- `aliases`: namen, handles of labels die naar dezelfde pagina moeten verwijzen
- `privacyTier`: `public`, `local-private`, `sensitive` of `confirm-before-use`
- `bestUsedFor` / `notEnoughFor`: compacte routeringshints
- `lastRefreshedAt`: timestamp voor bronverversing, los van paginabewerkingstijd
- `lastRefreshedAt`: tijdstempel voor bronverversing, los van de bewerktijd van de pagina
- `personCard`: optionele persoonspecifieke routeringskaart met handles, socials,
e-mails, tijdzone, lane, vraag-voor, niet-vragen-voor, vertrouwen en privacy
- `relationships`: getypeerde randen naar gerelateerde pagina's met target, soort, gewicht,
vertrouwen, bewijssoort, privacyniveau en notitie
e-mails, tijdzone, lane, ask-for, avoid-asking-for, vertrouwen en privacy
- `relationships`: getypeerde verbindingen naar gerelateerde pagina's met doel, soort, gewicht,
vertrouwen, evidence-soort, privacylaag en notitie
Voor een mensenwiki moet de agent meestal beginnen met
Voor een personenwiki moet de agent meestal beginnen met
`reports/person-agent-directory.md`, en daarna de persoonspagina openen met `wiki_get`
voordat contactgegevens of afgeleide feiten worden gebruikt.
@ -243,22 +243,22 @@ claims:
## Compile-pipeline
De compile-stap leest wikipagina's, normaliseert samenvattingen en maakt stabiele
machinaal gerichte artefacten aan onder:
De compileerstap leest wikipagina's, normaliseert samenvattingen en schrijft stabiele
machinegerichte artefacten onder:
- `.openclaw-wiki/cache/agent-digest.json`
- `.openclaw-wiki/cache/claims.jsonl`
Deze digests bestaan zodat agents en runtimecode geen Markdown-pagina's hoeven te scrapen.
Gecompileerde output ondersteunt ook:
Gecompileerde uitvoer voedt ook:
- eerste-pass wiki-indexering voor zoek-/ophaalflows
- claim-id-lookup terug naar eigenaarspagina's
- eerste-doorgang-wiki-indexering voor zoek-/ophaalflows
- claim-id-lookup terug naar de eigenaarspagina's
- compacte promptaanvullingen
- generatie van rapporten/dashboards
- rapport-/dashboardgeneratie
## Dashboards en gezondheidsrapporten
## Dashboards en statusrapporten
Wanneer `render.createDashboards` is ingeschakeld, onderhoudt compile dashboards onder
`reports/`.
@ -277,16 +277,16 @@ Ingebouwde rapporten zijn onder andere:
Deze rapporten volgen zaken zoals:
- clusters van tegenstrijdigheidsnotities
- clusters met tegenstrijdigheidsnotities
- concurrerende claimclusters
- claims zonder gestructureerd bewijs
- claims zonder gestructureerde evidence
- pagina's en claims met laag vertrouwen
- verouderde of onbekende versheid
- pagina's met onopgeloste vragen
- routeringskaarten voor personen/entiteiten
- gestructureerde relatieranden
- dekking van bewijsklassen
- niet-publieke privacyniveaus die vóór gebruik beoordeling vereisen
- gestructureerde relatieverbindingen
- dekking van evidence-klassen
- niet-publieke privacylagen die vóór gebruik beoordeling nodig hebben
## Zoeken en ophalen
@ -303,38 +303,38 @@ Het ondersteunt ook drie corpora:
Belangrijk gedrag:
- `wiki_search` en `wiki_get` gebruiken waar mogelijk gecompileerde digests als eerste pass
- claim-id's kunnen terugverwijzen naar de eigenaarspagina
- betwiste/verouderde/verse claims beïnvloeden rangschikking
- `wiki_search` en `wiki_get` gebruiken gecompileerde digests waar mogelijk als eerste doorgang
- claim-id's kunnen terug worden herleid naar de eigenaarspagina
- betwiste/verouderde/verse claims beïnvloeden ranking
- herkomstlabels kunnen in resultaten behouden blijven
- zoekmodus kan rangschikking sturen voor personenlookup, vraagroutering, bron-
bewijs of ruwe claims
- zoekmodus kan ranking sturen voor personenlookup, vraagroutering, bron-evidence
of ruwe claims
Praktische regel:
- gebruik `memory_search corpus=all` voor één brede recall-pass
- gebruik `wiki_search` + `wiki_get` wanneer wiki-specifieke rangschikking,
herkomst of overtuigingsstructuur op paginaniveau belangrijk is
- gebruik `memory_search corpus=all` voor één brede recall-doorgang
- gebruik `wiki_search` + `wiki_get` wanneer wiki-specifieke ranking,
herkomst of geloofsstructuur op paginaniveau belangrijk is
Zoekmodi:
- `auto`: gebalanceerde standaard
- `find-person`: boost persoonsachtige entiteiten, aliassen, handles, socials en
canonical ID's
- `route-question`: boost agentkaarten, vraag-voor-hints, best-gebruikt-voor-hints en
- `find-person`: versterk persoonsachtige entiteiten, aliassen, handles, socials en
canonieke ID's
- `route-question`: versterk agentkaarten, ask-for-hints, best-used-for-hints en
relatiecontext
- `source-evidence`: boost bronpagina's en gestructureerde bewijsmetadata
- `raw-claim`: boost overeenkomende gestructureerde claims en retourneer claim-/bewijs-
- `source-evidence`: versterk bronpagina's en gestructureerde evidence-metadata
- `raw-claim`: versterk overeenkomende gestructureerde claims en retourneer claim-/evidence-
metadata in resultaten
Wanneer een resultaat overeenkomt met een gestructureerde claim, kan `wiki_search`
`matchedClaimId`, `matchedClaimStatus`, `matchedClaimConfidence`,
`evidenceKinds` en `evidenceSourceIds` retourneren in de details-payload. Tekstoutput
`evidenceKinds` en `evidenceSourceIds` retourneren in zijn details-payload. Tekstuitvoer
bevat ook compacte `Claim:`- en `Evidence:`-regels wanneer beschikbaar.
## Agenttools
De Plugin registreert deze tools:
De plugin registreert deze tools:
- `wiki_status`
- `wiki_search`
@ -346,22 +346,22 @@ Wat ze doen:
- `wiki_status`: huidige vault-modus, gezondheid, beschikbaarheid van Obsidian CLI
- `wiki_search`: doorzoek wikipagina's en, wanneer geconfigureerd, gedeelde memory-corpora;
accepteert `mode` voor personenlookup, vraagroutering, bronbewijs of ruwe
claimdrilldown
- `wiki_get`: lees een wikipagina op id/pad of val terug op gedeelde memory-corpus
- `wiki_apply`: smalle synthese-/metadatamutaties zonder vrije paginachirurgie
accepteert `mode` voor personenlookup, vraagroutering, bron-evidence of ruwe
claim-drilldown
- `wiki_get`: lees een wikipagina op id/pad of val terug op gedeeld memory-corpus
- `wiki_apply`: beperkte synthese-/metadatamutaties zonder vrije pagina-ingrepen
- `wiki_lint`: structurele controles, herkomstgaten, tegenstrijdigheden, open vragen
De Plugin registreert ook een niet-exclusieve memory-corpusaanvulling, zodat gedeelde
`memory_search` en `memory_get` de wiki kunnen bereiken wanneer de Active Memory
Plugin corpusselectie ondersteunt.
De plugin registreert ook een niet-exclusieve memory-corpusaanvulling, zodat gedeelde
`memory_search` en `memory_get` de wiki kunnen bereiken wanneer de Active Memory-plugin
corpusselectie ondersteunt.
## Prompt- en contextgedrag
Wanneer `context.includeCompiledDigestPrompt` is ingeschakeld, voegen memory-promptsecties
een compacte gecompileerde snapshot uit `agent-digest.json` toe.
Die snapshot is bewust klein en bevat veel signaal:
Die snapshot is bewust klein en signaalrijk:
- alleen toppagina's
- alleen topclaims
@ -369,12 +369,12 @@ Die snapshot is bewust klein en bevat veel signaal:
- aantal vragen
- kwalificaties voor vertrouwen/versheid
Dit is opt-in omdat het de promptvorm wijzigt en vooral nuttig is voor context-
Dit is opt-in omdat het de promptvorm verandert en vooral nuttig is voor context-
engines of legacy promptassemblage die expliciet memory-aanvullingen consumeren.
## Configuratie
Plaats config onder `plugins.entries.memory-wiki.config`:
Plaats configuratie onder `plugins.entries.memory-wiki.config`:
```json5
{
@ -430,23 +430,26 @@ Belangrijke schakelaars:
- `vaultMode`: `isolated`, `bridge`, `unsafe-local`
- `vault.renderMode`: `native` of `obsidian`
- `bridge.readMemoryArtifacts`: openbare artefacten van de Active Memory-Plugin importeren
- `bridge.followMemoryEvents`: gebeurtenislogs opnemen in bridge-modus
- `bridge.readMemoryArtifacts`: importeer openbare artefacten van de active memory-Plugin
- `bridge.followMemoryEvents`: neem eventlogs op in bridge-modus
- `search.backend`: `shared` of `local`
- `search.corpus`: `wiki`, `memory` of `all`
- `context.includeCompiledDigestPrompt`: compacte digest-snapshot toevoegen aan geheugenpromptsecties
- `render.createBacklinks`: deterministische gerelateerde blokken genereren
- `render.createDashboards`: dashboardpagina's genereren
- `context.includeCompiledDigestPrompt`: voeg compacte digest-snapshot toe aan geheugensecties van de prompt
- `render.createBacklinks`: genereer deterministische gerelateerde blokken
- `render.createDashboards`: genereer dashboardpagina's
### Voorbeeld: QMD + bridge-modus
Gebruik dit wanneer u QMD wilt gebruiken voor recall en `memory-wiki` voor een onderhouden
Gebruik dit wanneer je QMD wilt voor recall en `memory-wiki` voor een onderhouden
kennislaag:
```json5
{
memory: {
backend: "qmd",
},
plugins: {
entries: {
"memory-wiki": {
enabled: true,
config: {
@ -475,13 +478,13 @@ kennislaag:
Dit houdt:
- QMD verantwoordelijk voor Active Memory-recall
- QMD verantwoordelijk voor active memory-recall
- `memory-wiki` gericht op gecompileerde pagina's en dashboards
- promptvorm ongewijzigd totdat u opzettelijk gecompileerde digest-prompts inschakelt
- promptvorm ongewijzigd totdat je gecompileerde digest-prompts bewust inschakelt
## CLI
`memory-wiki` biedt ook een CLI-oppervlak op hoofdniveau:
`memory-wiki` biedt ook een CLI-oppervlak op topniveau:
```bash
openclaw wiki status
@ -497,36 +500,36 @@ openclaw wiki bridge import
openclaw wiki obsidian status
```
Zie [CLI: wiki](/nl/cli/wiki) voor de volledige opdrachtreferentie.
Zie [CLI: wiki](/nl/cli/wiki) voor de volledige commandoreferentie.
## Obsidian-ondersteuning
Wanneer `vault.renderMode` `obsidian` is, schrijft de Plugin Obsidian-vriendelijke
Markdown en kan deze optioneel de officiële `obsidian` CLI gebruiken.
Markdown en kan optioneel de officiële `obsidian` CLI gebruiken.
Ondersteunde workflows omvatten:
Ondersteunde workflows zijn onder andere:
- statuscontrole
- vault-zoekopdracht
- zoeken in de vault
- een pagina openen
- een Obsidian-opdracht aanroepen
- een Obsidian-commando aanroepen
- naar de dagelijkse notitie springen
Dit is optioneel. De wiki werkt nog steeds in native modus zonder Obsidian.
## Aanbevolen workflow
1. Behoud uw Active Memory-Plugin voor recall/promotie/dreaming.
1. Behoud je active memory-Plugin voor recall/promotie/dreaming.
2. Schakel `memory-wiki` in.
3. Begin met de modus `isolated`, tenzij u expliciet bridge-modus wilt.
4. Gebruik `wiki_search` / `wiki_get` wanneer herkomst ertoe doet.
3. Begin met de modus `isolated`, tenzij je expliciet bridge-modus wilt.
4. Gebruik `wiki_search` / `wiki_get` wanneer herkomst belangrijk is.
5. Gebruik `wiki_apply` voor gerichte syntheses of metadata-updates.
6. Voer `wiki_lint` uit na betekenisvolle wijzigingen.
7. Schakel dashboards in als u zichtbaarheid op verouderde gegevens/tegenstrijdigheden wilt.
7. Schakel dashboards in als je zichtbaarheid op verouderde informatie/tegenstrijdigheden wilt.
## Gerelateerde documentatie
## Gerelateerde docs
- [Geheugenoverzicht](/nl/concepts/memory)
- [Memory-overzicht](/nl/concepts/memory)
- [CLI: memory](/nl/cli/memory)
- [CLI: wiki](/nl/cli/wiki)
- [Overzicht van Plugin SDK](/nl/plugins/sdk-overview)
- [Plugin SDK-overzicht](/nl/plugins/sdk-overview)

View File

@ -1,22 +1,22 @@
---
read_when:
- Je wilt vanuit OpenClaw een uitgaand spraakgesprek starten
- Je configureert of ontwikkelt de voice-call-plugin
- Je hebt realtime spraak of streamingtranscriptie via telefonie nodig
- Je wilt een uitgaand spraakgesprek starten vanuit OpenClaw
- Je configureert of ontwikkelt de spraakoproep-Plugin
- Je hebt realtime spraak of streamingtranscriptie voor telefonie nodig
sidebarTitle: Voice call
summary: Voer uitgaande spraakoproepen en neem inkomende spraakoproepen aan via Twilio, Telnyx of Plivo, met optionele realtime spraak en streamingtranscriptie
summary: Voer uitgaande spraakoproepen en neem inkomende spraakoproepen aan via Twilio, Telnyx of Plivo, met optionele realtime spraak en streaming transcriptie
title: Plugin voor spraakoproepen
x-i18n:
generated_at: "2026-05-02T22:22:03Z"
generated_at: "2026-05-04T07:07:37Z"
model: gpt-5.5
provider: openai
source_hash: 18a9a0d7095ec92036b516cc26c69219a0a2fd9bb8e0cb2e7509123bb4f3f65a
source_hash: 8ec2c22dcc9073572963744685a432328787bcedb14025e0326c20d9d842f857
source_path: plugins/voice-call.md
workflow: 16
---
Spraakoproepen voor OpenClaw via een Plugin. Ondersteunt uitgaande meldingen,
gesprekken over meerdere beurten, realtime full-duplex-spraak, streaming
Spraakoproepen voor OpenClaw via een plugin. Ondersteunt uitgaande meldingen,
gesprekken met meerdere beurten, full-duplex realtime spraak, streaming
transcriptie en inkomende oproepen met allowlist-beleid.
**Huidige providers:** `twilio` (Programmable Voice + Media Streams),
@ -24,22 +24,22 @@ transcriptie en inkomende oproepen met allowlist-beleid.
speech), `mock` (dev/geen netwerk).
<Note>
De Voice Call-Plugin draait **binnen het Gateway-proces**. Als je een
externe Gateway gebruikt, installeer en configureer je de Plugin op de machine waarop
de Gateway draait en herstart je daarna de Gateway om deze te laden.
De Voice Call-plugin draait **binnen het Gateway-proces**. Als je een
externe Gateway gebruikt, installeer en configureer je de plugin op de machine waarop
de Gateway draait en herstart je daarna de Gateway om de plugin te laden.
</Note>
## Snel starten
## Snelstart
<Steps>
<Step title="Install the plugin">
<Step title="Installeer de plugin">
<Tabs>
<Tab title="From npm">
<Tab title="Vanaf npm">
```bash
openclaw plugins install @openclaw/voice-call
```
</Tab>
<Tab title="From a local folder (dev)">
<Tab title="Vanuit een lokale map (dev)">
```bash
PLUGIN_SRC=./path/to/local/voice-call-plugin
openclaw plugins install "$PLUGIN_SRC"
@ -48,36 +48,36 @@ de Gateway draait en herstart je daarna de Gateway om deze te laden.
</Tab>
</Tabs>
Gebruik het kale pakket om de huidige officiële release-tag te volgen. Pin een
Gebruik het kale package om de huidige officiële release-tag te volgen. Pin een
exacte versie alleen wanneer je een reproduceerbare installatie nodig hebt.
Herstart daarna de Gateway zodat de Plugin wordt geladen.
Herstart daarna de Gateway zodat de plugin wordt geladen.
</Step>
<Step title="Configure provider and webhook">
Stel de configuratie in onder `plugins.entries.voice-call.config` (zie
[Configuratie](#configuration) hieronder voor de volledige structuur). Minimaal:
<Step title="Configureer provider en webhook">
Stel configuratie in onder `plugins.entries.voice-call.config` (zie
[Configuratie](#configuration) hieronder voor de volledige vorm). Minimaal:
`provider`, providerreferenties, `fromNumber` en een publiek
bereikbare Webhook-URL.
bereikbare webhook-URL.
</Step>
<Step title="Verify setup">
<Step title="Controleer de setup">
```bash
openclaw voicecall setup
```
De standaarduitvoer is leesbaar in chatlogs en terminals. Deze controleert
of de Plugin is ingeschakeld, providerreferenties, Webhook-blootstelling en of
of de plugin is ingeschakeld, providerreferenties, webhook-blootstelling en dat
slechts één audiomodus (`streaming` of `realtime`) actief is. Gebruik
`--json` voor scripts.
</Step>
<Step title="Smoke test">
<Step title="Smoke-test">
```bash
openclaw voicecall smoke
openclaw voicecall smoke --to "+15555550123"
```
Beide zijn standaard dry-runs. Voeg `--yes` toe om daadwerkelijk een korte
Beide zijn standaard dry runs. Voeg `--yes` toe om daadwerkelijk een korte
uitgaande meldingsoproep te plaatsen:
```bash
@ -88,18 +88,18 @@ de Gateway draait en herstart je daarna de Gateway om deze te laden.
</Steps>
<Warning>
Voor Twilio, Telnyx en Plivo moet setup uitkomen op een **publieke Webhook-URL**.
Voor Twilio, Telnyx en Plivo moet de setup uitkomen op een **publieke webhook-URL**.
Als `publicUrl`, de tunnel-URL, de Tailscale-URL of de serve-fallback
uitkomt op loopback- of privénetwerkruimte, mislukt setup in plaats van
uitkomt op loopback- of privénetwerkruimte, faalt de setup in plaats van
een provider te starten die geen carrier-webhooks kan ontvangen.
</Warning>
## Configuratie
Als `enabled: true` is maar de geselecteerde provider referenties mist,
logt het starten van de Gateway een waarschuwing dat de setup onvolledig is met de ontbrekende sleutels en
wordt het starten van de runtime overgeslagen. Commando's, RPC-calls en agenttools
geven nog steeds exact de ontbrekende providerconfiguratie terug wanneer ze worden gebruikt.
Als `enabled: true` is ingesteld maar de geselecteerde provider referenties mist,
logt de Gateway bij het opstarten een waarschuwing dat de setup onvolledig is met de ontbrekende sleutels en
slaat het starten van de runtime over. Commando's, RPC-aanroepen en agenttools
geven nog steeds de exacte ontbrekende providerconfiguratie terug wanneer ze worden gebruikt.
<Note>
Voice-call-referenties accepteren SecretRefs. `plugins.entries.voice-call.config.twilio.authToken`, `plugins.entries.voice-call.config.realtime.providers.*.apiKey`, `plugins.entries.voice-call.config.streaming.providers.*.apiKey` en `plugins.entries.voice-call.config.tts.providers.*.apiKey` worden opgelost via het standaard SecretRef-oppervlak; zie [SecretRef-referentieoppervlak](/nl/reference/secretref-credential-surface).
@ -175,27 +175,27 @@ Voice-call-referenties accepteren SecretRefs. `plugins.entries.voice-call.config
```
<AccordionGroup>
<Accordion title="Provider exposure and security notes">
- Twilio, Telnyx en Plivo vereisen allemaal een **publiek bereikbare** Webhook-URL.
- `mock` is een lokale dev-provider (geen netwerkoproepen).
<Accordion title="Providerblootstelling en beveiligingsnotities">
- Twilio, Telnyx en Plivo vereisen allemaal een **publiek bereikbare** webhook-URL.
- `mock` is een lokale dev-provider (geen netwerkaanroepen).
- Telnyx vereist `telnyx.publicKey` (of `TELNYX_PUBLIC_KEY`), tenzij `skipSignatureVerification` true is.
- `skipSignatureVerification` is alleen voor lokaal testen.
- Stel op de gratis ngrok-laag `publicUrl` in op de exacte ngrok-URL; handtekeningverificatie wordt altijd afgedwongen.
- `tunnel.allowNgrokFreeTierLoopbackBypass: true` staat Twilio-webhooks met ongeldige handtekeningen **alleen** toe wanneer `tunnel.provider="ngrok"` en `serve.bind` loopback is (lokale ngrok-agent). Alleen lokale dev.
- Gratis ngrok-URL's kunnen wijzigen of interstitial-gedrag toevoegen; als `publicUrl` afwijkt, mislukken Twilio-handtekeningen. Productie: geef de voorkeur aan een stabiel domein of een Tailscale-funnel.
- Gratis ngrok-URL's kunnen veranderen of tussenschermgedrag toevoegen; als `publicUrl` afwijkt, mislukken Twilio-handtekeningen. Productie: geef de voorkeur aan een stabiel domein of een Tailscale-funnel.
</Accordion>
<Accordion title="Streaming connection caps">
<Accordion title="Limieten voor streamingverbindingen">
- `streaming.preStartTimeoutMs` sluit sockets die nooit een geldig `start`-frame verzenden.
- `streaming.maxPendingConnections` beperkt het totale aantal ongeauthenticeerde pre-start-sockets.
- `streaming.maxPendingConnectionsPerIp` beperkt ongeauthenticeerde pre-start-sockets per bron-IP.
- `streaming.maxPendingConnections` beperkt het totale aantal niet-geauthenticeerde pre-start-sockets.
- `streaming.maxPendingConnectionsPerIp` beperkt niet-geauthenticeerde pre-start-sockets per bron-IP.
- `streaming.maxConnections` beperkt het totale aantal open mediastream-sockets (pending + actief).
</Accordion>
<Accordion title="Legacy config migrations">
<Accordion title="Migraties van legacy-configuratie">
Oudere configuraties die `provider: "log"`, `twilio.from` of legacy
`streaming.*` OpenAI-sleutels gebruiken, worden herschreven door `openclaw doctor --fix`.
Runtime-fallback accepteert de oude voice-call-sleutels voorlopig nog, maar
Runtime-fallback accepteert de oude voice-call-sleutels voorlopig nog steeds, maar
het herschrijfpad is `openclaw doctor --fix` en de compat-shim is
tijdelijk.
@ -213,9 +213,9 @@ Voice-call-referenties accepteren SecretRefs. `plugins.entries.voice-call.config
## Sessiebereik
Standaard gebruikt Voice Call `sessionScope: "per-phone"`, zodat herhaalde oproepen van
dezelfde beller het gespreksgeheugen behouden. Stel `sessionScope: "per-call"` in wanneer
elke carrier-oproep met nieuwe context moet beginnen, bijvoorbeeld voor receptie,
boekingen, IVR of Google Meet-bridgeflows waarbij hetzelfde telefoonnummer
dezelfde beller gespreksgeheugen behouden. Stel `sessionScope: "per-call"` in wanneer
elke carrier-oproep met nieuwe context moet beginnen, bijvoorbeeld receptie-,
boekings-, IVR- of Google Meet-bridgeflows waarbij hetzelfde telefoonnummer
verschillende vergaderingen kan vertegenwoordigen.
## Realtime spraakgesprekken
@ -232,23 +232,23 @@ audiomodus per oproep.
Huidig runtimegedrag:
- `realtime.enabled` wordt ondersteund voor Twilio Media Streams.
- `realtime.provider` is optioneel. Als dit niet is ingesteld, gebruikt Voice Call de eerste geregistreerde realtime spraakprovider.
- Gebundelde realtime spraakproviders: Google Gemini Live (`google`) en OpenAI (`openai`), geregistreerd door hun provider-Plugins.
- Provider-eigen raw-configuratie staat onder `realtime.providers.<providerId>`.
- Voice Call stelt standaard de gedeelde realtime tool `openclaw_agent_consult` beschikbaar. Het realtime model kan deze aanroepen wanneer de beller vraagt om diepere redenering, actuele informatie of normale OpenClaw-tools.
- `realtime.fastContext.enabled` staat standaard uit. Wanneer ingeschakeld, zoekt Voice Call eerst in geïndexeerd geheugen/sessiecontext naar de consultvraag en geeft die fragmenten binnen `realtime.fastContext.timeoutMs` terug aan het realtime model, voordat alleen wordt teruggevallen op de volledige consultagent als `realtime.fastContext.fallbackToConsult` true is.
- Als `realtime.provider` naar een niet-geregistreerde provider verwijst, of als er helemaal geen realtime spraakprovider is geregistreerd, logt Voice Call een waarschuwing en slaat realtime media over in plaats van de hele Plugin te laten falen.
- Consultsessiesleutels hergebruiken de opgeslagen oproepsessie wanneer die beschikbaar is, en vallen daarna terug op de geconfigureerde `sessionScope` (standaard `per-phone`, of `per-call` voor geïsoleerde oproepen).
- `realtime.provider` is optioneel. Als deze niet is ingesteld, gebruikt Voice Call de eerste geregistreerde realtime spraakprovider.
- Gebundelde realtime spraakproviders: Google Gemini Live (`google`) en OpenAI (`openai`), geregistreerd door hun providerplugins.
- Providerbeheerde raw-configuratie staat onder `realtime.providers.<providerId>`.
- Voice Call stelt standaard de gedeelde realtime tool `openclaw_agent_consult` beschikbaar. Het realtime model kan deze aanroepen wanneer de beller om dieper redeneren, actuele informatie of normale OpenClaw-tools vraagt.
- `realtime.fastContext.enabled` staat standaard uit. Wanneer ingeschakeld, zoekt Voice Call eerst in geïndexeerd geheugen/sessiecontext naar de consultvraag en retourneert die snippets aan het realtime model binnen `realtime.fastContext.timeoutMs` voordat wordt teruggevallen op de volledige consultagent, maar alleen als `realtime.fastContext.fallbackToConsult` true is.
- Als `realtime.provider` naar een niet-geregistreerde provider wijst, of als er helemaal geen realtime spraakprovider is geregistreerd, logt Voice Call een waarschuwing en slaat realtime media over in plaats van de hele plugin te laten falen.
- Consultsessiesleutels hergebruiken de opgeslagen oproepsessie wanneer beschikbaar en vallen daarna terug op de geconfigureerde `sessionScope` (`per-phone` standaard, of `per-call` voor geïsoleerde oproepen).
### Toolbeleid
`realtime.toolPolicy` beheert de consult-run:
| Beleid | Gedrag |
| Beleid | Gedrag |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `safe-read-only` | Stel de consulttool beschikbaar en beperk de reguliere agent tot `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` en `memory_get`. |
| `owner` | Stel de consulttool beschikbaar en laat de reguliere agent het normale agenttoolbeleid gebruiken. |
| `none` | Stel de consulttool niet beschikbaar. Aangepaste `realtime.tools` worden nog steeds doorgegeven aan de realtime provider. |
| `owner` | Stel de consulttool beschikbaar en laat de reguliere agent het normale agenttoolbeleid gebruiken. |
| `none` | Stel de consulttool niet beschikbaar. Aangepaste `realtime.tools` worden nog steeds doorgegeven aan de realtime provider. |
### Voorbeelden van realtime providers
@ -257,6 +257,9 @@ Huidig runtimegedrag:
Standaarden: API-sleutel uit `realtime.providers.google.apiKey`,
`GEMINI_API_KEY` of `GOOGLE_GENERATIVE_AI_API_KEY`; model
`gemini-2.5-flash-native-audio-preview-12-2025`; stem `Kore`.
`sessionResumption` en `contextWindowCompression` staan standaard aan voor langere,
opnieuw verbindbare oproepen. Gebruik `silenceDurationMs`, `startSensitivity` en
`endSensitivity` om snellere beurtwisseling op telefonie-audio af te stemmen.
```json5
{
@ -277,6 +280,8 @@ Huidig runtimegedrag:
apiKey: "${GEMINI_API_KEY}",
model: "gemini-2.5-flash-native-audio-preview-12-2025",
voice: "Kore",
silenceDurationMs: 500,
startSensitivity: "high",
},
},
},
@ -314,23 +319,23 @@ Huidig runtimegedrag:
Zie [Google-provider](/nl/providers/google) en
[OpenAI-provider](/nl/providers/openai) voor providerspecifieke realtime spraakopties.
## Streaming transcriptie
## Streamingtranscriptie
`streaming` selecteert een realtime transcriptieprovider voor live oproepaudio.
`streaming` selecteert een realtime transcriptieprovider voor live gespreksaudio.
Huidig runtimegedrag:
- `streaming.provider` is optioneel. Als dit niet is ingesteld, gebruikt Voice Call de eerste geregistreerde realtime-transcriptieprovider.
- Gebundelde realtime-transcriptieproviders: Deepgram (`deepgram`), ElevenLabs (`elevenlabs`), Mistral (`mistral`), OpenAI (`openai`) en xAI (`xai`), geregistreerd door hun providerplugins.
- Raw configuratie die eigendom is van de provider staat onder `streaming.providers.<providerId>`.
- Nadat Twilio een geaccepteerd stream-`start`-bericht verzendt, registreert Voice Call de stream onmiddellijk, zet inkomende media in de wachtrij via de transcriptieprovider terwijl de provider verbinding maakt, en start de eerste begroeting pas nadat realtime transcriptie gereed is.
- Als `streaming.provider` naar een niet-geregistreerde provider verwijst, of als er geen provider is geregistreerd, logt Voice Call een waarschuwing en slaat mediastreaming over in plaats van de hele Plugin te laten mislukken.
- `streaming.provider` is optioneel. Als dit niet is ingesteld, gebruikt Voice Call de eerste geregistreerde realtime transcriptieprovider.
- Meegeleverde realtime transcriptieproviders: Deepgram (`deepgram`), ElevenLabs (`elevenlabs`), Mistral (`mistral`), OpenAI (`openai`) en xAI (`xai`), geregistreerd door hun providerplugins.
- Ruwe configuratie die eigendom is van de provider staat onder `streaming.providers.<providerId>`.
- Nadat Twilio een geaccepteerd stream-`start`-bericht heeft verzonden, registreert Voice Call de stream onmiddellijk, zet inkomende media in de wachtrij via de transcriptieprovider terwijl de provider verbinding maakt, en start de eerste begroeting pas nadat realtime transcriptie gereed is.
- Als `streaming.provider` verwijst naar een niet-geregistreerde provider, of als er geen provider is geregistreerd, logt Voice Call een waarschuwing en slaat het mediastreaming over in plaats van de hele plugin te laten mislukken.
### Voorbeelden van streamingproviders
<Tabs>
<Tab title="OpenAI">
Standaarden: API-sleutel `streaming.providers.openai.apiKey` of
Standaardwaarden: API-sleutel `streaming.providers.openai.apiKey` of
`OPENAI_API_KEY`; model `gpt-4o-transcribe`; `silenceDurationMs: 800`;
`vadThreshold: 0.5`.
@ -362,7 +367,7 @@ Huidig runtimegedrag:
</Tab>
<Tab title="xAI">
Standaarden: API-sleutel `streaming.providers.xai.apiKey` of `XAI_API_KEY`;
Standaardwaarden: API-sleutel `streaming.providers.xai.apiKey` of `XAI_API_KEY`;
endpoint `wss://api.x.ai/v1/stt`; codering `mulaw`; samplefrequentie `8000`;
`endpointingMs: 800`; `interimResults: true`.
@ -394,10 +399,10 @@ Huidig runtimegedrag:
</Tab>
</Tabs>
## TTS voor oproepen
## TTS voor gesprekken
Voice Call gebruikt de kernconfiguratie `messages.tts` voor streaming
spraak tijdens oproepen. Je kunt deze overschrijven in de Plugin-configuratie met
spraak tijdens gesprekken. Je kunt deze overschrijven onder de pluginconfiguratie met
**dezelfde vorm** — deze wordt diep samengevoegd met `messages.tts`.
```json5
@ -415,22 +420,22 @@ spraak tijdens oproepen. Je kunt deze overschrijven in de Plugin-configuratie me
```
<Warning>
**Microsoft-spraak wordt genegeerd voor spraakoproepen.** Telefonie-audio heeft PCM nodig;
het huidige Microsoft-transport stelt geen telefonie-PCM-uitvoer beschikbaar.
**Microsoft-spraak wordt genegeerd voor spraakgesprekken.** Telefonieaudio vereist PCM;
het huidige Microsoft-transport biedt geen telefonie-PCM-uitvoer.
</Warning>
Gedragsnotities:
- Verouderde `tts.<provider>`-sleutels binnen de Plugin-configuratie (`openai`, `elevenlabs`, `microsoft`, `edge`) worden gerepareerd door `openclaw doctor --fix`; vastgelegde configuratie moet `tts.providers.<provider>` gebruiken.
- Core TTS wordt gebruikt wanneer Twilio-mediastreaming is ingeschakeld; anders vallen oproepen terug op providereigen stemmen.
- Als er al een Twilio-mediastream actief is, valt Voice Call niet terug op TwiML `<Say>`. Als telefonie-TTS in die status niet beschikbaar is, mislukt de afspeelaanvraag in plaats van twee afspeelpaden te mengen.
- Verouderde `tts.<provider>`-sleutels binnen pluginconfiguratie (`openai`, `elevenlabs`, `microsoft`, `edge`) worden gerepareerd door `openclaw doctor --fix`; vastgelegde configuratie moet `tts.providers.<provider>` gebruiken.
- Kern-TTS wordt gebruikt wanneer Twilio-mediastreaming is ingeschakeld; anders vallen gesprekken terug op providernatieve stemmen.
- Als er al een Twilio-mediastream actief is, valt Voice Call niet terug op TwiML `<Say>`. Als telefonie-TTS in die toestand niet beschikbaar is, mislukt het afspeelverzoek in plaats van twee afspeelpaden te mengen.
- Wanneer telefonie-TTS terugvalt op een secundaire provider, logt Voice Call een waarschuwing met de providerketen (`from`, `to`, `attempts`) voor foutopsporing.
- Wanneer Twilio barge-in of het afbreken van een stream de wachtende TTS-wachtrij leegt, worden afspeelaanvragen in de wachtrij afgehandeld in plaats van dat bellers blijven hangen in afwachting van voltooiing van het afspelen.
- Wanneer Twilio barge-in of streamafbraak de wachtende TTS-wachtrij wist, worden in de wachtrij geplaatste afspeelverzoeken afgehandeld in plaats van bellers te laten wachten op voltooiing van het afspelen.
### TTS-voorbeelden
<Tabs>
<Tab title="Core TTS only">
<Tab title="Alleen kern-TTS">
```json5
{
messages: {
@ -444,7 +449,7 @@ Gedragsnotities:
}
```
</Tab>
<Tab title="Override to ElevenLabs (calls only)">
<Tab title="Overschrijven naar ElevenLabs (alleen gesprekken)">
```json5
{
plugins: {
@ -468,7 +473,7 @@ Gedragsnotities:
}
```
</Tab>
<Tab title="OpenAI model override (deep-merge)">
<Tab title="OpenAI-model overschrijven (diep samenvoegen)">
```json5
{
plugins: {
@ -492,9 +497,9 @@ Gedragsnotities:
</Tab>
</Tabs>
## Inkomende oproepen
## Inkomende gesprekken
Inkomend beleid staat standaard op `disabled`. Stel het volgende in om inkomende oproepen in te schakelen:
Inkomend beleid is standaard `disabled`. Stel het volgende in om inkomende gesprekken in te schakelen:
```json5
{
@ -505,31 +510,30 @@ Inkomend beleid staat standaard op `disabled`. Stel het volgende in om inkomende
```
<Warning>
`inboundPolicy: "allowlist"` is een caller-ID-filter met lage betrouwbaarheid. De
Plugin normaliseert de door de provider geleverde `From`-waarde en vergelijkt deze met
`allowFrom`. Webhook-verificatie verifieert providerlevering en
payloadintegriteit, maar bewijst **niet** het eigendom van het PSTN/VoIP-bellernummer.
Behandel `allowFrom` als caller-ID-filtering, niet als sterke
belleridentiteit.
`inboundPolicy: "allowlist"` is een caller-ID-controle met lage zekerheid. De
plugin normaliseert de door de provider geleverde `From`-waarde en vergelijkt deze met
`allowFrom`. Webhookverificatie authenticeert providerlevering en
payloadintegriteit, maar bewijst **niet** het eigendom van PSTN/VoIP-bellernummers.
Behandel `allowFrom` als caller-ID-filtering, niet als sterke belleridentiteit.
</Warning>
Automatische antwoorden gebruiken het agentsysteem. Stem af met `responseModel`,
Automatische antwoorden gebruiken het agentsysteem. Stem dit af met `responseModel`,
`responseSystemPrompt` en `responseTimeoutMs`.
### Routering per nummer
### Routing per nummer
Gebruik `numbers` wanneer één Voice Call-Plugin oproepen ontvangt voor meerdere telefoon
nummers en elk nummer zich als een andere lijn moet gedragen. Eén
Gebruik `numbers` wanneer één Voice Call-plugin gesprekken voor meerdere telefoonnummers
ontvangt en elk nummer zich als een andere lijn moet gedragen. Eén
nummer kan bijvoorbeeld een informele persoonlijke assistent gebruiken, terwijl een ander een zakelijke
persona, een andere antwoordagent en een andere TTS-stem gebruikt.
Routes worden geselecteerd op basis van het door de provider geleverde gekozen `To`-nummer. Sleutels moeten
E.164-nummers zijn. Wanneer een oproep binnenkomt, bepaalt Voice Call de overeenkomende route één keer,
slaat de overeenkomende route op in het oproeprecord, en hergebruikt die effectieve configuratie
voor de begroeting, het klassieke pad voor automatische antwoorden, het realtime consultpad en TTS-
afspelen. Als er geen route overeenkomt, wordt de globale Voice Call-configuratie gebruikt.
Uitgaande oproepen gebruiken `numbers` niet; geef het uitgaande doel, bericht en
de sessie expliciet door bij het starten van de oproep.
Routes worden geselecteerd op basis van het door de provider geleverde gebelde `To`-nummer. Sleutels moeten
E.164-nummers zijn. Wanneer een gesprek binnenkomt, lost Voice Call de overeenkomende route één keer op,
slaat de gematchte route op in de gespreksrecord, en hergebruikt die effectieve configuratie
voor de begroeting, het klassieke automatische-antwoordpad, het realtime consultpad en TTS-
afspelen. Als geen route overeenkomt, wordt de globale Voice Call-configuratie gebruikt.
Uitgaande gesprekken gebruiken `numbers` niet; geef het uitgaande doel, bericht en
de sessie expliciet door bij het starten van het gesprek.
Route-overschrijvingen ondersteunen momenteel:
@ -540,7 +544,7 @@ Route-overschrijvingen ondersteunen momenteel:
- `responseSystemPrompt`
- `responseTimeoutMs`
De routewaarde `tts` wordt diep samengevoegd over de globale Voice Call-`tts`-configuratie, zodat
De `tts`-routewaarde wordt diep samengevoegd over de globale Voice Call-`tts`-configuratie, zodat
je meestal alleen de providerstem hoeft te overschrijven:
```json5
@ -579,41 +583,41 @@ de systeemprompt:
Voice Call extraheert spraaktekst defensief:
- Negeert payloads die zijn gemarkeerd als redeneer-/foutinhoud.
- Parset directe JSON, omheinde JSON of inline `"spoken"`-sleutels.
- Valt terug op platte tekst en verwijdert waarschijnlijke inleidende plannings-/metaparagrafen.
- Parseert directe JSON, JSON binnen fences of inline `"spoken"`-sleutels.
- Valt terug op platte tekst en verwijdert waarschijnlijke plannings-/meta-inleidende alinea's.
Dit houdt gesproken afspelen gericht op tekst voor de beller en voorkomt
dat planningstekst in audio terechtkomt.
dat planningstekst in audio lekt.
### Opstartgedrag van gesprekken
Voor uitgaande `conversation`-oproepen is afhandeling van het eerste bericht gekoppeld aan de live
Voor uitgaande `conversation`-gesprekken is afhandeling van het eerste bericht gekoppeld aan de live
afspeelstatus:
- Het legen van de barge-in-wachtrij en automatisch antwoorden worden alleen onderdrukt zolang de eerste begroeting actief wordt uitgesproken.
- Als het eerste afspelen mislukt, keert de oproep terug naar `listening` en blijft het eerste bericht in de wachtrij voor een nieuwe poging.
- Barge-in-wachtrij wissen en automatisch antwoord worden alleen onderdrukt terwijl de eerste begroeting actief wordt uitgesproken.
- Als het eerste afspelen mislukt, keert het gesprek terug naar `listening` en blijft het eerste bericht in de wachtrij voor een nieuwe poging.
- Eerste afspelen voor Twilio-streaming start bij streamverbinding zonder extra vertraging.
- Barge-in breekt actief afspelen af en leegt Twilio TTS-items die in de wachtrij staan maar nog niet worden afgespeeld. Geleegde items worden als overgeslagen afgehandeld, zodat vervolglogica voor antwoorden kan doorgaan zonder te wachten op audio die nooit zal worden afgespeeld.
- Realtime spraakgesprekken gebruiken de eigen openingsturn van de realtime stream. Voice Call plaatst **geen** verouderde `<Say>` TwiML-update voor dat eerste bericht, zodat uitgaande `<Connect><Stream>`-sessies gekoppeld blijven.
- Barge-in breekt actief afspelen af en wist in de wachtrij geplaatste maar nog niet afgespeelde Twilio TTS-items. Gewiste items worden als overgeslagen afgehandeld, zodat vervolgantwoordlogica kan doorgaan zonder te wachten op audio die nooit zal worden afgespeeld.
- Realtime spraakgesprekken gebruiken de eigen openingsbeurt van de realtime stream. Voice Call plaatst **geen** verouderde TwiML-update met `<Say>` voor dat eerste bericht, zodat uitgaande `<Connect><Stream>`-sessies gekoppeld blijven.
### Respijt bij verbreking van Twilio-stream
Wanneer een Twilio-mediastream wordt verbroken, wacht Voice Call **2000 ms** voordat
de oproep automatisch wordt beëindigd:
het gesprek automatisch wordt beëindigd:
- Als de stream binnen dat venster opnieuw verbinding maakt, wordt automatisch beëindigen geannuleerd.
- Als er na de respijtperiode geen stream opnieuw wordt geregistreerd, wordt de oproep beëindigd om vastgelopen actieve oproepen te voorkomen.
- Als er na de respijtperiode geen stream opnieuw wordt geregistreerd, wordt het gesprek beëindigd om vastgelopen actieve gesprekken te voorkomen.
## Verouderde oproepreaper
## Opschoner van verouderde gesprekken
Gebruik `staleCallReaperSeconds` om oproepen te beëindigen die nooit een terminale
Webhook ontvangen (bijvoorbeeld oproepen in meldmodus die nooit worden voltooid). De standaardwaarde
Gebruik `staleCallReaperSeconds` om gesprekken te beëindigen die nooit een terminale
Webhook ontvangen (bijvoorbeeld notify-modusgesprekken die nooit worden voltooid). De standaardwaarde
is `0` (uitgeschakeld).
Aanbevolen bereiken:
- **Productie:** `120``300` seconden voor meldingsachtige flows.
- Houd deze waarde **hoger dan `maxDurationSeconds`** zodat normale oproepen kunnen eindigen. Een goed startpunt is `maxDurationSeconds + 3060` seconden.
- **Productie:** `120``300` seconden voor notify-achtige flows.
- Houd deze waarde **hoger dan `maxDurationSeconds`** zodat normale gesprekken kunnen eindigen. Een goed startpunt is `maxDurationSeconds + 3060` seconden.
```json5
{
@ -630,14 +634,14 @@ Aanbevolen bereiken:
}
```
## Webhook-beveiliging
## Webhookbeveiliging
Wanneer er een proxy of tunnel vóór de Gateway staat, reconstrueert de Plugin
de openbare URL voor handtekeningverificatie. Deze opties
bepalen welke doorgestuurde headers worden vertrouwd:
Wanneer er een proxy of tunnel vóór de Gateway staat, reconstrueert de plugin
de openbare URL voor handtekeningverificatie. Deze opties bepalen
welke doorgestuurde headers worden vertrouwd:
<ParamField path="webhookSecurity.allowedHosts" type="string[]">
Sta hosts toe uit forwarding-headers.
Allowlist-hosts uit forwarding-headers.
</ParamField>
<ParamField path="webhookSecurity.trustForwardingHeaders" type="boolean">
Vertrouw doorgestuurde headers zonder allowlist.
@ -646,12 +650,12 @@ bepalen welke doorgestuurde headers worden vertrouwd:
Vertrouw doorgestuurde headers alleen wanneer het externe IP-adres van de aanvraag overeenkomt met de lijst.
</ParamField>
Aanvullende beveiligingen:
Aanvullende beschermingen:
- Webhook-**replaybescherming** is ingeschakeld voor Twilio en Plivo. Opnieuw afgespeelde geldige Webhook-aanvragen worden bevestigd maar overgeslagen voor bijwerkingen.
- Twilio-gespreksturns bevatten een token per turn in `<Gather>`-callbacks, zodat verouderde/opnieuw afgespeelde spraakcallbacks niet aan een nieuwere wachtende transcriptturn kunnen voldoen.
- Niet-geverifieerde Webhook-aanvragen worden geweigerd vóór body-reads wanneer de vereiste handtekeningheaders van de provider ontbreken.
- De voice-call-Webhook gebruikt het gedeelde pre-auth body-profiel (64 KB / 5 seconden) plus een per-IP-limiet voor gelijktijdige aanvragen vóór handtekeningverificatie.
- Twilio-gespreksbeurten bevatten een token per beurt in `<Gather>`-callbacks, zodat verouderde/opnieuw afgespeelde spraakcallbacks geen nieuwere wachtende transcriptiebeurt kunnen vervullen.
- Niet-geverifieerde Webhook-aanvragen worden geweigerd vóór het lezen van de body wanneer de vereiste handtekeningheaders van de provider ontbreken.
- De voice-call-Webhook gebruikt het gedeelde pre-auth-bodyprofiel (64 KB / 5 seconden) plus een in-flight-limiet per IP vóór handtekeningverificatie.
Voorbeeld met een stabiele openbare host:
@ -687,17 +691,17 @@ openclaw voicecall latency # summarize turn latency from lo
openclaw voicecall expose --mode funnel
```
Wanneer de Gateway al draait, delegeren operationele `voicecall`-commando's
naar de door de Gateway beheerde voice-call-runtime, zodat de CLI geen tweede
Webhook-server bindt. Als er geen Gateway bereikbaar is, vallen de commando's terug op een
Wanneer de Gateway al draait, delegeren operationele `voicecall`-opdrachten
naar de voice-call-runtime die eigendom is van de Gateway, zodat de CLI geen tweede
webhookserver bindt. Als er geen Gateway bereikbaar is, vallen de opdrachten terug op een
zelfstandige CLI-runtime.
`latency` leest `calls.jsonl` vanaf het standaard opslagpad voor spraakoproepen.
Gebruik `--file <path>` om naar een ander logboek te wijzen en `--last <n>` om
`latency` leest `calls.jsonl` uit het standaardopslagpad voor voice-call.
Gebruik `--file <path>` om naar een ander logbestand te verwijzen en `--last <n>` om
de analyse te beperken tot de laatste N records (standaard 200). De uitvoer bevat p50/p90/p99
voor beurtlatentie en luister-wachttijden.
voor turn-latentie en luisterwachttijden.
## Agent-tool
## Agenttool
Toolnaam: `voice_call`.
@ -710,9 +714,9 @@ Toolnaam: `voice_call`.
| `end_call` | `callId` |
| `get_status` | `callId` |
Deze repository levert een bijbehorend Skills-document op `skills/voice-call/SKILL.md`.
Deze repo levert een bijbehorend skill-document op `skills/voice-call/SKILL.md`.
## Gateway RPC
## Gateway-RPC
| Methode | Argumenten |
| -------------------- | ------------------------------------------ |
@ -723,15 +727,15 @@ Deze repository levert een bijbehorend Skills-document op `skills/voice-call/SKI
| `voicecall.end` | `callId` |
| `voicecall.status` | `callId` |
`dtmfSequence` is alleen geldig met `mode: "conversation"`. Oproepen in
meldingsmodus moeten `voicecall.dtmf` gebruiken nadat de oproep bestaat als ze
cijfers nodig hebben na het verbinden.
`dtmfSequence` is alleen geldig met `mode: "conversation"`. Oproepen in meldingsmodus
moeten `voicecall.dtmf` gebruiken nadat het gesprek bestaat als ze cijfers na het verbinden
nodig hebben.
## Probleemoplossing
### Installatie mislukt bij Webhook-blootstelling
### Setup mislukt bij Webhook-blootstelling
Voer de installatie uit vanuit dezelfde omgeving waarin de Gateway draait:
Voer setup uit vanuit dezelfde omgeving waarin de Gateway draait:
```bash
openclaw voicecall setup
@ -739,18 +743,17 @@ openclaw voicecall setup --json
```
Voor `twilio`, `telnyx` en `plivo` moet `webhook-exposure` groen zijn. Een
geconfigureerde `publicUrl` mislukt nog steeds wanneer die naar lokale of private
netwerkruimte wijst, omdat de provider niet kan terugbellen naar die adressen.
Gebruik geen `localhost`, `127.0.0.1`, `0.0.0.0`, `10.x`, `172.16.x`-`172.31.x`,
`192.168.x`, `169.254.x`, `fc00::/7` of `fd00::/8` als `publicUrl`.
geconfigureerde `publicUrl` mislukt nog steeds wanneer deze naar lokale of private netwerkruimte
wijst, omdat de provider niet naar die adressen kan terugbellen. Gebruik
`localhost`, `127.0.0.1`, `0.0.0.0`, `10.x`, `172.16.x`-`172.31.x`,
`192.168.x`, `169.254.x`, `fc00::/7` of `fd00::/8` niet als `publicUrl`.
Uitgaande Twilio-oproepen in meldingsmodus sturen hun eerste `<Say>` TwiML direct
in de aanvraag om de oproep te maken, dus het eerste uitgesproken bericht is niet
afhankelijk van Twilio die Webhook-TwiML ophaalt. Een openbare Webhook is nog
steeds vereist voor statuscallbacks, gespreksoproepen, DTMF vóór verbinding,
realtime streams en oproepbeheer na verbinding.
Uitgaande Twilio-oproepen in meldingsmodus sturen hun initiële `<Say>` TwiML rechtstreeks mee in
de create-call-aanvraag, dus het eerste gesproken bericht is niet afhankelijk van Twilio
dat Webhook-TwiML ophaalt. Een publieke Webhook blijft vereist voor status-callbacks,
gespreksoproepen, DTMF voor het verbinden, realtime streams en oproepbesturing na het verbinden.
Gebruik één openbaar blootstellingspad:
Gebruik één publiek blootstellingspad:
```json5
{
@ -770,18 +773,18 @@ Gebruik één openbaar blootstellingspad:
}
```
Herstart of herlaad na het wijzigen van de configuratie de Gateway en voer daarna uit:
Herstart of herlaad de Gateway nadat je de configuratie hebt gewijzigd en voer daarna uit:
```bash
openclaw voicecall setup
openclaw voicecall smoke
```
`voicecall smoke` is een droge run tenzij je `--yes` meegeeft.
`voicecall smoke` is een dry run tenzij je `--yes` meegeeft.
### Provider-inloggegevens mislukken
### Providerreferenties mislukken
Controleer de geselecteerde provider en de vereiste velden voor inloggegevens:
Controleer de geselecteerde provider en de vereiste referentievelden:
- Twilio: `twilio.accountSid`, `twilio.authToken` en `fromNumber`, of
`TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN` en `TWILIO_FROM_NUMBER`.
@ -789,19 +792,19 @@ Controleer de geselecteerde provider en de vereiste velden voor inloggegevens:
`fromNumber`.
- Plivo: `plivo.authId`, `plivo.authToken` en `fromNumber`.
Inloggegevens moeten op de Gateway-host aanwezig zijn. Het bewerken van een
lokaal shellprofiel heeft geen invloed op een al draaiende Gateway totdat die
opnieuw start of zijn omgeving herlaadt.
Referenties moeten bestaan op de Gateway-host. Het bewerken van een lokaal shellprofiel heeft
geen invloed op een al draaiende Gateway totdat deze herstart of zijn
omgeving herlaadt.
### Oproepen starten, maar provider-Webhooks komen niet aan
Bevestig dat de providerconsole naar de exacte openbare Webhook-URL wijst:
Controleer of de providerconsole naar de exacte publieke Webhook-URL verwijst:
```text
https://voice.example.com/voice/webhook
```
Inspecteer daarna de runtimestatus:
Inspecteer daarna de runtime-status:
```bash
openclaw voicecall status --call-id <id>
@ -814,26 +817,26 @@ Veelvoorkomende oorzaken:
- `publicUrl` wijst naar een ander pad dan `serve.path`.
- De tunnel-URL is gewijzigd nadat de Gateway is gestart.
- Een proxy stuurt de aanvraag door, maar verwijdert of herschrijft host-/proto-headers.
- Firewall of DNS routeert de openbare hostnaam naar iets anders dan de Gateway.
- De Gateway is opnieuw gestart zonder dat de Voice Call-Plugin is ingeschakeld.
- Firewall of DNS routeert de publieke hostnaam naar een andere plek dan de Gateway.
- De Gateway is herstart zonder dat de Voice Call-Plugin is ingeschakeld.
Wanneer er een reverse proxy of tunnel vóór de Gateway staat, stel je
`webhookSecurity.allowedHosts` in op de openbare hostnaam, of gebruik je
Wanneer er een reverse proxy of tunnel voor de Gateway staat, stel dan
`webhookSecurity.allowedHosts` in op de publieke hostnaam, of gebruik
`webhookSecurity.trustedProxyIPs` voor een bekend proxyadres. Gebruik
`webhookSecurity.trustForwardingHeaders` alleen wanneer de proxygrens onder
jouw controle staat.
jouw beheer valt.
### Handtekeningverificatie mislukt
Providerhandtekeningen worden gecontroleerd aan de hand van de openbare URL die
OpenClaw reconstrueert uit de binnenkomende aanvraag. Als handtekeningen mislukken:
Providerhandtekeningen worden gecontroleerd tegen de publieke URL die OpenClaw reconstrueert
uit de binnenkomende aanvraag. Als handtekeningen mislukken:
- Bevestig dat de provider-Webhook-URL exact overeenkomt met `publicUrl`, inclusief
- Controleer of de provider-Webhook-URL exact overeenkomt met `publicUrl`, inclusief
schema, host en pad.
- Werk voor ngrok-URL's uit de gratis laag `publicUrl` bij wanneer de tunnelhostnaam verandert.
- Werk voor ngrok-URL's in de gratis laag `publicUrl` bij wanneer de tunnelhostnaam verandert.
- Zorg dat de proxy de oorspronkelijke host- en proto-headers behoudt, of configureer
`webhookSecurity.allowedHosts`.
- Schakel `skipSignatureVerification` niet in buiten lokaal testen.
- Schakel `skipSignatureVerification` niet in buiten lokale tests.
### Google Meet Twilio-deelnames mislukken
@ -850,38 +853,38 @@ Controleer daarna expliciet het Google Meet-transport:
openclaw googlemeet setup --transport twilio
```
Als Voice Call groen is maar de Meet-deelnemer nooit deelneemt, controleer dan het
Meet-inbelnummer, de pincode en `--dtmf-sequence`. De telefoonoproep kan gezond
zijn terwijl de vergadering een onjuiste DTMF-reeks weigert of negeert.
Als Voice Call groen is maar de Meet-deelnemer nooit deelneemt, controleer dan het Meet-
inbelnummer, de pincode en `--dtmf-sequence`. Het telefoongesprek kan gezond zijn terwijl
de vergadering een onjuiste DTMF-reeks weigert of negeert.
Google Meet geeft de Meet-DTMF-reeks en introtekst door aan `voicecall.start`.
Voor Twilio-oproepen serveert Voice Call eerst de DTMF-TwiML, leidt terug naar de
Webhook en opent daarna de realtime mediastream zodat de opgeslagen intro wordt
gegenereerd nadat de telefoondeelnemer aan de vergadering heeft deelgenomen.
Voor Twilio-oproepen serveert Voice Call eerst de DTMF-TwiML, redirect terug naar de
Webhook en opent daarna de realtime mediastream, zodat de opgeslagen intro wordt gegenereerd
nadat de telefoondeelnemer aan de vergadering heeft deelgenomen.
Gebruik `openclaw logs --follow` voor de livefasetrace. Een gezonde Twilio Meet-
deelname logt deze volgorde:
- Google Meet delegeert de Twilio-deelname aan Voice Call.
- Voice Call slaat DTMF-TwiML vóór verbinding op.
- De initiële Twilio-TwiML wordt verbruikt en geserveerd vóór realtime verwerking.
- Voice Call slaat DTMF-TwiML voor het verbinden op.
- Initiële Twilio-TwiML wordt verbruikt en geserveerd vóór realtime verwerking.
- Voice Call serveert realtime TwiML voor de Twilio-oproep.
- De realtime bridge start met de initiële begroeting in de wachtrij.
`openclaw voicecall tail` toont nog steeds blijvend opgeslagen oproeprecords; het is nuttig voor
oproepstatus en transcripties, maar niet elke Webhook-/realtime overgang verschijnt
`openclaw voicecall tail` toont nog steeds opgeslagen oproeprecords; dit is nuttig voor
oproepstatus en transcripties, maar niet elke Webhook-/realtime-overgang verschijnt
daar.
### Realtime oproep heeft geen spraak
Bevestig dat slechts één audiomodus is ingeschakeld. `realtime.enabled` en
`streaming.enabled` kunnen niet allebei waar zijn.
Controleer of slechts één audiomodus is ingeschakeld. `realtime.enabled` en
`streaming.enabled` kunnen niet allebei true zijn.
Controleer voor realtime Twilio-oproepen ook:
- Er is een realtime provider-Plugin geladen en geregistreerd.
- `realtime.provider` is niet ingesteld of noemt een geregistreerde provider.
- De provider-API-sleutel is beschikbaar voor het Gateway-proces.
- De API-sleutel van de provider is beschikbaar voor het Gateway-proces.
- `openclaw logs --follow` toont dat realtime TwiML is geserveerd, de realtime bridge
is gestart en de initiële begroeting in de wachtrij is gezet.
@ -889,4 +892,4 @@ Controleer voor realtime Twilio-oproepen ook:
- [Praatmodus](/nl/nodes/talk)
- [Tekst-naar-spraak](/nl/tools/tts)
- [Spraakwekker](/nl/nodes/voicewake)
- [Voice wake](/nl/nodes/voicewake)

View File

@ -1,27 +1,27 @@
---
read_when:
- Je wilt ElevenLabs-tekst-naar-spraak in OpenClaw
- Je wilt ElevenLabs Scribe-spraak-naar-tekst voor audiobijlagen
- Je wilt realtime transcriptie van ElevenLabs voor Spraakoproep
summary: Gebruik ElevenLabs-spraak, Scribe STT en realtime-transcriptie met OpenClaw
- Je wilt ElevenLabs Scribe spraak-naar-tekst voor audiobijlagen
- Je wilt realtime-transcriptie van ElevenLabs voor Spraakoproep of Google Meet
summary: Gebruik ElevenLabs-spraak, Scribe STT en realtime transcriptie met OpenClaw
title: ElevenLabs
x-i18n:
generated_at: "2026-04-29T23:10:01Z"
generated_at: "2026-05-04T07:07:42Z"
model: gpt-5.5
provider: openai
source_hash: 1f858a344228c6355cd5fdc3775cddac39e0075f2e9fcf7683271f11be03a31a
source_hash: 4c880bf9dcab01ef70779c74576c70ea5d0203b96b5f739291842fafcb4bdb4b
source_path: providers/elevenlabs.md
workflow: 16
---
OpenClaw gebruikt ElevenLabs voor tekst-naar-spraak, batchgewijze spraak-naar-tekst met Scribe
v2, en Voice Call-streaming-STT met Scribe v2 Realtime.
OpenClaw gebruikt ElevenLabs voor tekst-naar-spraak, batch-spraak-naar-tekst met Scribe
v2 en streaming-STT met Scribe v2 Realtime.
| Mogelijkheid | OpenClaw-oppervlak | Standaard |
| ----------------------- | --------------------------------------------- | ------------------------ |
| Tekst-naar-spraak | `messages.tts` / `talk` | `eleven_multilingual_v2` |
| Batchgewijze spraak-naar-tekst | `tools.media.audio` | `scribe_v2` |
| Streaming spraak-naar-tekst | Voice Call `streaming.provider: "elevenlabs"` | `scribe_v2_realtime` |
| Mogelijkheid | OpenClaw-oppervlak | Standaard |
| ------------------------- | ---------------------------------------------------------------------- | ------------------------ |
| Tekst-naar-spraak | `messages.tts` / `talk` | `eleven_multilingual_v2` |
| Batch-spraak-naar-tekst | `tools.media.audio` | `scribe_v2` |
| Streaming-spraak-naar-tekst | streaming voor spraakoproepen of Google Meet `realtime.transcriptionProvider` | `scribe_v2_realtime` |
## Authenticatie
@ -50,12 +50,12 @@ export ELEVENLABS_API_KEY="..."
}
```
Stel `modelId` in op `eleven_v3` om ElevenLabs v3 TTS te gebruiken. OpenClaw behoudt
Stel `modelId` in op `eleven_v3` om ElevenLabs v3 TTS te gebruiken. OpenClaw houdt
`eleven_multilingual_v2` als standaard voor bestaande installaties.
## Spraak-naar-tekst
Gebruik Scribe v2 voor binnenkomende audiobijlagen en korte opgenomen spraaksegmenten:
Gebruik Scribe v2 voor inkomende audiobijlagen en korte opgenomen spraaksegmenten:
```json5
{
@ -71,21 +71,21 @@ Gebruik Scribe v2 voor binnenkomende audiobijlagen en korte opgenomen spraaksegm
```
OpenClaw stuurt multipart-audio naar ElevenLabs `/v1/speech-to-text` met
`model_id: "scribe_v2"`. Taalhints worden gekoppeld aan `language_code` wanneer aanwezig.
`model_id: "scribe_v2"`. Taalhints worden aan `language_code` gekoppeld wanneer aanwezig.
## Voice Call-streaming-STT
## Streaming-STT
De meegeleverde `elevenlabs` Plugin registreert Scribe v2 Realtime voor Voice Call-
streamingtranscriptie.
De gebundelde `elevenlabs`-Plugin registreert Scribe v2 Realtime voor streamingtranscriptie
in agentmodus voor spraakoproepen en Google Meet.
| Instelling | Configuratiepad | Standaard |
| --------------- | ------------------------------------------------------------------------- | ------------------------------------------------- |
| API-sleutel | `plugins.entries.voice-call.config.streaming.providers.elevenlabs.apiKey` | Valt terug op `ELEVENLABS_API_KEY` / `XI_API_KEY` |
| Model | `...elevenlabs.modelId` | `scribe_v2_realtime` |
| Audio-indeling | `...elevenlabs.audioFormat` | `ulaw_8000` |
| Instelling | Configuratiepad | Standaard |
| ---------------- | ------------------------------------------------------------------------- | ------------------------------------------------- |
| API-sleutel | `plugins.entries.voice-call.config.streaming.providers.elevenlabs.apiKey` | Valt terug op `ELEVENLABS_API_KEY` / `XI_API_KEY` |
| Model | `...elevenlabs.modelId` | `scribe_v2_realtime` |
| Audioformaat | `...elevenlabs.audioFormat` | `ulaw_8000` |
| Samplefrequentie | `...elevenlabs.sampleRate` | `8000` |
| Commitstrategie | `...elevenlabs.commitStrategy` | `vad` |
| Taal | `...elevenlabs.languageCode` | (niet ingesteld) |
| Commitstrategie | `...elevenlabs.commitStrategy` | `vad` |
| Taal | `...elevenlabs.languageCode` | (niet ingesteld) |
```json5
{
@ -113,12 +113,18 @@ streamingtranscriptie.
```
<Note>
Voice Call ontvangt Twilio-media als 8 kHz G.711 u-law. De realtimeprovider van ElevenLabs
gebruikt standaard `ulaw_8000`, zodat telefonieframes kunnen worden doorgestuurd zonder
transcodering.
Spraakoproepen ontvangen Twilio-media als 8 kHz G.711 u-law. De ElevenLabs-realtimeprovider
gebruikt standaard `ulaw_8000`, zodat telefonieframes zonder transcodering kunnen worden
doorgestuurd.
</Note>
Voor de Google Meet-agentmodus stelt u
`plugins.entries.google-meet.config.realtime.transcriptionProvider` in op
`"elevenlabs"` en configureert u hetzelfde providerblok onder
`plugins.entries.google-meet.config.realtime.providers.elevenlabs`.
## Gerelateerd
- [Tekst-naar-spraak](/nl/tools/tts)
- [Google Meet](/nl/plugins/google-meet)
- [Modelselectie](/nl/concepts/model-providers)

View File

@ -1,34 +1,34 @@
---
read_when:
- U wilt Google Gemini-modellen gebruiken met OpenClaw
- Je hebt de API-sleutel of de OAuth-authenticatiestroom nodig
summary: Google Gemini instellen (API-sleutel + OAuth, afbeeldingsgeneratie, mediabegrip, TTS, zoeken op het web)
- Je wilt Google Gemini-modellen gebruiken met OpenClaw
- Je hebt de API-sleutel of OAuth-authenticatiestroom nodig
summary: Google Gemini instellen (API-sleutel + OAuth, beeldgeneratie, mediabegrip, TTS, zoeken op het web)
title: Google (Gemini)
x-i18n:
generated_at: "2026-05-02T11:25:07Z"
generated_at: "2026-05-04T07:08:01Z"
model: gpt-5.5
provider: openai
source_hash: 14605b88f0d1d7e01796d429113a73b2b52a48fde6443565dcb3db47653be5e7
source_hash: 3e45627f5d5cd57e858c7590a90435b7fc0e9381509f3312a16fc9e9a4cbd908
source_path: providers/google.md
workflow: 16
---
De Google Plugin biedt toegang tot Gemini-modellen via Google AI Studio, plus
beeldgeneratie, mediabegrip (beeld/audio/video), tekst-naar-spraak en zoeken op het web via
afbeeldingsgeneratie, mediabegrip (afbeelding/audio/video), tekst-naar-spraak en webzoekfunctie via
Gemini Grounding.
- Aanbieder: `google`
- Authenticatie: `GEMINI_API_KEY` of `GOOGLE_API_KEY`
- Provider: `google`
- Auth: `GEMINI_API_KEY` of `GOOGLE_API_KEY`
- API: Google Gemini API
- Runtime-optie: `agents.defaults.agentRuntime.id: "google-gemini-cli"`
hergebruikt Gemini CLI OAuth en houdt modelverwijzingen canoniek als `google/*`.
- Runtimeoptie: `agents.defaults.agentRuntime.id: "google-gemini-cli"`
hergebruikt Gemini CLI OAuth terwijl modelverwijzingen canoniek blijven als `google/*`.
## Aan de slag
Kies je voorkeursmethode voor authenticatie en volg de installatiestappen.
Kies je gewenste auth-methode en volg de installatiestappen.
<Tabs>
<Tab title="API key">
<Tab title="API-sleutel">
**Het meest geschikt voor:** standaard Gemini API-toegang via Google AI Studio.
<Steps>
@ -71,11 +71,11 @@ Kies je voorkeursmethode voor authenticatie en volg de installatiestappen.
</Tab>
<Tab title="Gemini CLI (OAuth)">
**Het meest geschikt voor:** hergebruik van een bestaande Gemini CLI-login via PKCE OAuth in plaats van een aparte API-sleutel.
**Het meest geschikt voor:** het hergebruiken van een bestaande Gemini CLI-login via PKCE OAuth in plaats van een aparte API-sleutel.
<Warning>
De `google-gemini-cli`-aanbieder is een onofficiële integratie. Sommige gebruikers
melden accountbeperkingen bij gebruik van OAuth op deze manier. Gebruik dit op eigen risico.
De provider `google-gemini-cli` is een niet-officiële integratie. Sommige gebruikers
melden accountbeperkingen wanneer OAuth op deze manier wordt gebruikt. Gebruik dit op eigen risico.
</Warning>
<Steps>
@ -109,17 +109,17 @@ Kies je voorkeursmethode voor authenticatie en volg de installatiestappen.
- Runtime: `google-gemini-cli`
- Alias: `gemini-cli`
De Gemini API-model-ID van Gemini 3.1 Pro is `gemini-3.1-pro-preview`. OpenClaw accepteert de kortere `google/gemini-3.1-pro` als gemaksalias en normaliseert die vóór aanroepen naar de aanbieder.
De Gemini API-model-id van Gemini 3.1 Pro is `gemini-3.1-pro-preview`. OpenClaw accepteert de kortere `google/gemini-3.1-pro` als handige alias en normaliseert deze vóór provideraanroepen.
**Omgevingsvariabelen:**
- `OPENCLAW_GEMINI_OAUTH_CLIENT_ID`
- `OPENCLAW_GEMINI_OAUTH_CLIENT_SECRET`
(Of de `GEMINI_CLI_*`-varianten.)
(Of de varianten `GEMINI_CLI_*`.)
<Note>
Als Gemini CLI OAuth-aanvragen mislukken na het inloggen, stel dan `GOOGLE_CLOUD_PROJECT` of
Als Gemini CLI OAuth-aanvragen na het inloggen mislukken, stel dan `GOOGLE_CLOUD_PROJECT` of
`GOOGLE_CLOUD_PROJECT_ID` in op de Gateway-host en probeer het opnieuw.
</Note>
@ -128,9 +128,9 @@ Kies je voorkeursmethode voor authenticatie en volg de installatiestappen.
is geïnstalleerd en op `PATH` staat.
</Note>
`google-gemini-cli/*`-modelverwijzingen zijn legacy compatibiliteitsaliassen. Nieuwe
configuraties moeten `google/*`-modelverwijzingen gebruiken plus de `google-gemini-cli`-
runtime wanneer ze lokale Gemini CLI-uitvoering willen.
`google-gemini-cli/*`-modelverwijzingen zijn legacy-compatibiliteitsaliassen. Nieuwe
configuraties moeten `google/*`-modelverwijzingen gebruiken plus de runtime `google-gemini-cli`
wanneer ze lokale Gemini CLI-uitvoering willen.
</Tab>
</Tabs>
@ -140,20 +140,20 @@ Kies je voorkeursmethode voor authenticatie en volg de installatiestappen.
| Mogelijkheid | Ondersteund |
| ---------------------- | ----------------------------- |
| Chataanvullingen | Ja |
| Beeldgeneratie | Ja |
| Afbeeldingsgeneratie | Ja |
| Muziekgeneratie | Ja |
| Tekst-naar-spraak | Ja |
| Realtime spraak | Ja (Google Live API) |
| Beeldbegrip | Ja |
| Afbeeldingsbegrip | Ja |
| Audiotranscriptie | Ja |
| Videobegrip | Ja |
| Zoeken op het web (Grounding) | Ja |
| Webzoekfunctie (Grounding) | Ja |
| Denken/redeneren | Ja (Gemini 2.5+ / Gemini 3+) |
| Gemma 4-modellen | Ja |
## Zoeken op het web
## Webzoekfunctie
De meegeleverde `gemini`-aanbieder voor zoeken op het web gebruikt Gemini Google Search-grounding.
De meegeleverde webzoekprovider `gemini` gebruikt Gemini Google Search-grounding.
Configureer een speciale zoeksleutel onder `plugins.entries.google.config.webSearch`,
of laat deze `models.providers.google.apiKey` hergebruiken na `GEMINI_API_KEY`:
@ -175,40 +175,40 @@ of laat deze `models.providers.google.apiKey` hergebruiken na `GEMINI_API_KEY`:
}
```
De prioriteit voor referenties is eerst de specifieke `webSearch.apiKey`, daarna `GEMINI_API_KEY`,
en daarna `models.providers.google.apiKey`. `webSearch.baseUrl` is optioneel en
bestaat voor operator-proxy's of compatibele Gemini API-eindpunten; wanneer weggelaten,
hergebruikt Gemini-webzoekopdracht `models.providers.google.baseUrl`. Zie
[Gemini-zoekopdracht](/nl/tools/gemini-search) voor het aanbiederspecifieke toolgedrag.
De volgorde van inloggegevens is eerst de speciale `webSearch.apiKey`, daarna `GEMINI_API_KEY`,
daarna `models.providers.google.apiKey`. `webSearch.baseUrl` is optioneel en
bestaat voor operator-proxy's of compatibele Gemini API-eindpunten; wanneer deze wordt weggelaten,
hergebruikt Gemini-webzoekfunctie `models.providers.google.baseUrl`. Zie
[Gemini-zoekfunctie](/nl/tools/gemini-search) voor het providerspecifieke toolgedrag.
<Tip>
Gemini 3-modellen gebruiken `thinkingLevel` in plaats van `thinkingBudget`. OpenClaw koppelt
redeneerinstellingen voor Gemini 3, Gemini 3.1 en `gemini-*-latest`-aliassen aan
`thinkingLevel`, zodat standaardruns en runs met lage latency geen uitgeschakelde
redeneerbesturing voor Gemini 3, Gemini 3.1 en `gemini-*-latest`-aliassen aan
`thinkingLevel` zodat standaardruns/runs met lage latentie geen uitgeschakelde
`thinkingBudget`-waarden verzenden.
`/think adaptive` behoudt de dynamische denksemantiek van Google in plaats van
een vast OpenClaw-niveau te kiezen. Gemini 3 en Gemini 3.1 laten een vaste `thinkingLevel` weg zodat
Google het niveau kan kiezen; Gemini 2.5 verzendt Googles dynamische sentinel
`/think adaptive` behoudt de dynamische denksemantiek van Google in plaats van een
vast OpenClaw-niveau te kiezen. Gemini 3 en Gemini 3.1 laten een vaste `thinkingLevel` weg zodat
Google het niveau kan kiezen; Gemini 2.5 verzendt Google's dynamische sentinel
`thinkingBudget: -1`.
Gemma 4-modellen (bijvoorbeeld `gemma-4-26b-a4b-it`) ondersteunen de denkmodus. OpenClaw
Gemma 4-modellen (bijvoorbeeld `gemma-4-26b-a4b-it`) ondersteunen denkmodus. OpenClaw
herschrijft `thinkingBudget` naar een ondersteund Google `thinkingLevel` voor Gemma 4.
Denken instellen op `off` houdt denken uitgeschakeld in plaats van te koppelen aan
Als denken wordt ingesteld op `off`, blijft denken uitgeschakeld in plaats van te koppelen naar
`MINIMAL`.
</Tip>
## Beeldgeneratie
## Afbeeldingsgeneratie
De meegeleverde `google`-aanbieder voor beeldgeneratie gebruikt standaard
De meegeleverde afbeeldingsgeneratieprovider `google` gebruikt standaard
`google/gemini-3.1-flash-image-preview`.
- Ondersteunt ook `google/gemini-3-pro-image-preview`
- Genereren: tot 4 beelden per aanvraag
- Bewerkingsmodus: ingeschakeld, tot 5 invoerbeelden
- Geometrie-instellingen: `size`, `aspectRatio` en `resolution`
- Genereren: tot 4 afbeeldingen per aanvraag
- Bewerkmodus: ingeschakeld, tot 5 invoerafbeeldingen
- Geometriebesturing: `size`, `aspectRatio` en `resolution`
Google gebruiken als de standaardbeeldaanbieder:
Google gebruiken als standaard afbeeldingsprovider:
```json5
{
@ -223,20 +223,20 @@ Google gebruiken als de standaardbeeldaanbieder:
```
<Note>
Zie [Beeldgeneratie](/nl/tools/image-generation) voor gedeelde toolparameters, aanbiederselectie en failovergedrag.
Zie [Afbeeldingsgeneratie](/nl/tools/image-generation) voor gedeelde toolparameters, providerselectie en failovergedrag.
</Note>
## Videogeneratie
De meegeleverde `google` Plugin registreert ook videogeneratie via de gedeelde
`video_generate`-tool.
tool `video_generate`.
- Standaardvideomodel: `google/veo-3.1-fast-generate-preview`
- Modi: tekst-naar-video, beeld-naar-video en referentieflows met één video
- Standaard videomodel: `google/veo-3.1-fast-generate-preview`
- Modi: tekst-naar-video, afbeelding-naar-video en referentieflows met één video
- Ondersteunt `aspectRatio`, `resolution` en `audio`
- Huidige duurbegrenzing: **4 tot 8 seconden**
- Huidige duurklem: **4 tot 8 seconden**
Google gebruiken als de standaardvideoaanbieder:
Google gebruiken als standaard videoprovider:
```json5
{
@ -251,22 +251,22 @@ Google gebruiken als de standaardvideoaanbieder:
```
<Note>
Zie [Videogeneratie](/nl/tools/video-generation) voor gedeelde toolparameters, aanbiederselectie en failovergedrag.
Zie [Videogeneratie](/nl/tools/video-generation) voor gedeelde toolparameters, providerselectie en failovergedrag.
</Note>
## Muziekgeneratie
De meegeleverde `google` Plugin registreert ook muziekgeneratie via de gedeelde
`music_generate`-tool.
tool `music_generate`.
- Standaardmuziekmodel: `google/lyria-3-clip-preview`
- Standaard muziekmodel: `google/lyria-3-clip-preview`
- Ondersteunt ook `google/lyria-3-pro-preview`
- Promptinstellingen: `lyrics` en `instrumental`
- Uitvoerindeling: standaard `mp3`, plus `wav` op `google/lyria-3-pro-preview`
- Referentie-invoer: tot 10 beelden
- Promptbesturing: `lyrics` en `instrumental`
- Uitvoerformaat: standaard `mp3`, plus `wav` op `google/lyria-3-pro-preview`
- Referentie-invoer: tot 10 afbeeldingen
- Runs met sessiebacking worden losgekoppeld via de gedeelde taak-/statusflow, inclusief `action: "status"`
Google gebruiken als de standaardmuziekaanbieder:
Google gebruiken als standaard muziekprovider:
```json5
{
@ -281,20 +281,20 @@ Google gebruiken als de standaardmuziekaanbieder:
```
<Note>
Zie [Muziekgeneratie](/nl/tools/music-generation) voor gedeelde toolparameters, aanbiederselectie en failovergedrag.
Zie [Muziekgeneratie](/nl/tools/music-generation) voor gedeelde toolparameters, providerselectie en failovergedrag.
</Note>
## Tekst-naar-spraak
De meegeleverde `google`-spraakaanbieder gebruikt het Gemini API TTS-pad met
De meegeleverde spraakprovider `google` gebruikt het Gemini API TTS-pad met
`gemini-3.1-flash-tts-preview`.
- Standaardstem: `Kore`
- Authenticatie: `messages.tts.providers.google.apiKey`, `models.providers.google.apiKey`, `GEMINI_API_KEY` of `GOOGLE_API_KEY`
- Auth: `messages.tts.providers.google.apiKey`, `models.providers.google.apiKey`, `GEMINI_API_KEY` of `GOOGLE_API_KEY`
- Uitvoer: WAV voor gewone TTS-bijlagen, Opus voor spraaknotitiedoelen, PCM voor Talk/telefonie
- Spraaknotitie-uitvoer: Google PCM wordt verpakt als WAV en getranscodeerd naar 48 kHz Opus met `ffmpeg`
- Uitvoer voor spraaknotities: Google PCM wordt als WAV verpakt en met `ffmpeg` getranscodeerd naar 48 kHz Opus
Google gebruiken als de standaard-TTS-aanbieder:
Google gebruiken als standaard TTS-provider:
```json5
{
@ -314,14 +314,13 @@ Google gebruiken als de standaard-TTS-aanbieder:
}
```
Gemini API TTS gebruikt prompts in natuurlijke taal voor stijlcontrole. Stel
Gemini API TTS gebruikt prompts in natuurlijke taal voor stijlbesturing. Stel
`audioProfile` in om een herbruikbare stijlprompt vóór de gesproken tekst te plaatsen. Stel
`speakerName` in wanneer je prompttekst verwijst naar een genoemde spreker.
`speakerName` in wanneer je prompttekst naar een benoemde spreker verwijst.
Gemini API TTS accepteert ook expressieve audiotags tussen vierkante haken in de tekst,
zoals `[whispers]` of `[laughs]`. Om tags uit het zichtbare chatantwoord te houden
terwijl ze wel naar TTS worden gestuurd, plaats je ze in een `[[tts:text]]...[[/tts:text]]`-
blok:
zoals `[whispers]` of `[laughs]`. Om tags buiten het zichtbare chatantwoord te houden
terwijl ze naar TTS worden verzonden, plaats je ze binnen een `[[tts:text]]...[[/tts:text]]`-blok:
```text
Here is the clean reply text.
@ -331,26 +330,28 @@ Here is the clean reply text.
<Note>
Een Google Cloud Console API-sleutel die is beperkt tot de Gemini API is geldig voor deze
aanbieder. Dit is niet het aparte Cloud Text-to-Speech API-pad.
provider. Dit is niet het aparte Cloud Text-to-Speech API-pad.
</Note>
## Realtime spraak
De meegeleverde `google` Plugin registreert een realtime spraakaanbieder die wordt ondersteund door de
De meegeleverde `google` Plugin registreert een realtime spraakprovider die wordt ondersteund door de
Gemini Live API voor backend-audiobruggen zoals Voice Call en Google Meet.
| Instelling | Configuratiepad | Standaard |
| --------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| Model | `plugins.entries.voice-call.config.realtime.providers.google.model` | `gemini-2.5-flash-native-audio-preview-12-2025` |
| Stem | `...google.voice` | `Kore` |
| Temperatuur | `...google.temperature` | (niet ingesteld) |
| VAD-startgevoeligheid | `...google.startSensitivity` | (niet ingesteld) |
| VAD-eindgevoeligheid | `...google.endSensitivity` | (niet ingesteld) |
| Stilteperiode | `...google.silenceDurationMs` | (niet ingesteld) |
| Activiteitsafhandeling | `...google.activityHandling` | Google-standaard, `start-of-activity-interrupts` |
| Beurtdekking | `...google.turnCoverage` | Google-standaard, `only-activity` |
| Automatische VAD uitschakelen | `...google.automaticActivityDetectionDisabled` | `false` |
| API-sleutel | `...google.apiKey` | Valt terug op `models.providers.google.apiKey`, `GEMINI_API_KEY` of `GOOGLE_API_KEY` |
| Instelling | Configuratiepad | Standaardwaarde |
| ------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| Model | `plugins.entries.voice-call.config.realtime.providers.google.model` | `gemini-2.5-flash-native-audio-preview-12-2025` |
| Stem | `...google.voice` | `Kore` |
| Temperatuur | `...google.temperature` | (niet ingesteld) |
| VAD-startgevoeligheid | `...google.startSensitivity` | (niet ingesteld) |
| VAD-eindgevoeligheid | `...google.endSensitivity` | (niet ingesteld) |
| Stilteduur | `...google.silenceDurationMs` | (niet ingesteld) |
| Activiteitsafhandeling | `...google.activityHandling` | Google-standaard, `start-of-activity-interrupts` |
| Turn-dekking | `...google.turnCoverage` | Google-standaard, `only-activity` |
| Automatische VAD uitschakelen | `...google.automaticActivityDetectionDisabled` | `false` |
| Sessiehervatting | `...google.sessionResumption` | `true` |
| Contextcompressie | `...google.contextWindowCompression` | `true` |
| API-sleutel | `...google.apiKey` | Valt terug op `models.providers.google.apiKey`, `GEMINI_API_KEY` of `GOOGLE_API_KEY` |
Voorbeeld van realtime configuratie voor Voice Call:
@ -381,39 +382,39 @@ Voorbeeld van realtime configuratie voor Voice Call:
```
<Note>
Google Live API gebruikt bidirectionele audio en functieaanroepen via een WebSocket.
OpenClaw past audio van de telefonie-/Meet-bridge aan naar Gemini's PCM Live API-stream en
Google Live API gebruikt bidirectionele audio en functie-aanroepen via een WebSocket.
OpenClaw past audio van telefonie-/Meet-bruggen aan voor Gemini's PCM Live API-stream en
houdt toolaanroepen op het gedeelde realtime spraakcontract. Laat `temperature`
niet ingesteld, tenzij je wijzigingen in sampling nodig hebt; OpenClaw laat niet-positieve waarden weg
omdat Google Live transcripties zonder audio kan retourneren voor `temperature: 0`.
niet ingesteld, tenzij je samplingwijzigingen nodig hebt; OpenClaw laat niet-positieve waarden weg
omdat Google Live transcripties zonder audio kan teruggeven voor `temperature: 0`.
Gemini API-transcriptie is ingeschakeld zonder `languageCodes`; de huidige Google
SDK weigert taalcodehints op dit API-pad.
SDK weigert taalcodetips op dit API-pad.
</Note>
<Note>
Control UI Talk ondersteunt Google Live-browsersessies met beperkte tokens voor eenmalig gebruik.
Backend-only realtime spraakproviders kunnen ook via het generieke
Gateway-relaytransport draaien, waarmee providerreferenties op de Gateway blijven.
Realtime spraakproviders die alleen backend zijn, kunnen ook via het generieke
Gateway-relaytransport draaien, waarbij providerreferenties op de Gateway blijven.
</Note>
Voor live verificatie door maintainers voer je
`OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` uit.
De Google-stap maakt dezelfde beperkte Live API-tokenvorm aan die door Control
UI Talk wordt gebruikt, opent het browser-WebSocket-eindpunt, verzendt de initiële setup-payload
Het Google-deel mint dezelfde beperkte Live API-tokenvorm die Control
UI Talk gebruikt, opent het browser-WebSocket-eindpunt, verzendt de initiële setup-payload
en wacht op `setupComplete`.
## Geavanceerde configuratie
<AccordionGroup>
<Accordion title="Direct hergebruik van Gemini-cache">
<Accordion title="Direct Gemini cache reuse">
Voor directe Gemini API-runs (`api: "google-generative-ai"`) geeft OpenClaw
een geconfigureerde `cachedContent`-handle door aan Gemini-verzoeken.
een geconfigureerde `cachedContent`-handle door aan Gemini-aanvragen.
- Configureer per-model- of globale parameters met
`cachedContent` of verouderd `cached_content`
- Als beide aanwezig zijn, krijgt `cachedContent` voorrang
- Configureer parameters per model of globaal met
`cachedContent` of legacy `cached_content`
- Als beide aanwezig zijn, wint `cachedContent`
- Voorbeeldwaarde: `cachedContents/prebuilt-context`
- Gemini-cache-hitgebruik wordt genormaliseerd naar OpenClaw `cacheRead` vanuit
- Cache-hitgebruik van Gemini wordt genormaliseerd naar OpenClaw `cacheRead` vanuit
upstream `cachedContentTokenCount`
```json5
@ -434,7 +435,7 @@ en wacht op `setupComplete`.
</Accordion>
<Accordion title="Gebruiksnotities voor Gemini CLI JSON">
<Accordion title="Gemini CLI JSON usage notes">
Bij gebruik van de OAuth-provider `google-gemini-cli` normaliseert OpenClaw
de CLI JSON-uitvoer als volgt:
@ -446,7 +447,7 @@ en wacht op `setupComplete`.
</Accordion>
<Accordion title="Omgeving en daemonconfiguratie">
<Accordion title="Environment and daemon setup">
Als de Gateway als daemon draait (launchd/systemd), zorg er dan voor dat `GEMINI_API_KEY`
beschikbaar is voor dat proces (bijvoorbeeld in `~/.openclaw/.env` of via
`env.shellEnv`).
@ -456,16 +457,16 @@ en wacht op `setupComplete`.
## Gerelateerd
<CardGroup cols={2}>
<Card title="Modelselectie" href="/nl/concepts/model-providers" icon="layers">
Providers, modelverwijzingen en failovergedrag kiezen.
<Card title="Model selection" href="/nl/concepts/model-providers" icon="layers">
Providers, modelreferenties en failovergedrag kiezen.
</Card>
<Card title="Afbeeldingen genereren" href="/nl/tools/image-generation" icon="image">
<Card title="Image generation" href="/nl/tools/image-generation" icon="image">
Gedeelde parameters voor afbeeldingstools en providerselectie.
</Card>
<Card title="Video genereren" href="/nl/tools/video-generation" icon="video">
<Card title="Video generation" href="/nl/tools/video-generation" icon="video">
Gedeelde parameters voor videotools en providerselectie.
</Card>
<Card title="Muziek genereren" href="/nl/tools/music-generation" icon="music">
<Card title="Music generation" href="/nl/tools/music-generation" icon="music">
Gedeelde parameters voor muziektools en providerselectie.
</Card>
</CardGroup>

View File

@ -2,34 +2,34 @@
read_when:
- Je wilt één API-sleutel voor veel LLM's
- Je wilt modellen via OpenRouter uitvoeren in OpenClaw
- Je wilt OpenRouter gebruiken voor beeldgeneratie
- Je wilt OpenRouter gebruiken voor het genereren van afbeeldingen
- Je wilt OpenRouter gebruiken voor videogeneratie
summary: Gebruik de uniforme API van OpenRouter om toegang te krijgen tot veel modellen in OpenClaw
title: OpenRouter
x-i18n:
generated_at: "2026-05-02T11:26:05Z"
generated_at: "2026-05-04T07:08:09Z"
model: gpt-5.5
provider: openai
source_hash: e98b8b540265b6d11681390c02cb68312f33625bf223823a2dbca17e877c0422
source_hash: f6b7299408aa0de7530e2248c7fa5dae8c09095e2d20a0e9d12a64cab83966fc
source_path: providers/openrouter.md
workflow: 16
---
OpenRouter biedt een **uniforme API** die aanvragen naar veel modellen achter één
eindpunt en API-sleutel routeert. Deze is OpenAI-compatibel, dus de meeste OpenAI SDK's werken door de basis-URL te wijzigen.
OpenRouter biedt een **uniforme API** die verzoeken naar veel modellen routeert achter één
endpoint en API-sleutel. Deze is OpenAI-compatibel, dus de meeste OpenAI-SDK's werken door de basis-URL te wijzigen.
## Aan de slag
<Steps>
<Step title="Get your API key">
<Step title="Haal je API-sleutel op">
Maak een API-sleutel aan op [openrouter.ai/keys](https://openrouter.ai/keys).
</Step>
<Step title="Run onboarding">
<Step title="Voer onboarding uit">
```bash
openclaw onboard --auth-choice openrouter-api-key
```
</Step>
<Step title="(Optional) Switch to a specific model">
<Step title="(Optioneel) Schakel over naar een specifiek model">
Onboarding gebruikt standaard `openrouter/auto`. Kies later een concreet model:
```bash
@ -59,11 +59,11 @@ Modelverwijzingen volgen het patroon `openrouter/<provider>/<model>`. Zie [/conc
beschikbare providers en modellen.
</Note>
Meegeleverde fallbackvoorbeelden:
Gebundelde fallback-voorbeelden:
| Modelverwijzing | Opmerkingen |
| Modelverwijzing | Opmerkingen |
| --------------------------------- | ---------------------------- |
| `openrouter/auto` | Automatische OpenRouter-routering |
| `openrouter/auto` | Automatische routering van OpenRouter |
| `openrouter/moonshotai/kimi-k2.6` | Kimi K2.6 via MoonshotAI |
## Afbeeldingen genereren
@ -84,11 +84,11 @@ OpenRouter kan ook de tool `image_generate` ondersteunen. Gebruik een OpenRouter
}
```
OpenClaw stuurt afbeeldingsaanvragen naar OpenRouters chat-completions-afbeeldings-API met `modalities: ["image", "text"]`. Gemini-afbeeldingsmodellen ontvangen ondersteunde hints voor `aspectRatio` en `resolution` via OpenRouters `image_config`. Gebruik `agents.defaults.imageGenerationModel.timeoutMs` voor tragere OpenRouter-afbeeldingsmodellen; de parameter `timeoutMs` per aanroep van de tool `image_generate` heeft nog steeds voorrang.
OpenClaw stuurt afbeeldingsverzoeken naar OpenRouter's chat completions image API met `modalities: ["image", "text"]`. Gemini-afbeeldingsmodellen ontvangen ondersteunde hints voor `aspectRatio` en `resolution` via OpenRouter's `image_config`. Gebruik `agents.defaults.imageGenerationModel.timeoutMs` voor tragere OpenRouter-afbeeldingsmodellen; de parameter `timeoutMs` per aanroep van de tool `image_generate` heeft nog steeds voorrang.
## Video genereren
OpenRouter kan ook de tool `video_generate` ondersteunen via de asynchrone `/videos`-API. Gebruik een OpenRouter-videomodel onder `agents.defaults.videoGenerationModel`:
OpenRouter kan ook de tool `video_generate` ondersteunen via zijn asynchrone `/videos`-API. Gebruik een OpenRouter-videomodel onder `agents.defaults.videoGenerationModel`:
```json5
{
@ -103,20 +103,19 @@ OpenRouter kan ook de tool `video_generate` ondersteunen via de asynchrone `/vid
}
```
OpenClaw dient tekst-naar-video- en afbeelding-naar-video-taken in bij OpenRouter, polt
de geretourneerde `polling_url` en downloadt de voltooide video vanaf
OpenRouters `unsigned_urls` of het gedocumenteerde inhoudseindpunt van de taak.
Referentieafbeeldingen worden standaard verzonden als afbeeldingen voor het eerste/laatste frame; afbeeldingen
met de tag `reference_image` worden verzonden als OpenRouter-invoerreferenties. De
meegeleverde standaard `google/veo-3.1-fast` vermeldt de momenteel ondersteunde duur van 4/6/8
seconden, resoluties `720P`/`1080P` en beeldverhoudingen `16:9`/`9:16`.
Video-naar-video is niet geregistreerd voor OpenRouter omdat de upstream-API
voor videogeneratie momenteel tekst- en afbeeldingsreferenties accepteert.
OpenClaw dient tekst-naar-video- en afbeelding-naar-video-taken in bij OpenRouter, pollt
de geretourneerde `polling_url` en downloadt de voltooide video van
OpenRouter's `unsigned_urls` of het gedocumenteerde endpoint voor taakinhoud.
Referentieafbeeldingen worden standaard verzonden als eerste-/laatste-frame-afbeeldingen; afbeeldingen
die zijn getagd met `reference_image` worden verzonden als OpenRouter-invoerreferenties. De
gebundelde standaard `google/veo-3.1-fast` adverteert de momenteel ondersteunde duurwaarden van 4/6/8
seconden, `720P`/`1080P`-resoluties en `16:9`/`9:16`-beeldverhoudingen. Video-naar-video is niet geregistreerd voor OpenRouter, omdat de upstream
API voor videogeneratie momenteel tekst- en afbeeldingsreferenties accepteert.
## Tekst-naar-spraak
OpenRouter kan ook worden gebruikt als TTS-provider via het OpenAI-compatibele
eindpunt `/audio/speech`.
OpenRouter kan ook worden gebruikt als TTS-provider via zijn OpenAI-compatibele
`/audio/speech`-endpoint.
```json5
{
@ -136,83 +135,115 @@ eindpunt `/audio/speech`.
}
```
Als `messages.tts.providers.openrouter.apiKey` wordt weggelaten, hergebruikt TTS
Als `messages.tts.providers.openrouter.apiKey` is weggelaten, hergebruikt TTS
`models.providers.openrouter.apiKey` en daarna `OPENROUTER_API_KEY`.
## Authenticatie en headers
OpenRouter gebruikt onder water een Bearer-token met je API-sleutel.
OpenRouter gebruikt onder de motorkap een Bearer-token met je API-sleutel.
Bij echte OpenRouter-aanvragen (`https://openrouter.ai/api/v1`) voegt OpenClaw ook
OpenRouters gedocumenteerde app-attributieheaders toe:
Bij echte OpenRouter-verzoeken (`https://openrouter.ai/api/v1`) voegt OpenClaw ook
OpenRouter's gedocumenteerde app-attributieheaders toe:
| Header | Waarde |
| ------------------------- | --------------------- |
| `HTTP-Referer` | `https://openclaw.ai` |
| `X-OpenRouter-Title` | `OpenClaw` |
| `X-OpenRouter-Categories` | `cli-agent` |
| Header | Waarde |
| ------------------------- | ------------------------------------------------------------------------------------------------------ |
| `HTTP-Referer` | `https://openclaw.ai` |
| `X-OpenRouter-Title` | `OpenClaw` |
| `X-OpenRouter-Categories` | `cli-agent,cloud-agent,programming-app,creative-writing,writing-assistant,general-chat,personal-agent` |
<Warning>
Als je de OpenRouter-provider naar een andere proxy of basis-URL laat verwijzen, injecteert OpenClaw
Als je de OpenRouter-provider naar een andere proxy of basis-URL verwijst, injecteert OpenClaw
die OpenRouter-specifieke headers of Anthropic-cachemarkeringen **niet**.
</Warning>
## Geavanceerde configuratie
<AccordionGroup>
<Accordion title="Anthropic cache markers">
<Accordion title="Respons-caching">
OpenRouter-respons-caching is opt-in. Schakel dit per OpenRouter-model in met
modelparameters:
```json5
{
agents: {
defaults: {
models: {
"openrouter/auto": {
params: {
responseCache: true,
responseCacheTtlSeconds: 300,
},
},
},
},
},
}
```
OpenClaw stuurt `X-OpenRouter-Cache: true` en, wanneer geconfigureerd,
`X-OpenRouter-Cache-TTL`. `responseCacheClear: true` forceert een vernieuwing voor
het huidige verzoek en slaat de vervangende respons op. Snake_case-aliassen
(`response_cache`, `response_cache_ttl_seconds` en
`response_cache_clear`) worden ook geaccepteerd.
Dit staat los van prompt-caching van providers en van OpenRouter's
Anthropic-`cache_control`-markeringen. Het wordt alleen toegepast op geverifieerde
`openrouter.ai`-routes, niet op aangepaste proxy-basis-URL's.
</Accordion>
<Accordion title="Anthropic-cachemarkeringen">
Op geverifieerde OpenRouter-routes behouden Anthropic-modelverwijzingen de
OpenRouter-specifieke Anthropic-`cache_control`-markeringen die OpenClaw gebruikt voor
beter hergebruik van de promptcache op systeem-/ontwikkelaarspromptblokken.
beter hergebruik van prompt-caches op systeem-/ontwikkelaarspromptblokken.
</Accordion>
<Accordion title="Anthropic reasoning prefill">
Op geverifieerde OpenRouter-routes verwijderen Anthropic-modelverwijzingen met ingeschakelde reasoning
afsluitende assistant-prefill-beurten voordat de aanvraag OpenRouter bereikt,
in overeenstemming met Anthropics vereiste dat reasoning-gesprekken eindigen met een
gebruikersbeurt.
<Accordion title="Anthropic-redeneervoorinvulling">
Op geverifieerde OpenRouter-routes verwijderen Anthropic-modelverwijzingen met redeneren ingeschakeld
afsluitende assistant-prefill-beurten voordat het verzoek OpenRouter bereikt,
in overeenstemming met Anthropic's vereiste dat redeneergesprekken eindigen met een gebruikersbeurt.
</Accordion>
<Accordion title="Thinking / reasoning injection">
<Accordion title="Denk-/redeneerinjectie">
Op ondersteunde niet-`auto`-routes koppelt OpenClaw het geselecteerde denkniveau aan
OpenRouter-proxy-reasoning-payloads. Niet-ondersteunde modelhints en
`openrouter/auto` slaan die reasoning-injectie over. Hunter Alpha slaat ook
proxy-reasoning over voor verouderde geconfigureerde modelverwijzingen omdat OpenRouter
definitieve antwoordtekst kon retourneren in reasoning-velden voor die uitgefaseerde route.
OpenRouter-proxyredeneerpayloads. Niet-ondersteunde modelhints en
`openrouter/auto` slaan die redeneerinjectie over. Hunter Alpha slaat ook
proxyredeneren over voor verouderde geconfigureerde modelverwijzingen, omdat OpenRouter
definitieve antwoordtekst in redeneervelden kon retourneren voor die uitgefaseerde route.
</Accordion>
<Accordion title="DeepSeek V4 reasoning replay">
<Accordion title="DeepSeek V4-redeneerreplay">
Op geverifieerde OpenRouter-routes vullen `openrouter/deepseek/deepseek-v4-flash` en
`openrouter/deepseek/deepseek-v4-pro` ontbrekende `reasoning_content` aan op
opnieuw afgespeelde assistant-beurten, zodat denk-/toolgesprekken de door DeepSeek V4
`openrouter/deepseek/deepseek-v4-pro` ontbrekende `reasoning_content` in op
opnieuw afgespeelde assistant-beurten, zodat denk-/toolgesprekken DeepSeek V4's
vereiste opvolgvorm behouden.
</Accordion>
<Accordion title="OpenAI-only request shaping">
<Accordion title="OpenAI-only verzoekvorming">
OpenRouter loopt nog steeds via het proxy-achtige OpenAI-compatibele pad, dus
native aanvraagvorming die alleen voor OpenAI geldt, zoals `serviceTier`, Responses `store`,
OpenAI-reasoning-compat-payloads en promptcache-hints, wordt niet doorgestuurd.
native OpenAI-only verzoekvorming zoals `serviceTier`, Responses `store`,
OpenAI-redeneercompatibiliteitspayloads en prompt-cachehints worden niet doorgestuurd.
</Accordion>
<Accordion title="Gemini-backed routes">
<Accordion title="Door Gemini ondersteunde routes">
Door Gemini ondersteunde OpenRouter-verwijzingen blijven op het proxy-Gemini-pad: OpenClaw behoudt
daar Gemini-thought-signature-opschoning, maar schakelt geen native Gemini-
daar Gemini-thought-signature-sanitatie, maar schakelt geen native Gemini
replayvalidatie of bootstrap-herschrijvingen in.
</Accordion>
<Accordion title="Provider routing metadata">
Als je OpenRouter-providerroutering doorgeeft onder modelparameters, stuurt OpenClaw
die door als OpenRouter-routeringsmetadata voordat de gedeelde stream-wrappers worden uitgevoerd.
<Accordion title="Routeringsmetadata van providers">
Als je OpenRouter-providerroutering onder modelparameters doorgeeft, stuurt OpenClaw
die door als OpenRouter-routeringsmetadata voordat de gedeelde streamwrappers worden uitgevoerd.
</Accordion>
</AccordionGroup>
## Gerelateerd
<CardGroup cols={2}>
<Card title="Model selection" href="/nl/concepts/model-providers" icon="layers">
Providers, modelverwijzingen en failovergedrag kiezen.
<Card title="Modelselectie" href="/nl/concepts/model-providers" icon="layers">
Providers, modelverwijzingen en failover-gedrag kiezen.
</Card>
<Card title="Configuration reference" href="/nl/gateway/configuration-reference" icon="gear">
<Card title="Configuratiereferentie" href="/nl/gateway/configuration-reference" icon="gear">
Volledige configuratiereferentie voor agents, modellen en providers.
</Card>
</CardGroup>

File diff suppressed because it is too large Load Diff

View File

@ -1,36 +1,36 @@
---
read_when:
- Je wilt gelaagde verdediging tegen SSRF- en DNS-rebindingaanvallen
- Een externe doorstuurproxy configureren voor OpenClaw-runtimeverkeer
summary: OpenClaw-runtime-HTTP- en WebSocket-verkeer routeren via een door de operator beheerde filterproxy
- U wilt gelaagde verdediging tegen SSRF- en DNS-rebindingaanvallen
- Een externe forward proxy configureren voor OpenClaw-runtimeverkeer
summary: Hoe u HTTP- en WebSocket-verkeer van de OpenClaw-runtime via een door de operator beheerde filterproxy leidt
title: Netwerkproxy
x-i18n:
generated_at: "2026-05-01T11:23:25Z"
generated_at: "2026-05-04T07:08:46Z"
model: gpt-5.5
provider: openai
source_hash: 9207d349e4410e38631ae7665be19b536e4a4128a4e80dd095e802804dfd66a3
source_hash: fc7140c5ced0e7454a6f85d1ea8f3256bbd28cc0cb42eeafe8e5e6439b90e3f0
source_path: security/network-proxy.md
workflow: 16
---
# Netwerkproxy
OpenClaw kan HTTP- en WebSocket-verkeer tijdens runtime routeren via een door de operator beheerde forward proxy. Dit is optionele defense-in-depth voor implementaties die centrale egress-controle, sterkere SSRF-bescherming en betere netwerkauditbaarheid willen.
OpenClaw kan runtime-HTTP- en WebSocket-verkeer routeren via een door de operator beheerde forward proxy. Dit is optionele verdediging in de diepte voor deployments die centrale egresscontrole, sterkere SSRF-bescherming en betere netwerkauditbaarheid willen.
OpenClaw levert, downloadt, start, configureert of certificeert geen proxy. Je gebruikt de proxytechnologie die bij je omgeving past, en OpenClaw routeert normale proceslokale HTTP- en WebSocket-clients erdoorheen.
OpenClaw levert, downloadt, start, configureert of certificeert geen proxy. Jij draait de proxytechnologie die bij je omgeving past, en OpenClaw routeert normale proceslokale HTTP- en WebSocket-clients erdoorheen.
## Waarom een proxy gebruiken?
Een proxy geeft operators één netwerkcontrolepunt voor uitgaand HTTP- en WebSocket-verkeer. Dat kan ook buiten SSRF-verharding nuttig zijn:
- Centraal beleid: onderhoud één egress-beleid in plaats van erop te vertrouwen dat elke HTTP-aanroepplek in de applicatie de netwerkregels goed toepast.
- Controles tijdens verbinden: evalueer de bestemming na DNS-resolutie en direct voordat de proxy de upstreamverbinding opent.
- Verdediging tegen DNS-rebinding: verklein het gat tussen een DNS-controle op applicatieniveau en de daadwerkelijke uitgaande verbinding.
- Centraal beleid: onderhoud één egressbeleid in plaats van erop te vertrouwen dat elke HTTP-aanroepplaats in de toepassing de netwerkregels goed toepast.
- Controles bij verbinden: evalueer de bestemming na DNS-resolutie en direct voordat de proxy de upstreamverbinding opent.
- Verdediging tegen DNS-rebinding: verklein de kloof tussen een DNS-controle op toepassingsniveau en de daadwerkelijke uitgaande verbinding.
- Bredere JavaScript-dekking: routeer gewone `fetch`, `node:http`, `node:https`, WebSocket, axios, got, node-fetch en vergelijkbare clients via hetzelfde pad.
- Auditbaarheid: log toegestane en geweigerde bestemmingen aan de egress-grens.
- Auditbaarheid: log toegestane en geweigerde bestemmingen aan de egressgrens.
- Operationele controle: dwing bestemmingsregels, netwerksegmentatie, snelheidslimieten of uitgaande allowlists af zonder OpenClaw opnieuw te bouwen.
Proxyrouting is een procesniveau-guardrail voor normale HTTP- en WebSocket-egress. Het geeft operators een fail-closed pad om ondersteunde JavaScript-HTTP-clients via hun eigen filterende proxy te routeren, maar het is geen netwerksandbox op OS-niveau en zorgt er niet voor dat OpenClaw het bestemmingsbeleid van de proxy certificeert.
Proxyroutering is een guardrail op procesniveau voor normale HTTP- en WebSocket-egress. Het geeft operators een fail-closed pad om ondersteunde JavaScript-HTTP-clients via hun eigen filterende proxy te routeren, maar het is geen netwerksandbox op OS-niveau en zorgt er niet voor dat OpenClaw het bestemmingsbeleid van de proxy certificeert.
## Hoe OpenClaw verkeer routeert
@ -43,27 +43,27 @@ OpenClaw process
WebSocket clients -> operator-managed filtering proxy -> public internet
```
Het publieke contract is het routeringsgedrag, niet de interne Node-hooks die worden gebruikt om het te implementeren. OpenClaw Gateway-control-plane WebSocket-clients gebruiken een smal direct pad voor local loopback Gateway-RPC-verkeer wanneer de Gateway-URL `localhost` gebruikt of een letterlijk loopback-IP zoals `127.0.0.1` of `[::1]`. Dat control-plane-pad moet loopback-Gateways kunnen bereiken, zelfs wanneer de operatorproxy loopbackbestemmingen blokkeert. Normale runtime-HTTP- en WebSocket-verzoeken gebruiken nog steeds de geconfigureerde proxy.
Het publieke contract is het routeringsgedrag, niet de interne Node-hooks die worden gebruikt om het te implementeren. WebSocket-clients van het OpenClaw Gateway-control-plane gebruiken een smal direct pad voor local loopback Gateway-RPC-verkeer wanneer de Gateway-URL `localhost` of een letterlijk loopback-IP-adres zoals `127.0.0.1` of `[::1]` gebruikt. Dat control-plane-pad moet loopback-Gateways kunnen bereiken, zelfs wanneer de operatorproxy loopbackbestemmingen blokkeert. Normale runtime-HTTP- en WebSocket-aanvragen gebruiken nog steeds de geconfigureerde proxy.
Intern gebruikt OpenClaw twee procesniveau-routeringshooks voor deze functie:
Intern gebruikt OpenClaw twee routeringshooks op procesniveau voor deze functie:
- Undici-dispatcherrouting dekt `fetch`, clients op basis van undici en transports die hun eigen undici-dispatcher leveren.
- `global-agent`-routing dekt Node-core-aanroepers van `node:http` en `node:https`, waaronder veel bibliotheken die bovenop `http.request`, `https.request`, `http.get` en `https.get` zijn gebouwd. Beheerde proxymodus forceert die globale agent, zodat expliciete Node-HTTP-agents de operatorproxy niet per ongeluk omzeilen.
- Undici-dispatcherroutering dekt `fetch`, clients op basis van undici en transporten die hun eigen undici-dispatcher leveren.
- `global-agent`-routering dekt Node core-aanroepers van `node:http` en `node:https`, waaronder veel bibliotheken die zijn gebouwd op `http.request`, `https.request`, `http.get` en `https.get`. Beheerde proxymodus forceert die globale agent zodat expliciete Node-HTTP-agents niet per ongeluk de operatorproxy omzeilen.
Sommige plugins beheren aangepaste transports die expliciete proxybedrading nodig hebben, zelfs wanneer procesniveau-routing bestaat. Telegram's Bot API-transport gebruikt bijvoorbeeld zijn eigen HTTP/1-undici-dispatcher en respecteert daarom procesproxy-env plus de beheerde `OPENCLAW_PROXY_URL`-fallback in dat eigenaarspecifieke transportpad.
Sommige plugins beheren aangepaste transporten die expliciete proxybedrading nodig hebben, zelfs wanneer routering op procesniveau bestaat. De Bot API-transportlaag van Telegram gebruikt bijvoorbeeld zijn eigen HTTP/1-undici-dispatcher en respecteert daarom de procesproxyomgeving plus de beheerde `OPENCLAW_PROXY_URL`-fallback in dat eigenaarspecifieke transportpad.
De proxy-URL zelf moet `http://` gebruiken. HTTPS-bestemmingen worden nog steeds ondersteund via de proxy met HTTP `CONNECT`; dit betekent alleen dat OpenClaw een gewone HTTP-forward-proxylistener verwacht, zoals `http://127.0.0.1:3128`.
De proxy-URL zelf moet `http://` gebruiken. HTTPS-bestemmingen worden nog steeds via de proxy ondersteund met HTTP `CONNECT`; dit betekent alleen dat OpenClaw een gewone HTTP-forward-proxylistener verwacht, zoals `http://127.0.0.1:3128`.
Terwijl de proxy actief is, wist OpenClaw `no_proxy`, `NO_PROXY` en `GLOBAL_AGENT_NO_PROXY`. Die bypasslijsten zijn bestemmingsgebaseerd, dus als `localhost` of `127.0.0.1` daarin blijft staan, kunnen SSRF-doelen met hoog risico de filterende proxy overslaan.
Terwijl de proxy actief is, wist OpenClaw `no_proxy`, `NO_PROXY` en `GLOBAL_AGENT_NO_PROXY`. Die bypasslijsten zijn bestemmingsgebaseerd, dus als `localhost` of `127.0.0.1` daarin blijft staan, zouden risicovolle SSRF-doelen de filterende proxy kunnen overslaan.
Bij afsluiten herstelt OpenClaw de eerdere proxyomgeving en reset het de gecachte procesrouteringsstatus.
Bij afsluiten herstelt OpenClaw de vorige proxyomgeving en reset het gecachete procesrouteringsstate.
## Gerelateerde proxytermen
## Verwante proxytermen
- `proxy.enabled` / `proxy.proxyUrl`: uitgaande forward-proxyrouting voor OpenClaw-runtime-egress. Deze pagina documenteert die functie.
- `gateway.auth.mode: "trusted-proxy"`: inkomende identity-aware reverse-proxy-authenticatie voor Gateway-toegang. Zie [Trusted proxy-authenticatie](/nl/gateway/trusted-proxy-auth).
- `gateway.auth.mode: "trusted-proxy"`: inkomende identity-aware reverse-proxyauthenticatie voor Gateway-toegang. Zie [Trusted proxy-authenticatie](/nl/gateway/trusted-proxy-auth).
- `openclaw proxy`: lokale debugproxy en capture-inspector voor ontwikkeling en ondersteuning. Zie [openclaw proxy](/nl/cli/proxy).
- Kanaal- of providerspecifieke proxyinstellingen: eigenaarspecifieke overrides voor een bepaald transport. Geef de voorkeur aan de beheerde netwerkproxy wanneer het doel centrale egress-controle over de runtime is.
- Kanaal- of providerspecifieke proxyinstellingen: eigenaarspecifieke overrides voor een bepaald transport. Geef de voorkeur aan de beheerde netwerkproxy wanneer centrale egresscontrole over de runtime het doel is.
## Configuratie
@ -81,9 +81,9 @@ OPENCLAW_PROXY_URL=http://127.0.0.1:3128 openclaw gateway run
`proxy.proxyUrl` heeft voorrang op `OPENCLAW_PROXY_URL`.
Als `enabled=true` maar er geen geldige proxy-URL is geconfigureerd, falen beschermde opdrachten bij het opstarten in plaats van terug te vallen op directe netwerktoegang.
Als `enabled=true` maar er geen geldige proxy-URL is geconfigureerd, mislukken beschermde opdrachten bij het opstarten in plaats van terug te vallen op directe netwerktoegang.
Voor beheerde Gateway-services die met `openclaw gateway start` worden gestart, sla je de URL bij voorkeur op in de configuratie:
Voor beheerde gatewayservices die met `openclaw gateway start` worden gestart, kun je de URL het beste in de configuratie opslaan:
```bash
openclaw config set proxy.enabled true
@ -92,9 +92,9 @@ openclaw gateway install --force
openclaw gateway start
```
De omgevingsfallback is het beste voor foreground-runs. Als je die gebruikt met een geïnstalleerde service, zet `OPENCLAW_PROXY_URL` dan in de duurzame omgeving van de service, zoals `$OPENCLAW_STATE_DIR/.env` of `~/.openclaw/.env`, en installeer de service daarna opnieuw zodat launchd, systemd of Scheduled Tasks de gateway met die waarde start.
De omgevingsfallback is het meest geschikt voor foregroundruns. Als je die met een geïnstalleerde service gebruikt, plaats `OPENCLAW_PROXY_URL` dan in de duurzame omgeving van de service, zoals `$OPENCLAW_STATE_DIR/.env` of `~/.openclaw/.env`, en installeer de service daarna opnieuw zodat launchd, systemd of Scheduled Tasks de gateway met die waarde start.
Voor `openclaw --container ...`-opdrachten stuurt OpenClaw `OPENCLAW_PROXY_URL` door naar de containergerichte child-CLI wanneer die is ingesteld. De URL moet bereikbaar zijn vanuit de container; `127.0.0.1` verwijst naar de container zelf, niet naar de host. OpenClaw weigert loopback-proxy-URL's voor containergerichte opdrachten, tenzij je die veiligheidscontrole expliciet overschrijft.
Voor `openclaw --container ...`-opdrachten geeft OpenClaw `OPENCLAW_PROXY_URL` door aan de containergerichte child-CLI wanneer die is ingesteld. De URL moet bereikbaar zijn vanuit de container; `127.0.0.1` verwijst naar de container zelf, niet naar de host. OpenClaw weigert loopback-proxy-URL's voor containergerichte opdrachten, tenzij je die veiligheidscontrole expliciet overschrijft.
## Proxyvereisten
@ -103,38 +103,38 @@ Het proxybeleid is de beveiligingsgrens. OpenClaw kan niet verifiëren dat de pr
Configureer de proxy om:
- Alleen te binden aan loopback of een privé vertrouwde interface.
- Toegang te beperken zodat alleen het OpenClaw-proces, de host, container of serviceaccount hem kan gebruiken.
- Toegang te beperken zodat alleen het OpenClaw-proces, de host, container of serviceaccount deze kan gebruiken.
- Bestemmingen zelf te resolven en bestemmings-IP's na DNS-resolutie te blokkeren.
- Beleid toe te passen tijdens het verbinden voor zowel gewone HTTP-verzoeken als HTTPS-`CONNECT`-tunnels.
- Bestemmingsgebaseerde bypasses te weigeren voor loopback-, private, link-local-, metadata-, multicast-, gereserveerde of documentatiebereiken.
- Beleid toe te passen bij het verbinden voor zowel gewone HTTP-aanvragen als HTTPS-`CONNECT`-tunnels.
- Bestemmingsgebaseerde bypasses voor loopback, private, link-local, metadata-, multicast-, gereserveerde of documentatiebereiken te weigeren.
- Hostname-allowlists te vermijden, tenzij je het DNS-resolutiepad volledig vertrouwt.
- Bestemming, beslissing, status en reden te loggen zonder request bodies, authorization-headers, cookies of andere geheimen te loggen.
- Proxybeleid onder versiebeheer te houden en wijzigingen te beoordelen als beveiligingsgevoelige configuratie.
- Bestemming, beslissing, status en reden te loggen zonder request bodies, autorisatieheaders, cookies of andere geheimen te loggen.
- Proxybeleid onder versiebeheer te houden en wijzigingen te beoordelen zoals beveiligingsgevoelige configuratie.
## Aanbevolen geblokkeerde bestemmingen
Gebruik deze denylist als startpunt voor elke forward proxy, firewall of egress-beleid.
Gebruik deze denylist als startpunt voor elke forward proxy, firewall of egressbeleid.
OpenClaw-classificatielogica op applicatieniveau staat in `src/infra/net/ssrf.ts` en `src/shared/net/ip.ts`. De relevante pariteitshooks zijn `BLOCKED_HOSTNAMES`, `BLOCKED_IPV4_SPECIAL_USE_RANGES`, `BLOCKED_IPV6_SPECIAL_USE_RANGES`, `RFC2544_BENCHMARK_PREFIX` en de ingebedde IPv4-sentinelafhandeling voor NAT64, 6to4, Teredo, ISATAP en IPv4-mapped vormen. Die bestanden zijn nuttige referenties bij het onderhouden van een extern proxybeleid, maar OpenClaw exporteert of handhaaft die regels niet automatisch in je proxy.
De classifierlogica op OpenClaw-toepassingsniveau staat in `src/infra/net/ssrf.ts` en `src/shared/net/ip.ts`. De relevante parity-hooks zijn `BLOCKED_HOSTNAMES`, `BLOCKED_IPV4_SPECIAL_USE_RANGES`, `BLOCKED_IPV6_SPECIAL_USE_RANGES`, `RFC2544_BENCHMARK_PREFIX` en de ingebedde IPv4-sentinelafhandeling voor NAT64-, 6to4-, Teredo-, ISATAP- en IPv4-mapped vormen. Die bestanden zijn nuttige referenties bij het onderhouden van extern proxybeleid, maar OpenClaw exporteert of handhaaft die regels niet automatisch in je proxy.
| Bereik of host | Waarom blokkeren |
| ------------------------------------------------------------------------------------- | --------------------------------------------------- |
| `127.0.0.0/8`, `localhost`, `localhost.localdomain` | IPv4-loopback |
| `::1/128` | IPv6-loopback |
| `0.0.0.0/8`, `::/128` | Ongespecificeerde en this-network-adressen |
| `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` | RFC1918-private netwerken |
| `169.254.0.0/16`, `fe80::/10` | Link-local-adressen en veelvoorkomende cloudmetadatapaden |
| `169.254.169.254`, `metadata.google.internal` | Cloudmetadataservices |
| `100.64.0.0/10` | Gedeelde adresruimte voor carrier-grade NAT |
| `198.18.0.0/15`, `2001:2::/48` | Benchmarkbereiken |
| `192.0.0.0/24`, `192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`, `2001:db8::/32` | Bereiken voor speciaal gebruik en documentatie |
| `224.0.0.0/4`, `ff00::/8` | Multicast |
| `240.0.0.0/4` | Gereserveerd IPv4 |
| `fc00::/7`, `fec0::/10` | IPv6-lokale/private bereiken |
| `100::/64`, `2001:20::/28` | IPv6-discard- en ORCHIDv2-bereiken |
| `64:ff9b::/96`, `64:ff9b:1::/48` | NAT64-prefixen met ingebedde IPv4 |
| `2002::/16`, `2001::/32` | 6to4 en Teredo met ingebedde IPv4 |
| `::/96`, `::ffff:0:0/96` | IPv4-compatibele en IPv4-mapped IPv6 |
| Bereik of host | Waarom blokkeren |
| ------------------------------------------------------------------------------------ | --------------------------------------------------- |
| `127.0.0.0/8`, `localhost`, `localhost.localdomain` | IPv4-loopback |
| `::1/128` | IPv6-loopback |
| `0.0.0.0/8`, `::/128` | Ongespecificeerde en this-network-adressen |
| `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` | RFC1918-private netwerken |
| `169.254.0.0/16`, `fe80::/10` | Link-local-adressen en algemene cloudmetadatapaden |
| `169.254.169.254`, `metadata.google.internal` | Cloudmetadataservices |
| `100.64.0.0/10` | Gedeelde adresruimte voor carrier-grade NAT |
| `198.18.0.0/15`, `2001:2::/48` | Benchmarkingbereiken |
| `192.0.0.0/24`, `192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`, `2001:db8::/32` | Special-use- en documentatiebereiken |
| `224.0.0.0/4`, `ff00::/8` | Multicast |
| `240.0.0.0/4` | Gereserveerde IPv4 |
| `fc00::/7`, `fec0::/10` | IPv6-lokale/private bereiken |
| `100::/64`, `2001:20::/28` | IPv6-discard- en ORCHIDv2-bereiken |
| `64:ff9b::/96`, `64:ff9b:1::/48` | NAT64-prefixen met ingebedde IPv4 |
| `2002::/16`, `2001::/32` | 6to4 en Teredo met ingebedde IPv4 |
| `::/96`, `::ffff:0:0/96` | IPv4-compatibele en IPv4-mapped IPv6 |
Als je cloudprovider of netwerkplatform aanvullende metadatahosts of gereserveerde bereiken documenteert, voeg die dan ook toe.
@ -146,9 +146,9 @@ Valideer de proxy vanaf dezelfde host, container of serviceaccount waarop OpenCl
openclaw proxy validate --proxy-url http://127.0.0.1:3128
```
Standaard, wanneer er geen aangepaste bestemmingen zijn opgegeven, controleert de opdracht dat `https://example.com/` slaagt en start hij een tijdelijke loopback-canary die de proxy niet mag bereiken. De standaard geweigerde controle slaagt wanneer de proxy een niet-2xx-weigeringsrespons teruggeeft of de canary blokkeert met een transportfout; hij faalt als een succesvolle respons de canary bereikt. Als er geen proxy is ingeschakeld en geconfigureerd, rapporteert validatie een configuratieprobleem; gebruik `--proxy-url` voor een eenmalige preflight voordat je de configuratie wijzigt. Gebruik `--allowed-url` en `--denied-url` om implementatiespecifieke verwachtingen te testen. Aangepaste geweigerde bestemmingen zijn fail-closed: elke HTTP-respons betekent dat de bestemming via de proxy bereikbaar was, en elke transportfout wordt als niet-sluitend gerapporteerd omdat OpenClaw niet kan bewijzen dat de proxy een bereikbare origin heeft geblokkeerd. Bij validatiefout sluit de opdracht af met code 1.
Standaard, wanneer er geen aangepaste bestemmingen zijn opgegeven, controleert de opdracht of `https://example.com/` slaagt en start deze een tijdelijke loopback-canary die de proxy niet mag bereiken. De standaard geweigerde controle slaagt wanneer de proxy een niet-2xx-weigeringsrespons retourneert of de canary blokkeert met een transportfout; deze faalt als een succesvolle respons de canary bereikt. Als er geen proxy is ingeschakeld en geconfigureerd, rapporteert validatie een configuratieprobleem; gebruik `--proxy-url` voor een eenmalige preflight voordat je de configuratie wijzigt. Gebruik `--allowed-url` en `--denied-url` om deployment-specifieke verwachtingen te testen. Aangepaste geweigerde bestemmingen zijn fail-closed: elke HTTP-respons betekent dat de bestemming bereikbaar was via de proxy, en elke transportfout wordt als onbeslist gerapporteerd omdat OpenClaw niet kan bewijzen dat de proxy een bereikbare origin heeft geblokkeerd. Bij validatiefalen sluit de opdracht af met code 1.
Gebruik `--json` voor automatisering. De JSON-uitvoer bevat het algemene resultaat, de effectieve proxyconfiguratiebron, eventuele configuratiefouten en elke bestemmingscontrole. Referenties in proxy-URL's worden geredigeerd in tekst- en JSON-uitvoer:
Gebruik `--json` voor automatisering. De JSON-uitvoer bevat het algemene resultaat, de effectieve proxyconfiguratiebron, eventuele configuratiefouten en elke bestemmingscontrole. Proxy-URL-referenties worden geredigeerd in tekst- en JSON-uitvoer:
```json
{
@ -178,7 +178,7 @@ curl -x http://127.0.0.1:3128 http://127.0.0.1/
curl -x http://127.0.0.1:3128 http://169.254.169.254/
```
Het openbare verzoek zou moeten slagen. De loopback- en metadataverzoeken zouden door de proxy moeten worden geblokkeerd. Voor `openclaw proxy validate` kan de ingebouwde loopback-canary een proxyweigering onderscheiden van een bereikbare oorsprong. Aangepaste `--denied-url`-controles hebben die canary niet, dus behandel zowel HTTP-responses als dubbelzinnige transportfouten als validatiefouten, tenzij je proxy een implementatiespecifiek weigeringssignaal blootstelt dat je afzonderlijk kunt verifiëren.
Het publieke verzoek zou moeten slagen. De loopback- en metadataverzoeken moeten door de proxy worden geblokkeerd. Voor `openclaw proxy validate` kan de ingebouwde loopback-canary een proxyweigering onderscheiden van een bereikbare oorsprong. Aangepaste `--denied-url`-controles hebben die canary niet, dus behandel zowel HTTP-antwoorden als ambigue transportfouten als validatiefouten, tenzij je proxy een implementatiespecifiek weigeringssignaal blootstelt dat je afzonderlijk kunt verifiëren.
Schakel daarna OpenClaw-proxyrouting in:
@ -196,11 +196,13 @@ proxy:
proxyUrl: http://127.0.0.1:3128
```
## Limieten
## Beperkingen
- De proxy verbetert de dekking voor proceslokale JavaScript-HTTP- en WebSocket-clients, maar is geen netwerksandbox op OS-niveau.
- De proxy verbetert de dekking voor proceslokale JavaScript-HTTP- en WebSocket-clients, maar is geen netwerk-sandbox op OS-niveau.
- Ruwe `net`-, `tls`- en `http2`-sockets, native add-ons en childprocessen kunnen Node-proxyrouting omzeilen, tenzij ze proxy-omgevingsvariabelen erven en respecteren.
- Lokale WebUI's van gebruikers en lokale modelservers moeten waar nodig op de allowlist in het proxybeleid van de operator worden gezet; OpenClaw biedt hiervoor geen algemene bypass voor het lokale netwerk.
- De proxybypass voor het Gateway-control plane is bewust beperkt tot `localhost` en letterlijke loopback-IP-URL's. Gebruik `ws://127.0.0.1:18789`, `ws://[::1]:18789` of `ws://localhost:18789` voor lokale directe Gateway-control-plane-verbindingen; andere hostnamen worden gerouteerd als gewoon hostnaamgebaseerd verkeer.
- IRC is een ruw TCP/TLS-kanaal buiten door operators beheerde forward-proxyrouting. Stel in implementaties die alle uitgaande verbindingen via die forward proxy vereisen `channels.irc.enabled=false` in, tenzij directe IRC-uitgaande verbindingen expliciet zijn goedgekeurd.
- De lokale debugproxy is diagnostische tooling en de directe upstream-forwarding voor proxyverzoeken en CONNECT-tunnels is standaard uitgeschakeld zolang beheerde proxymodus actief is; schakel directe forwarding alleen in voor goedgekeurde lokale diagnostiek.
- Lokale WebUIs van gebruikers en lokale modelservers moeten waar nodig op de allowlist in het operatorproxybeleid worden gezet; OpenClaw stelt hiervoor geen algemene bypass voor het lokale netwerk beschikbaar.
- Gateway-control-plane-proxybypass is bewust beperkt tot `localhost` en letterlijke loopback-IP-URLs. Gebruik `ws://127.0.0.1:18789`, `ws://[::1]:18789` of `ws://localhost:18789` voor lokale directe Gateway-control-plane-verbindingen; andere hostnamen worden gerouteerd zoals normaal hostnaamgebaseerd verkeer.
- OpenClaw inspecteert, test of certificeert je proxybeleid niet.
- Behandel wijzigingen in proxybeleid als beveiligingsgevoelige operationele wijzigingen.

View File

@ -1,14 +1,14 @@
---
read_when:
- Je wilt een LLM-stap met alleen JSON binnen werkstromen
- Je wilt een LLM-stap met alleen JSON binnen workflows
- Je hebt schema-gevalideerde LLM-uitvoer nodig voor automatisering
summary: LLM-taken met alleen JSON voor werkstromen (optionele plugin-tool)
summary: LLM-taken uitsluitend in JSON voor workflows (optionele Plugin-tool)
title: LLM-taak
x-i18n:
generated_at: "2026-04-29T23:24:45Z"
generated_at: "2026-05-04T07:09:02Z"
model: gpt-5.5
provider: openai
source_hash: 613aefd1bac5b9675821a118c11130c8bfaefb1673d0266f14ff4e91b47fed8b
source_hash: 9cdc5d4feef17fb6d6d90d819d4c92d26a4ec43e4f5364c6acbaad1934a89269
source_path: tools/llm-task.md
workflow: 16
---
@ -17,9 +17,9 @@ x-i18n:
gestructureerde uitvoer retourneert (optioneel gevalideerd tegen JSON Schema).
Dit is ideaal voor workflow-engines zoals Lobster: je kunt één LLM-stap toevoegen
zonder aangepaste OpenClaw-code voor elke workflow te schrijven.
zonder voor elke workflow aangepaste OpenClaw-code te schrijven.
## Schakel de Plugin in
## De Plugin inschakelen
1. Schakel de Plugin in:
@ -33,21 +33,18 @@ zonder aangepaste OpenClaw-code voor elke workflow te schrijven.
}
```
2. Zet de tool op de allowlist (deze is geregistreerd met `optional: true`):
2. Sta de optionele tool toe:
```json
{
"agents": {
"list": [
{
"id": "main",
"tools": { "allow": ["llm-task"] }
}
]
"tools": {
"alsoAllow": ["llm-task"]
}
}
```
Gebruik `tools.allow` alleen wanneer je een restrictieve allowlist-modus wilt.
## Configuratie (optioneel)
```json
@ -70,27 +67,27 @@ zonder aangepaste OpenClaw-code voor elke workflow te schrijven.
}
```
`allowedModels` is een allowlist van `provider/model`-strings. Als deze is ingesteld, wordt elk verzoek
`allowedModels` is een allowlist van `provider/model`-tekenreeksen. Als dit is ingesteld, wordt elk verzoek
buiten de lijst geweigerd.
## Toolparameters
- `prompt` (string, vereist)
- `input` (any, optioneel)
- `prompt` (tekenreeks, vereist)
- `input` (elke waarde, optioneel)
- `schema` (object, optioneel JSON Schema)
- `provider` (string, optioneel)
- `model` (string, optioneel)
- `thinking` (string, optioneel)
- `authProfileId` (string, optioneel)
- `temperature` (number, optioneel)
- `maxTokens` (number, optioneel)
- `timeoutMs` (number, optioneel)
- `provider` (tekenreeks, optioneel)
- `model` (tekenreeks, optioneel)
- `thinking` (tekenreeks, optioneel)
- `authProfileId` (tekenreeks, optioneel)
- `temperature` (getal, optioneel)
- `maxTokens` (getal, optioneel)
- `timeoutMs` (getal, optioneel)
`thinking` accepteert de standaard redeneerpresets van OpenClaw, zoals `low` of `medium`.
## Uitvoer
Retourneert `details.json` met de geparste JSON (en valideert tegen
Retourneert `details.json` met de geparseerde JSON (en valideert tegen
`schema` wanneer opgegeven).
## Voorbeeld: Lobster-workflowstap
@ -115,16 +112,16 @@ openclaw.invoke --tool llm-task --action json --args-json '{
}'
```
## Veiligheidsnotities
## Veiligheidsopmerkingen
- De tool is **alleen JSON** en instrueert het model om alleen JSON uit te voeren (geen
- De tool werkt met **alleen JSON** en instrueert het model om uitsluitend JSON uit te voeren (geen
code fences, geen commentaar).
- Er worden voor deze uitvoering geen tools aan het model blootgesteld.
- Behandel uitvoer als onvertrouwd tenzij je valideert met `schema`.
- Er worden voor deze uitvoering geen tools aan het model beschikbaar gesteld.
- Behandel uitvoer als niet-vertrouwd, tenzij je valideert met `schema`.
- Plaats goedkeuringen vóór elke stap met neveneffecten (verzenden, posten, uitvoeren).
## Gerelateerd
- [Denk­niveaus](/nl/tools/thinking)
- [Subagenten](/nl/tools/subagents)
- [Slash-opdrachten](/nl/tools/slash-commands)
- [Denk-niveaus](/nl/tools/thinking)
- [Sub-agents](/nl/tools/subagents)
- [Slash-commando's](/nl/tools/slash-commands)

View File

@ -1,52 +1,52 @@
---
read_when:
- Je wilt deterministische werkstromen met meerdere stappen en expliciete goedkeuringen
- Je moet een workflow hervatten zonder eerdere stappen opnieuw uit te voeren
summary: Getypeerde runtime voor workflows voor OpenClaw met hervatbare goedkeuringspoorten.
- Je wilt deterministische workflows met meerdere stappen en expliciete goedkeuringen
- Je moet een werkstroom hervatten zonder eerdere stappen opnieuw uit te voeren
summary: Getypeerde workflowruntime voor OpenClaw met hervatbare goedkeuringspoorten.
title: Kreeft
x-i18n:
generated_at: "2026-04-29T23:24:47Z"
generated_at: "2026-05-04T07:09:15Z"
model: gpt-5.5
provider: openai
source_hash: 1700bcfdbcf4558cb908935834e9059221d0d26ad78ed6f9e2158f7e0b83edbd
source_hash: 67f5145b11f2d6e07e9d78a44a389ae5f236c85ec8c287ab0f217a18b622ece0
source_path: tools/lobster.md
workflow: 16
---
Lobster is een workflowshell waarmee OpenClaw meerstapstoolreeksen kan uitvoeren als één enkele, deterministische bewerking met expliciete goedkeuringscontrolepunten.
Lobster is een workflow-shell waarmee OpenClaw meerstaps toolreeksen kan uitvoeren als één enkele, deterministische bewerking met expliciete goedkeuringscontrolepunten.
Lobster is één authoringlaag boven losgekoppeld achtergrondwerk. Voor flow-orkestratie boven individuele taken, zie [Taakstroom](/nl/automation/taskflow) (`openclaw tasks flow`). Voor het taakactiviteitenlogboek, zie [`openclaw tasks`](/nl/automation/tasks).
Lobster is één auteurslaag boven losgekoppeld achtergrondwerk. Zie [Task Flow](/nl/automation/taskflow) (`openclaw tasks flow`) voor flow-orkestratie boven afzonderlijke taken. Zie [`openclaw tasks`](/nl/automation/tasks) voor het activiteitenlogboek van taken.
## Hook
Je assistent kan de tools bouwen waarmee hij zichzelf beheert. Vraag om een workflow, en 30 minuten later heb je een CLI plus pipelines die als één aanroep draaien. Lobster is het ontbrekende stuk: deterministische pipelines, expliciete goedkeuringen en hervatbare status.
Je assistent kan de tools bouwen die zichzelf beheren. Vraag om een workflow, en 30 minuten later heb je een CLI plus pipelines die als één aanroep worden uitgevoerd. Lobster is het ontbrekende onderdeel: deterministische pipelines, expliciete goedkeuringen en hervatbare status.
## Waarom
Vandaag vereisen complexe workflows veel heen-en-weergaande toolaanroepen. Elke aanroep kost tokens, en de LLM moet elke stap orkestreren. Lobster verplaatst die orkestratie naar een getypte runtime:
Tegenwoordig vereisen complexe workflows veel heen-en-weergaande toolaanroepen. Elke aanroep kost tokens, en de LLM moet elke stap orkestreren. Lobster verplaatst die orkestratie naar een getypeerde runtime:
- **Eén aanroep in plaats van veel**: OpenClaw voert één Lobster-toolaanroep uit en krijgt een gestructureerd resultaat.
- **Goedkeuringen ingebouwd**: Bijwerkingen (e-mail verzenden, reactie plaatsen) pauzeren de workflow totdat ze expliciet zijn goedgekeurd.
- **Hervatbaar**: Gepauzeerde workflows retourneren een token; keur goed en hervat zonder alles opnieuw uit te voeren.
- **Goedkeuringen ingebouwd**: Bijwerkingen (e-mail verzenden, reactie plaatsen) stoppen de workflow totdat ze expliciet zijn goedgekeurd.
- **Hervatbaar**: Gestopte workflows retourneren een token; keur goed en hervat zonder alles opnieuw uit te voeren.
## Waarom een DSL in plaats van gewone programma's?
Lobster is bewust klein. Het doel is niet "een nieuwe taal", maar een voorspelbare, AI-vriendelijke pipelinespecificatie met eersteklas goedkeuringen en hervattingstokens.
Lobster is bewust klein. Het doel is niet "een nieuwe taal", maar een voorspelbare, AI-vriendelijke pipelinespecificatie met eersteklas goedkeuringen en hervattokens.
- **Goedkeuren/hervatten is ingebouwd**: Een normaal programma kan een mens om input vragen, maar het kan niet _pauzeren en hervatten_ met een duurzaam token zonder dat je die runtime zelf uitvindt.
- **Determinisme + controleerbaarheid**: Pipelines zijn data, dus ze zijn eenvoudig te loggen, diffen, opnieuw af te spelen en te beoordelen.
- **Goedkeuren/hervatten is ingebouwd**: Een normaal programma kan een mens om invoer vragen, maar het kan niet _pauzeren en hervatten_ met een duurzaam token zonder dat je die runtime zelf uitvindt.
- **Determinisme + controleerbaarheid**: Pipelines zijn data, dus ze zijn gemakkelijk te loggen, te diffen, opnieuw af te spelen en te reviewen.
- **Beperkt oppervlak voor AI**: Een kleine grammatica + JSON-piping vermindert “creatieve” codepaden en maakt validatie realistisch.
- **Veiligheidsbeleid ingebakken**: Time-outs, uitvoerlimieten, sandboxcontroles en allowlists worden afgedwongen door de runtime, niet door elk script.
- **Nog steeds programmeerbaar**: Elke stap kan elke CLI of elk script aanroepen. Als je JS/TS wilt, genereer `.lobster`-bestanden vanuit code.
- **Veiligheidsbeleid ingebakken**: Time-outs, uitvoerlimieten, sandboxcontroles en allowlists worden door de runtime afgedwongen, niet door elk script.
- **Nog steeds programmeerbaar**: Elke stap kan elke CLI of elk script aanroepen. Als je JS/TS wilt, genereer dan `.lobster`-bestanden vanuit code.
## Hoe het werkt
OpenClaw voert Lobster-workflows **in-process** uit met een ingebedde runner. Er wordt geen extern CLI-subproces gestart; de workflowengine voert uit binnen het gatewayproces en retourneert rechtstreeks een JSON-envelope.
OpenClaw voert Lobster-workflows **in-process** uit met een ingesloten runner. Er wordt geen extern CLI-subproces gestart; de workflow-engine wordt binnen het Gateway-proces uitgevoerd en retourneert direct een JSON-envelope.
Als de pipeline pauzeert voor goedkeuring, retourneert de tool een `resumeToken` zodat je later kunt doorgaan.
## Patroon: kleine CLI + JSON-pipes + goedkeuringen
Bouw kleine commando's die JSON spreken en keten ze vervolgens in één enkele Lobster-aanroep. (Voorbeeldcommandonamen hieronder — vervang ze door je eigen namen.)
Bouw kleine opdrachten die JSON spreken en koppel ze vervolgens aan elkaar tot één Lobster-aanroep. (Voorbeeldopdrachtnamen hieronder — vervang ze door je eigen namen.)
```bash
inbox list --json
@ -62,7 +62,7 @@ inbox apply --json
}
```
Als de pipeline om goedkeuring vraagt, hervat je met het token:
Als de pipeline om goedkeuring vraagt, hervat dan met het token:
```json
{
@ -81,11 +81,11 @@ gog.gmail.search --query 'newer_than:1d' \
| openclaw.invoke --tool message --action send --each --item-key message --args-json '{"provider":"telegram","to":"..."}'
```
## Alleen-JSON LLM-stappen (llm-task)
## JSON-only LLM-stappen (llm-task)
Voor workflows die een **gestructureerde LLM-stap** nodig hebben, schakel je de optionele
`llm-task`-Plugin-tool in en roep je die aan vanuit Lobster. Dit houdt de workflow
deterministisch terwijl je nog steeds met een model kunt classificeren/samenvatten/opstellen.
`llm-task` Plugin-tool in en roep je die aan vanuit Lobster. Zo blijft de workflow
deterministisch terwijl je nog steeds met een model kunt classificeren, samenvatten of opstellen.
Schakel de tool in:
@ -100,7 +100,7 @@ Schakel de tool in:
"list": [
{
"id": "main",
"tools": { "allow": ["llm-task"] }
"tools": { "alsoAllow": ["llm-task"] }
}
]
}
@ -126,11 +126,11 @@ openclaw.invoke --tool llm-task --action json --args-json '{
}'
```
Zie [LLM-taak](/nl/tools/llm-task) voor details en configuratieopties.
Zie [LLM Task](/nl/tools/llm-task) voor details en configuratieopties.
## Workflowbestanden (.lobster)
Lobster kan YAML/JSON-workflowbestanden uitvoeren met `name`, `args`, `steps`, `env`, `condition` en `approval`-velden. Stel in OpenClaw-toolaanroepen `pipeline` in op het bestandspad.
Lobster kan YAML/JSON-workflowbestanden uitvoeren met velden `name`, `args`, `steps`, `env`, `condition` en `approval`. Stel in OpenClaw-toolaanroepen `pipeline` in op het bestandspad.
```yaml
name: inbox-triage
@ -153,16 +153,16 @@ steps:
condition: $approve.approved
```
Notities:
Opmerkingen:
- `stdin: $step.stdout` en `stdin: $step.json` geven de uitvoer van een eerdere stap door.
- `condition` (of `when`) kan stappen poorten op `$step.approved`.
## Lobster installeren
Gebundelde Lobster-workflows draaien in-process; er is geen aparte `lobster`-binary vereist. De ingebedde runner wordt meegeleverd met de Lobster-Plugin.
Gebundelde Lobster-workflows worden in-process uitgevoerd; er is geen aparte `lobster`-binary vereist. De ingesloten runner wordt meegeleverd met de Lobster-Plugin.
Als je de zelfstandige Lobster-CLI nodig hebt voor ontwikkeling of externe pipelines, installeer die dan vanuit de [Lobster-repo](https://github.com/openclaw/lobster) en zorg dat `lobster` op `PATH` staat.
Als je de standalone Lobster-CLI nodig hebt voor ontwikkeling of externe pipelines, installeer deze dan vanuit de [Lobster-repo](https://github.com/openclaw/lobster) en zorg dat `lobster` op `PATH` staat.
## De tool inschakelen
@ -195,10 +195,10 @@ Of per agent:
}
```
Vermijd het gebruik van `tools.allow: ["lobster"]`, tenzij je van plan bent in restrictieve allowlistmodus te draaien.
Vermijd het gebruik van `tools.allow: ["lobster"]`, tenzij je in restrictieve allowlist-modus wilt draaien.
<Note>
Allowlists zijn opt-in voor optionele plugins. Als je allowlist alleen Plugin-tools noemt (zoals `lobster`), houdt OpenClaw kerntools ingeschakeld. Om kerntools te beperken, neem je ook de kerntools of groepen op die je in de allowlist wilt hebben.
Allowlists zijn opt-in voor optionele plugins. `alsoAllow` schakelt alleen de genoemde optionele Plugin-tools in terwijl de normale set core-tools behouden blijft. Gebruik `tools.allow` met de core-tools of groepen die je wilt om core-tools te beperken.
</Note>
## Voorbeeld: e-mailtriage
@ -226,7 +226,7 @@ Met Lobster:
}
```
Retourneert een JSON-envelope (afgekapt):
Retourneert een JSON-envelope (ingekort):
```json
{
@ -270,7 +270,7 @@ Voer een pipeline uit in toolmodus.
}
```
Voer een workflowbestand uit met args:
Voer een workflowbestand uit met argumenten:
```json
{
@ -282,7 +282,7 @@ Voer een workflowbestand uit met args:
### `resume`
Ga door met een gepauzeerde workflow na goedkeuring.
Ga na goedkeuring door met een gestopte workflow.
```json
{
@ -294,8 +294,8 @@ Ga door met een gepauzeerde workflow na goedkeuring.
### Optionele invoer
- `cwd`: Relatieve werkdirectory voor de pipeline (moet binnen de gatewaywerkdirectory blijven).
- `timeoutMs`: Breek de workflow af als deze deze duur overschrijdt (standaard: 20000).
- `cwd`: Relatieve werkmap voor de pipeline (moet binnen de werkmap van de Gateway blijven).
- `timeoutMs`: Breek de workflow af als deze langer duurt dan deze duur (standaard: 20000).
- `maxStdoutBytes`: Breek de workflow af als de uitvoer deze grootte overschrijdt (standaard: 512000).
- `argsJson`: JSON-string die wordt doorgegeven aan `lobster run --args-json` (alleen workflowbestanden).
@ -311,39 +311,39 @@ De tool toont de envelope zowel in `content` (mooie JSON) als in `details` (ruw
## Goedkeuringen
Als `requiresApproval` aanwezig is, inspecteer je de prompt en beslis je:
Als `requiresApproval` aanwezig is, inspecteer dan de prompt en beslis:
- `approve: true` → hervat en ga door met bijwerkingen
- `approve: false` → annuleer en voltooi de workflow
- `approve: false` → annuleer en rond de workflow af
Gebruik `approve --preview-from-stdin --limit N` om een JSON-preview aan goedkeuringsverzoeken te koppelen zonder aangepaste jq/heredoc-lijm. Hervattingstokens zijn nu compact: Lobster slaat de hervattingsstatus van workflows op onder zijn statusdirectory en geeft een kleine tokensleutel terug.
Gebruik `approve --preview-from-stdin --limit N` om zonder aangepaste jq/heredoc-lijm een JSON-preview aan goedkeuringsverzoeken toe te voegen. Hervattokens zijn nu compact: Lobster slaat de hervatstatus van workflows op onder zijn statusmap en geeft een kleine tokensleutel terug.
## OpenProse
OpenProse werkt goed samen met Lobster: gebruik `/prose` om multi-agentvoorbereiding te orkestreren en voer daarna een Lobster-pipeline uit voor deterministische goedkeuringen. Als een Prose-programma Lobster nodig heeft, sta dan de `lobster`-tool toe voor subagents via `tools.subagents.tools`. Zie [OpenProse](/nl/prose).
OpenProse werkt goed samen met Lobster: gebruik `/prose` om voorbereiding met meerdere agents te orkestreren en voer daarna een Lobster-pipeline uit voor deterministische goedkeuringen. Als een Prose-programma Lobster nodig heeft, sta dan de `lobster`-tool toe voor sub-agents via `tools.subagents.tools`. Zie [OpenProse](/nl/prose).
## Veiligheid
- **Alleen lokaal in-process** — workflows worden uitgevoerd binnen het gatewayproces; geen netwerkoproepen vanuit de Plugin zelf.
- **Alleen lokaal in-process** — workflows worden uitgevoerd binnen het Gateway-proces; geen netwerkoproepen vanuit de Plugin zelf.
- **Geen geheimen** — Lobster beheert geen OAuth; het roept OpenClaw-tools aan die dat doen.
- **Sandbox-bewust** — uitgeschakeld wanneer de toolcontext gesandboxt is.
- **Verhard** — time-outs en uitvoerlimieten worden afgedwongen door de ingebedde runner.
- **Sandboxbewust** — uitgeschakeld wanneer de toolcontext gesandboxed is.
- **Verhard** — time-outs en uitvoerlimieten worden afgedwongen door de ingesloten runner.
## Problemen oplossen
- **`lobster timed out`** → verhoog `timeoutMs`, of splits een lange pipeline.
- **`lobster output exceeded maxStdoutBytes`** → verhoog `maxStdoutBytes` of verminder de uitvoergrootte.
- **`lobster timed out`** → verhoog `timeoutMs` of splits een lange pipeline.
- **`lobster output exceeded maxStdoutBytes`** → verhoog `maxStdoutBytes` of verklein de uitvoergrootte.
- **`lobster returned invalid JSON`** → zorg dat de pipeline in toolmodus draait en alleen JSON print.
- **`lobster failed`** → controleer gatewaylogs voor foutdetails van de ingebedde runner.
- **`lobster failed`** → controleer Gateway-logs voor de foutdetails van de ingesloten runner.
## Meer informatie
- [Plugins](/nl/tools/plugin)
- [Plugin-toolauthoring](/nl/plugins/building-plugins#registering-agent-tools)
- [Plugin-tools schrijven](/nl/plugins/building-plugins#registering-agent-tools)
## Casestudy: communityworkflows
Eén openbaar voorbeeld: een “second brain”-CLI + Lobster-pipelines die drie Markdown-vaults beheren (persoonlijk, partner, gedeeld). De CLI geeft JSON uit voor statistieken, inboxlijsten en scans op verouderde inhoud; Lobster ketent die commando's in workflows zoals `weekly-review`, `inbox-triage`, `memory-consolidation` en `shared-task-sync`, elk met goedkeuringspoorten. AI handelt beoordeling af (categorisatie) wanneer beschikbaar en valt terug op deterministische regels wanneer dat niet zo is.
Eén openbaar voorbeeld: een “second brain”-CLI + Lobster-pipelines die drie Markdown-vaults beheren (persoonlijk, partner, gedeeld). De CLI geeft JSON uit voor statistieken, inboxlijsten en stale-scans; Lobster koppelt die opdrachten aan elkaar tot workflows zoals `weekly-review`, `inbox-triage`, `memory-consolidation` en `shared-task-sync`, elk met goedkeuringspoorten. AI verwerkt oordeel (categorisatie) wanneer beschikbaar en valt terug op deterministische regels wanneer dat niet zo is.
- Thread: [https://x.com/plattenschieber/status/2014508656335770033](https://x.com/plattenschieber/status/2014508656335770033)
- Repo: [https://github.com/bloomedai/brain-cli](https://github.com/bloomedai/brain-cli)
@ -352,4 +352,4 @@ Eén openbaar voorbeeld: een “second brain”-CLI + Lobster-pipelines die drie
- [Automatisering en taken](/nl/automation) — Lobster-workflows plannen
- [Automatiseringsoverzicht](/nl/automation) — alle automatiseringsmechanismen
- [Toolsoverzicht](/nl/tools) — alle beschikbare agenttools
- [Toolsoverzicht](/nl/tools) — alle beschikbare agent-tools

View File

@ -1,42 +1,42 @@
---
read_when:
- Chatcommando's gebruiken of configureren
- Foutopsporing van opdrachtroutering of machtigingen
- Chatopdrachten gebruiken of configureren
- Opdrachtroutering of machtigingen debuggen
sidebarTitle: Slash commands
summary: 'Slashcommando''s: tekst versus systeemeigen, configuratie en ondersteunde commando''s'
title: Slash-commando's
summary: 'Slash-commando''s: tekst versus systeemeigen, configuratie en ondersteunde commando''s'
title: Slash-opdrachten
x-i18n:
generated_at: "2026-05-03T21:38:48Z"
generated_at: "2026-05-04T07:09:18Z"
model: gpt-5.5
provider: openai
source_hash: 9fbdd76ccd43159cabfbc3f15f7bddd2a7ada07fcd6eea2e169d2d88df18f28c
source_hash: 49eb41674c8d0a01dbd28a2df783eb9aba3dde18d8425951a266cede825e9a84
source_path: tools/slash-commands.md
workflow: 16
---
Opdrachten worden afgehandeld door de Gateway. De meeste opdrachten moeten worden verzonden als een **zelfstandig** bericht dat begint met `/`. De host-only bash-chatopdracht gebruikt `! <cmd>` (met `/bash <cmd>` als alias).
Wanneer een gesprek of thread is gekoppeld aan een ACP-sessie, wordt normale vervolgtekst naar die ACP-harness gerouteerd. Gateway-beheeropdrachten blijven nog steeds lokaal: `/acp ...` bereikt altijd de OpenClaw ACP-opdrachthandler, en `/status` plus `/unfocus` blijven lokaal wanneer opdrachtafhandeling is ingeschakeld voor het oppervlak.
Wanneer een gesprek of thread is gekoppeld aan een ACP-sessie, wordt normale vervolgtekst naar die ACP-harness geleid. Gateway-beheeropdrachten blijven lokaal: `/acp ...` bereikt altijd de OpenClaw ACP-opdrachthandler, en `/status` plus `/unfocus` blijven lokaal wanneer opdrachtafhandeling voor het oppervlak is ingeschakeld.
Er zijn twee verwante systemen:
Er zijn twee gerelateerde systemen:
<AccordionGroup>
<Accordion title="Opdrachten">
<Accordion title="Commands">
Zelfstandige `/...`-berichten.
</Accordion>
<Accordion title="Directieven">
<Accordion title="Directives">
`/think`, `/fast`, `/verbose`, `/trace`, `/reasoning`, `/elevated`, `/exec`, `/model`, `/queue`.
- Directieven worden uit het bericht verwijderd voordat het model ze ziet.
- In normale chatberichten (niet alleen directieven) worden ze behandeld als "inline hints" en blijven sessie-instellingen **niet** behouden.
- In berichten die alleen directieven bevatten (het bericht bevat uitsluitend directieven), blijven ze behouden voor de sessie en wordt er met een bevestiging geantwoord.
- Directieven worden alleen toegepast voor **geautoriseerde afzenders**. Als `commands.allowFrom` is ingesteld, is dit de enige gebruikte allowlist; anders komt autorisatie uit kanaal-allowlists/koppeling plus `commands.useAccessGroups`. Ongeautoriseerde afzenders zien directieven behandeld als platte tekst.
- Directives worden uit het bericht verwijderd voordat het model het ziet.
- In normale chatberichten (niet alleen directives) worden ze behandeld als "inline hints" en blijven sessie-instellingen **niet** bewaard.
- In berichten met alleen directives (het bericht bevat alleen directives) blijven ze bewaard in de sessie en wordt er geantwoord met een bevestiging.
- Directives worden alleen toegepast voor **geautoriseerde afzenders**. Als `commands.allowFrom` is ingesteld, is dat de enige allowlist die wordt gebruikt; anders komt autorisatie uit kanaalallowlists/koppeling plus `commands.useAccessGroups`. Ongeautoriseerde afzenders zien directives behandeld als platte tekst.
</Accordion>
<Accordion title="Inline snelkoppelingen">
<Accordion title="Inline shortcuts">
Alleen afzenders op de allowlist/geautoriseerde afzenders: `/help`, `/commands`, `/status`, `/whoami` (`/id`).
Ze worden direct uitgevoerd, worden verwijderd voordat het model het bericht ziet, en de resterende tekst gaat verder via de normale flow.
Ze worden onmiddellijk uitgevoerd, verwijderd voordat het model het bericht ziet, en de resterende tekst gaat verder via de normale flow.
</Accordion>
</AccordionGroup>
@ -69,20 +69,20 @@ Er zijn twee verwante systemen:
```
<ParamField path="commands.text" type="boolean" default="true">
Schakelt het parsen van `/...` in chatberichten in. Op oppervlakken zonder native opdrachten (WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams) werken tekstopdrachten nog steeds, zelfs als u dit instelt op `false`.
Schakelt het parsen van `/...` in chatberichten in. Op oppervlakken zonder native opdrachten (WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams) blijven tekstopdrachten werken, zelfs als je dit op `false` zet.
</ParamField>
<ParamField path="commands.native" type='boolean | "auto"' default='"auto"'>
Registreert native opdrachten. Auto: aan voor Discord/Telegram; uit voor Slack (totdat u slash-opdrachten toevoegt); genegeerd voor providers zonder native ondersteuning. Stel `channels.discord.commands.native`, `channels.telegram.commands.native` of `channels.slack.commands.native` in om per provider te overschrijven (bool of `"auto"`). Op Discord slaat `false` de registratie en opschoning van slash-opdrachten tijdens het opstarten over; eerder geregistreerde opdrachten kunnen zichtbaar blijven totdat u ze uit de Discord-app verwijdert. Slack-opdrachten worden beheerd in de Slack-app en worden niet automatisch verwijderd.
Registreert native opdrachten. Auto: aan voor Discord/Telegram; uit voor Slack (totdat je slash-opdrachten toevoegt); genegeerd voor providers zonder native ondersteuning. Stel `channels.discord.commands.native`, `channels.telegram.commands.native` of `channels.slack.commands.native` in om per provider te overschrijven (bool of `"auto"`). Op Discord slaat `false` registratie en opschoning van slash-opdrachten tijdens het opstarten over; eerder geregistreerde opdrachten kunnen zichtbaar blijven totdat je ze uit de Discord-app verwijdert. Slack-opdrachten worden beheerd in de Slack-app en worden niet automatisch verwijderd.
</ParamField>
Op Discord kunnen native opdrachtspecificaties `descriptionLocalizations` bevatten, die OpenClaw publiceert als Discord `description_localizations` en opneemt in reconciliatievergelijkingen.
Op Discord kunnen native opdrachtspecificaties `descriptionLocalizations` bevatten, die OpenClaw publiceert als Discord `description_localizations` en meeneemt in reconcile-vergelijkingen.
<ParamField path="commands.nativeSkills" type='boolean | "auto"' default='"auto"'>
Registreert **skill**-opdrachten native wanneer ondersteund. Auto: aan voor Discord/Telegram; uit voor Slack (Slack vereist het maken van een slash-opdracht per skill). Stel `channels.discord.commands.nativeSkills`, `channels.telegram.commands.nativeSkills` of `channels.slack.commands.nativeSkills` in om per provider te overschrijven (bool of `"auto"`).
Registreert **skill**-opdrachten native wanneer ondersteund. Auto: aan voor Discord/Telegram; uit voor Slack (Slack vereist dat je per skill een slash-opdracht maakt). Stel `channels.discord.commands.nativeSkills`, `channels.telegram.commands.nativeSkills` of `channels.slack.commands.nativeSkills` in om per provider te overschrijven (bool of `"auto"`).
</ParamField>
<ParamField path="commands.bash" type="boolean" default="false">
Schakelt `! <cmd>` in om host-shellopdrachten uit te voeren (`/bash <cmd>` is een alias; vereist `tools.elevated`-allowlists).
</ParamField>
<ParamField path="commands.bashForegroundMs" type="number" default="2000">
Bepaalt hoe lang bash wacht voordat wordt overgeschakeld naar achtergrondmodus (`0` zet direct op de achtergrond).
Bepaalt hoelang bash wacht voordat wordt overgeschakeld naar achtergrondmodus (`0` zet meteen op de achtergrond).
</ParamField>
<ParamField path="commands.config" type="boolean" default="false">
Schakelt `/config` in (leest/schrijft `openclaw.json`).
@ -91,7 +91,7 @@ Op Discord kunnen native opdrachtspecificaties `descriptionLocalizations` bevatt
Schakelt `/mcp` in (leest/schrijft door OpenClaw beheerde MCP-configuratie onder `mcp.servers`).
</ParamField>
<ParamField path="commands.plugins" type="boolean" default="false">
Schakelt `/plugins` in (Plugin-detectie/status plus installatie- en in-/uitschakelbediening).
Schakelt `/plugins` in (Plugin-ontdekking/status plus installatie- en in-/uitschakelknoppen).
</ParamField>
<ParamField path="commands.debug" type="boolean" default="false">
Schakelt `/debug` in (alleen runtime-overschrijvingen).
@ -100,105 +100,106 @@ Op Discord kunnen native opdrachtspecificaties `descriptionLocalizations` bevatt
Schakelt `/restart` plus Gateway-herstarttoolacties in.
</ParamField>
<ParamField path="commands.ownerAllowFrom" type="string[]">
Stelt de expliciete owner-allowlist in voor opdracht-/tooloppervlakken die alleen voor de owner zijn. Dit is het account van de menselijke operator dat gevaarlijke acties kan goedkeuren en opdrachten kan uitvoeren zoals `/diagnostics`, `/export-trajectory` en `/config`. Het staat los van `commands.allowFrom` en van DM-koppelingstoegang.
Stelt de expliciete allowlist voor eigenaars in voor opdracht-/tooloppervlakken die alleen voor eigenaars zijn. Dit is het menselijke operatoraccount dat gevaarlijke acties kan goedkeuren en opdrachten kan uitvoeren zoals `/diagnostics`, `/export-trajectory` en `/config`. Dit staat los van `commands.allowFrom` en van DM-koppelingstoegang.
</ParamField>
<ParamField path="channels.<channel>.commands.enforceOwnerForCommands" type="boolean" default="false">
Per kanaal: zorgt ervoor dat opdrachten die alleen voor de owner zijn **owner-identiteit** vereisen om op dat oppervlak te worden uitgevoerd. Wanneer `true`, moet de afzender overeenkomen met een opgeloste owner-kandidaat (bijvoorbeeld een vermelding in `commands.ownerAllowFrom` of provider-native owner-metadata) of interne `operator.admin`-scope hebben op een intern berichtkanaal. Een wildcardvermelding in kanaal `allowFrom`, of een lege/onopgeloste lijst met owner-kandidaten, is **niet** voldoende — opdrachten die alleen voor de owner zijn falen gesloten op dat kanaal. Laat dit uit als u wilt dat opdrachten die alleen voor de owner zijn uitsluitend worden afgeschermd door `ownerAllowFrom` en de standaardopdracht-allowlists.
Per kanaal: laat opdrachten die alleen voor eigenaars zijn **eigenaarsidentiteit** vereisen om op dat oppervlak te worden uitgevoerd. Wanneer `true`, moet de afzender overeenkomen met een opgeloste eigenaarskandidaat (bijvoorbeeld een vermelding in `commands.ownerAllowFrom` of provider-native eigenaarsmetadata), of interne `operator.admin`-scope hebben op een intern berichtkanaal. Een wildcardvermelding in kanaal-`allowFrom`, of een lege/onopgeloste lijst met eigenaarskandidaten, is **niet** voldoende — opdrachten die alleen voor eigenaars zijn falen gesloten op dat kanaal. Laat dit uit als je wilt dat opdrachten die alleen voor eigenaars zijn alleen worden bewaakt door `ownerAllowFrom` en de standaard opdrachtsallowlists.
</ParamField>
<ParamField path="commands.ownerDisplay" type='"raw" | "hash"'>
Bepaalt hoe owner-id's verschijnen in de systeemprompt.
Bepaalt hoe eigenaars-id's in de systeemprompt verschijnen.
</ParamField>
<ParamField path="commands.ownerDisplaySecret" type="string">
Stelt optioneel het HMAC-geheim in dat wordt gebruikt wanneer `commands.ownerDisplay="hash"`.
</ParamField>
<ParamField path="commands.allowFrom" type="object">
Allowlist per provider voor opdrachtautorisatie. Wanneer geconfigureerd, is dit de enige autorisatiebron voor opdrachten en directieven (kanaal-allowlists/koppeling en `commands.useAccessGroups` worden genegeerd). Gebruik `"*"` voor een globale standaard; providerspecifieke sleutels overschrijven deze.
Allowlist per provider voor opdrachtautorisatie. Wanneer geconfigureerd, is dit de enige autorisatiebron voor opdrachten en directives (kanaalallowlists/koppeling en `commands.useAccessGroups` worden genegeerd). Gebruik `"*"` voor een globale standaard; providerspecifieke sleutels overschrijven die.
</ParamField>
<ParamField path="commands.useAccessGroups" type="boolean" default="true">
Dwingt allowlists/beleid af voor opdrachten wanneer `commands.allowFrom` niet is ingesteld.
Dwingt allowlists/beleidsregels af voor opdrachten wanneer `commands.allowFrom` niet is ingesteld.
</ParamField>
## Opdrachtenlijst
Huidige bron van waarheid:
- core built-ins komen uit `src/auto-reply/commands-registry.shared.ts`
- gegenereerde dock-opdrachten komen uit `src/auto-reply/commands-registry.data.ts`
- ingebouwde kernopdrachten komen uit `src/auto-reply/commands-registry.shared.ts`
- gegenereerde dockopdrachten komen uit `src/auto-reply/commands-registry.data.ts`
- Plugin-opdrachten komen uit Plugin-`registerCommand()`-aanroepen
- daadwerkelijke beschikbaarheid op uw Gateway hangt nog steeds af van configuratievlaggen, kanaaloppervlak en geïnstalleerde/ingeschakelde Plugins
- daadwerkelijke beschikbaarheid op je Gateway hangt nog steeds af van configuratievlaggen, kanaaloppervlak en geïnstalleerde/ingeschakelde Plugins
### Ingebouwde core-opdrachten
### Ingebouwde kernopdrachten
<AccordionGroup>
<Accordion title="Sessies en runs">
<Accordion title="Sessions and runs">
- `/new [model]` start een nieuwe sessie; `/reset` is de reset-alias.
- Control UI onderschept getypte `/new` om een nieuwe dashboardsessie te maken en daarnaartoe te schakelen; getypte `/reset` voert nog steeds de in-place reset van de Gateway uit.
- `/reset soft [message]` behoudt het huidige transcript, verwijdert hergebruikte CLI-backendsessie-id's en voert het laden van startup/systeemprompt opnieuw in-place uit.
- `/compact [instructions]` comprimeert de sessiecontext. Zie [Compaction](/nl/concepts/compaction).
- Control UI onderschept getypte `/new` om een nieuwe dashboardsessie te maken en ernaar te schakelen; getypte `/reset` voert nog steeds de in-place reset van de Gateway uit.
- `/reset soft [message]` behoudt het huidige transcript, laat hergebruikte CLI-backendsessie-id's vallen en voert startup-/systeempromptladen opnieuw in-place uit.
- `/compact [instructions]` compacteert de sessiecontext. Zie [Compaction](/nl/concepts/compaction).
- `/stop` breekt de huidige run af.
- `/session idle <duration|off>` en `/session max-age <duration|off>` beheren de vervaldatum van thread-koppelingen.
- `/session idle <duration|off>` en `/session max-age <duration|off>` beheren het verlopen van thread-koppelingen.
- `/export-session [path]` exporteert de huidige sessie naar HTML. Alias: `/export`.
- `/export-trajectory [path]` vraagt om exec-goedkeuring en exporteert daarna een JSONL-[trajectbundel](/nl/tools/trajectory) voor de huidige sessie. Gebruik dit wanneer u de prompt-, tool- en transcripttijdlijn voor één OpenClaw-sessie nodig hebt. In groepschats gaan de goedkeuringsprompt en het exportresultaat privé naar de owner. Alias: `/trajectory`.
- `/export-trajectory [path]` vraagt om exec-goedkeuring en exporteert daarna een JSONL-[trajectbundel](/nl/tools/trajectory) voor de huidige sessie. Gebruik dit wanneer je de prompt-, tool- en transcripttijdlijn voor één OpenClaw-sessie nodig hebt. In groepschats gaan de goedkeuringsprompt en het exportresultaat privé naar de eigenaar. Alias: `/trajectory`.
</Accordion>
<Accordion title="Model- en runbesturing">
- `/think <level>` stelt het denkniveau in. Opties komen uit het providerprofiel van het actieve model; gangbare niveaus zijn `off`, `minimal`, `low`, `medium` en `high`, met aangepaste niveaus zoals `xhigh`, `adaptive`, `max` of binaire `on` alleen waar ondersteund. Aliassen: `/thinking`, `/t`.
- `/verbose on|off|full` schakelt uitgebreide uitvoer om. Alias: `/v`.
- `/trace on|off` schakelt Plugin-trace-uitvoer om voor de huidige sessie.
<Accordion title="Model and run controls">
- `/think <level>` stelt het denkniveau in. Opties komen uit het providerprofiel van het actieve model; gangbare niveaus zijn `off`, `minimal`, `low`, `medium` en `high`, met aangepaste niveaus zoals `xhigh`, `adaptive`, `max` of binair `on` alleen waar ondersteund. Aliassen: `/thinking`, `/t`.
- `/verbose on|off|full` schakelt uitgebreide uitvoer in of uit. Alias: `/v`.
- `/trace on|off` schakelt Plugin-trace-uitvoer voor de huidige sessie in of uit.
- `/fast [status|on|off]` toont of stelt snelle modus in.
- `/reasoning [on|off|stream]` schakelt zichtbaarheid van redenering om. Alias: `/reason`.
- `/elevated [on|off|ask|full]` schakelt elevated-modus om. Alias: `/elev`.
- `/reasoning [on|off|stream]` schakelt redeneerzichtbaarheid in of uit. Alias: `/reason`.
- `/elevated [on|off|ask|full]` schakelt elevated-modus in of uit. Alias: `/elev`.
- `/exec host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>` toont of stelt exec-standaarden in.
- `/model [name|#|status]` toont of stelt het model in.
- `/models [provider] [page] [limit=<n>|size=<n>|all]` toont geconfigureerde/beschikbare providers met auth of modellen voor een provider; voeg `all` toe om door de volledige catalogus van die provider te bladeren.
- `/queue <mode>` beheert wachtrijgedrag (`steer`, legacy `queue`, `followup`, `collect`, `steer-backlog`, `interrupt`) plus opties zoals `debounce:0.5s cap:25 drop:summarize`; `/queue default` of `/queue reset` wist de sessie-overschrijving. Zie [Opdrachtwachtrij](/nl/concepts/queue) en [Sturingswachtrij](/nl/concepts/queue-steering).
- `/models [provider] [page] [limit=<n>|size=<n>|all]` toont geconfigureerde/auth-beschikbare providers of modellen voor een provider; voeg `all` toe om door de volledige catalogus van die provider te bladeren.
- `/queue <mode>` beheert wachtrijgedrag (`steer`, legacy `queue`, `followup`, `collect`, `steer-backlog`, `interrupt`) plus opties zoals `debounce:0.5s cap:25 drop:summarize`; `/queue default` of `/queue reset` wist de sessie-overschrijving. Zie [Opdrachtwachtrij](/nl/concepts/queue) en [Steering-wachtrij](/nl/concepts/queue-steering).
- `/steer <message>` injecteert begeleiding in de actieve run voor de huidige sessie, onafhankelijk van de `/queue`-modus. Het start geen nieuwe run wanneer de sessie inactief is. Alias: `/tell`. Zie [Steer](/nl/tools/steer).
</Accordion>
<Accordion title="Detectie en status">
<Accordion title="Discovery and status">
- `/help` toont de korte helpsamenvatting.
- `/commands` toont de gegenereerde opdrachtencatalogus.
- `/tools [compact|verbose]` toont wat de huidige agent nu kan gebruiken.
- `/status` toont uitvoerings-/runtimestatus, inclusief `Execution`/`Runtime`-labels en providergebruik/quota wanneer beschikbaar.
- `/diagnostics [note]` is de supportrapport-flow voor Gateway-bugs en Codex-harnessruns, alleen voor de owner. Deze vraagt elke keer om expliciete exec-goedkeuring voordat `openclaw gateway diagnostics export --json` wordt uitgevoerd; keur diagnostics niet goed met een allow-all-regel. Na goedkeuring verzendt deze een plakbaar rapport met het lokale bundelpad, manifestsamenvatting, privacynotities en relevante sessie-id's. In groepschats gaan de goedkeuringsprompt en het rapport privé naar de owner. Wanneer de actieve sessie de OpenAI Codex-harness gebruikt, verzendt dezelfde goedkeuring ook relevante Codex-feedback naar OpenAI-servers en vermeldt het voltooide antwoord de OpenClaw-sessie-id's, Codex-thread-id's en `codex resume <thread-id>`-opdrachten. Zie [Diagnostics Export](/nl/gateway/diagnostics).
- `/crestodian <request>` voert de Crestodian-installatie- en reparatiehelper uit vanuit een owner-DM.
- `/tools [compact|verbose]` toont wat de huidige agent op dit moment kan gebruiken.
- `/status` toont uitvoerings-/runtimestatus, inclusief `Execution`/`Runtime`-labels en providergebruik/quotum wanneer beschikbaar.
- `/diagnostics [note]` is de supportrapportflow alleen voor eigenaars voor Gateway-bugs en Codex-harnessruns. Deze vraagt elke keer om expliciete exec-goedkeuring voordat `openclaw gateway diagnostics export --json` wordt uitgevoerd; keur diagnostics niet goed met een allow-all-regel. Na goedkeuring verzendt het een plakbaar rapport met het lokale bundelpad, manifestsamenvatting, privacynotities en relevante sessie-id's. In groepschats gaan de goedkeuringsprompt en het rapport privé naar de eigenaar. Wanneer de actieve sessie de OpenAI Codex-harness gebruikt, verzendt dezelfde goedkeuring ook relevante Codex-feedback naar OpenAI-servers en vermeldt het voltooide antwoord de OpenClaw-sessie-id's, Codex-thread-id's en `codex resume <thread-id>`-opdrachten. Zie [Diagnostics-export](/nl/gateway/diagnostics).
- `/crestodian <request>` voert de Crestodian-installatie- en reparatiehulp uit vanuit een eigenaars-DM.
- `/tasks` toont actieve/recente achtergrondtaken voor de huidige sessie.
- `/context [list|detail|json]` legt uit hoe context wordt samengesteld.
- `/whoami` toont uw afzender-id. Alias: `/id`.
- `/whoami` toont je afzender-id. Alias: `/id`.
- `/usage off|tokens|full|cost` beheert de gebruiksfooter per antwoord of drukt een lokale kostensamenvatting af.
</Accordion>
<Accordion title="Skills, allowlists, goedkeuringen">
<Accordion title="Skills, allowlists, approvals">
- `/skill <name> [input]` voert een skill op naam uit.
- `/allowlist [list|add|remove] ...` beheert allowlist-vermeldingen. Alleen tekst.
- `/allowlist [list|add|remove] ...` beheert allowlistvermeldingen. Alleen tekst.
- `/approve <id> <decision>` lost exec-goedkeuringsprompts op.
- `/btw <question>` stelt een zijvraag zonder de toekomstige sessiecontext te wijzigen. Alias: `/side`. Zie [BTW](/nl/tools/btw).
- `/btw <question>` stelt een nevenvraag zonder toekomstige sessiecontext te wijzigen. Alias: `/side`. Zie [BTW](/nl/tools/btw).
</Accordion>
<Accordion title="Subagents en ACP">
- `/subagents list|kill|log|info|send|steer|spawn` beheert subagent-uitvoeringen voor de huidige sessie.
<Accordion title="Subagents and ACP">
- `/subagents list|kill|log|info|send|steer|spawn` beheert sub-agent-uitvoeringen voor de huidige sessie.
- `/acp spawn|cancel|steer|close|sessions|status|set-mode|set|cwd|permissions|timeout|model|reset-options|doctor|install|help` beheert ACP-sessies en runtime-opties.
- `/focus <target>` koppelt de huidige Discord-thread of het huidige Telegram-onderwerp/gesprek aan een sessiedoel.
- `/unfocus` verwijdert de huidige koppeling.
- `/agents` toont thread-gebonden agents voor de huidige sessie.
- `/kill <id|#|all>` breekt een of alle actieve subagents af.
- `/steer <id|#> <message>` stuurt bijsturing naar een actieve subagent. Alias: `/tell`.
- `/kill <id|#|all>` breekt een of alle actieve sub-agents af.
- `/subagents steer <id|#> <message>` stuurt bijsturing naar een actieve sub-agent. Zie [Bijsturen](/nl/tools/steer).
</Accordion>
<Accordion title="Alleen-eigenaar-schrijfacties en beheer">
- `/config show|get|set|unset` leest of schrijft `openclaw.json`. Alleen eigenaar. Vereist `commands.config: true`.
- `/mcp show|get|set|unset` leest of schrijft door OpenClaw beheerde MCP-serverconfiguratie onder `mcp.servers`. Alleen eigenaar. Vereist `commands.mcp: true`.
- `/plugins list|inspect|show|get|install|enable|disable` inspecteert of wijzigt de pluginstatus. `/plugin` is een alias. Alleen eigenaar voor schrijfacties. Vereist `commands.plugins: true`.
- `/debug show|set|unset|reset` beheert runtime-only configuratie-overschrijvingen. Alleen eigenaar. Vereist `commands.debug: true`.
- `/restart` start OpenClaw opnieuw wanneer dit is ingeschakeld. Standaard: ingeschakeld; stel `commands.restart: false` in om dit uit te schakelen.
- `/send on|off|inherit` stelt het verzendbeleid in. Alleen eigenaar.
<Accordion title="Owner-only writes and admin">
- `/config show|get|set|unset` leest of schrijft `openclaw.json`. Alleen voor de eigenaar. Vereist `commands.config: true`.
- `/mcp show|get|set|unset` leest of schrijft door OpenClaw beheerde MCP-serverconfiguratie onder `mcp.servers`. Alleen voor de eigenaar. Vereist `commands.mcp: true`.
- `/plugins list|inspect|show|get|install|enable|disable` inspecteert of wijzigt de Plugin-status. `/plugin` is een alias. Schrijfbewerkingen zijn alleen voor de eigenaar. Vereist `commands.plugins: true`.
- `/debug show|set|unset|reset` beheert runtime-only configuratie-overschrijvingen. Alleen voor de eigenaar. Vereist `commands.debug: true`.
- `/restart` herstart OpenClaw wanneer ingeschakeld. Standaard: ingeschakeld; stel `commands.restart: false` in om dit uit te schakelen.
- `/send on|off|inherit` stelt het verzendbeleid in. Alleen voor de eigenaar.
</Accordion>
<Accordion title="Spraak, TTS, kanaalbeheer">
<Accordion title="Voice, TTS, channel control">
- `/tts on|off|status|chat|latest|provider|limit|summary|audio|help` bestuurt TTS. Zie [TTS](/nl/tools/tts).
- `/activation mention|always` stelt de groepsactivatiemodus in.
- `/bash <command>` voert een host-shellopdracht uit. Alleen tekst. Alias: `! <command>`. Vereist `commands.bash: true` plus allowlists voor `tools.elevated`.
- `!poll [sessionId]` controleert een achtergrond-bash-taak.
- `!stop [sessionId]` stopt een achtergrond-bash-taak.
- `/bash <command>` voert een hostshellopdracht uit. Alleen tekst. Alias: `! <command>`. Vereist `commands.bash: true` plus allowlists voor `tools.elevated`.
- `!poll [sessionId]` controleert een bash-taak op de achtergrond.
- `!stop [sessionId]` stopt een bash-taak op de achtergrond.
</Accordion>
</AccordionGroup>
@ -206,127 +207,127 @@ Huidige bron van waarheid:
### Gegenereerde dock-opdrachten
Dock-opdrachten schakelen de antwoordroute van de huidige sessie over naar een ander gekoppeld
kanaal. Zie [Kanaaldocking](/nl/concepts/channel-docking) voor configuratie,
kanaal. Zie [Kanaal-docking](/nl/concepts/channel-docking) voor installatie,
voorbeelden en probleemoplossing.
Dock-opdrachten worden gegenereerd uit kanaalplugins met ondersteuning voor native opdrachten. Huidige gebundelde set:
Dock-opdrachten worden gegenereerd uit kanaal-plugins met ondersteuning voor native opdrachten. Huidige gebundelde set:
- `/dock-discord` (alias: `/dock_discord`)
- `/dock-mattermost` (alias: `/dock_mattermost`)
- `/dock-slack` (alias: `/dock_slack`)
- `/dock-telegram` (alias: `/dock_telegram`)
Gebruik dock-opdrachten vanuit een directe chat om de antwoordroute van de huidige sessie over te schakelen naar een ander gekoppeld kanaal. De agent behoudt dezelfde sessiecontext, maar toekomstige antwoorden voor die sessie worden geleverd aan de geselecteerde kanaalpeer.
Gebruik dock-opdrachten vanuit een directe chat om de antwoordroute van de huidige sessie over te schakelen naar een ander gekoppeld kanaal. De agent behoudt dezelfde sessiecontext, maar toekomstige antwoorden voor die sessie worden afgeleverd bij de geselecteerde kanaalpeer.
Dock-opdrachten vereisen `session.identityLinks`. De bronafzender en doelpeer moeten in dezelfde identiteitsgroep zitten, bijvoorbeeld `["telegram:123", "discord:456"]`. Als een Telegram-gebruiker met id `123` `/dock_discord` verzendt, slaat OpenClaw `lastChannel: "discord"` en `lastTo: "456"` op in de actieve sessie. Als de afzender niet aan een Discord-peer is gekoppeld, antwoordt de opdracht met een configuratiehint in plaats van door te vallen naar normale chat.
Dock-opdrachten vereisen `session.identityLinks`. De bronafzender en doelpeer moeten in dezelfde identiteitsgroep zitten, bijvoorbeeld `["telegram:123", "discord:456"]`. Als een Telegram-gebruiker met id `123` `/dock_discord` verzendt, slaat OpenClaw `lastChannel: "discord"` en `lastTo: "456"` op in de actieve sessie. Als de afzender niet is gekoppeld aan een Discord-peer, antwoordt de opdracht met een installatietip in plaats van door te vallen naar normale chat.
Docking wijzigt alleen de actieve sessieroute. Het maakt geen kanaalaccounts aan, verleent geen toegang, omzeilt geen kanaal-allowlists en verplaatst geen transcriptgeschiedenis naar een andere sessie. Gebruik `/dock-telegram`, `/dock-slack`, `/dock-mattermost` of een andere gegenereerde dock-opdracht om de route opnieuw te wijzigen.
Docking wijzigt alleen de actieve sessieroute. Het maakt geen kanaalaccounts aan, verleent geen toegang, omzeilt geen kanaal-allowlists en verplaatst geen transcriptgeschiedenis naar een andere sessie. Gebruik `/dock-telegram`, `/dock-slack`, `/dock-mattermost` of een andere gegenereerde dock-opdracht om de route opnieuw te schakelen.
### Gebundelde pluginopdrachten
### Gebundelde Plugin-opdrachten
Gebundelde plugins kunnen meer slash-opdrachten toevoegen. Huidige gebundelde opdrachten in deze repo:
- `/dreaming [on|off|status|help]` schakelt geheugen-dreaming in of uit. Zie [Dreaming](/nl/concepts/dreaming).
- `/pair [qr|status|pending|approve|cleanup|notify]` beheert de flow voor apparaatkoppeling/configuratie. Zie [Koppelen](/nl/channels/pairing).
- `/phone status|arm <camera|screen|writes|all> [duration]|disarm` activeert tijdelijk risicovolle opdrachten voor telefoon-nodes.
- `/dreaming [on|off|status|help]` schakelt geheugen-Dreaming in of uit. Zie [Dreaming](/nl/concepts/dreaming).
- `/pair [qr|status|pending|approve|cleanup|notify]` beheert de flow voor apparaatkoppeling/installatie. Zie [Koppelen](/nl/channels/pairing).
- `/phone status|arm <camera|screen|writes|all> [duration]|disarm` activeert tijdelijk telefoon-Node-opdrachten met hoog risico.
- `/voice status|list [limit]|set <voiceId|name>` beheert Talk-spraakconfiguratie. Op Discord is de native opdrachtnaam `/talkvoice`.
- `/card ...` verzendt LINE-rich-card-presets. Zie [LINE](/nl/channels/line).
- `/codex status|models|threads|resume|compact|review|diagnostics|account|mcp|skills` inspecteert en bestuurt de gebundelde Codex app-server-harness. Zie [Codex-harness](/nl/plugins/codex-harness).
- Alleen-QQBot-opdrachten:
- `/codex status|models|threads|resume|compact|review|diagnostics|account|mcp|skills` inspecteert en bestuurt de gebundelde Codex-appserverharnas. Zie [Codex-harnas](/nl/plugins/codex-harness).
- Alleen QQBot-opdrachten:
- `/bot-ping`
- `/bot-version`
- `/bot-help`
- `/bot-upgrade`
- `/bot-logs`
### Dynamische skill-opdrachten
### Dynamische Skills-opdrachten
Door gebruikers aanroepbare Skills worden ook als slash-opdrachten beschikbaar gemaakt:
- `/skill <name> [input]` werkt altijd als het generieke toegangspunt.
- Skills kunnen ook verschijnen als directe opdrachten zoals `/prose` wanneer de skill/plugin deze registreert.
- native registratie van skill-opdrachten wordt bestuurd door `commands.nativeSkills` en `channels.<provider>.commands.nativeSkills`.
- opdrachtspecificaties kunnen `descriptionLocalizations` bieden voor native oppervlakken die gelokaliseerde beschrijvingen ondersteunen, waaronder Discord.
- `/skill <name> [input]` werkt altijd als het generieke ingangspunt.
- Skills kunnen ook verschijnen als directe opdrachten zoals `/prose` wanneer de Skill/Plugin ze registreert.
- registratie van native Skills-opdrachten wordt beheerd door `commands.nativeSkills` en `channels.<provider>.commands.nativeSkills`.
- opdrachtspecificaties kunnen `descriptionLocalizations` leveren voor native oppervlakken die gelokaliseerde beschrijvingen ondersteunen, waaronder Discord.
<AccordionGroup>
<Accordion title="Argument- en parseropmerkingen">
<Accordion title="Argument and parser notes">
- Opdrachten accepteren een optionele `:` tussen de opdracht en argumenten (bijv. `/think: high`, `/send: on`, `/help:`).
- `/new <model>` accepteert een modelalias, `provider/model` of een providernaam (fuzzy match); als er geen match is, wordt de tekst behandeld als de berichttekst.
- Gebruik `openclaw status --usage` voor een volledige uitsplitsing van providergebruik.
- `/allowlist add|remove` vereist `commands.config=true` en respecteert kanaal-`configWrites`.
- In kanalen met meerdere accounts respecteren configuratiegerichte `/allowlist --account <id>` en `/config set channels.<provider>.accounts.<id>...` ook de `configWrites` van het doelaccount.
- `/usage` bestuurt de gebruiksfooter per antwoord; `/usage cost` drukt een lokaal kostenoverzicht af uit OpenClaw-sessielogs.
- In kanalen met meerdere accounts respecteren config-gerichte `/allowlist --account <id>` en `/config set channels.<provider>.accounts.<id>...` ook de `configWrites` van het doelaccount.
- `/usage` beheert de gebruiksvoettekst per antwoord; `/usage cost` print een lokale kostensamenvatting uit OpenClaw-sessielogs.
- `/restart` is standaard ingeschakeld; stel `commands.restart: false` in om dit uit te schakelen.
- `/plugins install <spec>` accepteert dezelfde pluginspecificaties als `openclaw plugins install`: lokaal pad/archief, npm-pakket, `git:<repo>` of `clawhub:<pkg>`, en vraagt daarna om een Gateway-herstart omdat pluginbronmodules zijn gewijzigd.
- `/plugins enable|disable` werkt pluginconfiguratie bij en triggert een Gateway-pluginherlaadactie voor nieuwe agentbeurten.
- `/plugins install <spec>` accepteert dezelfde Plugin-specificaties als `openclaw plugins install`: lokaal pad/archief, npm-pakket, `git:<repo>` of `clawhub:<pkg>`, en vraagt vervolgens om een Gateway-herstart omdat Plugin-bronmodules zijn gewijzigd.
- `/plugins enable|disable` werkt Plugin-configuratie bij en activeert herladen van Gateway-plugins voor nieuwe agentbeurten.
</Accordion>
<Accordion title="Kanaalspecifiek gedrag">
- Alleen-Discord native opdracht: `/vc join|leave|status` bestuurt spraakkanalen (niet beschikbaar als tekst). `join` vereist een guild en geselecteerd spraak-/stagekanaal. Vereist `channels.discord.voice` en native opdrachten.
- Discord-threadbindingsopdrachten (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`) vereisen dat effectieve threadbindings zijn ingeschakeld (`session.threadBindings.enabled` en/of `channels.discord.threadBindings.enabled`).
- ACP-opdrachtreferentie en runtimegedrag: [ACP-agents](/nl/tools/acp-agents).
<Accordion title="Channel-specific behavior">
- Alleen voor Discord native opdracht: `/vc join|leave|status` bestuurt spraakkanalen (niet beschikbaar als tekst). `join` vereist een guild en een geselecteerd spraak-/stagekanaal. Vereist `channels.discord.voice` en native opdrachten.
- Discord-threadkoppelingsopdrachten (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`) vereisen dat effectieve threadkoppelingen zijn ingeschakeld (`session.threadBindings.enabled` en/of `channels.discord.threadBindings.enabled`).
- ACP-opdrachtreferentie en runtime-gedrag: [ACP-agents](/nl/tools/acp-agents).
</Accordion>
<Accordion title="Uitgebreid / trace / snel / redeneerveiligheid">
- `/verbose` is bedoeld voor debuggen en extra zichtbaarheid; houd dit bij normaal gebruik **uit**.
- `/trace` is smaller dan `/verbose`: het toont alleen trace-/debugregels die eigendom zijn van plugins en houdt normale uitgebreide toolruis uit.
- `/fast on|off` bewaart een sessie-overschrijving. Gebruik de optie `inherit` in de Sessions UI om deze te wissen en terug te vallen op configuratiestandaarden.
- `/fast` is providerspecifiek: OpenAI/OpenAI Codex koppelen dit aan `service_tier=priority` op native Responses-endpoints, terwijl directe publieke Anthropic-verzoeken, waaronder met OAuth geauthenticeerd verkeer dat naar `api.anthropic.com` wordt verzonden, dit koppelen aan `service_tier=auto` of `standard_only`. Zie [OpenAI](/nl/providers/openai) en [Anthropic](/nl/providers/anthropic).
<Accordion title="Verbose / trace / fast / reasoning safety">
- `/verbose` is bedoeld voor foutopsporing en extra zichtbaarheid; houd dit bij normaal gebruik **uit**.
- `/trace` is smaller dan `/verbose`: het toont alleen trace-/debugregels die eigendom zijn van plugins en houdt normale verbose tool-ruis uit.
- `/fast on|off` bewaart een sessie-overschrijving. Gebruik de optie `inherit` in de Sessions UI om die te wissen en terug te vallen op configuratiestandaarden.
- `/fast` is providerspecifiek: OpenAI/OpenAI Codex mappen dit naar `service_tier=priority` op native Responses-eindpunten, terwijl directe publieke Anthropic-verzoeken, inclusief met OAuth geauthenticeerd verkeer naar `api.anthropic.com`, dit mappen naar `service_tier=auto` of `standard_only`. Zie [OpenAI](/nl/providers/openai) en [Anthropic](/nl/providers/anthropic).
- Samenvattingen van toolfouten worden nog steeds getoond wanneer relevant, maar gedetailleerde fouttekst wordt alleen opgenomen wanneer `/verbose` `on` of `full` is.
- `/reasoning`, `/verbose` en `/trace` zijn risicovol in groepsinstellingen: ze kunnen interne redenering, tooluitvoer of plugin-diagnostiek tonen die je niet wilde blootgeven. Laat ze bij voorkeur uit, vooral in groepschats.
- `/reasoning`, `/verbose` en `/trace` zijn riskant in groepsinstellingen: ze kunnen interne redenering, tooluitvoer of Plugin-diagnostiek onthullen die u niet wilde blootstellen. Laat ze bij voorkeur uit, vooral in groepschats.
</Accordion>
<Accordion title="Model wisselen">
<Accordion title="Model switching">
- `/model` bewaart het nieuwe sessiemodel onmiddellijk.
- Als de agent inactief is, gebruikt de volgende uitvoering het meteen.
- Als er al een uitvoering actief is, markeert OpenClaw een live-wissel als in behandeling en herstart het alleen naar het nieuwe model op een schoon retrypunt.
- Als toolactiviteit of antwoorduitvoer al is gestart, kan de in behandeling staande wissel in de wachtrij blijven tot een latere retrymogelijkheid of de volgende gebruikersbeurt.
- Als de agent inactief is, gebruikt de volgende run het meteen.
- Als er al een run actief is, markeert OpenClaw een live-omschakeling als in behandeling en herstart het pas naar het nieuwe model op een schoon retry-punt.
- Als toolactiviteit of antwoorduitvoer al is gestart, kan de omschakeling in behandeling in de wachtrij blijven staan tot een latere retry-mogelijkheid of de volgende gebruikersbeurt.
- In de lokale TUI keert `/crestodian [request]` terug van de normale agent-TUI naar Crestodian. Dit staat los van reddingsmodus voor berichtkanalen en verleent geen externe configuratiebevoegdheid.
</Accordion>
<Accordion title="Snel pad en inline-snelkoppelingen">
- **Snel pad:** berichten die alleen uit een opdracht bestaan van afzenders op de allowlist worden onmiddellijk afgehandeld (omzeilt wachtrij + model).
- **Groepsvermelding-gating:** berichten die alleen uit een opdracht bestaan van afzenders op de allowlist omzeilen vermeldingsvereisten.
- **Inline-snelkoppelingen (alleen afzenders op de allowlist):** bepaalde opdrachten werken ook wanneer ze in een normaal bericht zijn ingesloten en worden verwijderd voordat het model de resterende tekst ziet.
- Voorbeeld: `hey /status` triggert een statusantwoord, en de resterende tekst gaat door via de normale flow.
<Accordion title="Fast path and inline shortcuts">
- **Snel pad:** berichten met alleen opdrachten van afzenders op de allowlist worden onmiddellijk afgehandeld (omzeilt wachtrij + model).
- **Groepsmention-gating:** berichten met alleen opdrachten van afzenders op de allowlist omzeilen mention-vereisten.
- **Inline-snelkoppelingen (alleen afzenders op de allowlist):** bepaalde opdrachten werken ook wanneer ze zijn ingebed in een normaal bericht en worden verwijderd voordat het model de resterende tekst ziet.
- Voorbeeld: `hey /status` activeert een statusantwoord, en de resterende tekst gaat door de normale flow.
- Momenteel: `/help`, `/commands`, `/status`, `/whoami` (`/id`).
- Niet-geautoriseerde berichten die alleen uit een opdracht bestaan worden stil genegeerd, en inline `/...`-tokens worden behandeld als platte tekst.
- Ongeautoriseerde berichten met alleen opdrachten worden stil genegeerd, en inline `/...`-tokens worden behandeld als platte tekst.
</Accordion>
<Accordion title="Skill-opdrachten en native argumenten">
<Accordion title="Skill commands and native arguments">
- **Skill-opdrachten:** `user-invocable` Skills worden als slash-opdrachten beschikbaar gemaakt. Namen worden opgeschoond naar `a-z0-9_` (max. 32 tekens); botsingen krijgen numerieke suffixen (bijv. `_2`).
- `/skill <name> [input]` voert een skill op naam uit (nuttig wanneer native opdrachtlimieten opdrachten per skill verhinderen).
- Standaard worden skill-opdrachten als een normale aanvraag doorgestuurd naar het model.
- Skills kunnen optioneel `command-dispatch: tool` declareren om de opdracht direct naar een tool te routeren (deterministisch, geen model).
- Voorbeeld: `/prose` (OpenProse-plugin) — zie [OpenProse](/nl/prose).
- **Native opdrachtargumenten:** Discord gebruikt automatisch aanvullen voor dynamische opties (en knopmenu's wanneer je vereiste argumenten weglaat). Telegram en Slack tonen een knopmenu wanneer een opdracht keuzes ondersteunt en je het argument weglaat. Dynamische keuzes worden opgelost tegen het doelsessiemodel, dus modelspecifieke opties zoals `/think`-niveaus volgen de `/model`-overschrijving van die sessie.
- `/skill <name> [input]` voert een Skill uit op naam (handig wanneer limieten voor native opdrachten opdrachten per Skill verhinderen).
- Standaard worden Skill-opdrachten doorgestuurd naar het model als een normaal verzoek.
- Skills kunnen optioneel `command-dispatch: tool` declareren om de opdracht rechtstreeks naar een tool te routeren (deterministisch, geen model).
- Voorbeeld: `/prose` (OpenProse-Plugin) — zie [OpenProse](/nl/prose).
- **Argumenten voor native opdrachten:** Discord gebruikt autocomplete voor dynamische opties (en knopmenu's wanneer u vereiste argumenten weglaat). Telegram en Slack tonen een knopmenu wanneer een opdracht keuzes ondersteunt en u het argument weglaat. Dynamische keuzes worden opgelost tegen het doel-sessiemodel, zodat modelspecifieke opties zoals `/think`-niveaus de `/model`-overschrijving van die sessie volgen.
</Accordion>
</AccordionGroup>
## `/tools`
`/tools` beantwoordt een runtimevraag, geen configuratievraag: **wat deze agent nu in dit gesprek kan gebruiken**.
`/tools` beantwoordt een runtime-vraag, geen configuratievraag: **wat deze agent nu in dit gesprek kan gebruiken**.
- Standaard `/tools` is compact en geoptimaliseerd voor snel scannen.
- Standaard `/tools` is compact en geoptimaliseerd om snel te scannen.
- `/tools verbose` voegt korte beschrijvingen toe.
- Native-opdrachtoppervlakken die argumenten ondersteunen, stellen dezelfde modusschakelaar beschikbaar als `compact|verbose`.
- Resultaten zijn sessiegebonden, dus het wijzigen van agent, kanaal, thread, afzenderautorisatie of model kan de uitvoer veranderen.
- `/tools` bevat tools die daadwerkelijk bereikbaar zijn tijdens runtime, waaronder kerntools, verbonden plugintools en kanaal-eigen tools.
- Native-opdrachtoppervlakken die argumenten ondersteunen, bieden dezelfde modusschakelaar als `compact|verbose`.
- Resultaten zijn sessiegebonden, dus het wijzigen van agent, kanaal, thread, afzenderautorisatie of model kan de uitvoer wijzigen.
- `/tools` bevat tools die daadwerkelijk bereikbaar zijn tijdens runtime, inclusief kerntools, verbonden Plugin-tools en tools die eigendom zijn van het kanaal.
Gebruik voor het bewerken van profielen en overschrijvingen het Tools-paneel in de Control UI of configuratie-/catalogusoppervlakken in plaats van `/tools` als statische catalogus te behandelen.
## Gebruiksoppervlakken (wat waar wordt getoond)
- **Providergebruik/quota** (voorbeeld: "Claude 80% over") verschijnt in `/status` voor de huidige modelprovider wanneer gebruikstracking is ingeschakeld. OpenClaw normaliseert providervensters naar `% left`; voor MiniMax worden procentvelden met alleen resterend gebruik vóór weergave omgekeerd, en `model_remains`-antwoorden geven de voorkeur aan de chatmodelvermelding plus een modelgetagd planlabel.
- **Token-/cache-regels** in `/status` kunnen terugvallen op de nieuwste gebruiksvermelding uit het transcript wanneer de live sessie-snapshot beperkt is. Bestaande niet-nul live waarden blijven voorgaan, en transcriptfallback kan ook het actieve runtime-modellabel herstellen plus een groter promptgericht totaal wanneer opgeslagen totalen ontbreken of kleiner zijn.
- **Providergebruik/quota** (voorbeeld: "Claude 80% over") wordt in `/status` weergegeven voor de huidige modelprovider wanneer gebruikstracking is ingeschakeld. OpenClaw normaliseert providervensters naar `% left`; voor MiniMax worden percentvelden die alleen resterend gebruik tonen voor weergave omgekeerd, en `model_remains`-antwoorden geven de voorkeur aan de chatmodelvermelding plus een model-gelabeld planlabel.
- **Token-/cache-regels** in `/status` kunnen terugvallen op de nieuwste gebruiksvermelding uit het transcript wanneer de live sessie-snapshot beperkt is. Bestaande niet-nul live waarden blijven leidend, en transcriptfallback kan ook het actieve runtime-modellabel herstellen plus een groter promptgericht totaal wanneer opgeslagen totalen ontbreken of kleiner zijn.
- **Uitvoering versus runtime:** `/status` rapporteert `Execution` voor het effectieve sandboxpad en `Runtime` voor wie de sessie daadwerkelijk uitvoert: `OpenClaw Pi Default`, `OpenAI Codex`, een CLI-backend of een ACP-backend.
- **Tokens/kosten per antwoord** wordt beheerd met `/usage off|tokens|full` (toegevoegd aan normale antwoorden).
- **Tokens/kosten per antwoord** worden beheerd met `/usage off|tokens|full` (toegevoegd aan normale antwoorden).
- `/model status` gaat over **modellen/authenticatie/eindpunten**, niet over gebruik.
## Modelselectie (`/model`)
`/model` is geïmplementeerd als een directive.
`/model` is geimplementeerd als een directive.
Voorbeelden:
@ -342,7 +343,7 @@ Voorbeelden:
Opmerkingen:
- `/model` en `/model list` tonen een compacte, genummerde kiezer (modelfamilie + beschikbare providers).
- Op Discord openen `/model` en `/models` een interactieve kiezer met dropdowns voor provider en model plus een stap Verzenden.
- Op Discord openen `/model` en `/models` een interactieve kiezer met dropdowns voor provider en model plus een indienstap.
- `/model <#>` selecteert uit die kiezer (en geeft waar mogelijk de voorkeur aan de huidige provider).
- `/model status` toont de gedetailleerde weergave, inclusief geconfigureerd provider-eindpunt (`baseUrl`) en API-modus (`api`) wanneer beschikbaar.
@ -361,12 +362,12 @@ Voorbeelden:
```
<Note>
Overschrijvingen gelden onmiddellijk voor nieuwe configuratielezingen, maar schrijven **niet** naar `openclaw.json`. Gebruik `/debug reset` om alle overschrijvingen te wissen en terug te keren naar de configuratie op schijf.
Overschrijvingen worden direct toegepast op nieuwe configuratielezingen, maar schrijven **niet** naar `openclaw.json`. Gebruik `/debug reset` om alle overschrijvingen te wissen en terug te keren naar de configuratie op schijf.
</Note>
## Plugin-trace-uitvoer
Met `/trace` kun je **sessiegebonden Plugin trace-/debugregels** omschakelen zonder de volledige verbose-modus in te schakelen.
Met `/trace` kun je **sessiegebonden plugin-trace-/debugregels** in- of uitschakelen zonder volledige uitgebreide modus aan te zetten.
Voorbeelden:
@ -379,11 +380,11 @@ Voorbeelden:
Opmerkingen:
- `/trace` zonder argument toont de huidige trace-status van de sessie.
- `/trace on` schakelt Plugin trace-regels in voor de huidige sessie.
- `/trace on` schakelt plugin-trace-regels in voor de huidige sessie.
- `/trace off` schakelt ze weer uit.
- Plugin trace-regels kunnen verschijnen in `/status` en als vervolgdignosebericht na het normale assistentantwoord.
- Plugin-trace-regels kunnen verschijnen in `/status` en als een opvolgend diagnostisch bericht na het normale assistentantwoord.
- `/trace` vervangt `/debug` niet; `/debug` beheert nog steeds alleen-runtime configuratie-overschrijvingen.
- `/trace` vervangt `/verbose` niet; normale verbose tool-/statusuitvoer hoort nog steeds bij `/verbose`.
- `/trace` vervangt `/verbose` niet; normale uitgebreide tool-/statusuitvoer hoort nog steeds bij `/verbose`.
## Configuratie-updates
@ -400,7 +401,7 @@ Voorbeelden:
```
<Note>
Configuratie wordt gevalideerd vóór het schrijven; ongeldige wijzigingen worden geweigerd. `/config`-updates blijven behouden na herstarts.
Configuratie wordt gevalideerd voordat er wordt geschreven; ongeldige wijzigingen worden geweigerd. `/config`-updates blijven behouden na herstarts.
</Note>
## MCP-updates
@ -417,7 +418,7 @@ Voorbeelden:
```
<Note>
`/mcp` slaat configuratie op in OpenClaw-configuratie, niet in projectinstellingen die eigendom zijn van Pi. Runtime-adapters bepalen welke transporten daadwerkelijk uitvoerbaar zijn.
`/mcp` slaat configuratie op in OpenClaw-configuratie, niet in projectinstellingen die eigendom zijn van Pi. Runtime-adapters bepalen welke transports daadwerkelijk uitvoerbaar zijn.
</Note>
## Plugin-updates
@ -435,46 +436,46 @@ Voorbeelden:
```
<Note>
- `/plugins list` en `/plugins show` gebruiken echte Plugin-detectie tegen de huidige workspace plus configuratie op schijf.
- `/plugins list` en `/plugins show` gebruiken echte plugin-discovery tegen de huidige workspace plus configuratie op schijf.
- `/plugins install` installeert vanuit ClawHub, npm, git, lokale mappen en archieven.
- `/plugins enable|disable` werkt alleen Plugin-configuratie bij; het installeert of verwijdert geen plugins.
- Wijzigingen voor inschakelen en uitschakelen hot-reloaden runtime-oppervlakken van Gateway-plugins voor nieuwe agentbeurten; installeren vraagt om een Gateway-herstart omdat Plugin-bronmodules zijn gewijzigd.
- `/plugins enable|disable` werkt alleen plugin-configuratie bij; het installeert of verwijdert geen plugins.
- Wijzigingen voor inschakelen en uitschakelen laden Gateway plugin-runtime-oppervlakken hot-reload voor nieuwe agentbeurten; installatie vraagt om een Gateway-herstart omdat plugin-bronmodules zijn gewijzigd.
</Note>
## Opmerkingen per oppervlak
## Oppervlaknotities
<AccordionGroup>
<Accordion title="Sessions per surface">
- **Tekstcommando's** worden uitgevoerd in de normale chatsessie (DM's delen `main`, groepen hebben hun eigen sessie).
- **Native commando's** gebruiken geïsoleerde sessies:
<Accordion title="Sessies per oppervlak">
- **Tekstopdrachten** worden uitgevoerd in de normale chatsessie (DM's delen `main`, groepen hebben hun eigen sessie).
- **Native opdrachten** gebruiken geisoleerde sessies:
- Discord: `agent:<agentId>:discord:slash:<userId>`
- Slack: `agent:<agentId>:slack:slash:<userId>` (prefix configureerbaar via `channels.slack.slashCommand.sessionPrefix`)
- Telegram: `telegram:slash:<userId>` (richt zich op de chatsessie via `CommandTargetSessionKey`)
- **`/stop`** richt zich op de actieve chatsessie zodat die de huidige run kan afbreken.
- **`/stop`** richt zich op de actieve chatsessie zodat deze de huidige run kan afbreken.
</Accordion>
<Accordion title="Slack specifics">
`channels.slack.slashCommand` wordt nog steeds ondersteund voor één commando in `/openclaw`-stijl. Als je `commands.native` inschakelt, moet je één Slack-slashcommando maken per ingebouwd commando (dezelfde namen als `/help`). Commandoargumentmenu's voor Slack worden geleverd als efemere Block Kit-knoppen.
<Accordion title="Slack-specifiek">
`channels.slack.slashCommand` wordt nog steeds ondersteund voor een enkele opdracht in `/openclaw`-stijl. Als je `commands.native` inschakelt, moet je een Slack slash command per ingebouwde opdracht maken (dezelfde namen als `/help`). Menu's met opdrachtargumenten voor Slack worden geleverd als tijdelijke Block Kit-knoppen.
Slack native uitzondering: registreer `/agentstatus` (niet `/status`) omdat Slack `/status` reserveert. Tekst `/status` werkt nog steeds in Slack-berichten.
Slack native-uitzondering: registreer `/agentstatus` (niet `/status`) omdat Slack `/status` reserveert. Tekst `/status` werkt nog steeds in Slack-berichten.
</Accordion>
</AccordionGroup>
## BTW-nevenvragen
## BTW-zijvragen
`/btw` is een snelle **nevenvraag** over de huidige sessie. `/side` is een alias.
`/btw` is een snelle **zijvraag** over de huidige sessie. `/side` is een alias.
Anders dan normale chat:
- gebruikt het de huidige sessie als achtergrondcontext,
- wordt het uitgevoerd als een afzonderlijke **toolloze** eenmalige call,
- wordt het uitgevoerd als een aparte **tool-loze** eenmalige call,
- verandert het toekomstige sessiecontext niet,
- wordt het niet naar transcriptgeschiedenis geschreven,
- wordt het geleverd als een live nevenresultaat in plaats van een normaal assistentbericht.
- wordt het geleverd als een live zijresultaat in plaats van een normaal assistentbericht.
Dat maakt `/btw` nuttig wanneer je tijdelijke verduidelijking wilt terwijl de hoofdtaak doorgaat.
Daardoor is `/btw` nuttig wanneer je tijdelijke verduidelijking wilt terwijl de hoofdtaak doorgaat.
Voorbeeld:
@ -483,7 +484,7 @@ Voorbeeld:
/side what changed while the main run continued?
```
Zie [BTW-nevenvragen](/nl/tools/btw) voor het volledige gedrag en de UX-details van clients.
Zie [BTW-zijvragen](/nl/tools/btw) voor het volledige gedrag en de client-UX-details.
## Gerelateerd

74
docs/nl/tools/steer.md Normal file
View File

@ -0,0 +1,74 @@
---
read_when:
- Gebruik van /steer of /tell terwijl er al een agent actief is
- Vergelijking van /steer met /queue steer
- Beslissen of je de huidige uitvoering, een subagent of een ACP-sessie moet bijsturen
sidebarTitle: Steer
summary: Stuur een actieve uitvoering bij zonder de wachtrijmodus te wijzigen
title: Sturen
x-i18n:
generated_at: "2026-05-04T07:09:39Z"
model: gpt-5.5
provider: openai
source_hash: 71e1c80c0eea86d5c3c29513d3ed0675c04779fc9c6ee3b8a76c4bedaa264d22
source_path: tools/steer.md
workflow: 16
---
`/steer` stuurt begeleiding naar een al actieve uitvoering. Het is bedoeld voor momenten als "pas deze uitvoering aan terwijl die nog bezig is", niet om een nieuwe beurt te starten.
## Huidige sessie
Gebruik `/steer` op hoofdniveau om de actieve uitvoering voor de huidige sessie te targeten:
```text
/steer prefer the smaller patch and keep the tests focused
/tell summarize before making the next tool call
```
Gedrag:
- Target alleen de actieve uitvoering van de huidige sessie.
- Werkt onafhankelijk van de `/queue`-modus van de sessie.
- Start geen nieuwe uitvoering wanneer de sessie inactief is.
- Antwoordt met een waarschuwing wanneer er geen actieve uitvoering is om te sturen.
- Gebruikt het sturingspad van de actieve uitvoeringsomgeving, zodat het model de begeleiding ziet bij de volgende ondersteunde runtimegrens.
## Sturen versus wachtrij
`/queue steer` wijzigt hoe normale inkomende berichten zich gedragen wanneer ze binnenkomen terwijl een uitvoering actief is. `/steer <message>` is een expliciete opdracht die probeert het bericht van die opdracht in de actieve uitvoering te injecteren bij de volgende ondersteunde runtimegrens, ongeacht de opgeslagen `/queue`-instelling.
Gebruik:
- `/steer <message>` wanneer je de actieve uitvoering nu wilt begeleiden.
- `/queue steer` wanneer je wilt dat toekomstige normale berichten standaard actieve uitvoeringen sturen.
- `/queue collect` of `/queue followup` wanneer nieuwe berichten moeten wachten op een latere beurt in plaats van de actieve uitvoering te sturen.
Zie [Opdrachtwachtrij](/nl/concepts/queue) en [Sturingswachtrij](/nl/concepts/queue-steering) voor wachtrijmodi en fallbackgedrag.
## Subagenten
Gebruik `/subagents steer` wanneer het doel een onderliggende uitvoering is:
```text
/subagents steer 2 focus only on the API surface
```
`/steer` op hoofdniveau selecteert geen subagent op id of lijstindex. Het target altijd de actieve uitvoering van de huidige sessie. Zie [Subagenten](/nl/tools/subagents) voor subagent-id's, labels en besturingsopdrachten.
## ACP-sessies
Gebruik `/acp steer` wanneer het doel een ACP-harnesssessie is:
```text
/acp steer --session agent:main:acp:codex tighten the repro
```
Zie [ACP-agenten](/nl/tools/acp-agents) voor selectie van ACP-sessies en runtimegedrag.
## Gerelateerd
- [Slash-opdrachten](/nl/tools/slash-commands)
- [Opdrachtwachtrij](/nl/concepts/queue)
- [Sturingswachtrij](/nl/concepts/queue-steering)
- [Subagenten](/nl/tools/subagents)

View File

@ -1,48 +1,48 @@
---
read_when:
- U wilt werk op de achtergrond of parallel werk via de agent
- Je wijzigt sessions_spawn of het beleid voor subagent-tools
- Je implementeert of verhelpt problemen met threadgebonden subagentsessies
- Je wilt achtergrondwerk of parallel werk via de agent
- Je wijzigt sessions_spawn of het beleid voor subagenttools
- Je implementeert threadgebonden subagent-sessies of lost er problemen mee op
sidebarTitle: Sub-agents
summary: Start geïsoleerde agentuitvoeringen op de achtergrond die resultaten terugmelden in de chat van de aanvrager
summary: Start geïsoleerde agentuitvoeringen op de achtergrond die resultaten terugmelden aan de chat van de aanvrager
title: Subagenten
x-i18n:
generated_at: "2026-05-02T11:30:29Z"
generated_at: "2026-05-04T07:09:54Z"
model: gpt-5.5
provider: openai
source_hash: 0e964df543bd19435daf94f2c85a34b9d32e07662405d2eac7635935f1e7bf64
source_hash: 65d60bf6813d667b7311aa28109d4bd6be012a16e638c64cfff130831db88cd8
source_path: tools/subagents.md
workflow: 16
---
Subagenten zijn agentruns op de achtergrond die vanuit een bestaande agentrun worden gestart.
Subagenten zijn achtergronduitvoeringen van agents die vanuit een bestaande agentuitvoering worden gestart.
Ze draaien in hun eigen sessie (`agent:<agentId>:subagent:<uuid>`) en
**kondigen** hun resultaat na afloop aan terug aan het chatkanaal van de
aanvrager. Elke subagentrun wordt gevolgd als een
**melden** hun resultaat na afloop terug aan het chatchannel van de
aanvrager. Elke subagentuitvoering wordt bijgehouden als een
[achtergrondtaak](/nl/automation/tasks).
Primaire doelen:
- "onderzoek / lange taak / trage tool"-werk parallel uitvoeren zonder de hoofdrun te blokkeren.
- Subagenten standaard geisoleerd houden (sessiescheiding + optionele sandboxing).
- Het tooloppervlak moeilijk te misbruiken houden: subagenten krijgen standaard **geen** sessietools.
- Configureerbare nesteldiepte ondersteunen voor orchestratorpatronen.
- Paralleliseer werk voor "onderzoek / lange taak / trage tool" zonder de hoofduitvoering te blokkeren.
- Houd subagenten standaard geïsoleerd (sessiescheiding + optionele sandboxing).
- Houd het tooloppervlak moeilijk te misbruiken: subagenten krijgen standaard **geen** sessietools.
- Ondersteun configureerbare nestingsdiepte voor orchestratorpatronen.
<Note>
**Kostenopmerking:** elke subagent heeft standaard zijn eigen context en
tokengebruik. Stel voor zware of repetitieve taken een goedkoper model in
voor subagenten en houd je hoofdagent op een model van hogere kwaliteit.
Configureer dit via `agents.defaults.subagents.model` of overrides per agent.
Wanneer een child werkelijk het huidige transcript van de aanvrager nodig
heeft, kan de agent `context: "fork"` aanvragen voor die ene spawn.
Thread-gebonden subagentsessies gebruiken standaard `context: "fork"` omdat
ze het huidige gesprek vertakken naar een follow-upthread.
**Kostenopmerking:** elke subagent heeft standaard zijn eigen context en tokengebruik.
Voor zware of repetitieve taken stelt u een goedkoper model in voor subagenten
en houdt u uw hoofdagent op een model van hogere kwaliteit. Configureer via
`agents.defaults.subagents.model` of per-agent overrides. Wanneer een child
echt het huidige transcript van de aanvrager nodig heeft, kan de agent
`context: "fork"` aanvragen voor die ene spawn. Thread-gebonden subagentsessies gebruiken standaard
`context: "fork"`, omdat ze het huidige gesprek vertakken naar een
follow-upthread.
</Note>
## Slash-opdracht
## Slash-commando
Gebruik `/subagents` om subagentruns voor de **huidige sessie** te bekijken
of te beheren:
Gebruik `/subagents` om subagentuitvoeringen voor de **huidige
sessie** te inspecteren of te beheren:
```text
/subagents list
@ -54,15 +54,17 @@ of te beheren:
/subagents spawn <agentId> <task> [--model <model>] [--thinking <level>]
```
`/subagents info` toont runmetadata (status, tijdstempels, sessie-id,
Gebruik [`/steer <message>`](/nl/tools/steer) op topniveau om de actieve uitvoering van de huidige aanvragersessie bij te sturen. Gebruik `/subagents steer <id|#> <message>` wanneer het doel een childuitvoering is.
`/subagents info` toont uitvoeringsmetadata (status, tijdstempels, sessie-id,
transcriptpad, opschoning). Gebruik `sessions_history` voor een begrensde,
veiligheidsgefilterde recall-weergave; inspecteer het transcriptpad op schijf
wanneer je het ruwe volledige transcript nodig hebt.
veiligheidsgefilterde herinneringsweergave; inspecteer het transcriptpad op schijf wanneer u
het ruwe volledige transcript nodig hebt.
### Besturing voor threadbinding
### Besturing voor thread-binding
Deze opdrachten werken op kanalen die persistente threadbindingen ondersteunen.
Zie [Kanalen met threadondersteuning](#thread-supporting-channels) hieronder.
Deze commando's werken op kanalen die persistente thread-bindings ondersteunen.
Zie [Kanalen met thread-ondersteuning](#thread-supporting-channels) hieronder.
```text
/focus <subagent-label|session-key|session-id|session-label>
@ -72,79 +74,80 @@ Zie [Kanalen met threadondersteuning](#thread-supporting-channels) hieronder.
/session max-age <duration|off>
```
### Spawngedrag
### Spawn-gedrag
`/subagents spawn` start een subagent op de achtergrond als gebruikersopdracht
(niet als interne relay) en stuurt een laatste voltooiingsupdate terug naar de
chat van de aanvrager wanneer de run is afgerond.
`/subagents spawn` start een achtergrondsubagent als gebruikerscommando (niet als
interne relay) en stuurt één definitieve voltooiingsupdate terug naar de
aanvragerchat wanneer de uitvoering klaar is.
<AccordionGroup>
<Accordion title="Niet-blokkerende, push-gebaseerde voltooiing">
- De spawnopdracht is niet-blokkerend; hij retourneert onmiddellijk een run-id.
- Bij voltooiing kondigt de subagent een samenvatting/resultaatbericht aan terug aan het chatkanaal van de aanvrager.
- Voltooiing is push-gebaseerd. Zodra de subagent is gestart, poll dan **niet** `/subagents list`, `sessions_list` of `sessions_history` in een lus alleen om te wachten tot hij klaar is; inspecteer de status alleen op aanvraag voor debugging of ingrijpen.
- Bij voltooiing sluit OpenClaw naar beste vermogen gevolgde browsertabs/processen die door die subagentsessie zijn geopend voordat de aankondigings- en opschoningsflow doorgaat.
- Het spawn-commando is niet-blokkerend; het retourneert onmiddellijk een uitvoerings-id.
- Bij voltooiing meldt de subagent een samenvatting/resultaatbericht terug aan het chatchannel van de aanvrager.
- Voltooiing is push-gebaseerd. Zodra de subagent is gestart, poll dan **niet** `/subagents list`, `sessions_list` of `sessions_history` in een lus alleen om te wachten tot deze klaar is; inspecteer de status alleen op aanvraag voor debugging of interventie.
- Bij voltooiing sluit OpenClaw naar beste vermogen gevolgde browsertabs/processen die door die subagentsessie zijn geopend voordat de aankondigingsopschoning verdergaat.
</Accordion>
<Accordion title="Veerkracht van levering bij handmatige spawn">
<Accordion title="Veerkrachtige levering bij handmatige spawn">
- OpenClaw probeert eerst directe `agent`-levering met een stabiele idempotentiesleutel.
- Als directe levering mislukt, valt het terug op routering via de wachtrij.
- Als wachtrijroutering nog steeds niet beschikbaar is, wordt de aankondiging opnieuw geprobeerd met een korte exponentiele backoff voordat definitief wordt opgegeven.
- Voltooiingslevering behoudt de opgeloste aanvragersroute: thread-gebonden of gespreksgebonden voltooiingsroutes winnen wanneer beschikbaar; als de voltooiingsoorsprong alleen een kanaal levert, vult OpenClaw het ontbrekende doel/account aan vanuit de opgeloste route van de aanvragersessie (`lastChannel` / `lastTo` / `lastAccountId`), zodat directe levering nog steeds werkt.
- Als de voltooiingsbeurt van de aanvrager-agent mislukt, geen zichtbare uitvoer produceert, of een duidelijk onvolledig voorvoegsel van het vastgelegde childresultaat retourneert, valt OpenClaw terug op directe voltooiingslevering vanuit het vastgelegde childresultaat.
- Als directe levering niet kan worden gebruikt, valt het terug op routering via de wachtrij.
- Als routering via de wachtrij nog steeds niet beschikbaar is, wordt de aankondiging opnieuw geprobeerd met korte exponentiële backoff voordat definitief wordt opgegeven.
- Voltooiingslevering behoudt de opgeloste aanvragerroute: thread-gebonden of gespreksgebonden voltooiingsroutes winnen wanneer beschikbaar; als de voltooiingsoorsprong alleen een kanaal levert, vult OpenClaw het ontbrekende doel/account aan vanuit de opgeloste route van de aanvragersessie (`lastChannel` / `lastTo` / `lastAccountId`), zodat directe levering nog steeds werkt.
</Accordion>
<Accordion title="Metadata voor voltooiingsoverdracht">
De voltooiingsoverdracht naar de aanvragersessie is tijdens runtime
gegenereerde interne context (geen door de gebruiker geschreven tekst) en bevat:
De voltooiingsoverdracht naar de aanvragersessie is runtime-gegenereerde
interne context (geen door de gebruiker geschreven tekst) en bevat:
- `Result` — nieuwste zichtbare `assistant`-antwoordtekst, anders opgeschoonde nieuwste tool-/toolResult-tekst. Terminal mislukte runs hergebruiken geen vastgelegde antwoordtekst.
- `Result` — nieuwste zichtbare `assistant`-antwoordtekst, anders gesaneerde nieuwste tool/toolResult-tekst. Terminal gefaalde uitvoeringen hergebruiken geen vastgelegde antwoordtekst.
- `Status``completed successfully` / `failed` / `timed out` / `unknown`.
- Compacte runtime-/tokenstatistieken.
- Een leveringsinstructie die de aanvrageragent vertelt om te herschrijven in normale assistentstem (en geen ruwe interne metadata door te sturen).
- Een leveringsinstructie die de aanvrager-agent vertelt om te herschrijven in normale assistentstem (niet ruwe interne metadata doorsturen).
</Accordion>
<Accordion title="Modi en ACP-runtime">
- `--model` en `--thinking` overschrijven defaults voor die specifieke run.
- `--model` en `--thinking` overschrijven de standaardwaarden voor die specifieke uitvoering.
- Gebruik `info`/`log` om details en uitvoer na voltooiing te inspecteren.
- `/subagents spawn` is one-shotmodus (`mode: "run"`). Gebruik voor persistente thread-gebonden sessies `sessions_spawn` met `thread: true` en `mode: "session"`.
- Gebruik voor ACP-harnesssessies (Claude Code, Gemini CLI, OpenCode, of expliciete Codex ACP/acpx) `sessions_spawn` met `runtime: "acp"` wanneer de tool die runtime adverteert. Zie [ACP-leveringsmodel](/nl/tools/acp-agents#delivery-model) bij het debuggen van voltooiingen of agent-naar-agent-lussen. Wanneer de `codex`-Plugin is ingeschakeld, moet Codex-chat-/threadbesturing de voorkeur geven aan `/codex ...` boven ACP, tenzij de gebruiker expliciet om ACP/acpx vraagt.
- OpenClaw verbergt `runtime: "acp"` totdat ACP is ingeschakeld, de aanvrager niet is gesandboxed en een backend-Plugin zoals `acpx` is geladen. `runtime: "acp"` verwacht een externe ACP-harness-id, of een `agents.list[]`-item met `runtime.type="acp"`; gebruik de standaard subagent-runtime voor normale OpenClaw-configuratieagenten uit `agents_list`.
- `/subagents spawn` is one-shotmodus (`mode: "run"`). Voor persistente thread-gebonden sessies gebruikt u `sessions_spawn` met `thread: true` en `mode: "session"`.
- Voor ACP-harness-sessies (Claude Code, Gemini CLI, OpenCode, of expliciete Codex ACP/acpx), gebruikt u `sessions_spawn` met `runtime: "acp"` wanneer de tool die runtime adverteert. Zie [ACP-leveringsmodel](/nl/tools/acp-agents#delivery-model) bij het debuggen van voltooiingen of agent-naar-agent-lussen. Wanneer de `codex`-Plugin is ingeschakeld, moet Codex-chat-/threadbesturing de voorkeur geven aan `/codex ...` boven ACP, tenzij de gebruiker expliciet om ACP/acpx vraagt.
- OpenClaw verbergt `runtime: "acp"` totdat ACP is ingeschakeld, de aanvrager niet in een sandbox zit en een backend-Plugin zoals `acpx` is geladen. `runtime: "acp"` verwacht een externe ACP-harness-id, of een `agents.list[]`-vermelding met `runtime.type="acp"`; gebruik de standaard subagent-runtime voor normale OpenClaw-configagents uit `agents_list`.
</Accordion>
</AccordionGroup>
## Contextmodi
Native subagenten starten geisoleerd tenzij de aanroeper expliciet vraagt om
Native subagenten starten geïsoleerd, tenzij de aanroeper expliciet vraagt om
het huidige transcript te forken.
| Modus | Wanneer je deze gebruikt | Gedrag |
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| `isolated` | Vers onderzoek, onafhankelijke implementatie, traag toolwerk, of alles wat in de taaktekst kan worden gebrieft | Maakt een schoon childtranscript. Dit is de default en houdt tokengebruik lager. |
| `fork` | Werk dat afhangt van het huidige gesprek, eerdere toolresultaten of genuanceerde instructies die al in het aanvragertranscript staan | Vertakt het aanvragertranscript naar de childsessie voordat het child start. |
| Modus | Wanneer u deze gebruikt | Gedrag |
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| `isolated` | Nieuw onderzoek, onafhankelijke implementatie, traag toolwerk, of alles wat kort in de taaktekst kan worden gebrieft | Maakt een schoon childtranscript. Dit is de standaard en houdt tokengebruik lager. |
| `fork` | Werk dat afhangt van het huidige gesprek, eerdere toolresultaten, of genuanceerde instructies die al in het aanvragertranscript staan | Vertakt het aanvragertranscript naar de childsessie voordat de child start. |
Gebruik `fork` spaarzaam. Het is bedoeld voor contextgevoelige delegatie, niet
als vervanging voor het schrijven van een duidelijke taakprompt.
Gebruik `fork` spaarzaam. Het is bedoeld voor contextgevoelige delegatie, niet als
vervanging voor het schrijven van een duidelijke taakprompt.
## Tool: `sessions_spawn`
Start een subagentrun met `deliver: false` op de globale `subagent`-lane,
voert daarna een aankondigingsstap uit en plaatst het aankondigingsantwoord in
het chatkanaal van de aanvrager.
Start een subagentuitvoering met `deliver: false` op de globale `subagent`-lane,
voert daarna een aankondigingsstap uit en plaatst het aankondigingsantwoord in het
chatchannel van de aanvrager.
Beschikbaarheid hangt af van het effectieve toolbeleid van de aanroeper. De
profielen `coding` en `full` stellen `sessions_spawn` standaard beschikbaar.
Het profiel `messaging` doet dat niet; voeg `tools.alsoAllow: ["sessions_spawn", "sessions_yield",
"subagents"]` toe of gebruik `tools.profile: "coding"` voor agenten die werk
moeten delegeren. Kanaal-/groep-, provider-, sandbox- en allow-/denybeleid per
agent kunnen de tool na de profielfase nog steeds verwijderen. Gebruik `/tools`
vanuit dezelfde sessie om de effectieve toollijst te bevestigen.
Beschikbaarheid hangt af van het effectieve toolbeleid van de aanroeper. De profielen `coding` en
`full` stellen `sessions_spawn` standaard beschikbaar. Het profiel `messaging`
doet dat niet; voeg `tools.alsoAllow: ["sessions_spawn", "sessions_yield",
"subagents"]` toe of gebruik `tools.profile: "coding"` voor agents die werk moeten
delegeren. Kanaal/groep, provider, sandbox en allow/deny-beleid per agent kunnen
de tool na de profielfase nog steeds verwijderen. Gebruik `/tools` vanuit dezelfde
sessie om de effectieve toollijst te bevestigen.
**Defaults:**
**Standaardwaarden:**
- **Model:** erft de aanroeper tenzij je `agents.defaults.subagents.model` instelt (of per-agent `agents.list[].subagents.model`); een expliciete `sessions_spawn.model` wint nog steeds.
- **Thinking:** erft de aanroeper tenzij je `agents.defaults.subagents.thinking` instelt (of per-agent `agents.list[].subagents.thinking`); een expliciete `sessions_spawn.thinking` wint nog steeds.
- **Run-time-out:** als `sessions_spawn.runTimeoutSeconds` is weggelaten, gebruikt OpenClaw `agents.defaults.subagents.runTimeoutSeconds` wanneer ingesteld; anders valt het terug op `0` (geen time-out).
- **Model:** erft van de aanroeper, tenzij u `agents.defaults.subagents.model` instelt (of per-agent `agents.list[].subagents.model`); een expliciete `sessions_spawn.model` wint nog steeds.
- **Thinking:** erft van de aanroeper, tenzij u `agents.defaults.subagents.thinking` instelt (of per-agent `agents.list[].subagents.thinking`); een expliciete `sessions_spawn.thinking` wint nog steeds.
- **Uitvoeringstime-out:** als `sessions_spawn.runTimeoutSeconds` is weggelaten, gebruikt OpenClaw `agents.defaults.subagents.runTimeoutSeconds` wanneer ingesteld; anders valt het terug op `0` (geen time-out).
### Toolparameters
@ -158,52 +161,52 @@ vanuit dezelfde sessie om de effectieve toollijst te bevestigen.
Spawn onder een andere agent-id wanneer toegestaan door `subagents.allowAgents`.
</ParamField>
<ParamField path="runtime" type='"subagent" | "acp"' default="subagent">
`acp` is alleen voor externe ACP-harnesses (`claude`, `droid`, `gemini`, `opencode`, of expliciet aangevraagde Codex ACP/acpx) en voor `agents.list[]`-items waarvan `runtime.type` `acp` is.
`acp` is alleen voor externe ACP-harnesses (`claude`, `droid`, `gemini`, `opencode`, of expliciet gevraagde Codex ACP/acpx) en voor `agents.list[]`-vermeldingen waarvan `runtime.type` `acp` is.
</ParamField>
<ParamField path="resumeSessionId" type="string">
Alleen ACP. Hervat een bestaande ACP-harnesssessie wanneer `runtime: "acp"`; genegeerd voor native subagent-spawns.
Alleen ACP. Hervat een bestaande ACP-harness-sessie wanneer `runtime: "acp"`; genegeerd voor native subagent-spawns.
</ParamField>
<ParamField path="streamTo" type='"parent"'>
Alleen ACP. Streamt ACP-runuitvoer naar de parentsessie wanneer `runtime: "acp"`; laat weg voor native subagent-spawns.
Alleen ACP. Streamt ACP-uitvoeringsuitvoer naar de parentsessie wanneer `runtime: "acp"`; weglaten voor native subagent-spawns.
</ParamField>
<ParamField path="model" type="string">
Overschrijf het subagentmodel. Ongeldige waarden worden overgeslagen en de subagent draait op het standaardmodel met een waarschuwing in het toolresultaat.
</ParamField>
<ParamField path="thinking" type="string">
Overschrijf het thinkingniveau voor de subagentrun.
Overschrijf het thinkingniveau voor de subagentuitvoering.
</ParamField>
<ParamField path="runTimeoutSeconds" type="number">
Default naar `agents.defaults.subagents.runTimeoutSeconds` wanneer ingesteld, anders `0`. Wanneer ingesteld, wordt de subagentrun na N seconden afgebroken.
Standaard `agents.defaults.subagents.runTimeoutSeconds` wanneer ingesteld, anders `0`. Wanneer ingesteld, wordt de subagentuitvoering na N seconden afgebroken.
</ParamField>
<ParamField path="thread" type="boolean" default="false">
Wanneer `true`, vraagt dit kanaalthreadbinding aan voor deze subagentsessie.
Wanneer `true`, vraagt dit kanaalthread-binding aan voor deze subagentsessie.
</ParamField>
<ParamField path="mode" type='"run" | "session"' default="run">
Als `thread: true` en `mode` is weggelaten, wordt de default `session`. `mode: "session"` vereist `thread: true`.
Als `thread: true` en `mode` is weggelaten, wordt de standaard `session`. `mode: "session"` vereist `thread: true`.
</ParamField>
<ParamField path="cleanup" type='"delete" | "keep"' default="keep">
`"delete"` archiveert onmiddellijk na aankondiging (behoudt het transcript nog steeds via hernoemen).
`"delete"` archiveert onmiddellijk na de aankondiging (behoudt het transcript nog steeds via hernoemen).
</ParamField>
<ParamField path="sandbox" type='"inherit" | "require"' default="inherit">
`require` weigert spawn tenzij de doel-childruntime gesandboxed is.
`require` weigert spawn tenzij de doel-childruntime in een sandbox zit.
</ParamField>
<ParamField path="context" type='"isolated" | "fork"' default="isolated">
`fork` vertakt het huidige transcript van de aanvrager naar de childsessie. Alleen native subagenten. Thread-gebonden spawns gebruiken standaard `fork`; niet-threadspawns gebruiken standaard `isolated`.
`fork` vertakt het huidige transcript van de aanvrager naar de childsessie. Alleen native subagenten. Thread-gebonden spawns gebruiken standaard `fork`; niet-thread-spawns gebruiken standaard `isolated`.
</ParamField>
<Warning>
`sessions_spawn` accepteert **geen** kanaalleveringsparameters (`target`,
`channel`, `to`, `threadId`, `replyTo`, `transport`). Gebruik voor levering
`message`/`sessions_send` vanuit de gestarte run.
`message`/`sessions_send` vanuit de gestarte uitvoering.
</Warning>
## Thread-gebonden sessies
Wanneer threadbindingen zijn ingeschakeld voor een kanaal, kan een subagent
aan een thread gebonden blijven, zodat follow-upberichten van gebruikers in die
thread naar dezelfde subagentsessie blijven routeren.
Wanneer thread-bindings zijn ingeschakeld voor een kanaal, kan een subagent gebonden blijven
aan een thread, zodat follow-upgebruikersberichten in die thread naar dezelfde
subagentsessie blijven routeren.
### Kanalen met threadondersteuning
### Kanalen met thread-ondersteuning
**Discord** is momenteel het enige ondersteunde kanaal. Het ondersteunt
persistente thread-gebonden subagentsessies (`sessions_spawn` met
@ -211,7 +214,7 @@ persistente thread-gebonden subagentsessies (`sessions_spawn` met
`/session idle`, `/session max-age`) en adaptersleutels
`channels.discord.threadBindings.enabled`,
`channels.discord.threadBindings.idleHours`,
`channels.discord.threadBindings.maxAgeHours` en
`channels.discord.threadBindings.maxAgeHours`, en
`channels.discord.threadBindings.spawnSessions`.
### Snelle flow
@ -220,46 +223,46 @@ persistente thread-gebonden subagentsessies (`sessions_spawn` met
<Step title="Spawn">
`sessions_spawn` met `thread: true` (en optioneel `mode: "session"`).
</Step>
<Step title="Binden">
OpenClaw maakt of bindt een thread aan dat sessiedoel in het actieve kanaal.
<Step title="Bind">
OpenClaw maakt of koppelt een thread aan dat sessiedoel in het actieve kanaal.
</Step>
<Step title="Follow-ups routeren">
Antwoorden en follow-upberichten in die thread routeren naar de gebonden sessie.
<Step title="Route follow-ups">
Antwoorden en vervolgberichten in die thread worden naar de gekoppelde sessie gerouteerd.
</Step>
<Step title="Time-outs inspecteren">
Gebruik `/session idle` om automatisch unfocusen bij inactiviteit te inspecteren/bij te werken en
`/session max-age` om de harde bovengrens te beheren.
<Step title="Inspect timeouts">
Gebruik `/session idle` om automatische ontfocus bij inactiviteit te inspecteren/bij te werken en
`/session max-age` om de harde limiet te beheren.
</Step>
<Step title="Loskoppelen">
<Step title="Detach">
Gebruik `/unfocus` om handmatig los te koppelen.
</Step>
</Steps>
### Handmatige besturing
### Handmatige bediening
| Opdracht | Effect |
| ------------------ | ---------------------------------------------------------------------- |
| `/focus <target>` | Koppel de huidige thread (of maak er een) aan een subagent-/sessiedoel |
| `/unfocus` | Verwijder de koppeling voor de huidige gekoppelde thread |
| `/agents` | Toon actieve runs en koppelingsstatus (`thread:<id>` of `unbound`) |
| `/session idle` | Inspecteer/update automatische idle-ontkoppeling (alleen gefocuste gekoppelde threads) |
| `/session max-age` | Inspecteer/update harde limiet (alleen gefocuste gekoppelde threads) |
| Commando | Effect |
| ------------------ | ----------------------------------------------------------------------------- |
| `/focus <target>` | Koppel de huidige thread (of maak er een aan) aan een sub-agent-/sessiedoel |
| `/unfocus` | Verwijder de koppeling voor de huidige gekoppelde thread |
| `/agents` | Toon actieve uitvoeringen en koppelingsstatus (`thread:<id>` of `unbound`) |
| `/session idle` | Inspecteer/update automatische ontfocus bij inactiviteit (alleen gefocuste gekoppelde threads) |
| `/session max-age` | Inspecteer/update harde limiet (alleen gefocuste gekoppelde threads) |
### Configuratieschakelaars
- **Globale standaard:** `session.threadBindings.enabled`, `session.threadBindings.idleHours`, `session.threadBindings.maxAgeHours`.
- **Kanaaloverschrijving en spawn-auto-bind-sleutels** zijn adapterspecifiek. Zie [Threadondersteunende kanalen](#thread-supporting-channels) hierboven.
- **Kanaaloverschrijving en sleutels voor automatisch koppelen bij spawn** zijn adapterspecifiek. Zie [Kanalen met thread-ondersteuning](#thread-supporting-channels) hierboven.
Zie [Configuratiereferentie](/nl/gateway/configuration-reference) en
[Slash-opdrachten](/nl/tools/slash-commands) voor actuele adapterdetails.
[Slash-commando's](/nl/tools/slash-commands) voor actuele adapterdetails.
### Toestaanlijst
### Allowlist
<ParamField path="agents.list[].subagents.allowAgents" type="string[]">
Lijst met agent-id's die via expliciete `agentId` kunnen worden benaderd (`["*"]` staat alles toe). Standaard: alleen de aanvragende agent. Als je een lijst instelt en nog steeds wilt dat de aanvrager zichzelf met `agentId` spawnt, neem dan de requester-id op in de lijst.
Lijst met agent-id's die via expliciete `agentId` kunnen worden gekozen (`["*"]` staat alles toe). Standaard: alleen de aanvragende agent. Als je een lijst instelt en nog steeds wilt dat de aanvrager zichzelf met `agentId` kan spawnen, neem dan de requester-id op in de lijst.
</ParamField>
<ParamField path="agents.defaults.subagents.allowAgents" type="string[]">
Standaard toestaanlijst voor doelagents die wordt gebruikt wanneer de aanvragende agent geen eigen `subagents.allowAgents` instelt.
Standaard allowlist voor doelagents die wordt gebruikt wanneer de aanvragende agent geen eigen `subagents.allowAgents` instelt.
</ParamField>
<ParamField path="agents.defaults.subagents.requireAgentId" type="boolean" default="false">
Blokkeer `sessions_spawn`-aanroepen die `agentId` weglaten (dwingt expliciete profielselectie af). Overschrijving per agent: `agents.list[].subagents.requireAgentId`.
@ -268,29 +271,29 @@ Zie [Configuratiereferentie](/nl/gateway/configuration-reference) en
Als de aanvragersessie in een sandbox draait, wijst `sessions_spawn` doelen af
die zonder sandbox zouden draaien.
### Discovery
### Detectie
Gebruik `agents_list` om te zien welke agent-id's momenteel zijn toegestaan voor
`sessions_spawn`. Het antwoord bevat het effectieve model en ingesloten runtime-metadata
van elke vermelde agent, zodat aanroepers PI, Codex-appserver en andere geconfigureerde
native runtimes kunnen onderscheiden.
`sessions_spawn`. Het antwoord bevat voor elke vermelde agent het effectieve
model en ingesloten runtime-metadata, zodat aanroepers onderscheid kunnen maken tussen PI, Codex
app-server en andere geconfigureerde native runtimes.
### Automatisch archiveren
- Subagentsessies worden automatisch gearchiveerd na `agents.defaults.subagents.archiveAfterMinutes` (standaard `60`).
- Sub-agentsessies worden automatisch gearchiveerd na `agents.defaults.subagents.archiveAfterMinutes` (standaard `60`).
- Archiveren gebruikt `sessions.delete` en hernoemt het transcript naar `*.deleted.<timestamp>` (dezelfde map).
- `cleanup: "delete"` archiveert direct na de aankondiging (het transcript blijft behouden via hernoemen).
- Automatisch archiveren is best-effort; uitstaande timers gaan verloren als de Gateway opnieuw start.
- `runTimeoutSeconds` archiveert **niet** automatisch; het stopt alleen de run. De sessie blijft bestaan tot automatisch archiveren.
- `cleanup: "delete"` archiveert direct na aankondiging (het transcript blijft behouden via hernoeming).
- Automatisch archiveren is best-effort; geplande timers gaan verloren als de Gateway opnieuw start.
- `runTimeoutSeconds` archiveert **niet** automatisch; het stopt alleen de uitvoering. De sessie blijft bestaan tot automatische archivering.
- Automatisch archiveren geldt zowel voor diepte-1- als diepte-2-sessies.
- Browseropschoning staat los van archiefopschoning: bijgehouden browsertabs/-processen worden best-effort gesloten wanneer de run eindigt, zelfs als het transcript/de sessierecord behouden blijft.
- Browseropschoning staat los van archiefopschoning: bijgehouden browsertabs/processen worden best-effort gesloten wanneer de uitvoering eindigt, zelfs als het transcript/de sessierecord behouden blijft.
## Geneste subagents
## Geneste sub-agents
Standaard kunnen subagents hun eigen subagents niet spawnen
(`maxSpawnDepth: 1`). Stel `maxSpawnDepth: 2` in om een niveau
nesting in te schakelen — het **orchestratorpatroon**: hoofd → orchestrator-subagent →
worker-sub-subagents.
Standaard kunnen sub-agents hun eigen sub-agents niet spawnen
(`maxSpawnDepth: 1`). Stel `maxSpawnDepth: 2` in om één niveau
nesting in te schakelen — het **orchestrator-patroon**: hoofd → orchestrator-sub-agent →
worker-sub-sub-agents.
```json5
{
@ -310,154 +313,149 @@ worker-sub-subagents.
### Diepteniveaus
| Diepte | Vorm van sessiesleutel | Rol | Kan spawnen? |
| ------ | -------------------------------------------- | --------------------------------------------- | ---------------------------- |
| 0 | `agent:<id>:main` | Hoofdagent | Altijd |
| 1 | `agent:<id>:subagent:<uuid>` | Subagent (orchestrator wanneer diepte 2 toegestaan is) | Alleen als `maxSpawnDepth >= 2` |
| 2 | `agent:<id>:subagent:<uuid>:subagent:<uuid>` | Sub-subagent (leaf-worker) | Nooit |
| ----- | -------------------------------------------- | --------------------------------------------- | ---------------------------- |
| 0 | `agent:<id>:main` | Hoofdagent | Altijd |
| 1 | `agent:<id>:subagent:<uuid>` | Sub-agent (orchestrator wanneer diepte 2 is toegestaan) | Alleen als `maxSpawnDepth >= 2` |
| 2 | `agent:<id>:subagent:<uuid>:subagent:<uuid>` | Sub-sub-agent (leaf-worker) | Nooit |
### Aankondigingsketen
Resultaten stromen terug omhoog door de keten:
1. Diepte-2-worker eindigt → kondigt aan bij de ouder (diepte-1-orchestrator).
2. Diepte-1-orchestrator ontvangt de aankondiging, synthetiseert resultaten, eindigt → kondigt aan bij hoofd.
3. Hoofdagent ontvangt de aankondiging en levert aan de gebruiker.
2. Diepte-1-orchestrator ontvangt de aankondiging, synthetiseert resultaten, eindigt → kondigt aan bij de hoofdsessie.
3. Hoofdagent ontvangt de aankondiging en levert die aan de gebruiker.
Elk niveau ziet alleen aankondigingen van zijn directe kinderen.
<Note>
**Operationele richtlijn:** start child-werk eenmaal en wacht op voltooiingsevents
in plaats van poll-lussen te bouwen rond `sessions_list`,
`sessions_history`, `/subagents list` of `exec`-slaapopdrachten.
**Operationele richtlijn:** start child-werk één keer en wacht op voltooiingsgebeurtenissen
in plaats van pollinglussen te bouwen rond `sessions_list`,
`sessions_history`, `/subagents list` of `exec`-slaapcommando's.
`sessions_list` en `/subagents list` houden child-sessierelaties
gericht op live werk — live children blijven gekoppeld, beëindigde children blijven
korte tijd zichtbaar in een recent venster, en verouderde store-only child-links worden
kort zichtbaar in een recent venster en verouderde child-koppelingen die alleen in de store staan, worden
genegeerd na hun versheidsvenster. Dit voorkomt dat oude `spawnedBy`- /
`parentSessionKey`-metadata spook-children na een herstart opnieuw tot leven wekt.
Als een voltooiingsevent van een child arriveert nadat je het
eindantwoord al hebt verzonden, is de correcte follow-up het exacte stille token
`parentSessionKey`-metadata na een herstart ghost children laten herleven.
Als een voltooiingsgebeurtenis van een child aankomt nadat je het
eindantwoord al hebt verzonden, is de juiste follow-up het exacte stille token
`NO_REPLY` / `no_reply`.
</Note>
### Toolbeleid per diepte
- Rol en control scope worden bij het spawnen naar sessiemetadata geschreven. Daardoor krijgen platte of herstelde sessiesleutels niet per ongeluk opnieuw orchestratorrechten.
- **Diepte 1 (orchestrator, wanneer `maxSpawnDepth >= 2`):** krijgt `sessions_spawn`, `subagents`, `sessions_list`, `sessions_history` zodat hij zijn children kan beheren. Andere sessie-/systeemtools blijven geweigerd.
- Rol en beheerscope worden tijdens het spawnen in sessiemetadata geschreven. Daardoor kunnen platte of herstelde sessiesleutels niet per ongeluk orchestrator-rechten terugkrijgen.
- **Diepte 1 (orchestrator, wanneer `maxSpawnDepth >= 2`):** krijgt `sessions_spawn`, `subagents`, `sessions_list`, `sessions_history`, zodat deze zijn children kan beheren. Andere sessie-/systeemtools blijven geweigerd.
- **Diepte 1 (leaf, wanneer `maxSpawnDepth == 1`):** geen sessietools (huidig standaardgedrag).
- **Diepte 2 (leaf-worker):** geen sessietools — `sessions_spawn` wordt altijd geweigerd op diepte 2. Kan geen verdere children spawnen.
- **Diepte 2 (leaf-worker):** geen sessietools — `sessions_spawn` wordt op diepte 2 altijd geweigerd. Kan geen verdere children spawnen.
### Spawnlimiet per agent
Elke agentsessie (op elke diepte) kan op elk moment maximaal `maxChildrenPerAgent`
(standaard `5`) actieve children hebben. Dit voorkomt ontsporende fan-out
vanaf een enkele orchestrator.
Elke agentsessie (op elke diepte) kan maximaal `maxChildrenPerAgent`
(standaard `5`) actieve children tegelijk hebben. Dit voorkomt ongecontroleerde fan-out
vanuit één orchestrator.
### Cascadestop
### Cascaderende stop
Het stoppen van een diepte-1-orchestrator stopt automatisch al zijn diepte-2
children:
- `/stop` in de hoofdchat stopt alle diepte-1-agents en cascadeert naar hun diepte-2 children.
- `/subagents kill <id>` stopt een specifieke subagent en cascadeert naar zijn children.
- `/subagents kill all` stopt alle subagents voor de aanvrager en cascadeert.
- `/stop` in de hoofdchat stopt alle diepte-1-agents en cascadeert naar hun diepte-2-children.
- `/subagents kill <id>` stopt een specifieke sub-agent en cascadeert naar zijn children.
- `/subagents kill all` stopt alle sub-agents voor de aanvrager en cascadeert.
## Authenticatie
Subagent-auth wordt bepaald op basis van **agent-id**, niet op basis van sessietype:
Authenticatie voor sub-agents wordt bepaald door **agent-id**, niet door sessietype:
- De subagentsessiesleutel is `agent:<agentId>:subagent:<uuid>`.
- De auth-store wordt geladen vanuit de `agentDir` van die agent.
- De sessiesleutel van de sub-agent is `agent:<agentId>:subagent:<uuid>`.
- De auth-store wordt geladen uit de `agentDir` van die agent.
- De auth-profielen van de hoofdagent worden samengevoegd als **fallback**; agentprofielen overschrijven hoofdprofielen bij conflicten.
De merge is additief, dus hoofdprofielen zijn altijd beschikbaar als
fallbacks. Volledig geïsoleerde auth per agent wordt nog niet ondersteund.
De samenvoeging is additief, dus hoofdprofielen zijn altijd beschikbaar als
fallbacks. Volledig geïsoleerde authenticatie per agent wordt nog niet ondersteund.
## Aankondigen
Subagents rapporteren terug via een aankondigingsstap:
Sub-agents rapporteren terug via een aankondigingsstap:
- De aankondigingsstap draait binnen de subagentsessie (niet de aanvragersessie).
- Als de subagent exact `ANNOUNCE_SKIP` antwoordt, wordt er niets geplaatst.
- Als de nieuwste assistenttekst het exacte stille token `NO_REPLY` / `no_reply` is, wordt aankondigingsoutput onderdrukt, zelfs als er eerder zichtbare voortgang was.
- De aankondigingsstap draait binnen de sub-agentsessie (niet de aanvragersessie).
- Als de sub-agent exact `ANNOUNCE_SKIP` antwoordt, wordt er niets geplaatst.
- Als de nieuwste assistenttekst het exacte stille token `NO_REPLY` / `no_reply` is, wordt aankondigingsuitvoer onderdrukt, zelfs als er eerder zichtbare voortgang was.
Levering hangt af van de diepte van de aanvrager:
- Aanvragersessies op topniveau gebruiken een follow-up-`agent`-aanroep met externe levering (`deliver=true`).
- Geneste aanvrager-subagentsessies ontvangen een interne follow-up-injectie (`deliver=false`) zodat de orchestrator child-resultaten binnen de sessie kan synthetiseren.
- Als een geneste aanvrager-subagentsessie verdwenen is, valt OpenClaw terug op de requester van die sessie wanneer beschikbaar.
- Aanvragersessies op topniveau gebruiken een follow-up `agent`-aanroep met externe levering (`deliver=true`).
- Geneste aanvragende subagentsessies ontvangen een interne follow-upinjectie (`deliver=false`), zodat de orchestrator child-resultaten in de sessie kan synthetiseren.
- Als een geneste aanvragende subagentsessie verdwenen is, valt OpenClaw waar beschikbaar terug op de requester van die sessie.
Voor aanvragersessies op topniveau lost directe levering in voltooiingsmodus eerst
elke gekoppelde conversatie-/threadroute en hook-overschrijving op, en vult daarna
ontbrekende kanaaldoelvelden vanuit de opgeslagen route van de aanvragersessie.
Zo blijven voltooiingen in de juiste chat/topic, zelfs wanneer de voltooiingsbron
ontbrekende kanaaldoelvelden aan vanuit de opgeslagen route van de aanvragersessie.
Zo blijven voltooiingen in de juiste chat/topic, zelfs wanneer de oorsprong van de voltooiing
alleen het kanaal identificeert.
Aggregatie van child-voltooiingen is gescoped naar de huidige requester-run bij
het bouwen van geneste voltooiingsbevindingen, zodat verouderde child-output uit eerdere runs
Aggregatie van child-voltooiingen is beperkt tot de huidige aanvrageruitvoering bij het
opbouwen van geneste voltooiingsbevindingen, zodat verouderde child-uitvoer van eerdere uitvoeringen
niet in de huidige aankondiging lekt. Aankondigingsantwoorden behouden
thread-/topicroutering wanneer beschikbaar op kanaaladapters.
thread-/topicroutering wanneer die beschikbaar is op kanaaladapters.
### Aankondigingscontext
Aankondigingscontext wordt genormaliseerd naar een stabiel intern eventblok:
Aankondigingscontext wordt genormaliseerd naar een stabiel intern gebeurtenisblok:
| Veld | Bron |
| -------------- | ------------------------------------------------------------------------------------------------------------- |
| Bron | `subagent` of `cron` |
| Sessie-id's | Child-sessiesleutel/-id |
| Sessie-id's | Child-sessiesleutel/id |
| Type | Aankondigingstype + taaklabel |
| Status | Afgeleid van runtime-uitkomst (`success`, `error`, `timeout` of `unknown`) — **niet** afgeleid uit modeltekst |
| Resultaatinhoud | Nieuwste zichtbare assistenttekst, anders opgeschoonde nieuwste tool-/toolResult-tekst |
| Follow-up | Instructie die beschrijft wanneer te antwoorden versus stil te blijven |
Terminale mislukte runs rapporteren foutstatus zonder vastgelegde
antwoordtekst opnieuw af te spelen. Bij timeout kan de aankondiging, als de child alleen
toolaanroepen heeft gehaald, die geschiedenis samenvouwen tot een korte samenvatting
van gedeeltelijke voortgang in plaats van ruwe tooloutput opnieuw af te spelen.
Terminal gefaalde uitvoeringen rapporteren de foutstatus zonder vastgelegde
antwoordtekst opnieuw af te spelen. Bij timeout kan, als de child alleen door toolaanroepen kwam, de aankondiging
die geschiedenis samenvouwen tot een korte samenvatting van gedeeltelijke voortgang in plaats van
ruwe tooluitvoer opnieuw af te spelen.
### Statistiekregel
Aankondigingspayloads bevatten aan het einde een statistiekregel (zelfs wanneer ingepakt):
Aankondigingspayloads bevatten aan het einde een statistiekregel (ook wanneer omwikkeld):
- Runtime (bijv. `runtime 5m12s`).
- Tokengebruik (input/output/totaal).
- Geschatte kosten wanneer modelprijzen zijn geconfigureerd (`models.providers.*.models[].cost`).
- `sessionKey`, `sessionId` en transcriptpad zodat de hoofdagent geschiedenis kan ophalen via `sessions_history` of het bestand op schijf kan inspecteren.
- `sessionKey`, `sessionId` en transcriptpad, zodat de hoofdagent geschiedenis kan ophalen via `sessions_history` of het bestand op schijf kan inspecteren.
Interne metadata is alleen bedoeld voor orchestratie; gebruikersgerichte antwoorden
moeten worden herschreven in normale assistentstem.
moeten worden herschreven in een normale assistentstem.
### Waarom `sessions_history` de voorkeur heeft
`sessions_history` is het veiligere orchestratiepad:
- Assistentgeheugen wordt eerst genormaliseerd: thinking-tags verwijderd; `<relevant-memories>`- / `<relevant_memories>`-scaffolding verwijderd; XML-payloadblokken voor toolaanroepen in platte tekst (`<tool_call>`, `<function_call>`, `<tool_calls>`, `<function_calls>`) verwijderd, inclusief afgekorte payloads die nooit netjes sluiten; gedegradeerde tool-call/result-scaffolding en historische-contextmarkers verwijderd; gelekte modelcontroletokens (`<|assistant|>`, andere ASCII `<|...|>`, full-width `<...>`) verwijderd; misvormde MiniMax-tool-call-XML verwijderd.
- Assistentherinnering wordt eerst genormaliseerd: thinking-tags verwijderd; `<relevant-memories>`- / `<relevant_memories>`-scaffolding verwijderd; plain-text XML-payloadblokken voor toolaanroepen (`<tool_call>`, `<function_call>`, `<tool_calls>`, `<function_calls>`) verwijderd, inclusief afgekorte payloads die nooit netjes sluiten; gedegradeerde tool-call/result-scaffolding en historische-contextmarkers verwijderd; gelekte modelbesturingstokens (`<|assistant|>`, andere ASCII `<|...|>`, full-width `<...>`) verwijderd; misvormde MiniMax-tool-call-XML verwijderd.
- Tekst die op credentials/tokens lijkt, wordt geredigeerd.
- Lange blokken kunnen worden afgekapt.
- Lange blokken kunnen worden ingekort.
- Zeer grote geschiedenissen kunnen oudere rijen laten vallen of een te grote rij vervangen door `[sessions_history omitted: message too large]`.
- Inspectie van het ruwe transcript op schijf is de fallback wanneer je het volledige byte-voor-byte-transcript nodig hebt.
- Inspectie van het ruwe transcript op schijf is de fallback wanneer je het volledige byte-voor-byte transcript nodig hebt.
## Toolbeleid
Subagents gebruiken eerst dezelfde profiel- en toolbeleidpipeline als de ouder of
doelagent. Daarna past OpenClaw de restrictielaag voor subagents toe.
Subagenten gebruiken eerst dezelfde profiel- en toolbeleidspijplijn als de bovenliggende of doelagent. Daarna past OpenClaw de beperkingslaag voor subagenten toe.
Zonder restrictief `tools.profile` krijgen subagents **alle tools behalve
sessietools** en systeemtools:
Zonder beperkend `tools.profile` krijgen subagenten **alle tools behalve sessietools** en systeemtools:
- `sessions_list`
- `sessions_history`
- `sessions_send`
- `sessions_spawn`
`sessions_history` blijft ook hier een begrensde, opgeschoonde geheugenweergave — het
is geen ruwe transcriptdump.
`sessions_history` blijft ook hier een begrensde, opgeschoonde herinneringsweergave — het is geen ruwe transcriptdump.
Wanneer `maxSpawnDepth >= 2`, ontvangen diepte-1-orchestrator-subagents daarnaast
`sessions_spawn`, `subagents`, `sessions_list` en
`sessions_history` zodat ze hun children kunnen beheren.
Wanneer `maxSpawnDepth >= 2`, ontvangen orchestrator-subagenten op diepte 1 daarnaast `sessions_spawn`, `subagents`, `sessions_list` en `sessions_history`, zodat ze hun kinderen kunnen beheren.
### Overschrijven via configuratie
### Overschrijven via config
```json5
{
@ -481,7 +479,7 @@ Wanneer `maxSpawnDepth >= 2`, ontvangen diepte-1-orchestrator-subagents daarnaas
}
```
`tools.subagents.tools.allow` is een definitief allow-only-filter. Het kan de al opgeloste toolset beperken, maar het kan geen tool **terug toevoegen** die door `tools.profile` is verwijderd. Bijvoorbeeld: `tools.profile: "coding"` bevat `web_search`/`web_fetch`, maar niet de `browser`-tool. Om sub-agents met het coding-profiel browserautomatisering te laten gebruiken, voeg je browser toe in de profielfase:
`tools.subagents.tools.allow` is een laatste filter dat alleen toestaat. Het kan de al opgeloste toolset beperken, maar het kan een tool die door `tools.profile` is verwijderd niet **terug toevoegen**. `tools.profile: "coding"` bevat bijvoorbeeld `web_search`/`web_fetch`, maar niet de `browser`-tool. Voeg browser toe in de profielfase om subagenten met een coding-profiel browserautomatisering te laten gebruiken:
```json5
{
@ -496,40 +494,40 @@ Gebruik per-agent `agents.list[].tools.alsoAllow: ["browser"]` wanneer slechts
## Gelijktijdigheid
Sub-agents gebruiken een speciale in-process wachtrij-lane:
Subagenten gebruiken een toegewezen in-process wachtrijbaan:
- **Lane-naam:** `subagent`
- **Baannaam:** `subagent`
- **Gelijktijdigheid:** `agents.defaults.subagents.maxConcurrent` (standaard `8`)
## Liveness en herstel
OpenClaw behandelt het ontbreken van `endedAt` niet als permanent bewijs dat een sub-agent nog actief is. Niet-beëindigde runs die ouder zijn dan het venster voor verlopen runs tellen niet meer mee als actief/in behandeling in `/subagents list`, statusoverzichten, gating voor voltooiing van descendants en gelijktijdigheidscontroles per sessie.
OpenClaw behandelt het ontbreken van `endedAt` niet als permanent bewijs dat een subagent nog actief is. Niet-beëindigde runs die ouder zijn dan het venster voor verouderde runs, tellen niet meer als actief/in behandeling in `/subagents list`, statusoverzichten, gating voor voltooiing van afstammelingen en gelijktijdigheidscontroles per sessie.
Na een Gateway-herstart worden verlopen, niet-beëindigde herstelde runs opgeschoond, tenzij hun child session is gemarkeerd als `abortedLastRun: true`. Die door herstart afgebroken child sessions blijven herstelbaar via de orphan-herstelstroom voor sub-agents, die een synthetisch hervattingsbericht verzendt voordat de afgebroken-markering wordt gewist.
Na een herstart van de Gateway worden verouderde, niet-beëindigde herstelde runs opgeschoond, tenzij hun kindsessie is gemarkeerd als `abortedLastRun: true`. Die door de herstart afgebroken kindsessies blijven herstelbaar via de herstelstroom voor verweesde subagenten, die een synthetisch hervattingsbericht verzendt voordat de afgebroken-markering wordt gewist.
Automatisch herstel na herstart is begrensd per child session. Als dezelfde child van een sub-agent herhaaldelijk wordt geaccepteerd voor orphan-herstel binnen het snelle re-wedge-venster, bewaart OpenClaw een herstel-tombstone op die sessie en stopt het met automatisch hervatten bij latere herstarts. Voer `openclaw tasks maintenance --apply` uit om de taakrecord te reconciliëren, of `openclaw doctor --fix` om verlopen afgebroken herstelvlaggen op sessies met een tombstone te wissen.
Automatisch herstel na herstart is begrensd per kindsessie. Als hetzelfde subagent-kind herhaaldelijk binnen het snelle re-wedge-venster wordt geaccepteerd voor verweesd herstel, bewaart OpenClaw een herstel-tombstone op die sessie en stopt het met automatisch hervatten bij latere herstarts. Voer `openclaw tasks maintenance --apply` uit om de taakrecord te reconciliëren, of `openclaw doctor --fix` om verouderde afgebroken-herstelvlaggen op tombstoned sessies te wissen.
<Note>
Als het starten van een sub-agent mislukt met Gateway `PAIRING_REQUIRED` / `scope-upgrade`, controleer dan de RPC-caller voordat je de pairing-status bewerkt. Interne `sessions_spawn`-coördinatie moet verbinden als `client.id: "gateway-client"` met `client.mode: "backend"` via directe local loopback-authenticatie met gedeeld token/wachtwoord; dat pad is niet afhankelijk van de scope-basislijn van gekoppelde apparaten van de CLI. Externe callers, expliciete `deviceIdentity`, expliciete paden met device-token en browser-/node-clients hebben nog steeds normale apparaatgoedkeuring nodig voor scope-upgrades.
Als het spawnen van een subagent mislukt met Gateway `PAIRING_REQUIRED` / `scope-upgrade`, controleer dan de RPC-aanroeper voordat je de koppelingsstatus bewerkt. Interne `sessions_spawn`-coördinatie moet verbinden als `client.id: "gateway-client"` met `client.mode: "backend"` via directe loopback-authenticatie met gedeeld token/wachtwoord; dat pad is niet afhankelijk van de baseline voor het gekoppelde-apparaatbereik van de CLI. Externe aanroepers, expliciete `deviceIdentity`, expliciete apparaat-tokenpaden en browser-/Node-clients hebben nog steeds normale apparaatgoedkeuring nodig voor bereikupgrades.
</Note>
## Stoppen
- Het verzenden van `/stop` in de aanvragerchat breekt de aanvragersessie af en stopt alle actieve sub-agent-runs die daaruit zijn gestart, met cascading naar geneste children.
- `/subagents kill <id>` stopt een specifieke sub-agent en laat dit doorlopen naar zijn children.
- Het verzenden van `/stop` in de aanvragerchat breekt de aanvragersessie af en stopt alle actieve subagent-runs die daaruit zijn gespawnd, met cascade naar geneste kinderen.
- `/subagents kill <id>` stopt een specifieke subagent en cascadeert naar zijn kinderen.
## Beperkingen
- Aankondiging van sub-agents is **best-effort**. Als de Gateway herstart, gaat in behandeling zijnd werk voor "announce back" verloren.
- Sub-agents delen nog steeds dezelfde procesresources van de Gateway; behandel `maxConcurrent` als een veiligheidsventiel.
- `sessions_spawn` is altijd niet-blokkerend: het retourneert onmiddellijk `{ status: "accepted", runId, childSessionKey }`.
- Sub-agent-context injecteert alleen `AGENTS.md` + `TOOLS.md` (geen `SOUL.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md` of `BOOTSTRAP.md`).
- Maximale nestingsdiepte is 5 (`maxSpawnDepth`-bereik: 15). Diepte 2 wordt aanbevolen voor de meeste use cases.
- `maxChildrenPerAgent` begrenst actieve children per sessie (standaard `5`, bereik `120`).
- Aankondiging door subagenten is **best-effort**. Als de Gateway herstart, gaat in behandeling zijnd "announce back"-werk verloren.
- Subagenten delen nog steeds dezelfde Gateway-procesresources; behandel `maxConcurrent` als een veiligheidsklep.
- `sessions_spawn` is altijd niet-blokkerend: het retourneert direct `{ status: "accepted", runId, childSessionKey }`.
- Subagentcontext injecteert alleen `AGENTS.md` + `TOOLS.md` (geen `SOUL.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md` of `BOOTSTRAP.md`).
- De maximale nestingsdiepte is 5 (`maxSpawnDepth`-bereik: 15). Diepte 2 wordt aanbevolen voor de meeste gebruikssituaties.
- `maxChildrenPerAgent` beperkt actieve kinderen per sessie (standaard `5`, bereik `120`).
## Gerelateerd
- [ACP-agents](/nl/tools/acp-agents)
- [ACP-agenten](/nl/tools/acp-agents)
- [Agent verzenden](/nl/tools/agent-send)
- [Achtergrondtaken](/nl/automation/tasks)
- [Multi-agent sandbox-tools](/nl/tools/multi-agent-sandbox-tools)
- [Multi-agent-sandboxtools](/nl/tools/multi-agent-sandbox-tools)

View File

@ -1,140 +1,143 @@
---
read_when:
- Parsing of standaardinstellingen aanpassen voor denken, snelle modus of uitgebreide richtlijnen
summary: Directievesyntaxis voor /think, /fast, /verbose, /trace en zichtbaarheid van redenering
- Parsing of standaardwaarden voor denk-, snelle-modus- of uitgebreide instructies aanpassen
summary: Directivesyntaxis voor /think, /fast, /verbose, /trace en zichtbaarheid van redenering
title: Denkniveaus
x-i18n:
generated_at: "2026-04-30T16:31:35Z"
generated_at: "2026-05-04T07:09:57Z"
model: gpt-5.5
provider: openai
source_hash: f9adf065e46cb64e4c2149b95ecd69ed887a17e2eff5a5569894defa3e7217b7
source_hash: 6fa1b0a2b5f7b93a706488c3ad39dfe08c08eed0bdd30880eb4c07d730ee4d4f
source_path: tools/thinking.md
workflow: 16
---
## Wat het doet
- Inline directive in elke inkomende body: `/t <level>`, `/think:<level>`, of `/thinking <level>`.
- Inline-instructie in elke inkomende body: `/t <level>`, `/think:<level>` of `/thinking <level>`.
- Niveaus (aliassen): `off | minimal | low | medium | high | xhigh | adaptive | max`
- minimal → “think”
- low → “think hard”
- medium → “think harder”
- minimal → “denk”
- low → “denk hard”
- medium → “denk harder”
- high → “ultrathink” (maximaal budget)
- xhigh → “ultrathink+” (GPT-5.2+ en Codex-modellen, plus Anthropic Claude Opus 4.7-inspanning)
- adaptive → door de provider beheerd adaptief denken (ondersteund voor Claude 4.6 op Anthropic/Bedrock, Anthropic Claude Opus 4.7 en dynamisch denken van Google Gemini)
- max → maximale redenering van de provider (Anthropic Claude Opus 4.7; Ollama koppelt dit aan de hoogste native `think`-inspanning)
- adaptive → door provider beheerd adaptief denken (ondersteund voor Claude 4.6 op Anthropic/Bedrock, Anthropic Claude Opus 4.7 en Google Gemini dynamisch denken)
- max → maximale reasoning van de provider (Anthropic Claude Opus 4.7; Ollama koppelt dit aan de hoogste native `think`-inspanning)
- `x-high`, `x_high`, `extra-high`, `extra high` en `extra_high` verwijzen naar `xhigh`.
- `highest` verwijst naar `high`.
- Providernotities:
- Denkmenu's en -kiezers worden aangestuurd door providerprofielen. Providerplugins declareren de exacte niveauset voor het geselecteerde model, inclusief labels zoals binair `on`.
- `adaptive`, `xhigh` en `max` worden alleen getoond voor provider-/modelprofielen die ze ondersteunen. Getypte directives voor niet-ondersteunde niveaus worden geweigerd met de geldige opties van dat model.
- Bestaande opgeslagen niet-ondersteunde niveaus worden opnieuw gekoppeld op basis van providerprofielrang. `adaptive` valt terug op `medium` bij niet-adaptieve modellen, terwijl `xhigh` en `max` terugvallen op het grootste ondersteunde niet-`off`-niveau voor het geselecteerde model.
- Anthropic Claude 4.6-modellen gebruiken standaard `adaptive` wanneer geen expliciet denkniveau is ingesteld.
- Anthropic Claude Opus 4.7 gebruikt adaptief denken niet standaard. De standaard voor API-inspanning blijft eigendom van de provider, tenzij je expliciet een denkniveau instelt.
- Anthropic Claude Opus 4.7 koppelt `/think xhigh` aan adaptief denken plus `output_config.effort: "xhigh"`, omdat `/think` een denkdirective is en `xhigh` de Opus 4.7-inspanningsinstelling is.
- Anthropic Claude Opus 4.7 biedt ook `/think max`; dit verwijst naar hetzelfde providerbeheerde pad voor maximale inspanning.
- Provider-opmerkingen:
- Denkmenu's en keuzelijsten worden aangestuurd door het providerprofiel. Provider-plugins declareren de exacte niveauset voor het geselecteerde model, inclusief labels zoals binair `on`.
- `adaptive`, `xhigh` en `max` worden alleen getoond voor provider-/modelprofielen die ze ondersteunen. Getypte instructies voor niet-ondersteunde niveaus worden geweigerd met de geldige opties van dat model.
- Bestaande opgeslagen niet-ondersteunde niveaus worden opnieuw gekoppeld op basis van providerrang in het profiel. `adaptive` valt terug op `medium` bij niet-adaptieve modellen, terwijl `xhigh` en `max` terugvallen op het grootste ondersteunde niet-`off`-niveau voor het geselecteerde model.
- Anthropic Claude 4.6-modellen gebruiken standaard `adaptive` wanneer er geen expliciet denkniveau is ingesteld.
- Anthropic Claude Opus 4.7 gebruikt niet standaard adaptief denken. De standaard API-inspanning blijft eigendom van de provider, tenzij je expliciet een denkniveau instelt.
- Anthropic Claude Opus 4.7 koppelt `/think xhigh` aan adaptief denken plus `output_config.effort: "xhigh"`, omdat `/think` een denkinstructie is en `xhigh` de inspanningsinstelling van Opus 4.7 is.
- Anthropic Claude Opus 4.7 biedt ook `/think max`; dit verwijst naar hetzelfde door de provider beheerde pad voor maximale inspanning.
- DeepSeek V4-modellen bieden `/think xhigh|max`; beide verwijzen naar DeepSeek `reasoning_effort: "max"`, terwijl lagere niet-`off`-niveaus naar `high` verwijzen.
- Ollama-modellen met denkondersteuning bieden `/think low|medium|high|max`; `max` verwijst naar native `think: "high"`, omdat de native API van Ollama de inspanningsteksten `low`, `medium` en `high` accepteert.
- OpenAI GPT-modellen koppelen `/think` via modelspecifieke ondersteuning voor Responses API-inspanning. `/think off` verzendt `reasoning.effort: "none"` alleen wanneer het doelmodel dit ondersteunt; anders laat OpenClaw de uitgeschakelde redeneringspayload weg in plaats van een niet-ondersteunde waarde te verzenden.
- Aangepaste OpenAI-compatibele catalogusvermeldingen kunnen `/think xhigh` inschakelen door `models.providers.<provider>.models[].compat.supportedReasoningEfforts` zo in te stellen dat `"xhigh"` is opgenomen. Dit gebruikt dezelfde compatmetadata die uitgaande OpenAI-redeneringsinspanningpayloads koppelt, zodat menu's, sessievalidering, agent-CLI en `llm-task` overeenkomen met transportgedrag.
- Verouderde geconfigureerde OpenRouter Hunter Alpha-refs slaan proxyredeneringsinjectie over, omdat die ingetrokken route definitieve antwoordtekst via redeneringsvelden kon retourneren.
- Google Gemini koppelt `/think adaptive` aan Gemini's providerbeheerde dynamische denken. Gemini 3-verzoeken laten een vaste `thinkingLevel` weg, terwijl Gemini 2.5-verzoeken `thinkingBudget: -1` verzenden; vaste niveaus verwijzen nog steeds naar de dichtstbijzijnde Gemini `thinkingLevel` of het dichtstbijzijnde budget voor die modelfamilie.
- MiniMax (`minimax/*`) op het Anthropic-compatibele streamingpad gebruikt standaard `thinking: { type: "disabled" }`, tenzij je denken expliciet instelt in modelparameters of verzoekparameters. Dit voorkomt gelekte `reasoning_content`-delta's uit MiniMax' niet-native Anthropic-streamformaat.
- Ollama-modellen met denkcapaciteit bieden `/think low|medium|high|max`; `max` verwijst naar native `think: "high"` omdat de native API van Ollama `low`-, `medium`- en `high`-inspanningstrings accepteert.
- OpenAI GPT-modellen koppelen `/think` via modelspecifieke ondersteuning voor inspanning in de Responses API. `/think off` verzendt `reasoning.effort: "none"` alleen wanneer het doelmodel dit ondersteunt; anders laat OpenClaw de uitgeschakelde reasoning-payload weg in plaats van een niet-ondersteunde waarde te verzenden.
- Aangepaste OpenAI-compatibele catalogusvermeldingen kunnen `/think xhigh` inschakelen door `models.providers.<provider>.models[].compat.supportedReasoningEfforts` zo in te stellen dat `"xhigh"` is opgenomen. Dit gebruikt dezelfde compat-metadata die uitgaande OpenAI reasoning-inspanningspayloads koppelt, zodat menu's, sessievalidering, agent-CLI en `llm-task` overeenkomen met transportgedrag.
- Verouderde geconfigureerde OpenRouter Hunter Alpha-verwijzingen slaan proxy-reasoning-injectie over omdat die ingetrokken route uiteindelijke antwoordtekst via reasoning-velden kon teruggeven.
- Google Gemini koppelt `/think adaptive` aan door Gemini's provider beheerd dynamisch denken. Gemini 3-verzoeken laten een vast `thinkingLevel` weg, terwijl Gemini 2.5-verzoeken `thinkingBudget: -1` verzenden; vaste niveaus worden nog steeds gekoppeld aan het dichtstbijzijnde Gemini `thinkingLevel` of budget voor die modelfamilie.
- MiniMax (`minimax/*`) op het Anthropic-compatibele streamingpad gebruikt standaard `thinking: { type: "disabled" }`, tenzij je denken expliciet instelt in modelparameters of requestparameters. Dit voorkomt gelekte `reasoning_content`-delta's uit MiniMax' niet-native Anthropic-streamindeling.
- Z.AI (`zai/*`) ondersteunt alleen binair denken (`on`/`off`). Elk niet-`off`-niveau wordt behandeld als `on` (gekoppeld aan `low`).
- Moonshot (`moonshot/*`) koppelt `/think off` aan `thinking: { type: "disabled" }` en elk niet-`off`-niveau aan `thinking: { type: "enabled" }`. Wanneer denken is ingeschakeld, accepteert Moonshot alleen `tool_choice` `auto|none`; OpenClaw normaliseert incompatibele waarden naar `auto`.
## Oplossingsvolgorde
## Resolutievolgorde
1. Inline directive in het bericht (geldt alleen voor dat bericht).
2. Sessie-override (ingesteld door een bericht te verzenden dat alleen een directive bevat).
1. Inline-instructie op het bericht (geldt alleen voor dat bericht).
2. Sessie-override (ingesteld door een bericht te sturen dat alleen uit een instructie bestaat).
3. Standaard per agent (`agents.list[].thinkingDefault` in config).
4. Globale standaard (`agents.defaults.thinkingDefault` in config).
5. Fallback: door de provider gedeclareerde standaard wanneer beschikbaar; anders lossen modellen met redeneervermogen op naar `medium` of het dichtstbijzijnde ondersteunde niet-`off`-niveau voor dat model, en modellen zonder redenering blijven `off`.
5. Terugval: door provider gedeclareerde standaard wanneer beschikbaar; anders lossen modellen met reasoning-capaciteit op naar `medium` of het dichtstbijzijnde ondersteunde niet-`off`-niveau voor dat model, en modellen zonder reasoning blijven `off`.
## Een sessiestandaard instellen
- Verzend een bericht dat **alleen** de directive bevat (witruimte toegestaan), bijvoorbeeld `/think:medium` of `/t high`.
- Dit blijft gelden voor de huidige sessie (standaard per afzender); gewist door `/think:off` of een sessiereset na inactiviteit.
- Stuur een bericht dat **alleen** de instructie bevat (witruimte toegestaan), bijvoorbeeld `/think:medium` of `/t high`.
- Dat blijft gelden voor de huidige sessie (standaard per afzender); gewist door `/think:off` of een sessie-idlereset.
- Er wordt een bevestigingsantwoord verzonden (`Thinking level set to high.` / `Thinking disabled.`). Als het niveau ongeldig is (bijvoorbeeld `/thinking big`), wordt de opdracht geweigerd met een hint en blijft de sessiestatus ongewijzigd.
- Verzend `/think` (of `/think:`) zonder argument om het huidige denkniveau te zien.
- Stuur `/think` (of `/think:`) zonder argument om het huidige denkniveau te zien.
## Toepassing per agent
- **Ingebedde Pi**: het opgeloste niveau wordt doorgegeven aan de in-process Pi-agentruntime.
- **Embedded Pi**: het opgeloste niveau wordt doorgegeven aan de in-process Pi-agentruntime.
## Snelle modus (/fast)
- Niveaus: `on|off`.
- Een bericht dat alleen de directive bevat, schakelt een sessie-override voor snelle modus om en antwoordt `Fast mode enabled.` / `Fast mode disabled.`.
- Verzend `/fast` (of `/fast status`) zonder modus om de huidige effectieve status van snelle modus te zien.
- OpenClaw lost snelle modus in deze volgorde op:
1. Inline/alleen-directive `/fast on|off`
- Een bericht dat alleen uit een instructie bestaat, schakelt een sessie-override voor snelle modus om en antwoordt `Fast mode enabled.` / `Fast mode disabled.`.
- Stuur `/fast` (of `/fast status`) zonder modus om de huidige effectieve status van snelle modus te zien.
- OpenClaw lost snelle modus op in deze volgorde:
1. Inline/alleen-instructie `/fast on|off`
2. Sessie-override
3. Standaard per agent (`agents.list[].fastModeDefault`)
4. Config per model: `agents.defaults.models["<provider>/<model>"].params.fastMode`
5. Fallback: `off`
- Voor `openai/*` wordt snelle modus gekoppeld aan OpenAI-prioriteitsverwerking door `service_tier=priority` te verzenden bij ondersteunde Responses-verzoeken.
- Voor `openai-codex/*` verzendt snelle modus dezelfde vlag `service_tier=priority` bij Codex Responses. OpenClaw behoudt één gedeelde `/fast`-schakelaar voor beide authenticatiepaden.
- Voor directe openbare `anthropic/*`-verzoeken, inclusief via OAuth geauthenticeerd verkeer dat naar `api.anthropic.com` wordt verzonden, wordt snelle modus gekoppeld aan Anthropic-serviceniveaus: `/fast on` stelt `service_tier=auto` in, `/fast off` stelt `service_tier=standard_only` in.
5. Terugval: `off`
- Voor `openai/*` wordt snelle modus gekoppeld aan OpenAI priority processing door `service_tier=priority` te verzenden bij ondersteunde Responses-verzoeken.
- Voor `openai-codex/*` verzendt snelle modus dezelfde `service_tier=priority`-vlag bij Codex Responses. OpenClaw behoudt één gedeelde `/fast`-schakelaar voor beide auth-paden.
- Voor directe openbare `anthropic/*`-verzoeken, inclusief OAuth-geauthenticeerd verkeer dat naar `api.anthropic.com` wordt gestuurd, wordt snelle modus gekoppeld aan Anthropic-serviceniveaus: `/fast on` stelt `service_tier=auto` in, `/fast off` stelt `service_tier=standard_only` in.
- Voor `minimax/*` op het Anthropic-compatibele pad herschrijft `/fast on` (of `params.fastMode: true`) `MiniMax-M2.7` naar `MiniMax-M2.7-highspeed`.
- Expliciete Anthropic `serviceTier` / `service_tier`-modelparameters overschrijven de standaard voor snelle modus wanneer beide zijn ingesteld. OpenClaw slaat nog steeds Anthropic-serviceniveau-injectie over voor niet-Anthropic proxybasis-URL's.
- Expliciete Anthropic `serviceTier` / `service_tier`-modelparameters overschrijven de standaard voor snelle modus wanneer beide zijn ingesteld. OpenClaw slaat Anthropic-serviceniveau-injectie nog steeds over voor niet-Anthropic proxybasis-URL's.
- `/status` toont `Fast` alleen wanneer snelle modus is ingeschakeld.
## Uitgebreide directives (/verbose of /v)
## Verbose-instructies (/verbose of /v)
- Niveaus: `on` (minimaal) | `full` | `off` (standaard).
- Een bericht dat alleen de directive bevat, schakelt uitgebreide sessielogging om en antwoordt `Verbose logging enabled.` / `Verbose logging disabled.`; ongeldige niveaus retourneren een hint zonder de status te wijzigen.
- Een bericht dat alleen uit een instructie bestaat, schakelt verbose voor de sessie om en antwoordt `Verbose logging enabled.` / `Verbose logging disabled.`; ongeldige niveaus geven een hint terug zonder de status te wijzigen.
- `/verbose off` slaat een expliciete sessie-override op; wis die via de Sessions-UI door `inherit` te kiezen.
- Inline directive geldt alleen voor dat bericht; sessie-/globale standaarden gelden anders.
- Verzend `/verbose` (of `/verbose:`) zonder argument om het huidige uitgebreide niveau te zien.
- Wanneer uitgebreid aan staat, sturen agents die gestructureerde toolresultaten uitsturen (Pi, andere JSON-agents) elke toolaanroep terug als een eigen bericht met alleen metadata, voorafgegaan door `<emoji> <tool-name>: <arg>` wanneer beschikbaar (pad/opdracht). Deze toolsamenvattingen worden verzonden zodra elke tool start (afzonderlijke bubbels), niet als streamingdelta's.
- Samenvattingen van toolfouten blijven zichtbaar in normale modus, maar ruwe detailsuffixen voor fouten worden verborgen tenzij uitgebreid `on` of `full` is.
- Wanneer uitgebreid `full` is, worden tooluitvoerresultaten ook na voltooiing doorgestuurd (afzonderlijke bubbel, afgekapt tot een veilige lengte). Als je `/verbose on|full|off` omschakelt terwijl een run actief is, respecteren volgende toolbubbels de nieuwe instelling.
- Inline-instructie geldt alleen voor dat bericht; sessie-/globale standaarden gelden anders.
- Stuur `/verbose` (of `/verbose:`) zonder argument om het huidige verbose-niveau te zien.
- Wanneer verbose aan staat, sturen agents die gestructureerde toolresultaten uitsturen (Pi, andere JSON-agents) elke toolaanroep terug als een eigen metadata-only bericht, voorafgegaan door `<emoji> <tool-name>: <arg>` wanneer beschikbaar. Deze toolsamenvattingen worden verzonden zodra elke tool start (aparte bubbels), niet als streaming-delta's.
- Samenvattingen van toolfouten blijven zichtbaar in normale modus, maar raw foutdetailsuffixen zijn verborgen tenzij verbose `on` of `full` is.
- Wanneer verbose `full` is, worden tooloutputs ook na voltooiing doorgestuurd (aparte bubbel, afgekapt tot een veilige lengte). Als je `/verbose on|full|off` omschakelt terwijl een run bezig is, volgen volgende toolbubbels de nieuwe instelling.
- `agents.defaults.toolProgressDetail` bepaalt de vorm van `/verbose`-toolsamenvattingen en toolregels in voortgangsconcepten. Gebruik `"explain"` (standaard) voor compacte menselijke labels zoals `🛠️ Exec: checking JS syntax`; gebruik `"raw"` wanneer je ook de raw opdracht/details wilt toevoegen voor debugging. Per-agent `agents.list[].toolProgressDetail` overschrijft de standaard.
- `explain`: `🛠️ Exec: check JS syntax for /tmp/app.js`
- `raw`: `🛠️ Exec: check JS syntax for /tmp/app.js, node --check /tmp/app.js`
## Plugin-traceringsdirectives (/trace)
## Plugin-trace-instructies (/trace)
- Niveaus: `on` | `off` (standaard).
- Een bericht dat alleen de directive bevat, schakelt Plugin-traceringsuitvoer voor de sessie om en antwoordt `Plugin trace enabled.` / `Plugin trace disabled.`.
- Inline directive geldt alleen voor dat bericht; sessie-/globale standaarden gelden anders.
- Verzend `/trace` (of `/trace:`) zonder argument om het huidige traceringsniveau te zien.
- `/trace` is smaller dan `/verbose`: het toont alleen trace-/debugregels die eigendom zijn van de Plugin, zoals Active Memory-debugsamenvattingen.
- Traceringsregels kunnen verschijnen in `/status` en als een volgend diagnostisch bericht na het normale assistentantwoord.
- Een bericht dat alleen uit een instructie bestaat, schakelt trace-uitvoer van sessie-Plugin om en antwoordt `Plugin trace enabled.` / `Plugin trace disabled.`.
- Inline-instructie geldt alleen voor dat bericht; sessie-/globale standaarden gelden anders.
- Stuur `/trace` (of `/trace:`) zonder argument om het huidige trace-niveau te zien.
- `/trace` is smaller dan `/verbose`: het toont alleen trace-/debugregels die eigendom zijn van Plugin, zoals debug-samenvattingen van Active Memory.
- Traceregels kunnen verschijnen in `/status` en als een aanvullend diagnostisch bericht na het normale assistentantwoord.
## Zichtbaarheid van redenering (/reasoning)
## Zichtbaarheid van reasoning (/reasoning)
- Niveaus: `on|off|stream`.
- Een bericht dat alleen de directive bevat, schakelt om of denkblokken in antwoorden worden getoond.
- Wanneer ingeschakeld, wordt redenering verzonden als een **afzonderlijk bericht** voorafgegaan door `Reasoning:`.
- `stream` (alleen Telegram): streamt redenering naar de Telegram-conceptbubbel terwijl het antwoord wordt gegenereerd, en verzendt daarna het definitieve antwoord zonder redenering.
- Een bericht dat alleen uit een instructie bestaat, schakelt om of denkblokken in antwoorden worden getoond.
- Wanneer ingeschakeld, wordt reasoning verzonden als een **apart bericht** voorafgegaan door `Reasoning:`.
- `stream` (alleen Telegram): streamt reasoning naar de Telegram-conceptbubbel terwijl het antwoord wordt gegenereerd, en verzendt daarna het definitieve antwoord zonder reasoning.
- Alias: `/reason`.
- Verzend `/reasoning` (of `/reasoning:`) zonder argument om het huidige redeneringsniveau te zien.
- Oplossingsvolgorde: inline directive, daarna sessie-override, daarna standaard per agent (`agents.list[].reasoningDefault`), daarna fallback (`off`).
- Stuur `/reasoning` (of `/reasoning:`) zonder argument om het huidige reasoning-niveau te zien.
- Resolutievolgorde: inline-instructie, daarna sessie-override, daarna standaard per agent (`agents.list[].reasoningDefault`), daarna terugval (`off`).
Misvormde redeneringstags van lokale modellen worden conservatief afgehandeld. Gesloten `<think>...</think>`-blokken blijven verborgen in normale antwoorden, en niet-gesloten redenering na tekst die al zichtbaar is, wordt ook verborgen. Als een antwoord volledig is omwikkeld met één niet-gesloten openingstag en anders als lege tekst zou worden geleverd, verwijdert OpenClaw de misvormde openingstag en levert de resterende tekst.
Misvormde reasoning-tags van lokale modellen worden conservatief afgehandeld. Gesloten `<think>...</think>`-blokken blijven verborgen in normale antwoorden, en niet-gesloten reasoning na al zichtbare tekst wordt ook verborgen. Als een antwoord volledig is verpakt in één niet-gesloten openingstag en anders als lege tekst zou worden afgeleverd, verwijdert OpenClaw de misvormde openingstag en levert de resterende tekst af.
## Gerelateerd
- Documentatie voor verhoogde modus staat in [Verhoogde modus](/nl/tools/elevated).
- Documentatie over verhoogde modus staat in [Verhoogde modus](/nl/tools/elevated).
## Heartbeats
- De body van de Heartbeat-probe is de geconfigureerde Heartbeat-prompt (standaard: `Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`). Inline directives in een Heartbeat-bericht gelden zoals gebruikelijk (maar vermijd het wijzigen van sessiestandaarden vanuit Heartbeats).
- Heartbeat-bezorging gebruikt standaard alleen de definitieve payload. Om ook het afzonderlijke `Reasoning:`-bericht te verzenden (wanneer beschikbaar), stel `agents.defaults.heartbeat.includeReasoning: true` of per agent `agents.list[].heartbeat.includeReasoning: true` in.
- De body van de Heartbeat-probe is de geconfigureerde Heartbeat-prompt (standaard: `Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`). Inline-instructies in een Heartbeat-bericht gelden zoals gewoonlijk (maar vermijd het wijzigen van sessiestandaarden vanuit Heartbeats).
- Heartbeat-levering gebruikt standaard alleen de uiteindelijke payload. Om ook het afzonderlijke `Reasoning:`-bericht te verzenden (wanneer beschikbaar), stel je `agents.defaults.heartbeat.includeReasoning: true` of per-agent `agents.list[].heartbeat.includeReasoning: true` in.
## Webchat-UI
- De denkkiezer in de webchat spiegelt het opgeslagen niveau van de sessie uit de inkomende sessiestore/config wanneer de pagina wordt geladen.
- De denkselector van de webchat weerspiegelt het opgeslagen niveau van de sessie uit de inkomende sessiestore/config wanneer de pagina wordt geladen.
- Het kiezen van een ander niveau schrijft de sessie-override onmiddellijk via `sessions.patch`; het wacht niet op de volgende verzending en is geen eenmalige `thinkingOnce`-override.
- De eerste optie is altijd `Default (<resolved level>)`, waarbij de opgeloste standaard afkomstig is uit het providerdenkprofiel van het model van de actieve sessie plus dezelfde fallbacklogica die `/status` en `session_status` gebruiken.
- De kiezer gebruikt `thinkingLevels` die door de Gateway-sessierij/-standaarden worden geretourneerd, waarbij `thinkingOptions` behouden blijft als legacy labellijst. De browser-UI houdt geen eigen provider-regexlijst bij; plugins zijn eigenaar van modelspecifieke niveausets.
- `/think:<level>` werkt nog steeds en werkt hetzelfde opgeslagen sessieniveau bij, zodat chatdirectives en de kiezer gesynchroniseerd blijven.
- De eerste optie is altijd `Default (<resolved level>)`, waarbij de opgeloste standaard afkomstig is van het providerdenkprofiel van het actieve sessiemodel plus dezelfde terugvallogica die `/status` en `session_status` gebruiken.
- De keuzelijst gebruikt `thinkingLevels` die worden teruggegeven door de Gateway-sessierij/-standaarden, waarbij `thinkingOptions` als legacy labellijst behouden blijft. De browser-UI houdt geen eigen provider-regexlijst bij; plugins zijn eigenaar van modelspecifieke niveausets.
- `/think:<level>` werkt nog steeds en werkt hetzelfde opgeslagen sessieniveau bij, zodat chatinstructies en de keuzelijst gesynchroniseerd blijven.
## Providerprofielen
- Provider-plugins kunnen `resolveThinkingProfile(ctx)` beschikbaar maken om de ondersteunde niveaus en standaardwaarde van het model te definiëren.
- Provider-plugins die Claude-modellen proxyen, moeten `resolveClaudeThinkingProfile(modelId)` uit `openclaw/plugin-sdk/provider-model-shared` hergebruiken, zodat directe Anthropic- en proxycatalogi afgestemd blijven.
- Provider-plugins kunnen `resolveThinkingProfile(ctx)` beschikbaar maken om de ondersteunde niveaus en de standaardwaarde van het model te definiëren.
- Provider-plugins die als proxy voor Claude-modellen fungeren, moeten `resolveClaudeThinkingProfile(modelId)` uit `openclaw/plugin-sdk/provider-model-shared` hergebruiken, zodat directe Anthropic- en proxycatalogi afgestemd blijven.
- Elk profielniveau heeft een opgeslagen canonieke `id` (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `adaptive` of `max`) en kan een weergave-`label` bevatten. Binaire providers gebruiken `{ id: "low", label: "on" }`.
- Tool-plugins die een expliciete thinking-override moeten valideren, moeten `api.runtime.agent.resolveThinkingPolicy({ provider, model })` plus `api.runtime.agent.normalizeThinkingLevel(...)` gebruiken; ze mogen geen eigen provider-/modelniveaulijsten bijhouden.
- Tool-plugins met toegang tot geconfigureerde metadata van aangepaste modellen kunnen `catalog` doorgeven aan `resolveThinkingPolicy`, zodat opt-ins voor `compat.supportedReasoningEfforts` worden meegenomen in validatie aan de pluginkant.
- Gepubliceerde legacy-hooks (`supportsXHighThinking`, `isBinaryThinking` en `resolveDefaultThinkingLevel`) blijven bestaan als compatibiliteitsadapters, maar nieuwe aangepaste niveausets moeten `resolveThinkingProfile` gebruiken.
- Gateway-rijen/-standaardwaarden stellen `thinkingLevels`, `thinkingOptions` en `thinkingDefault` beschikbaar, zodat ACP-/chatclients dezelfde profiel-id's en labels renderen die runtimevalidatie gebruikt.
- Tool-plugins die een expliciete thinking-override moeten valideren, moeten `api.runtime.agent.resolveThinkingPolicy({ provider, model })` plus `api.runtime.agent.normalizeThinkingLevel(...)` gebruiken; ze moeten geen eigen lijsten met provider-/modelniveaus bijhouden.
- Tool-plugins met toegang tot geconfigureerde metadata van aangepaste modellen kunnen `catalog` doorgeven aan `resolveThinkingPolicy`, zodat opt-ins voor `compat.supportedReasoningEfforts` worden meegenomen in validatie aan de pluginzijde.
- Gepubliceerde legacy hooks (`supportsXHighThinking`, `isBinaryThinking` en `resolveDefaultThinkingLevel`) blijven bestaan als compatibiliteitsadapters, maar nieuwe aangepaste niveausets moeten `resolveThinkingProfile` gebruiken.
- Gateway-rijen/-standaardwaarden bieden `thinkingLevels`, `thinkingOptions` en `thinkingDefault`, zodat ACP-/chatclients dezelfde profiel-id's en labels renderen als runtimevalidatie gebruikt.

View File

@ -1,30 +1,30 @@
---
read_when:
- Je wilt een URL ophalen en leesbare inhoud extraheren
- Je moet web_fetch of de Firecrawl-terugvaloptie configureren
- Je wilt de limieten en cachewerking van web_fetch begrijpen
- U moet web_fetch of de bijbehorende Firecrawl-terugvaloptie configureren
- Je wilt de limieten en caching van web_fetch begrijpen
sidebarTitle: Web Fetch
summary: web_fetch-hulpmiddel -- HTTP-ophaalactie met extractie van leesbare inhoud
summary: web_fetch-hulpmiddel -- HTTP-ophalen met extractie van leesbare inhoud
title: Web ophalen
x-i18n:
generated_at: "2026-05-02T11:31:02Z"
generated_at: "2026-05-04T07:10:21Z"
model: gpt-5.5
provider: openai
source_hash: f455da77c20049f0ed0246fa53e9f49d3cf2004e65bd64a0bf871861c6e93229
source_hash: c8c3efbf4a640b2fd69cc9532dcb06a873a6830a2e8a85ab7510ab38207c8670
source_path: tools/web-fetch.md
workflow: 16
---
De tool `web_fetch` voert een gewone HTTP GET uit en extraheert leesbare inhoud
(HTML naar markdown of tekst). Hij voert **geen** JavaScript uit.
De tool `web_fetch` voert een eenvoudige HTTP GET uit en extraheert leesbare inhoud
(HTML naar markdown of tekst). De tool voert **geen** JavaScript uit.
Gebruik voor JS-zware sites of pagina's achter een login in plaats daarvan de
[Webbrowser](/nl/tools/browser).
Gebruik voor JS-zware sites of pagina's die door inloggen zijn beschermd in plaats daarvan de
[Webbrowser](/nl/tools/browser).
## Snel starten
## Snel aan de slag
`web_fetch` is **standaard ingeschakeld** -- geen configuratie nodig. De agent kan
hem direct aanroepen:
de tool direct aanroepen:
```javascript
await web_fetch({ url: "https://example.com/article" });
@ -33,33 +33,33 @@ await web_fetch({ url: "https://example.com/article" });
## Toolparameters
<ParamField path="url" type="string" required>
URL om op te halen. Alleen `http(s)`.
Op te halen URL. Alleen `http(s)`.
</ParamField>
<ParamField path="extractMode" type="'markdown' | 'text'" default="markdown">
Uitvoerformaat na extractie van de hoofdinhoud.
Uitvoerindeling na extractie van de hoofdinhoud.
</ParamField>
<ParamField path="maxChars" type="number">
Kap uitvoer af tot dit aantal tekens.
Kap de uitvoer af tot dit aantal tekens.
</ParamField>
## Hoe het werkt
<Steps>
<Step title="Ophalen">
Verstuurt een HTTP GET met een Chrome-achtige User-Agent en
`Accept-Language`-header. Blokkeert private/interne hostnamen en controleert omleidingen opnieuw.
Verzendt een HTTP GET met een Chrome-achtige User-Agent en `Accept-Language`-
header. Blokkeert privé/interne hostnamen en controleert redirects opnieuw.
</Step>
<Step title="Extraheren">
Voert Readability (extractie van hoofdinhoud) uit op de HTML-respons.
</Step>
<Step title="Fallback (optioneel)">
Als Readability mislukt en Firecrawl is geconfigureerd, probeert het opnieuw via de
Firecrawl-API met modus voor bot-omzeiling.
Als Readability mislukt en Firecrawl is geconfigureerd, wordt opnieuw geprobeerd via de
Firecrawl-API met bot-omzeilingsmodus.
</Step>
<Step title="Cache">
Resultaten worden 15 minuten gecachet (configureerbaar) om herhaald
Resultaten worden 15 minuten gecachet (configureerbaar) om herhaaldelijk
ophalen van dezelfde URL te verminderen.
</Step>
</Steps>
@ -79,6 +79,7 @@ Kap uitvoer af tot dit aantal tekens.
timeoutSeconds: 30,
cacheTtlMinutes: 15,
maxRedirects: 3,
useTrustedEnvProxy: false, // let a trusted HTTP(S) env proxy resolve DNS
readability: true, // use Readability extraction
userAgent: "Mozilla/5.0 ...", // override User-Agent
ssrfPolicy: {
@ -125,41 +126,59 @@ Als Readability-extractie mislukt, kan `web_fetch` terugvallen op
```
`plugins.entries.firecrawl.config.webFetch.apiKey` ondersteunt SecretRef-objecten.
Verouderde `tools.web.fetch.firecrawl.*`-configuratie wordt automatisch gemigreerd door `openclaw doctor --fix`.
Verouderde configuratie `tools.web.fetch.firecrawl.*` wordt automatisch gemigreerd door `openclaw doctor --fix`.
<Note>
Als Firecrawl is ingeschakeld en de SecretRef ervan niet kan worden opgelost zonder
`FIRECRAWL_API_KEY`-env-fallback, faalt het opstarten van de Gateway snel.
Als Firecrawl is ingeschakeld en de SecretRef niet kan worden opgelost zonder
`FIRECRAWL_API_KEY`-env-fallback, mislukt het starten van de Gateway snel.
</Note>
<Note>
Firecrawl-overschrijvingen van `baseUrl` zijn afgeschermd: gehost verkeer gebruikt
`https://api.firecrawl.dev`; zelfgehoste overschrijvingen moeten private of
interne endpoints als doel hebben, en `http://` wordt alleen voor die private doelen geaccepteerd.
Firecrawl-overschrijvingen voor `baseUrl` zijn strikt beperkt: gehost verkeer gebruikt
`https://api.firecrawl.dev`; zelf gehoste overschrijvingen moeten gericht zijn op privé- of
interne eindpunten, en `http://` wordt alleen geaccepteerd voor die privétargets.
</Note>
Huidig runtimegedrag:
- `tools.web.fetch.provider` selecteert expliciet de fallbackprovider voor ophalen.
- `tools.web.fetch.provider` selecteert de fallbackprovider voor ophalen expliciet.
- Als `provider` is weggelaten, detecteert OpenClaw automatisch de eerste gereedstaande web-fetch-
provider uit beschikbare credentials. Niet-gesandboxte `web_fetch` kan
geinstalleerde plugins gebruiken die `contracts.webFetchProviders` declareren en tijdens runtime een
overeenkomende provider registreren. Vandaag is de gebundelde provider Firecrawl.
- Gesandboxte `web_fetch`-aanroepen blijven beperkt tot gebundelde providers.
- Als Readability is uitgeschakeld, slaat `web_fetch` direct door naar de geselecteerde
providerfallback. Als er geen provider beschikbaar is, faalt het gesloten.
provider op basis van beschikbare inloggegevens. Niet-gesandboxte `web_fetch` kan
geïnstalleerde plugins gebruiken die `contracts.webFetchProviders` declareren en tijdens runtime een
overeenkomende provider registreren. Momenteel is de meegeleverde provider Firecrawl.
- Gesandboxte `web_fetch`-aanroepen blijven beperkt tot meegeleverde providers.
- Als Readability is uitgeschakeld, slaat `web_fetch` direct over naar de geselecteerde
providerfallback. Als er geen provider beschikbaar is, faalt de tool gesloten.
## Vertrouwde Env Proxy
Als je deployment vereist dat `web_fetch` via een vertrouwde uitgaande
HTTP(S)-proxy loopt, stel dan `tools.web.fetch.useTrustedEnvProxy: true` in.
In deze modus past OpenClaw nog steeds hostnaamgebaseerde SSRF-controles toe voordat
de aanvraag wordt verzonden, maar laat het de proxy DNS oplossen in plaats van lokale DNS-
pinning te doen. Schakel dit alleen in wanneer de proxy door de operator wordt beheerd en
uitgaand beleid afdwingt na DNS-resolutie.
<Note>
Als er geen HTTP(S)-proxy-env-var is geconfigureerd, of als de doelhost is uitgesloten door
`NO_PROXY`, valt `web_fetch` terug op het normale strikte pad met lokale DNS-
pinning.
</Note>
## Limieten en veiligheid
- `maxChars` wordt begrensd op `tools.web.fetch.maxCharsCap`
- De responsbody wordt voor het parsen begrensd op `maxResponseBytes`; te grote
- De responsebody wordt begrensd op `maxResponseBytes` vóór parsing; te grote
responses worden afgekapt met een waarschuwing
- Private/interne hostnamen worden geblokkeerd
- Privé/interne hostnamen worden geblokkeerd
- `tools.web.fetch.ssrfPolicy.allowRfc2544BenchmarkRange` en
`tools.web.fetch.ssrfPolicy.allowIpv6UniqueLocalRange` zijn nauwe opt-ins
voor vertrouwde fake-IP-proxystacks; laat ze unset tenzij je proxy
die synthetische bereiken bezit en zijn eigen bestemmingsbeleid afdwingt
- Omleidingen worden gecontroleerd en beperkt door `maxRedirects`
`tools.web.fetch.ssrfPolicy.allowIpv6UniqueLocalRange` zijn beperkte opt-ins
voor vertrouwde fake-IP-proxystacks; laat ze unset tenzij je proxy eigenaar is van
die synthetische bereiken en een eigen bestemmingsbeleid afdwingt
- Redirects worden gecontroleerd en beperkt door `maxRedirects`
- `useTrustedEnvProxy` is een expliciete opt-in en mag alleen worden ingeschakeld voor
door operators beheerde proxy's die na DNS-resolutie nog steeds uitgaand beleid afdwingen
- `web_fetch` werkt op basis van best effort -- sommige sites hebben de [Webbrowser](/nl/tools/browser) nodig
## Toolprofielen
@ -177,6 +196,6 @@ Als je toolprofielen of allowlists gebruikt, voeg dan `web_fetch` of `group:web`
## Gerelateerd
- [Webzoekopdracht](/nl/tools/web) -- doorzoek het web met meerdere providers
- [Zoeken op het web](/nl/tools/web) -- doorzoek het web met meerdere providers
- [Webbrowser](/nl/tools/browser) -- volledige browserautomatisering voor JS-zware sites
- [Firecrawl](/nl/tools/firecrawl) -- Firecrawl-tools voor zoeken en scrapen
- [Firecrawl](/nl/tools/firecrawl) -- zoek- en scrapetools van Firecrawl

View File

@ -3,18 +3,18 @@ read_when:
- Je wilt de Gateway vanuit een browser bedienen
- Je wilt Tailnet-toegang zonder SSH-tunnels
sidebarTitle: Control UI
summary: Browsergebaseerde beheer-UI voor de Gateway (chat, knooppunten, configuratie)
title: Bedienings-UI
summary: Browsergebaseerde beheerinterface voor de Gateway (chat, knooppunten, configuratie)
title: Bedieningsinterface
x-i18n:
generated_at: "2026-05-03T11:17:00Z"
generated_at: "2026-05-04T07:10:16Z"
model: gpt-5.5
provider: openai
source_hash: 88959ccf435b31015039bf28c3043023d99f0b953a1489986ab2d0cbd261771c
source_hash: 07fbbe1c7fec5f67a04a231e02bdf0f7d16be9c5fe188915674d71fcd69002a5
source_path: web/control-ui.md
workflow: 16
---
De Control UI is een kleine **Vite + Lit**-single-page app die door de Gateway wordt geserveerd:
De Control UI is een kleine **Vite + Lit** single-page-app die door de Gateway wordt geserveerd:
- standaard: `http://<host>:18789/`
- optioneel prefix: stel `gateway.controlUi.basePath` in (bijv. `/openclaw`)
@ -23,7 +23,7 @@ Deze communiceert **rechtstreeks met de Gateway WebSocket** op dezelfde poort.
## Snel openen (lokaal)
Als de Gateway op dezelfde computer draait, open je:
Als de Gateway op dezelfde computer draait, open:
- [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (of [http://localhost:18789/](http://localhost:18789/))
@ -36,13 +36,13 @@ Authenticatie wordt tijdens de WebSocket-handshake geleverd via:
- Tailscale Serve-identiteitsheaders wanneer `gateway.auth.allowTailscale: true`
- trusted-proxy-identiteitsheaders wanneer `gateway.auth.mode: "trusted-proxy"`
Het instellingenpaneel van het dashboard bewaart een token voor de huidige browsertabsessie en de geselecteerde gateway-URL; wachtwoorden worden niet bewaard. Onboarding genereert meestal bij de eerste verbinding een gateway-token voor gedeelde-geheim-authenticatie, maar wachtwoordauthenticatie werkt ook wanneer `gateway.auth.mode` `"password"` is.
Het instellingenpaneel van het dashboard bewaart een token voor de huidige browsertabsessie en geselecteerde gateway-URL; wachtwoorden worden niet bewaard. Onboarding genereert meestal een gateway-token voor shared-secret-authenticatie bij de eerste verbinding, maar wachtwoordauthenticatie werkt ook wanneer `gateway.auth.mode` `"password"` is.
## Apparaatkoppeling (eerste verbinding)
Wanneer je vanuit een nieuwe browser of vanaf een nieuw apparaat verbinding maakt met de Control UI, vereist de Gateway meestal een **eenmalige koppelingsgoedkeuring**. Dit is een beveiligingsmaatregel om onbevoegde toegang te voorkomen.
Wanneer je vanaf een nieuwe browser of apparaat verbinding maakt met de Control UI, vereist de Gateway meestal een **eenmalige koppelingsgoedkeuring**. Dit is een beveiligingsmaatregel om ongeautoriseerde toegang te voorkomen.
**Wat je ziet:** "disconnected (1008): pairing required"
**Wat je ziet:** "verbinding verbroken (1008): koppeling vereist"
<Steps>
<Step title="Openstaande verzoeken weergeven">
@ -50,7 +50,7 @@ Wanneer je vanuit een nieuwe browser of vanaf een nieuw apparaat verbinding maak
openclaw devices list
```
</Step>
<Step title="Goedkeuren op aanvraag-ID">
<Step title="Goedkeuren op verzoek-ID">
```bash
openclaw devices approve <requestId>
```
@ -59,62 +59,62 @@ Wanneer je vanuit een nieuwe browser of vanaf een nieuw apparaat verbinding maak
Als de browser opnieuw probeert te koppelen met gewijzigde authenticatiegegevens (rol/scopes/openbare sleutel), wordt het vorige openstaande verzoek vervangen en wordt er een nieuwe `requestId` aangemaakt. Voer `openclaw devices list` opnieuw uit vóór goedkeuring.
Als de browser al is gekoppeld en je deze wijzigt van leestoegang naar schrijf-/beheertoegang, wordt dit behandeld als een goedkeuringsupgrade, niet als een stille herverbinding. OpenClaw houdt de oude goedkeuring actief, blokkeert de bredere herverbinding en vraagt je om de nieuwe scopeset expliciet goed te keuren.
Als de browser al gekoppeld is en je deze wijzigt van leestoegang naar schrijf-/beheerderstoegang, wordt dit behandeld als een goedkeuringsupgrade, niet als een stille herverbinding. OpenClaw houdt de oude goedkeuring actief, blokkeert de bredere herverbinding en vraagt je de nieuwe set scopes expliciet goed te keuren.
Na goedkeuring wordt het apparaat onthouden en is er geen nieuwe goedkeuring nodig tenzij je het intrekt met `openclaw devices revoke --device <id> --role <role>`. Zie [Apparaten-CLI](/nl/cli/devices) voor tokenrotatie en intrekking.
Na goedkeuring wordt het apparaat onthouden en is geen hernieuwde goedkeuring vereist, tenzij je het intrekt met `openclaw devices revoke --device <id> --role <role>`. Zie [Apparaten-CLI](/nl/cli/devices) voor tokenrotatie en intrekking.
<Note>
- Rechtstreekse lokale local loopback-browserverbindingen (`127.0.0.1` / `localhost`) worden automatisch goedgekeurd.
- Tailscale Serve kan de koppelingsronde overslaan voor Control UI-operatorsessies wanneer `gateway.auth.allowTailscale: true`, de Tailscale-identiteit is geverifieerd en de browser zijn apparaatidentiteit presenteert.
- Rechtstreekse local loopback-browserverbindingen (`127.0.0.1` / `localhost`) worden automatisch goedgekeurd.
- Tailscale Serve kan de koppelingsronde overslaan voor Control UI-operatorsessies wanneer `gateway.auth.allowTailscale: true`, Tailscale-identiteit wordt geverifieerd en de browser zijn apparaatidentiteit presenteert.
- Rechtstreekse Tailnet-binds, LAN-browserverbindingen en browserprofielen zonder apparaatidentiteit vereisen nog steeds expliciete goedkeuring.
- Elk browserprofiel genereert een unieke apparaat-ID, dus wisselen van browser of het wissen van browsergegevens vereist opnieuw koppelen.
- Elk browserprofiel genereert een unieke apparaat-ID, dus wisselen van browser of browsergegevens wissen vereist opnieuw koppelen.
</Note>
## Persoonlijke identiteit (browserlokaal)
## Persoonlijke identiteit (browser-lokaal)
De Control UI ondersteunt een persoonlijke identiteit per browser (weergavenaam en avatar) die aan uitgaande berichten wordt gekoppeld voor toeschrijving in gedeelde sessies. Deze staat in browseropslag, is beperkt tot het huidige browserprofiel en wordt niet gesynchroniseerd met andere apparaten of server-side bewaard buiten de normale metadata voor transcriptauteurschap op berichten die je daadwerkelijk verzendt. Het wissen van sitegegevens of wisselen van browser zet deze terug naar leeg.
De Control UI ondersteunt een persoonlijke identiteit per browser (weergavenaam en avatar) die aan uitgaande berichten wordt gekoppeld voor attributie in gedeelde sessies. Deze staat in browseropslag, is beperkt tot het huidige browserprofiel en wordt niet gesynchroniseerd naar andere apparaten of server-side bewaard buiten de normale auteurschapsmetadata van transcripties op berichten die je daadwerkelijk verstuurt. Sitegegevens wissen of van browser wisselen zet deze terug naar leeg.
Hetzelfde browserlokale patroon geldt voor de override van de assistent-avatar. Geüploade assistent-avatars leggen de door de gateway opgeloste identiteit alleen over de lokale browser heen en maken nooit een roundtrip via `config.patch`. Het gedeelde configuratieveld `ui.assistant.avatar` blijft beschikbaar voor niet-UI-clients die het veld rechtstreeks schrijven (zoals gescripte gateways of aangepaste dashboards).
Hetzelfde browser-lokale patroon geldt voor de override van de assistentavatar. Geüploade assistentavatars overlappen de door de gateway opgeloste identiteit alleen in de lokale browser en maken nooit een round-trip via `config.patch`. Het gedeelde configuratieveld `ui.assistant.avatar` blijft beschikbaar voor niet-UI-clients die het veld rechtstreeks schrijven (zoals scripted gateways of aangepaste dashboards).
## Runtime-configuratie-eindpunt
De Control UI haalt de runtime-instellingen op uit `/__openclaw/control-ui-config.json`. Dat eindpunt wordt beveiligd door dezelfde gateway-authenticatie als de rest van het HTTP-oppervlak: niet-geauthenticeerde browsers kunnen het niet ophalen, en een geslaagde ophaalactie vereist een al geldig gateway-token/wachtwoord, Tailscale Serve-identiteit of een trusted-proxy-identiteit.
De Control UI haalt zijn runtime-instellingen op van `/__openclaw/control-ui-config.json`. Dat eindpunt wordt afgeschermd door dezelfde gateway-authenticatie als de rest van het HTTP-oppervlak: niet-geauthenticeerde browsers kunnen het niet ophalen, en een succesvolle fetch vereist een al geldig gateway-token/wachtwoord, Tailscale Serve-identiteit of een trusted-proxy-identiteit.
## Taalondersteuning
De Control UI kan zichzelf bij de eerste laadactie lokaliseren op basis van je browserlocale. Om dit later te overschrijven, open je **Overzicht -> Gateway-toegang -> Taal**. De locale-kiezer staat in de Gateway-toegangskaart, niet onder Uiterlijk.
De Control UI kan zichzelf bij de eerste laadbeurt lokaliseren op basis van je browserlocale. Om dit later te overschrijven, open **Overzicht -> Gateway-toegang -> Taal**. De locale-kiezer staat in de Gateway-toegangskaart, niet onder Uiterlijk.
- Ondersteunde locales: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `ar`, `it`, `tr`, `uk`, `id`, `pl`, `th`, `vi`, `nl`, `fa`
- Niet-Engelse vertalingen worden lazy-loaded in de browser.
- De geselecteerde locale wordt opgeslagen in browseropslag en hergebruikt bij toekomstige bezoeken.
- Ontbrekende vertaalsleutels vallen terug op Engels.
Documentatievertalingen worden gegenereerd voor dezelfde niet-Engelse localeset, maar de ingebouwde Mintlify-taalkiezer van de documentatiesite is beperkt tot de locale-codes die Mintlify accepteert. Thaise (`th`) en Perzische (`fa`) documentatie wordt nog steeds gegenereerd in de publicatierepository; deze verschijnt mogelijk pas in die kiezer wanneer Mintlify die codes ondersteunt.
Documentatievertalingen worden gegenereerd voor dezelfde niet-Engelse localeset, maar de ingebouwde Mintlify-taalkiezer van de documentatiesite is beperkt tot de locale-codes die Mintlify accepteert. Thaise (`th`) en Perzische (`fa`) documentatie wordt nog steeds gegenereerd in de publicatierepo; deze verschijnt mogelijk pas in die kiezer wanneer Mintlify die codes ondersteunt.
## Uiterlijkthema's
Het paneel Uiterlijk behoudt de ingebouwde thema's Claw, Knot en Dash, plus één browserlokale tweakcn-importslot. Om een thema te importeren, open je [tweakcn themes](https://tweakcn.com/themes), kies of maak je een thema, klik je op **Delen** en plak je de gekopieerde themalink in Uiterlijk. De importer accepteert ook `https://tweakcn.com/r/themes/<id>`-registry-URL's, editor-URL's zoals `https://tweakcn.com/editor/theme?theme=amethyst-haze`, relatieve `/themes/<id>`-paden, ruwe thema-ID's en standaardthemanamen zoals `amethyst-haze`.
Het paneel Uiterlijk behoudt de ingebouwde Claw-, Knot- en Dash-thema's, plus één browser-lokaal tweakcn-importslot. Om een thema te importeren, open [tweakcn editor](https://tweakcn.com/editor/theme), kies of maak een thema, klik op **Delen** en plak de gekopieerde themalink in Uiterlijk. De importfunctie accepteert ook `https://tweakcn.com/r/themes/<id>`-registry-URL's, editor-URL's zoals `https://tweakcn.com/editor/theme?theme=amethyst-haze`, relatieve `/themes/<id>`-paden, ruwe thema-ID's en standaardthemanamen zoals `amethyst-haze`.
Geïmporteerde thema's worden alleen in het huidige browserprofiel opgeslagen. Ze worden niet naar de gateway-configuratie geschreven en synchroniseren niet tussen apparaten. Het vervangen van het geïmporteerde thema werkt het ene lokale slot bij; het wissen ervan schakelt het actieve thema terug naar Claw als het geïmporteerde thema was geselecteerd.
Geïmporteerde thema's worden alleen opgeslagen in het huidige browserprofiel. Ze worden niet naar de gateway-configuratie geschreven en synchroniseren niet tussen apparaten. Het vervangen van het geïmporteerde thema werkt het ene lokale slot bij; wissen schakelt het actieve thema terug naar Claw als het geïmporteerde thema geselecteerd was.
## Wat het kan doen (vandaag)
<AccordionGroup>
<Accordion title="Chatten en praten">
<Accordion title="Chat en Talk">
- Chat met het model via Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`).
- Praat via realtime browsersessies. OpenAI gebruikt directe WebRTC, Google Live gebruikt een beperkt browser-token voor eenmalig gebruik via WebSocket, en realtime spraakplugins die alleen backend zijn gebruiken het relay-transport van de Gateway. De relay bewaart providerreferenties op de Gateway terwijl de browser microfoon-PCM streamt via `talk.realtime.relay*`-RPC's en `openclaw_agent_consult`-toolaanroepen terugstuurt via `chat.send` voor het grotere geconfigureerde OpenClaw-model.
- Stream toolaanroepen + live kaarten met tooluitvoer in Chat (agent-events).
- Praat via realtime browsersessies. OpenAI gebruikt directe WebRTC, Google Live gebruikt een beperkt eenmalig browser-token via WebSocket, en realtime spraakplugins die alleen op de backend draaien gebruiken het Gateway-relaytransport. De relay houdt providerreferenties op de Gateway terwijl de browser microfoon-PCM streamt via `talk.realtime.relay*`-RPC's en `openclaw_agent_consult`-toolaanroepen terugstuurt via `chat.send` voor het grotere geconfigureerde OpenClaw-model.
- Stream toolaanroepen + live tooluitvoerkaarten in Chat (agentgebeurtenissen).
</Accordion>
<Accordion title="Kanalen, instanties, sessies, dromen">
- Kanalen: ingebouwde plus gebundelde/externe pluginkanalenstatus, QR-login en configuratie per kanaal (`channels.status`, `web.login.*`, `config.patch`).
- Instanties: aanwezigheidslijst + vernieuwen (`system-presence`).
- Sessies: lijst + overrides per sessie voor model/denken/snel/uitgebreid/trace/reasoning (`sessions.list`, `sessions.patch`).
- Dromen: Dreaming-status, in-/uitschakelknop en Dream Diary-lezer (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
- Sessies: lijst + overrides per sessie voor model/thinking/fast/verbose/trace/reasoning (`sessions.list`, `sessions.patch`).
- Dromen: Dreaming-status, in-/uitschakelaar en Dream Diary-lezer (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
</Accordion>
<Accordion title="Cron, Skills, Nodes, exec-goedkeuringen">
<Accordion title="Cron, skills, nodes, exec-goedkeuringen">
- Cron-taken: weergeven/toevoegen/bewerken/uitvoeren/inschakelen/uitschakelen + uitvoeringsgeschiedenis (`cron.*`).
- Skills: status, inschakelen/uitschakelen, installeren, API-sleutelupdates (`skills.*`).
- Nodes: lijst + caps (`node.list`).
@ -123,29 +123,29 @@ Geïmporteerde thema's worden alleen in het huidige browserprofiel opgeslagen. Z
</Accordion>
<Accordion title="Configuratie">
- Bekijk/bewerk `~/.openclaw/openclaw.json` (`config.get`, `config.set`).
- Pas toe + herstart met validatie (`config.apply`) en wek de laatst actieve sessie.
- Schrijfacties bevatten een base-hash-guard om te voorkomen dat gelijktijdige bewerkingen worden overschreven.
- Schrijfacties (`config.set`/`config.apply`/`config.patch`) voeren vooraf SecretRef-resolutie uit voor actieve refs in de ingediende configuratiepayload; niet-opgeloste actieve ingediende refs worden vóór het schrijven geweigerd.
- Schema + formulierweergave (`config.schema` / `config.schema.lookup`, inclusief veld `title` / `description`, overeenkomende UI-hints, directe child-samenvattingen, documentatiemetadata op geneste object-/wildcard-/array-/compositienodes, plus plugin- + kanaalschema's wanneer beschikbaar); de Raw JSON-editor is alleen beschikbaar wanneer de snapshot een veilige raw roundtrip heeft.
- Als een snapshot niet veilig raw tekst kan roundtrippen, forceert Control UI de formuliermodus en schakelt het Raw-modus uit voor die snapshot.
- Raw JSON-editor "Opgeslagen versie herstellen" behoudt de raw-aangemaakte vorm (opmaak, opmerkingen, `$include`-layout) in plaats van een afgevlakte snapshot opnieuw te renderen, zodat externe bewerkingen een reset overleven wanneer de snapshot veilig kan roundtrippen.
- Gestructureerde SecretRef-objectwaarden worden alleen-lezen weergegeven in tekstinvoer van formulieren om onbedoelde object-naar-string-corruptie te voorkomen.
- Toepassen + opnieuw starten met validatie (`config.apply`) en de laatst actieve sessie wekken.
- Schrijfbewerkingen bevatten een base-hash-beveiliging om te voorkomen dat gelijktijdige bewerkingen worden overschreven.
- Schrijfbewerkingen (`config.set`/`config.apply`/`config.patch`) voeren vooraf actieve SecretRef-resolutie uit voor refs in de ingediende configuratiepayload; niet-opgeloste actieve ingediende refs worden vóór schrijven geweigerd.
- Schema + formulierweergave (`config.schema` / `config.schema.lookup`, inclusief veld `title` / `description`, overeenkomende UI-hints, directe samenvattingen van children, documentatiemetadata op geneste object-/wildcard-/array-/composition-nodes, plus plugin- en kanaalschema's wanneer beschikbaar); de Raw JSON-editor is alleen beschikbaar wanneer de snapshot een veilige raw round-trip heeft.
- Als een snapshot niet veilig raw tekst kan round-trippen, dwingt Control UI de formuliermodus af en schakelt Raw-modus uit voor die snapshot.
- Raw JSON-editor "Terugzetten naar opgeslagen" behoudt de raw-aangemaakte vorm (opmaak, opmerkingen, `$include`-layout) in plaats van een afgevlakte snapshot opnieuw te renderen, zodat externe bewerkingen een reset overleven wanneer de snapshot veilig kan round-trippen.
- Gestructureerde SecretRef-objectwaarden worden read-only weergegeven in formuliertekstinvoeren om onbedoelde corruptie van object naar string te voorkomen.
</Accordion>
<Accordion title="Debug, logs, update">
- Debug: snapshots van status/gezondheid/modellen + eventlog + handmatige RPC-aanroepen (`status`, `health`, `models.list`).
- Debug: status-/health-/models-snapshots + gebeurtenislog + handmatige RPC-aanroepen (`status`, `health`, `models.list`).
- Logs: live tail van gateway-bestandslogs met filter/export (`logs.tail`).
- Update: voer een pakket-/git-update + herstart uit (`update.run`) met een herstartrapport en poll daarna `update.status` na herverbinding om de actieve gateway-versie te verifiëren.
- Update: voer een package-/git-update + herstart uit (`update.run`) met een herstartrapport, en poll daarna `update.status` na herverbinding om de draaiende gateway-versie te verifiëren.
</Accordion>
<Accordion title="Opmerkingen bij Cron-takenpaneel">
- Voor geïsoleerde taken staat levering standaard op samenvatting aankondigen. Je kunt overschakelen naar geen als je alleen interne runs wilt.
<Accordion title="Opmerkingen bij het Cron-takenpaneel">
- Voor geïsoleerde taken is de standaardlevering een aankondigingssamenvatting. Je kunt overschakelen naar geen als je alleen interne uitvoeringen wilt.
- Kanaal-/doelvelden verschijnen wanneer aankondigen is geselecteerd.
- Webhook-modus gebruikt `delivery.mode = "webhook"` met `delivery.to` ingesteld op een geldige HTTP(S)-Webhook-URL.
- Voor hoofdsessietaken zijn Webhook- en geen-leveringsmodi beschikbaar.
- Geavanceerde bewerkingsopties omvatten verwijderen-na-uitvoering, agent-override wissen, cron-exact/stagger-opties, overrides voor agentmodel/denken en best-effort leveringstoggles.
- Formuliervalidatie is inline met fouten op veldniveau; ongeldige waarden schakelen de knop Opslaan uit totdat ze zijn opgelost.
- Stel `cron.webhookToken` in om een speciale bearer-token te verzenden; als dit wordt weggelaten, wordt de Webhook zonder auth-header verzonden.
- Webhook-modus gebruikt `delivery.mode = "webhook"` met `delivery.to` ingesteld op een geldige HTTP(S)-webhook-URL.
- Voor taken in de hoofdsessie zijn webhook- en geen-leveringsmodi beschikbaar.
- Geavanceerde bewerkingsopties omvatten verwijderen na uitvoeren, agentoverride wissen, cron exact/stagger-opties, overrides voor agentmodel/thinking en best-effort-leveringsschakelaars.
- Formuliervalidatie is inline met fouten per veld; ongeldige waarden schakelen de knop Opslaan uit totdat ze zijn gecorrigeerd.
- Stel `cron.webhookToken` in om een speciale bearer token te sturen; als dit wordt weggelaten, wordt de webhook zonder auth-header verzonden.
- Verouderde fallback: opgeslagen legacy-taken met `notify: true` kunnen nog steeds `cron.webhook` gebruiken totdat ze zijn gemigreerd.
</Accordion>
@ -154,56 +154,57 @@ Geïmporteerde thema's worden alleen in het huidige browserprofiel opgeslagen. Z
## Chatgedrag
<AccordionGroup>
<Accordion title="Verzend- en geschiedenissemantiek">
- `chat.send` is **niet-blokkerend**: het bevestigt direct met `{ runId, status: "started" }` en de respons streamt via `chat`-gebeurtenissen.
<Accordion title="Semantiek voor verzenden en geschiedenis">
- `chat.send` is **niet-blokkerend**: het bevestigt onmiddellijk met `{ runId, status: "started" }` en de respons streamt via `chat`-events.
- Chat-uploads accepteren afbeeldingen plus niet-videobestanden. Afbeeldingen behouden het native afbeeldingspad; andere bestanden worden opgeslagen als beheerde media en in de geschiedenis weergegeven als bijlagelinks.
- Opnieuw verzenden met dezelfde `idempotencyKey` retourneert `{ status: "in_flight" }` zolang de uitvoering loopt, en `{ status: "ok" }` na voltooiing.
- `chat.history`-responses zijn qua grootte begrensd voor UI-veiligheid. Wanneer transcriptitems te groot zijn, kan de Gateway lange tekstvelden inkorten, zware metadatablokken weglaten en te grote berichten vervangen door een placeholder (`[chat.history omitted: message too large]`).
- Door de assistent/gegenereerde afbeeldingen worden bewaard als beheerde mediareferenties en teruggeleverd via geauthenticeerde Gateway-media-URL's, zodat herladen niet afhankelijk is van onbewerkte base64-afbeeldingspayloads die in de chatgeschiedenisresponse blijven staan.
- `chat.history` verwijdert ook inline directivetags die alleen voor weergave zijn bedoeld uit zichtbare assistenttekst (bijvoorbeeld `[[reply_to_*]]` en `[[audio_as_voice]]`), plattetekst-XML-payloads voor toolcalls (inclusief `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` en afgekorte toolcall-blokken), en gelekte ASCII-/full-width modelbesturingstokens, en laat assistentitems weg waarvan de volledige zichtbare tekst alleen het exacte stille token `NO_REPLY` / `no_reply` is.
- Tijdens een actieve verzending en de laatste geschiedenisverversing houdt de chatweergave lokale optimistische gebruikers-/assistentberichten zichtbaar als `chat.history` kortstondig een oudere snapshot retourneert; het canonieke transcript vervangt die lokale berichten zodra de Gateway-geschiedenis is bijgewerkt.
- `chat.inject` voegt een assistentnotitie toe aan het sessietranscript en broadcast een `chat`-gebeurtenis voor alleen-UI-updates (geen agentuitvoering, geen kanaallevering).
- De model- en denkmoduskeuzelijsten in de chatkop patchen de actieve sessie direct via `sessions.patch`; het zijn persistente sessie-overschrijvingen, geen verzendopties voor slechts één beurt.
- `/new` typen in de Control UI maakt dezelfde nieuwe dashboardsessie als New Chat aan en schakelt daarnaar over. `/reset` typen behoudt de expliciete in-place reset van de Gateway voor de huidige sessie.
- De chatmodelkiezer vraagt de geconfigureerde modelweergave van de Gateway op. Als `agents.defaults.models` aanwezig is, stuurt die allowlist de kiezer aan. Anders toont de kiezer expliciete `models.providers.*.models`-items plus providers met bruikbare authenticatie. De volledige catalogus blijft beschikbaar via de debug-`models.list`-RPC met `view: "all"`.
- Wanneer recente gebruiksrapporten van Gateway-sessies hoge contextdruk tonen, toont het chatcomposergebied een contextmelding en, op aanbevolen compaction-niveaus, een compacte knop die het normale sessiecompaction-pad uitvoert. Verouderde tokensnapshots worden verborgen totdat de Gateway opnieuw recent gebruik rapporteert.
- Opnieuw verzenden met dezelfde `idempotencyKey` retourneert `{ status: "in_flight" }` terwijl de run actief is, en `{ status: "ok" }` na voltooiing.
- `chat.history`-responses zijn qua grootte begrensd voor UI-veiligheid. Wanneer transcriptitems te groot zijn, kan Gateway lange tekstvelden inkorten, zware metadatablokken weglaten en te grote berichten vervangen door een placeholder (`[chat.history omitted: message too large]`).
- Door de assistant/gegenereerde afbeeldingen worden bewaard als beheerde mediareferenties en teruggeleverd via geauthenticeerde Gateway-media-URL's, zodat herladen niet afhankelijk is van onbewerkte base64-afbeeldingspayloads die in de chatgeschiedenisrespons blijven.
- `chat.history` verwijdert ook inline directivetags die alleen voor weergave zijn uit zichtbare assistant-tekst (bijvoorbeeld `[[reply_to_*]]` en `[[audio_as_voice]]`), tool-call-XML-payloads in platte tekst (waaronder `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` en ingekorte tool-call-blokken), en gelekte ASCII-/volledige-breedte modelbesturingstokens, en laat assistant-items weg waarvan de volledige zichtbare tekst alleen het exacte stille token `NO_REPLY` / `no_reply` is.
- Tijdens een actieve send en de laatste geschiedenisverversing houdt de chatweergave lokale optimistische gebruikers-/assistant-berichten zichtbaar als `chat.history` kort een oudere snapshot retourneert; het canonieke transcript vervangt die lokale berichten zodra de Gateway-geschiedenis is bijgewerkt.
- Live `chat`-events zijn afleverstatus, terwijl `chat.history` opnieuw wordt opgebouwd uit het duurzame sessietranscript. Na tool-final-events herlaadt de Control UI de geschiedenis en voegt alleen een kleine optimistische staart samen; de transcriptgrens is gedocumenteerd in [WebChat](/nl/web/webchat).
- `chat.inject` voegt een assistant-notitie toe aan het sessietranscript en broadcast een `chat`-event voor updates alleen voor de UI (geen agent-run, geen kanaalaflevering).
- De model- en thinking-kiezers in de chatkop patchen de actieve sessie onmiddellijk via `sessions.patch`; het zijn permanente sessie-overschrijvingen, geen verzendopties voor slechts één beurt.
- `/new` typen in de Control UI maakt dezelfde nieuwe dashboardsessie als New Chat en schakelt ernaar over. `/reset` typen behoudt de expliciete in-place reset van de Gateway voor de huidige sessie.
- De chatmodelkiezer vraagt de geconfigureerde modelweergave van de Gateway op. Als `agents.defaults.models` aanwezig is, stuurt die allowlist de kiezer aan. Anders toont de kiezer expliciete `models.providers.*.models`-items plus providers met bruikbare auth. De volledige catalogus blijft beschikbaar via de debug-`models.list`-RPC met `view: "all"`.
- Wanneer recente gebruiksrapporten van Gateway-sessies hoge contextdruk tonen, toont het chatcomposer-gebied een contextmelding en, bij aanbevolen compactionniveaus, een compacte knop die het normale sessiecompactionpad uitvoert. Verouderde tokensnapshots worden verborgen totdat de Gateway opnieuw recent gebruik rapporteert.
</Accordion>
<Accordion title="Praatmodus (browser realtime)">
Praatmodus gebruikt een geregistreerde realtime spraakprovider. Configureer OpenAI met `talk.provider: "openai"` plus `talk.providers.openai.apiKey`, of configureer Google met `talk.provider: "google"` plus `talk.providers.google.apiKey`; de realtime providerconfiguratie voor Voice Call kan nog steeds opnieuw worden gebruikt als fallback. De browser ontvangt nooit een standaard API-sleutel van een provider. OpenAI ontvangt een tijdelijke Realtime-clientsecret voor WebRTC. Google Live ontvangt een eenmalig beperkt Live API-authenticatietoken voor een browser-WebSocket-sessie, waarbij instructies en tooldeclaraties door de Gateway in het token zijn vastgelegd. Providers die alleen een backend-realtimebridge aanbieden, lopen via het Gateway-relaytransport, zodat inloggegevens en vendorsockets server-side blijven terwijl browseraudio via geauthenticeerde Gateway-RPC's loopt. De Realtime-sessieprompt wordt door de Gateway samengesteld; `talk.realtime.session` accepteert geen door de caller aangeleverde instructie-overschrijvingen.
Praatmodus gebruikt een geregistreerde realtime spraakprovider. Configureer OpenAI met `talk.provider: "openai"` plus `talk.providers.openai.apiKey`, of configureer Google met `talk.provider: "google"` plus `talk.providers.google.apiKey`; de realtime providerconfiguratie van Voice Call kan nog steeds als fallback worden hergebruikt. De browser ontvangt nooit een standaard API-sleutel van de provider. OpenAI ontvangt een ephemeral Realtime-clientgeheim voor WebRTC. Google Live ontvangt een eenmalig beperkt Live API-auth-token voor een browser-WebSocket-sessie, waarbij instructies en tooldeclaraties door de Gateway in het token zijn vastgezet. Providers die alleen een backend realtime bridge aanbieden, lopen via het Gateway-relaytransport, zodat credentials en vendor-sockets server-side blijven terwijl browseraudio via geauthenticeerde Gateway-RPC's beweegt. De Realtime-sessieprompt wordt samengesteld door de Gateway; `talk.realtime.session` accepteert geen door de caller aangeleverde instructie-overschrijvingen.
In de chatcomposer is de Talk-bediening de golfknop naast de microfoondictatieknop. Wanneer Talk start, toont de composerstatusrij `Connecting Talk...`, daarna `Talk live` terwijl audio is verbonden, of `Asking OpenClaw...` terwijl een realtime toolcall het geconfigureerde grotere model raadpleegt via `chat.send`.
In de Chat-composer is de Talk-knop de golfknop naast de microfoonknop voor dicteren. Wanneer Talk start, toont de statusrij van de composer `Connecting Talk...`, daarna `Talk live` terwijl audio verbonden is, of `Asking OpenClaw...` terwijl een realtime tool-call het geconfigureerde grotere model raadpleegt via `chat.send`.
Live smoke voor maintainers: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` verifieert de OpenAI browser-WebRTC SDP-uitwisseling, de Google Live constrained-token browser-WebSocket-configuratie en de Gateway-relaybrowseradapter met nep-microfoonmedia. De opdracht print alleen providerstatus en logt geen geheimen.
Maintainer live smoke: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` verifieert de OpenAI browser-WebRTC-SDP-uitwisseling, de Google Live constrained-token browser-WebSocket-setup en de Gateway-relay browseradapter met nep-microfoonmedia. De opdracht print alleen providerstatus en logt geen secrets.
</Accordion>
<Accordion title="Stoppen en afbreken">
- Klik op **Stop** (roept `chat.abort` aan).
- Terwijl een uitvoering actief is, worden normale vervolgen in de wachtrij gezet. Klik op **Sturen** bij een bericht in de wachtrij om dat vervolg in de lopende beurt te injecteren.
- Typ `/stop` (of losse afbreekzinnen zoals `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`) om out-of-band af te breken.
- `chat.abort` ondersteunt `{ sessionKey }` (geen `runId`) om alle actieve uitvoeringen voor die sessie af te breken.
- Terwijl een run actief is, worden normale follow-ups in de wachtrij geplaatst. Klik op **Steer** bij een bericht in de wachtrij om die follow-up in de lopende beurt te injecteren.
- Typ `/stop` (of zelfstandige afbreekzinnen zoals `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`) om out-of-band af te breken.
- `chat.abort` ondersteunt `{ sessionKey }` (geen `runId`) om alle actieve runs voor die sessie af te breken.
</Accordion>
<Accordion title="Behoud van gedeeltelijke inhoud bij afbreken">
- Wanneer een uitvoering wordt afgebroken, kan gedeeltelijke assistenttekst nog steeds in de UI worden weergegeven.
- Gateway bewaart afgebroken gedeeltelijke assistenttekst in de transcriptgeschiedenis wanneer gebufferde uitvoer bestaat.
- Bewaarde items bevatten afbreekmetadata zodat transcriptconsumenten gedeeltelijke afbreekinhoud kunnen onderscheiden van normale voltooiingsuitvoer.
<Accordion title="Behoud van gedeeltelijke abort-output">
- Wanneer een run wordt afgebroken, kan gedeeltelijke assistant-tekst nog steeds in de UI worden weergegeven.
- Gateway bewaart afgebroken gedeeltelijke assistant-tekst in de transcriptgeschiedenis wanneer gebufferde output bestaat.
- Bewaarde items bevatten abortmetadata zodat transcriptconsumenten gedeeltelijke abort-output kunnen onderscheiden van normale voltooiingsoutput.
</Accordion>
</AccordionGroup>
## PWA-installatie en webpush
De Control UI levert een `manifest.webmanifest` en een serviceworker, zodat moderne browsers deze als zelfstandige PWA kunnen installeren. Web Push laat de Gateway de geïnstalleerde PWA wekken met meldingen, zelfs wanneer het tabblad of browservenster niet open is.
De Control UI levert een `manifest.webmanifest` en een service worker, zodat moderne browsers deze als zelfstandige PWA kunnen installeren. Web Push laat de Gateway de geïnstalleerde PWA wekken met meldingen, zelfs wanneer het tabblad of browservenster niet open is.
| Oppervlak | Wat het doet |
| ----------------------------------------------------- | ------------------------------------------------------------------ |
| Oppervlak | Wat het doet |
| ----------------------------------------------------- | ----------------------------------------------------------------- |
| `ui/public/manifest.webmanifest` | PWA-manifest. Browsers bieden "App installeren" aan zodra het bereikbaar is. |
| `ui/public/sw.js` | Serviceworker die `push`-gebeurtenissen en meldingsklikken afhandelt. |
| `ui/public/sw.js` | Service worker die `push`-events en klikken op meldingen afhandelt. |
| `push/vapid-keys.json` (onder de OpenClaw-statusmap) | Automatisch gegenereerd VAPID-sleutelpaar dat wordt gebruikt om Web Push-payloads te ondertekenen. |
| `push/web-push-subscriptions.json` | Bewaarde browserabonnementseindpunten. |
| `push/web-push-subscriptions.json` | Bewaarde browserabonnementseindpunten. |
Overschrijf het VAPID-sleutelpaar via omgevingsvariabelen op het Gateway-proces wanneer je sleutels wilt vastpinnen (voor implementaties met meerdere hosts, geheimrotatie of tests):
Overschrijf het VAPID-sleutelpaar via env vars op het Gateway-proces wanneer je sleutels wilt vastpinnen (voor multi-host-deployments, secretrotatie of tests):
- `OPENCLAW_VAPID_PUBLIC_KEY`
- `OPENCLAW_VAPID_PRIVATE_KEY`
@ -213,16 +214,16 @@ De Control UI gebruikt deze scope-gated Gateway-methoden om browserabonnementen
- `push.web.vapidPublicKey` — haalt de actieve openbare VAPID-sleutel op.
- `push.web.subscribe` — registreert een `endpoint` plus `keys.p256dh`/`keys.auth`.
- `push.web.unsubscribe` — verwijdert een geregistreerd endpoint.
- `push.web.unsubscribe` — verwijdert een geregistreerd eindpunt.
- `push.web.test` — verzendt een testmelding naar het abonnement van de caller.
<Note>
Web Push staat los van het iOS APNS-relaypad (zie [Configuratie](/nl/gateway/configuration) voor relay-ondersteunde push) en de bestaande methode `push.test`, die zijn gericht op native mobiele koppeling.
Web Push staat los van het iOS APNS-relaypad (zie [Configuratie](/nl/gateway/configuration) voor relay-backed push) en de bestaande `push.test`-methode, die gericht zijn op native mobiele koppeling.
</Note>
## Gehoste embeds
Assistentberichten kunnen gehoste webinhoud inline renderen met de shortcode `[embed ...]`. Het iframe-sandboxbeleid wordt beheerd door `gateway.controlUi.embedSandbox`:
Assistant-berichten kunnen gehoste webinhoud inline renderen met de `[embed ...]`-shortcode. Het iframe-sandboxbeleid wordt beheerd door `gateway.controlUi.embedSandbox`:
<Tabs>
<Tab title="strict">
@ -249,14 +250,14 @@ Voorbeeld:
```
<Warning>
Gebruik `trusted` alleen wanneer het ingesloten document daadwerkelijk same-origin-gedrag nodig heeft. Voor de meeste door agents gegenereerde games en interactieve canvassen is `scripts` de veiligere keuze.
Gebruik `trusted` alleen wanneer het ingesloten document echt same-origin-gedrag nodig heeft. Voor de meeste door agents gegenereerde games en interactieve canvassen is `scripts` de veiligere keuze.
</Warning>
Absolute externe `http(s)`-embed-URL's blijven standaard geblokkeerd. Als je bewust wilt dat `[embed url="https://..."]` pagina's van derden laadt, stel dan `gateway.controlUi.allowExternalEmbedUrls: true` in.
## Breedte van chatberichten
Gegroepeerde chatberichten gebruiken een leesbare standaard maximale breedte. Implementaties met brede monitors kunnen dit overschrijven zonder gebundelde CSS te patchen door `gateway.controlUi.chatMessageMaxWidth` in te stellen:
Gegroepeerde chatberichten gebruiken een leesbare standaard maximale breedte. Wide-monitor-deployments kunnen deze overschrijven zonder gebundelde CSS te patchen door `gateway.controlUi.chatMessageMaxWidth` in te stellen:
```json5
{
@ -268,13 +269,13 @@ Gegroepeerde chatberichten gebruiken een leesbare standaard maximale breedte. Im
}
```
De waarde wordt gevalideerd voordat deze de browser bereikt. Ondersteunde waarden zijn onder meer gewone lengtes en percentages zoals `960px` of `82%`, plus begrensde breedte-expressies met `min(...)`, `max(...)`, `clamp(...)`, `calc(...)` en `fit-content(...)`.
De waarde wordt gevalideerd voordat deze de browser bereikt. Ondersteunde waarden zijn onder andere gewone lengtes en percentages zoals `960px` of `82%`, plus begrensde `min(...)`-, `max(...)`-, `clamp(...)`-, `calc(...)`- en `fit-content(...)`-breedte-expressies.
## Tailnet-toegang (aanbevolen)
<Tabs>
<Tab title="Geïntegreerde Tailscale Serve (voorkeur)">
Houd de Gateway op loopback en laat Tailscale Serve deze via HTTPS proxyen:
Houd de Gateway op loopback en laat Tailscale Serve deze proxyen met HTTPS:
```bash
openclaw gateway --tailscale serve
@ -284,12 +285,12 @@ De waarde wordt gevalideerd voordat deze de browser bereikt. Ondersteunde waarde
- `https://<magicdns>/` (of je geconfigureerde `gateway.controlUi.basePath`)
Standaard kunnen Control UI-/WebSocket Serve-aanvragen authenticeren via Tailscale-identiteitsheaders (`tailscale-user-login`) wanneer `gateway.auth.allowTailscale` `true` is. OpenClaw verifieert de identiteit door het `x-forwarded-for`-adres op te lossen met `tailscale whois` en dit te matchen met de header, en accepteert deze alleen wanneer de aanvraag loopback raakt met Tailscale-`x-forwarded-*`-headers. Voor Control UI-operatorsessies met browserapparaatidentiteit slaat dit geverifieerde Serve-pad ook de roundtrip voor apparaatkoppeling over; browsers zonder apparaat en verbindingen met node-rol volgen nog steeds de normale apparaatcontroles. Stel `gateway.auth.allowTailscale: false` in als je expliciete gedeelde-geheimreferenties wilt vereisen, zelfs voor Serve-verkeer. Gebruik daarna `gateway.auth.mode: "token"` of `"password"`.
Standaard kunnen Control UI-/WebSocket Serve-requests authenticeren via Tailscale-identiteitsheaders (`tailscale-user-login`) wanneer `gateway.auth.allowTailscale` `true` is. OpenClaw verifieert de identiteit door het `x-forwarded-for`-adres op te lossen met `tailscale whois` en dit te matchen met de header, en accepteert deze alleen wanneer de request loopback bereikt met Tailscale's `x-forwarded-*`-headers. Voor Control UI-operatorsessies met browserapparaatidentiteit slaat dit geverifieerde Serve-pad ook de device-pairing round trip over; browsers zonder apparaat en node-role-verbindingen volgen nog steeds de normale apparaatcontroles. Stel `gateway.auth.allowTailscale: false` in als je expliciete shared-secret-credentials wilt vereisen, zelfs voor Serve-verkeer. Gebruik dan `gateway.auth.mode: "token"` of `"password"`.
Voor dat asynchrone Serve-identiteitspad worden mislukte authenticatiepogingen voor hetzelfde client-IP en dezelfde authenticatiescope geserialiseerd voordat rate-limit-schrijfacties plaatsvinden. Gelijktijdige mislukte herpogingen vanuit dezelfde browser kunnen daarom `retry later` tonen bij de tweede aanvraag in plaats van twee gewone mismatches die parallel racen.
Voor dat asynchrone Serve-identiteitspad worden mislukte auth-pogingen voor hetzelfde client-IP en dezelfde auth-scope geserialiseerd voordat rate-limit-writes plaatsvinden. Gelijktijdige slechte retries vanuit dezelfde browser kunnen daarom `retry later` op de tweede request tonen in plaats van twee gewone mismatches die parallel racen.
<Warning>
Tokenloze Serve-authenticatie gaat ervan uit dat de gatewayhost vertrouwd is. Als niet-vertrouwde lokale code op die host kan draaien, vereis dan token-/wachtwoordauthenticatie.
Tokenloze Serve-auth gaat ervan uit dat de gatewayhost vertrouwd is. Als niet-vertrouwde lokale code op die host kan draaien, vereis dan token-/password-auth.
</Warning>
</Tab>
@ -309,12 +310,12 @@ De waarde wordt gevalideerd voordat deze de browser bereikt. Ondersteunde waarde
## Onveilige HTTP
Als je het dashboard opent via gewone HTTP (`http://<lan-ip>` of `http://<tailscale-ip>`), draait de browser in een **niet-beveiligde context** en blokkeert WebCrypto. Standaard **blokkeert** OpenClaw Control UI-verbindingen zonder apparaatidentiteit.
Als je het dashboard opent via gewone HTTP (`http://<lan-ip>` of `http://<tailscale-ip>`), draait de browser in een **niet-veilige context** en blokkeert WebCrypto. Standaard **blokkeert** OpenClaw Control UI-verbindingen zonder apparaatidentiteit.
Gedocumenteerde uitzonderingen:
- localhost-only onveilige HTTP-compatibiliteit met `gateway.controlUi.allowInsecureAuth=true`
- succesvolle operatorauthenticatie voor de Control UI via `gateway.auth.mode: "trusted-proxy"`
- succesvolle operator-Control UI-auth via `gateway.auth.mode: "trusted-proxy"`
- break-glass `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
**Aanbevolen oplossing:** gebruik HTTPS (Tailscale Serve) of open de UI lokaal:
@ -323,7 +324,7 @@ Gedocumenteerde uitzonderingen:
- `http://127.0.0.1:18789/` (op de gatewayhost)
<AccordionGroup>
<Accordion title="Gedrag van toggle voor onveilige auth">
<Accordion title="Insecure-auth toggle behavior">
```json5
{
gateway: {
@ -334,14 +335,14 @@ Gedocumenteerde uitzonderingen:
}
```
`allowInsecureAuth` is alleen een lokale compatibiliteitstoggle:
`allowInsecureAuth` is alleen een lokale compatibiliteitsschakelaar:
- Hiermee kunnen localhost-Control UI-sessies doorgaan zonder apparaatidentiteit in niet-beveiligde HTTP-contexten.
- Hiermee worden koppelingscontroles niet omzeild.
- Hiermee worden vereisten voor apparaatidentiteit op afstand (niet-localhost) niet versoepeld.
</Accordion>
<Accordion title="Alleen voor noodtoegang">
<Accordion title="Break-glass only">
```json5
{
gateway: {
@ -353,42 +354,52 @@ Gedocumenteerde uitzonderingen:
```
<Warning>
`dangerouslyDisableDeviceAuth` schakelt apparaatidentiteitscontroles van de Control UI uit en is een ernstige beveiligingsverlaging. Draai dit snel terug na noodgebruik.
`dangerouslyDisableDeviceAuth` schakelt apparaatidentiteitscontroles voor de Control UI uit en is een ernstige beveiligingsverlaging. Draai dit snel terug na noodgebruik.
</Warning>
</Accordion>
<Accordion title="Opmerking over vertrouwde proxy">
- Geslaagde trusted-proxy-auth kan **operator**-Control UI-sessies toelaten zonder apparaatidentiteit.
- Dit geldt **niet** voor Control UI-sessies met node-rol.
- Reverse proxy's via loopback op dezelfde host voldoen nog steeds niet aan trusted-proxy-auth; zie [Auth met vertrouwde proxy](/nl/gateway/trusted-proxy-auth).
<Accordion title="Trusted-proxy note">
- Succesvolle trusted-proxy-authenticatie kan **operator**-Control UI-sessies toelaten zonder apparaatidentiteit.
- Dit geldt **niet** voor Control UI-sessies met noderol.
- Same-host local loopback reverse proxies voldoen nog steeds niet aan trusted-proxy-authenticatie; zie [Trusted proxy auth](/nl/gateway/trusted-proxy-auth).
</Accordion>
</AccordionGroup>
Zie [Tailscale](/nl/gateway/tailscale) voor richtlijnen voor HTTPS-configuratie.
Zie [Tailscale](/nl/gateway/tailscale) voor hulp bij het instellen van HTTPS.
## Beleid voor inhoudsbeveiliging
## Contentbeveiligingsbeleid
De Control UI wordt geleverd met een strikt `img-src`-beleid: alleen assets van **dezelfde origin**, `data:`-URL's en lokaal gegenereerde `blob:`-URL's zijn toegestaan. Externe `http(s)`- en protocolrelatieve afbeeldings-URL's worden door de browser geweigerd en leiden niet tot netwerkverzoeken.
De Control UI wordt geleverd met een streng `img-src`-beleid: alleen assets van **dezelfde origin**, `data:`-URL's en lokaal gegenereerde `blob:`-URL's zijn toegestaan. Externe `http(s)`- en protocolrelatieve afbeeldings-URL's worden door de browser geweigerd en leiden niet tot netwerkverzoeken.
Wat dit in de praktijk betekent:
- Avatars en afbeeldingen die via relatieve paden worden geserveerd (bijvoorbeeld `/avatars/<id>`) worden nog steeds weergegeven, inclusief geauthenticeerde avatarroutes die de UI ophaalt en omzet in lokale `blob:`-URL's.
- Avatars en afbeeldingen die via relatieve paden worden aangeboden (bijvoorbeeld `/avatars/<id>`) worden nog steeds weergegeven, inclusief geauthenticeerde avatarroutes die de UI ophaalt en omzet in lokale `blob:`-URL's.
- Inline `data:image/...`-URL's worden nog steeds weergegeven (handig voor payloads binnen het protocol).
- Lokale `blob:`-URL's die door de Control UI zijn gemaakt, worden nog steeds weergegeven.
- Externe avatar-URL's die door kanaalmetadata worden uitgegeven, worden verwijderd door de avatarhelpers van de Control UI en vervangen door het ingebouwde logo/badge, zodat een gecompromitteerd of kwaadwillend kanaal geen willekeurige externe afbeeldingsverzoeken vanuit een operatorbrowser kan afdwingen.
- Externe avatar-URL's die door kanaalmetadata worden uitgegeven, worden door de avatarhelpers van de Control UI verwijderd en vervangen door het ingebouwde logo/de ingebouwde badge, zodat een gecompromitteerd of schadelijk kanaal geen willekeurige externe afbeeldingsverzoeken vanuit de browser van een operator kan afdwingen.
Je hoeft niets te wijzigen om dit gedrag te krijgen — het staat altijd aan en is niet configureerbaar.
## Auth voor avatarroute
## Authenticatie voor avatarroutes
Wanneer Gateway-auth is geconfigureerd, vereist het avatarendpoint van de Control UI dezelfde gateway-token als de rest van de API:
Wanneer Gateway-authenticatie is geconfigureerd, vereist het avatarendpoint van de Control UI hetzelfde Gateway-token als de rest van de API:
- `GET /avatar/<agentId>` retourneert de avatarafbeelding alleen aan geauthenticeerde aanroepers. `GET /avatar/<agentId>?meta=1` retourneert de avatarmetadata onder dezelfde regel.
- Niet-geauthenticeerde verzoeken naar beide routes worden geweigerd (net als bij de verwante assistant-media-route). Dit voorkomt dat de avatarroute agentidentiteit lekt op hosts die verder beschermd zijn.
- De Control UI zelf stuurt de gateway-token door als bearer-header bij het ophalen van avatars en gebruikt geauthenticeerde blob-URL's zodat de afbeelding nog steeds in dashboards wordt weergegeven.
- `GET /avatar/<agentId>` retourneert de avatarafbeelding alleen aan geauthenticeerde callers. `GET /avatar/<agentId>?meta=1` retourneert de avatarmetadata volgens dezelfde regel.
- Niet-geauthenticeerde verzoeken naar een van beide routes worden geweigerd (net als bij de naastliggende assistant-media-route). Dit voorkomt dat de avatarroute agentidentiteit lekt op hosts die verder beschermd zijn.
- De Control UI stuurt zelf het Gateway-token door als bearer-header bij het ophalen van avatars en gebruikt geauthenticeerde blob-URL's, zodat de afbeelding nog steeds in dashboards wordt weergegeven.
Als je Gateway-auth uitschakelt (niet aanbevolen op gedeelde hosts), wordt de avatarroute ook niet-geauthenticeerd, in lijn met de rest van de Gateway.
Als je Gateway-authenticatie uitschakelt (niet aanbevolen op gedeelde hosts), wordt de avatarroute ook niet-geauthenticeerd, in lijn met de rest van de Gateway.
## Authenticatie voor assistant-media-route
Wanneer Gateway-authenticatie is geconfigureerd, gebruiken lokale mediavoorvertoningen van de assistent een tweestapsroute:
- `GET /__openclaw__/assistant-media?meta=1&source=<path>` vereist de normale operator-authenticatie van de Control UI. De browser verzendt het Gateway-token als bearer-header bij het controleren van beschikbaarheid.
- Succesvolle metadatareacties bevatten een kortlevende `mediaTicket` die is beperkt tot dat exacte bronpad.
- Door de browser weergegeven URL's voor afbeeldingen, audio, video en documenten gebruiken `mediaTicket=<ticket>` in plaats van het actieve Gateway-token of wachtwoord. Het ticket verloopt snel en kan geen andere bron autoriseren.
Hierdoor blijft normale mediaweergave compatibel met browser-native media-elementen zonder herbruikbare Gateway-referenties in zichtbare media-URL's te plaatsen.
## De UI bouwen
@ -404,30 +415,30 @@ Optionele absolute basis (wanneer je vaste asset-URL's wilt):
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
```
Voor lokale ontwikkeling (aparte dev-server):
Voor lokale ontwikkeling (afzonderlijke ontwikkelserver):
```bash
pnpm ui:dev
```
Richt de UI daarna op je Gateway-WS-URL (bijv. `ws://127.0.0.1:18789`).
Wijs de UI daarna naar je Gateway-WS-URL (bijv. `ws://127.0.0.1:18789`).
## Debuggen/testen: dev-server + externe Gateway
## Debuggen/testen: ontwikkelserver + externe Gateway
De Control UI bestaat uit statische bestanden; het WebSocket-doel is configureerbaar en kan verschillen van de HTTP-origin. Dit is handig wanneer je de Vite-dev-server lokaal wilt gebruiken, maar de Gateway elders draait.
De Control UI bestaat uit statische bestanden; het WebSocket-doel is configureerbaar en kan verschillen van de HTTP-origin. Dit is handig wanneer je de Vite-ontwikkelserver lokaal wilt gebruiken, maar de Gateway elders draait.
<Steps>
<Step title="Start de UI-dev-server">
<Step title="Start the UI dev server">
```bash
pnpm ui:dev
```
</Step>
<Step title="Openen met gatewayUrl">
<Step title="Open with gatewayUrl">
```text
http://localhost:5173/?gatewayUrl=ws%3A%2F%2F<gateway-host>%3A18789
```
Optionele eenmalige auth (indien nodig):
Optionele eenmalige authenticatie (indien nodig):
```text
http://localhost:5173/?gatewayUrl=wss%3A%2F%2F<gateway-host>%3A18789#token=<gateway-token>
@ -437,18 +448,18 @@ De Control UI bestaat uit statische bestanden; het WebSocket-doel is configureer
</Steps>
<AccordionGroup>
<Accordion title="Opmerkingen">
<Accordion title="Notes">
- `gatewayUrl` wordt na het laden opgeslagen in localStorage en uit de URL verwijderd.
- Als je een volledig `ws://`- of `wss://`-endpoint doorgeeft via `gatewayUrl`, URL-encodeer dan de waarde van `gatewayUrl` zodat de browser de querystring correct parseert.
- `token` moet waar mogelijk via het URL-fragment (`#token=...`) worden doorgegeven. Fragmenten worden niet naar de server gestuurd, waardoor lekkage via verzoeklogs en Referer wordt voorkomen. Verouderde `?token=`-queryparameters worden voor compatibiliteit nog één keer geïmporteerd, maar alleen als fallback, en worden direct na bootstrap verwijderd.
- Als je een volledig `ws://`- of `wss://`-endpoint via `gatewayUrl` doorgeeft, URL-encodeer dan de waarde van `gatewayUrl` zodat de browser de querystring correct parseert.
- `token` moet waar mogelijk via het URL-fragment (`#token=...`) worden doorgegeven. Fragmenten worden niet naar de server verzonden, wat lekken via verzoeklogs en Referer voorkomt. Verouderde `?token=`-queryparams worden voor compatibiliteit nog één keer geïmporteerd, maar alleen als fallback, en worden direct na bootstrap verwijderd.
- `password` wordt alleen in het geheugen bewaard.
- Wanneer `gatewayUrl` is ingesteld, valt de UI niet terug op configuratie- of omgevingscredentials. Geef `token` (of `password`) expliciet op. Ontbrekende expliciete credentials zijn een fout.
- Wanneer `gatewayUrl` is ingesteld, valt de UI niet terug op configuratie- of omgevingsreferenties. Geef `token` (of `password`) expliciet op. Ontbrekende expliciete referenties zijn een fout.
- Gebruik `wss://` wanneer de Gateway achter TLS staat (Tailscale Serve, HTTPS-proxy, enz.).
- `gatewayUrl` wordt alleen geaccepteerd in een venster op topniveau (niet ingebed) om clickjacking te voorkomen.
- Niet-loopback-Control UI-deployments moeten `gateway.controlUi.allowedOrigins` expliciet instellen (volledige origins). Dit geldt ook voor externe dev-opstellingen.
- Bij het opstarten kan de Gateway lokale origins zoals `http://localhost:<port>` en `http://127.0.0.1:<port>` vullen op basis van de effectieve runtime-bind en poort, maar externe browser-origins hebben nog steeds expliciete vermeldingen nodig.
- Gebruik `gateway.controlUi.allowedOrigins: ["*"]` niet, behalve voor strikt gecontroleerde lokale tests. Het betekent elke browser-origin toestaan, niet "match de host die ik gebruik."
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` schakelt Host-header-origin-fallbackmodus in, maar dit is een gevaarlijke beveiligingsmodus.
- `gatewayUrl` wordt alleen geaccepteerd in een venster op topniveau (niet ingesloten) om clickjacking te voorkomen.
- Niet-local loopback-Control UI-implementaties moeten `gateway.controlUi.allowedOrigins` expliciet instellen (volledige origins). Dit omvat externe ontwikkelopstellingen.
- Het opstarten van de Gateway kan lokale origins zoals `http://localhost:<port>` en `http://127.0.0.1:<port>` vullen op basis van de effectieve runtime-bind en poort, maar externe browser-origins hebben nog steeds expliciete vermeldingen nodig.
- Gebruik `gateway.controlUi.allowedOrigins: ["*"]` niet behalve voor strikt gecontroleerde lokale tests. Het betekent: sta elke browser-origin toe, niet "match de host die ik gebruik."
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` schakelt fallbackmodus voor Host-header-origin in, maar dit is een gevaarlijke beveiligingsmodus.
</Accordion>
</AccordionGroup>
@ -465,11 +476,11 @@ Voorbeeld:
}
```
Details voor configuratie van toegang op afstand: [Toegang op afstand](/nl/gateway/remote).
Details voor externe toegang instellen: [Externe toegang](/nl/gateway/remote).
## Gerelateerd
- [Dashboard](/nl/web/dashboard) — Gateway-dashboard
- [Gezondheidscontroles](/nl/gateway/health) — gezondheidsbewaking van de Gateway
- [Health Checks](/nl/gateway/health) — Gateway-gezondheidsmonitoring
- [TUI](/nl/web/tui) — terminalgebruikersinterface
- [WebChat](/nl/web/webchat) — browsergebaseerde chatinterface

View File

@ -1,72 +1,84 @@
---
read_when:
- WebChat-toegang debuggen of configureren
summary: Statische host voor Loopback WebChat en Gateway-WS-gebruik voor de chatinterface
summary: Statische host voor Loopback WebChat en Gateway-WS-gebruik voor de chat-UI
title: Webchat
x-i18n:
generated_at: "2026-05-03T11:16:55Z"
generated_at: "2026-05-04T07:10:11Z"
model: gpt-5.5
provider: openai
source_hash: 48024e58259901c6feb67168c5c1ce32f46b8ad9b6f4511e56d2000478a3ed60
source_hash: bf435585a13a1cde5885714837017109eeeb61ffa5e33a400017706f676f57ea
source_path: web/webchat.md
workflow: 16
---
Status: de macOS/iOS SwiftUI-chatinterface communiceert rechtstreeks met de Gateway WebSocket.
Status: de macOS/iOS SwiftUI-chat-UI praat rechtstreeks met de Gateway WebSocket.
## Wat het is
- Een native chatinterface voor de Gateway (geen ingesloten browser en geen lokale statische server).
- Een native chat-UI voor de Gateway (geen ingesloten browser en geen lokale statische server).
- Gebruikt dezelfde sessies en routeringsregels als andere kanalen.
- Deterministische routering: antwoorden gaan altijd terug naar WebChat.
## Snel starten
## Snelstart
1. Start de Gateway.
2. Open de WebChat-UI (macOS/iOS-app) of het chattabblad van de Control UI.
3. Zorg dat een geldig Gateway-authenticatiepad is geconfigureerd (standaard gedeeld geheim,
3. Zorg dat er een geldig authenticatiepad voor de Gateway is geconfigureerd (standaard shared-secret,
zelfs op loopback).
## Hoe het werkt (gedrag)
- De UI maakt verbinding met de Gateway WebSocket en gebruikt `chat.history`, `chat.send` en `chat.inject`.
- `chat.history` is begrensd voor stabiliteit: Gateway kan lange tekstvelden inkorten, zware metadata weglaten en te grote vermeldingen vervangen door `[chat.history omitted: message too large]`.
- `chat.history` volgt de actieve transcriptvertakking voor moderne append-only sessiebestanden, zodat verlaten herschrijfvertakkingen en vervangen promptkopieen niet in WebChat worden weergegeven.
- Compaction-vermeldingen worden weergegeven als een expliciete scheiding voor gecompacteerde geschiedenis. De scheiding legt uit dat eerdere beurten in een checkpoint worden bewaard en linkt naar de checkpointbediening voor Sessions, waar operators de weergave van voor de Compaction kunnen vertakken of herstellen wanneer hun machtigingen dat toestaan.
- Control UI onthoudt de onderliggende Gateway-`sessionId` die door `chat.history` wordt geretourneerd en neemt deze op in vervolgoproepen naar `chat.send`, zodat herverbindingen en pagina-verversingen hetzelfde opgeslagen gesprek voortzetten tenzij de gebruiker een sessie start of reset.
- Control UI voegt dubbele lopende inzendingen voor dezelfde sessie, hetzelfde bericht en dezelfde bijlagen samen voordat een nieuwe run-id voor `chat.send` wordt gegenereerd; de Gateway dedupliceert nog steeds herhaalde aanvragen die dezelfde idempotentiesleutel hergebruiken.
- `chat.history` volgt de actieve transcriptvertakking voor moderne append-only sessiebestanden, zodat verlaten herschrijftakken en vervangen promptkopieën niet in WebChat worden weergegeven.
- Compaction-vermeldingen worden weergegeven als een expliciete scheidingslijn voor gecompacteerde geschiedenis. De scheidingslijn legt uit dat eerdere beurten in een checkpoint worden bewaard en linkt naar de checkpointbediening van Sessies, waar operators de weergave van vóór de Compaction kunnen vertakken of herstellen wanneer hun machtigingen dit toestaan.
- Control UI onthoudt de onderliggende Gateway-`sessionId` die door `chat.history` wordt teruggegeven en neemt deze op in volgende `chat.send`-aanroepen, zodat opnieuw verbinden en pagina's vernieuwen hetzelfde opgeslagen gesprek voortzetten, tenzij de gebruiker een sessie start of reset.
- Control UI voegt dubbele lopende verzendingen voor dezelfde sessie, hetzelfde bericht en dezelfde bijlagen samen voordat een nieuwe `chat.send`-run-id wordt gegenereerd; de Gateway dedupliceert nog steeds herhaalde verzoeken die dezelfde idempotentiesleutel hergebruiken.
- Opstartbestanden voor de workspace en wachtende `BOOTSTRAP.md`-instructies worden geleverd via de Projectcontext van de systeemprompt van de agent, niet gekopieerd naar het gebruikersbericht van WebChat. Afkapping van de bootstrap voegt alleen een beknopte herstelmelding aan de systeemprompt toe; gedetailleerde aantallen en configuratieknoppen blijven op diagnostische oppervlakken.
- `chat.history` wordt ook genormaliseerd voor weergave: runtime-only OpenClaw-context,
inkomende envelop-wrappers, inline tags voor bezorgrichtlijnen
zoals `[[reply_to_*]]` en `[[audio_as_voice]]`, plattetekst-XML-payloads
voor toolcalls (waaronder `<tool_call>...</tool_call>`,
inkomende envelop-wrappers, inline tags voor afleveringsrichtlijnen
zoals `[[reply_to_*]]` en `[[audio_as_voice]]`, plattetekst-XML-payloads voor tool-calls
(inclusief `<tool_call>...</tool_call>`,
`<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`,
`<function_calls>...</function_calls>` en afgekorte toolcallblokken), en
gelekte ASCII-/volledige-breedte modelcontroletokens worden uit zichtbare tekst gestript,
`<function_calls>...</function_calls>` en afgekorte tool-call-blokken), en
gelekte ASCII-/full-width-modelcontroletokens worden uit zichtbare tekst verwijderd,
en assistentvermeldingen waarvan de volledige zichtbare tekst alleen het exacte stille
token `NO_REPLY` / `no_reply` is, worden weggelaten.
- Antwoordpayloads met reasoning-vlag (`isReasoning: true`) worden uitgesloten van WebChat-assistentinhoud, transcript-herhalingstekst en audiocontentblokken, zodat payloads die alleen voor denken zijn niet verschijnen als zichtbare assistentberichten of afspeelbare audio.
- `chat.inject` voegt een assistentnotitie rechtstreeks toe aan het transcript en zendt deze uit naar de UI (geen agentrun).
- Antwoordpayloads met reasoning-vlag (`isReasoning: true`) worden uitgesloten van WebChat-assistentinhoud, transcriptreplaytekst en audio-inhoudsblokken, zodat payloads die alleen uit denkwerk bestaan niet verschijnen als zichtbare assistentberichten of afspeelbare audio.
- `chat.inject` voegt een assistentnotitie rechtstreeks toe aan het transcript en broadcast deze naar de UI (geen agent-run).
- Afgebroken runs kunnen gedeeltelijke assistentuitvoer zichtbaar houden in de UI.
- Gateway bewaart afgebroken gedeeltelijke assistenttekst in de transcriptgeschiedenis wanneer gebufferde uitvoer bestaat, en markeert die vermeldingen met abortmetadata.
- Geschiedenis wordt altijd opgehaald bij de Gateway (geen lokale bestandsbewaking).
- Geschiedenis wordt altijd opgehaald uit de Gateway (geen lokale bestandsbewaking).
- Als de Gateway onbereikbaar is, is WebChat alleen-lezen.
## Toolspaneel voor Control UI-agenten
### Transcript- en afleveringsmodel
- Het Toolspaneel van Control UI `/agents` heeft twee aparte weergaven:
WebChat heeft twee afzonderlijke datapaden:
- Het sessie-JSONL-bestand is het duurzame model-/runtime-transcript. Voor normale agent-runs bewaart Pi modelzichtbare `user`-, `assistant`- en `toolResult`-berichten via zijn sessiebeheerder. WebChat schrijft geen willekeurige afleverings-, status- of hulptekst naar dat transcript.
- Gateway-`ReplyPayload`-events zijn de live afleveringsprojectie. Ze kunnen worden genormaliseerd voor WebChat-/kanaalweergave, blokstreaming, richtlijntags, media-insluiting, TTS-/audiovlaggen en UI-fallbackgedrag. Ze zijn zelf niet het canonieke sessielogboek.
- WebChat injecteert alleen assistenttranscriptvermeldingen wanneer de Gateway eigenaar is van een weergegeven bericht buiten een normale Pi-assistentbeurt: `chat.inject`, antwoorden van niet-agentopdrachten, afgebroken gedeeltelijke uitvoer en door WebChat beheerde mediasupplementen voor transcripties.
- `chat.history` leest het opgeslagen sessietranscript en past de WebChat-weergaveprojectie toe. Als live assistenttekst tijdens een run verschijnt maar verdwijnt na het herladen van de geschiedenis, controleer dan eerst of de ruwe JSONL de assistenttekst bevat, daarna of de `chat.history`-projectie deze heeft verwijderd, en daarna of de optimistische-tail-merge van Control UI de lokale afleveringsstatus heeft vervangen door de opgeslagen snapshot.
Definitieve antwoorden van normale agent-runs zouden duurzaam moeten zijn omdat Pi de assistant-`message_end` schrijft. Elke fallback die een afgeleverde definitieve payload naar het transcript spiegelt, moet eerst voorkomen dat een assistentbeurt wordt gedupliceerd die Pi al heeft geschreven.
## Toolspaneel voor agenten in Control UI
- Het Tools-paneel van Control UI `/agents` heeft twee afzonderlijke weergaven:
- **Nu beschikbaar** gebruikt `tools.effective(sessionKey=...)` en toont wat de huidige
sessie daadwerkelijk tijdens runtime kan gebruiken, inclusief tools die eigendom zijn van core, Plugin en kanalen.
sessie daadwerkelijk tijdens runtime kan gebruiken, inclusief tools die eigendom zijn van core, Plugin en kanaal.
- **Toolconfiguratie** gebruikt `tools.catalog` en blijft gericht op profielen, overrides en
catalogussemantiek.
- Runtimebeschikbaarheid is sessiegebonden. Wisselen van sessie op dezelfde agent kan de lijst
**Nu beschikbaar** wijzigen.
- Runtimebeschikbaarheid is sessiegebonden. Sessies wisselen op dezelfde agent kan de
lijst **Nu beschikbaar** wijzigen.
- De configuratie-editor impliceert geen runtimebeschikbaarheid; effectieve toegang volgt nog steeds de beleidsprioriteit
(`allow`/`deny`, per-agent- en provider-/kanaaloverrides).
(`allow`/`deny`, per-agent en provider-/kanaaloverrides).
## Gebruik op afstand
- Externe modus tunnelt de Gateway WebSocket via SSH/Tailscale.
- Je hoeft geen aparte WebChat-server uit te voeren.
- Je hoeft geen afzonderlijke WebChat-server uit te voeren.
## Configuratiereferentie (WebChat)
@ -74,18 +86,18 @@ Volledige configuratie: [Configuratie](/nl/gateway/configuration)
WebChat-opties:
- `gateway.webchat.chatHistoryMaxChars`: maximaal aantal tekens voor tekstvelden in `chat.history`-antwoorden. Wanneer een transcriptvermelding deze limiet overschrijdt, kort Gateway lange tekstvelden in en kan te grote berichten vervangen door een placeholder. Per-aanvraag `maxChars` kan ook door de client worden verzonden om deze standaardwaarde voor een enkele `chat.history`-oproep te overschrijven.
- `gateway.webchat.chatHistoryMaxChars`: maximumaantal tekens voor tekstvelden in `chat.history`-antwoorden. Wanneer een transcriptvermelding deze limiet overschrijdt, kapt Gateway lange tekstvelden af en kan het te grote berichten vervangen door een placeholder. Per verzoek kan `maxChars` ook door de client worden verzonden om deze standaardwaarde voor één `chat.history`-aanroep te overschrijven.
Gerelateerde globale opties:
- `gateway.port`, `gateway.bind`: WebSocket-host/-poort.
- `gateway.auth.mode`, `gateway.auth.token`, `gateway.auth.password`:
gedeeld-geheim WebSocket-authenticatie.
- `gateway.auth.allowTailscale`: het chattabblad van de browser-Control UI kan Tailscale
Serve-identiteitsheaders gebruiken wanneer ingeschakeld.
- `gateway.auth.mode: "trusted-proxy"`: reverse-proxy-authenticatie voor browserclients achter een identiteitsbewuste **niet-loopback** proxybron (zie [Trusted Proxy Auth](/nl/gateway/trusted-proxy-auth)).
shared-secret WebSocket-authenticatie.
- `gateway.auth.allowTailscale`: het chattabblad van browser-Control UI kan Tailscale
Serve-identiteitsheaders gebruiken wanneer dit is ingeschakeld.
- `gateway.auth.mode: "trusted-proxy"`: reverse-proxy-authenticatie voor browserclients achter een identiteitsbewuste **non-loopback** proxybron (zie [Trusted Proxy Auth](/nl/gateway/trusted-proxy-auth)).
- `gateway.remote.url`, `gateway.remote.token`, `gateway.remote.password`: extern Gateway-doel.
- `session.*`: sessieopslag en standaardwaarden voor hoofdsleutel.
- `session.*`: sessieopslag en standaardwaarden voor hoofdsleutels.
## Gerelateerd