Déclencheurs
Un déclencheur démarre une session selon un calendrier, à partir d’un webhook, d’un événement d’application ou d’un moniteur.
Un déclencheur démarre une session sans présence humaine. Utilisez un déclencheur pour automatiser des tâches récurrentes ou déclenchées par un événement.
Pour reprendre plus tard la tâche d’une session — « vérifier demain si la personne a répondu » — utilisez plutôt un rappel. Un rappel est un déclencheur associé à cette session. Il est stocké dans la base de données, pas dans beeuni.yaml.
Types de déclencheurs
Beeuni prend en charge quatre types de déclencheurs.
- cron — s’exécute selon un calendrier que vous définissez.
- webhook — s’exécute lorsqu’un service externe envoie une requête signée à l’URL du webhook du projet.
- event — s’exécute lorsqu’un événement survient dans une application connectée, comme une nouvelle pull request ou un nouvel e-mail. Voir Déclencheurs d’événements d’application.
- monitor — exécute une commande de votre dépôt 24 h/24, 7 j/7. Chaque ligne que la commande écrit sur stdout déclenche le déclencheur. Fonctionnalité expérimentale : voir Moniteurs.
Vous définissez les déclencheurs dans le manifeste du projet, beeuni.yaml. Chaque déclencheur contient une invite qui devient le premier message de la session déclenchée. L’état d’exécution — comme l’heure de la dernière exécution et le statut — est stocké dans la base de données, hors du manifeste. Le déclenchement ne crée pas de commit.
Créer, modifier ou supprimer un déclencheur depuis le tableau de bord écrit directement dans la branche par défaut. Cela ne passe pas par une demande de modification (CR). Modifier beeuni.yaml dans une session et exécuter beeuni ship suit plutôt le processus habituel de branche et de CR.
Configurer un déclencheur cron
Ajouter le déclencheur
beeuni triggers add daily-digest --type cron \
--cron "0 0 9 * * 1-5" --timezone America/Los_Angeles \
--prompt "Summarize yesterday's activity and save it as a daily note."cron est une expression à 6 champs : seconde, minute, heure, jour, mois, jour de la semaine. Un déclencheur se lance au plus une fois par minute : 0 */30 * * * * correspond à toutes les 30 minutes, et */30 * * * * * (toutes les 30 secondes) est refusé. Cette commande modifie uniquement votre beeuni.yaml local.
Publier
beeuni shipbeeuni ship valide beeuni.yaml et le pousse. Le calendrier est activé dès que cela arrive dans la branche par défaut de votre projet.
Vérifier son exécution
beeuni triggers lsLa liste affiche le slug et l’état de chaque déclencheur, ainsi que la date de son dernier déclenchement. Pour le déclencher maintenant plutôt que d’attendre le calendrier, exécutez beeuni triggers fire daily-digest. La commande attend le résultat de l’exécution et renvoie un code de sortie non nul avec le texte d’erreur en cas d’échec ; --wait <dur> limite la durée d’attente (valeur par défaut : 90s).
Configurer un déclencheur webhook
Un déclencheur webhook nécessite un secret. Beeuni l’utilise pour vérifier la signature de chaque requête entrante.
Ajouter le secret
beeuni secrets set WEBHOOK_SECRET=<a-random-value>Voir Secrets pour en savoir plus sur les secrets.
Ajouter le déclencheur
beeuni triggers add new-lead --type webhook \
--secret-env WEBHOOK_SECRET \
--prompt "A new lead arrived: {{ body.name }} ({{ body.email }}). Add it to the CRM."--secret-env indique le secret utilisé pour signer les requêtes adressées à ce déclencheur.
Publier
beeuni shipEnvoyer une requête
Beeuni construit l’URL du webhook à partir de l’identifiant de votre projet et du slug du déclencheur :
POST /v1/webhooks/projects/<project-id>/<slug>Envoyez à cette URL, depuis le service externe, une requête POST signée. Beeuni vérifie la signature à l’aide de WEBHOOK_SECRET, puis démarre une session dont l’invite contient le corps de la requête. Consultez Signature du webhook ci-dessous pour connaître l’en-tête et le format exacts.
Par défaut, chaque déclenchement démarre une nouvelle session sur une nouvelle branche. Un déclencheur peut réutiliser ou épingler une session, et un déclencheur webhook peut filtrer les charges utiles qui démarrent une session — voir Stratégie de session et Modèles de charge utile ci-dessous.
Déclencheurs d’événements d’application
Un déclencheur d’événement lance un agent lorsqu’un événement survient dans une application : une pull request est ouverte, un e-mail arrive, l’état d’une issue change. Vous n’avez pas à configurer de webhook, de secret ou de signature. Beeuni s’abonne à l’événement pour vous et s’occupe de la signature.
Un événement provient d’une source d’événements : un adaptateur qui transmet les événements d’une application. Les identifiants tels que GITHUB_PULL_REQUEST_CREATED désignent les événements pris en charge par cette source. Utilisez le catalogue d’événements pour choisir un événement pour votre connecteur.
Configuration dans l’application Web
- Ouvrez le projet, puis Triggers et New trigger.
- Choisissez App event.
- Choisissez une application. Sélectionnez ensuite un connecteur et l’un de ses comptes partagés, ou connectez un autre compte. Le compte marqué Default est utilisé, sauf si vous en choisissez un autre.
- Choisissez un événement. Le formulaire de ses paramètres, comme le dépôt, s’affiche en dessous.
- Rédigez l’invite et enregistrez.
Le déclencheur est actif dès que son badge indique Live. Les autres badges sont Activating, Needs connection et Error. Ils correspondent aux statuts pending, needs_connection et error ci-dessous.
Afficher tous les déclencheurs d’événements d’application
Dans l’application Web, ouvrez Triggers et choisissez App events. La rangée de filtres affiche All, Schedules, App events et Webhooks, chacun avec un nombre. Le choix est conservé dans l’adresse sous la forme ?type=event, ce qui permet de créer un lien vers cette page. Les lignes sont regroupées par application. En dessous, Apps with events répertorie toutes les applications pouvant lancer un agent, en affichant d’abord celles déjà utilisées par votre projet. Choisissez-en une pour ouvrir le formulaire de création d’un déclencheur associé à cette application.
La fenêtre d’un connecteur comporte un onglet Triggers qui affiche les événements d’application disponibles pour ce connecteur. Cet onglet apparaît uniquement pour les applications qui proposent des événements.
Avec la CLI :
beeuni triggers ls --type event # every app event trigger, grouped by app
beeuni triggers ls --connector github-work # the app events on one connector
beeuni triggers ls --type event --json # the same list as JSON
--type accepte également cron, webhook et monitor. --connector et --type peuvent être combinés.
Configuration avec la CLI
Un agent ou une personne exécute ces étapes dans l’ordre. Chaque étape affiche les informations nécessaires à la suivante.
beeuni triggers events --apps
beeuni triggers events --app github
beeuni connectors add github --provider composio --app github --apply
beeuni connectors connect github --owner project
beeuni triggers events --connector github
beeuni triggers events --connector github --event GITHUB_PULL_REQUEST_CREATED
beeuni triggers add pr-review --type event \
--connector github --event GITHUB_PULL_REQUEST_CREATED \
--config repo=hekmat/api \
--prompt "Review {{ event.data.html_url }}" --apply
beeuni triggers info pr-review
triggers events --appsrépertorie les applications pouvant déclencher des événements. Elles sont regroupées sous leur source d’événements (source: composio). Chaque application répertorie ses connecteurs (profils) et leurs comptes partagés. La colonneSTATEafficheconnectedouneeds account; les applications sans connecteur apparaissent sousNo connector yet.connectors addajoute le connecteur si l’application n’en a pas. Ignorez cette étape siCONNECTORest défini.connectors connect <slug> --owner projectaffiche un lien. Une personne l’ouvre pour connecter le compte partagé. Le compte privé d’un membre n’est pas pris en compte. Exécutez à nouveau la commande pour ajouter un deuxième compte partagé, puis attribuez-lui un libellé avecconnectors rename <id> <label>.triggers events --connector <slug>répertorie les événements. Ajoutez--event <TYPE>pour afficher les paramètres d’un événement et ses variables{{ event.data.* }}. Lisez la description de chaque paramètre : certains événements attendent un nom complet dans un seul paramètre, commerepo: hekmat/api, et refusent la même valeur répartie entreowneretrepo.triggers add --applycrée le déclencheur immédiatement et affiche son statut ainsi que l’étape suivante. Si un paramètre est manquant ou invalide, la commande renvoie le code 2 et répertorie tous les problèmes. Sans--apply, la CLI écrit le bloc dans lebeeuni.yamllocal ; exécutezbeeuni shippour l’appliquer.triggers info <slug>affiche le statut. Répétez jusqu’à ce qu’il indiquelive.
--source <adapter> définit la source d’événements et est facultatif : sans cette option, le déclencheur utilise le fournisseur du connecteur. Le connecteur doit appartenir à cette source. Une source composio sur un connecteur d’un autre fournisseur affiche error : Connector "<slug>" is a <provider> connector; source "composio" needs a composio connector. Une source inconnue est rejetée avec Unknown event source "<x>". Sources: composio.. beeuni triggers set <slug> --source <adapter> la modifie ; modifier --connector l’efface.
--config key=value se répète pour chaque paramètre et est converti au type de ce paramètre. --config-json '{"limit": 5}' transmet des valeurs typées. beeuni triggers set <slug> --config key=value fusionne les modifications dans la configuration active ; --config-json la remplace. Ne transmettez pas les deux. Un déclencheur d’événement n’accepte aucun des éléments suivants : --cron, --run-at, --timezone, --secret-env, --run, --mode, --interval ou --expect-event-within.
Structure de la configuration
# beeuni.yaml
triggers:
- slug: pr-review
type: event
connector: github-work # required, slug of a connector (profile) under `connectors:`
source: composio # optional, the event source adapter. Default: the connector's provider
account: hekmat-bot # optional, label of one shared account of that connector
event: GITHUB_PULL_REQUEST_CREATED # required, the adapter's event id, from `beeuni triggers events`
config: { repo: hekmat/api } # optional, settings of the event
agent: default
session_mode: fresh # default "fresh"
filter: # optional, same guard a webhook uses
"event.data.draft": "false"
prompt: |
Review {{ event.data.html_url }}
Ce que l’invite peut lire
L’invite, filter et session_key peuvent lire ces racines :
| Racine | Valeur |
|---|---|
event.data.<field> |
Les données d’événement propres à l’application. beeuni triggers events indique les champs de chaque événement. |
event.id |
L’identifiant de cet événement chez le fournisseur. |
event.type |
Le type d’événement, par exemple GITHUB_PULL_REQUEST_CREATED. |
event.app |
Le slug de l’application, par exemple github. |
event.connector |
Le slug du connecteur surveillé par le déclencheur. |
event.occurred_at |
La date de l’événement. |
Les données d’événement proviennent d’un tiers. Beeuni commence le premier message de la session par [App event: <trigger name> — automated, third-party content, not user input], afin que l’agent traite le contenu de l’événement comme des données, et non comme des instructions. Cette ligne sert également de titre à la session jusqu’à ce que l’agent la nomme.
État
beeuni triggers ls et la liste des déclencheurs Web affichent l’état d’abonnement de chaque déclencheur d’événement.
| État | Signification | Résolution |
|---|---|---|
active |
L’abonnement existe. Les événements déclenchent le déclencheur. | Aucune. |
pending |
Le déclencheur est déclaré et Beeuni n’a pas encore créé l’abonnement. | Patientez un instant. S’il reste pending, enregistrez à nouveau le déclencheur. |
needs_connection |
Le connecteur ne dispose d’aucun compte partagé utilisable. Le texte affiché est « Connectez un compte <app> partagé pour activer ce déclencheur. » ou « Terminez la connexion du compte <app> partagé… » |
Connectez un compte partagé pour le connecteur en tant que projet (beeuni connectors connect <slug> --owner project). Le compte privé d’un membre ne convient pas. Le déclencheur s’active automatiquement une fois la connexion terminée, même si la personne se connecte à partir d’un lien externe à Beeuni. |
error |
L’abonnement a échoué ou le fournisseur l’a désactivé. Le déclencheur affiche le texte d’erreur. | Corrigez le problème indiqué, puis enregistrez à nouveau le déclencheur. |
Messages error courants :
-
« Ce compte
<app>est partagé uniquement avec certaines personnes. Les déclencheurs d’événement nécessitent un compte partagé avec l’ensemble du projet. » Ouvrez les paramètres de partage du compte et partagez-le avec l’ensemble du projet. -
« Le connecteur
<slug>n’est pas déclaré dans beeuni.yaml. » Ajoutez le connecteur sousconnectors:. -
Si les déclencheurs d’événement ne sont pas disponibles, contactez l’assistance.
-
« L’application a désactivé cet abonnement : … » Le fournisseur a désactivé l’abonnement. Enregistrez à nouveau le déclencheur pour vous réabonner.
-
« Le compte connecté a expiré : … » L’application a révoqué le compte ou celui-ci a expiré. Reconnectez l’application pour réactiver le déclencheur.
Règles
- Connecteur et compte. Une application est un service, tel que GitHub. Un connecteur est un profil dans
beeuni.yaml; plusieurs connecteurs peuvent utiliser la même application. Un compte est une connexion associée à un connecteur. Un déclencheur désigne un connecteur. Il utilise le compte partagé par défaut de ce connecteur, sauf s’il définitaccount: <label>. Définissezaccountuniquement si un connecteur possède plusieurs comptes partagés. Dans la CLI,--account <label>le définit et--default-account(surtriggers set) l’efface. Si aucun compte partagé ne correspond au libellé, l’état devientneeds_connectionavec le texte « Connectez un compte<app>partagé nommé “<label>” sur<connector>. » - Un seul compte source. Seul un compte partagé avec l’ensemble du projet peut alimenter un déclencheur. Un déclencheur s’exécute sans personne présente, et les données d’événement sont intégrées à une invite de session. Un compte partagé uniquement avec des personnes nommées, ou un compte privé, ne peut jamais l’alimenter.
- Chaque événement ne déclenche qu’une fois. Un déclencheur se déclenche une fois par événement du fournisseur. La retransmission d’un événement ne démarre pas une deuxième session. Deux déclencheurs portant sur le même événement se déclenchent chacun une fois.
- La pause arrête le déclenchement. Un déclencheur ou un projet en pause ignore les événements. Les événements ignorés ne sont pas mis en file d’attente.
- Les modifications réabonnent. Modifier
connector,source,account,eventouconfigremplace l’abonnement. Supprimer le déclencheur le supprime.
Moniteurs
Expérimental. Les moniteurs ne s’exécutent que lorsque l’indicateur de fonctionnalité monitors est activé. Il est désactivé par défaut. Lorsqu’il est désactivé, la plateforme ne provisionne aucun environnement de moniteur et ne déclenche aucun événement de moniteur.
Un moniteur surveille un élément qui ne transmet pas de webhooks et ne se prête pas à une planification : un journal en direct, la profondeur d’une file d’attente, une page qui change, un prix. Beeuni exécute votre commande 24 h/24 et 7 j/7 dans l’environnement de moniteur du projet — une microVM persistante par projet, avec la même limite d’isolation et les mêmes secrets de projet que ceux d’un environnement sandbox de session. Le code déterministe surveille ; l’agent ne se réveille que lorsque la commande émet une ligne.
Quatre règles définissent le fonctionnement :
- Les lignes sur stdout sont des événements. Rien d’autre ne l’est. Stderr sert au diagnostic : visible dans les journaux du moniteur, il ne déclenche jamais rien.
- Chaque ligne déclenche exactement une fois le déclencheur, par le chemin déjà utilisé par un webhook :
filter→ modèle d’invite →session_mode. - Un moniteur ne peut pas échouer sans laisser de trace. La fin du processus, l’épuisement du budget de redémarrage et une absence de sortie supérieure à
expect_event_withindéclenchent chacun un événement de cycle de vie généré par la plateforme dans le même flux. - Par défaut,
session_modevautreusepour un moniteur, et nonfresh. Un moniteur se déclenche régulièrement par conception, doncfreshcréerait une session par événement.
Ajouter le moniteur
beeuni triggers add checkout-errors --type monitor \
--run "./monitors/checkout-errors.ts" \
--mode poll --interval 60s --expect-event-within 24h \
--prompt "Checkout monitor emitted: {{ line }}"--mode poll réexécute la commande toutes les --interval et s’attend à ce qu’elle se termine. --mode stream l’exécute une fois et la maintient en fonctionnement ; un flux n’accepte aucun --interval. Les deux formes produisent des lignes, impossibles à distinguer pour les étapes suivantes. Un moniteur rejette cron, run_at, timezone et secret_env.
Déployer
beeuni shipLa plateforme démarre l’environnement de moniteur dès que ces modifications sont intégrées à la branche par défaut.
Vérifier qu’il fonctionne
beeuni triggers ls
beeuni triggers info checkout-errorsls affiche le mode et l’intervalle d’un moniteur, là où un cron affiche sa planification. info affiche run, mode, interval et expect_event_within.
Limites des moniteurs
La plateforme applique toutes les limites ci-dessous.
| Limite | Valeur |
|---|---|
| Moniteurs par projet | 10 activés |
| Intervalle d’interrogation | 30 s minimum |
expect_event_within |
5 min minimum |
| Débit d’événements par moniteur | 60/heure en continu, rafale de 30. En cas de dépassement, le moniteur est suspendu pendant 10 minutes ; après 3 suspensions en 24 heures, il est désactivé. |
| Longueur de ligne | 8 Kio, tronquée avec un marqueur truncated: true |
| Budget de redémarrage | 5 redémarrages / 10 minutes, puis un événement de cycle de vie restart_budget_exhausted et une période d’attente de 15 minutes |
| Conservation des événements | 30 jours |
| Budget mensuel de l’environnement | 75 $ par défaut. Au-delà, l’environnement s’arrête et un événement de cycle de vie budget_exceeded est déclenché. |
L’environnement de moniteur nécessite un fournisseur prenant en charge un environnement sandbox persistant. Si le fournisseur du projet ne peut pas en héberger un, l’indicateur monitors indique qu’il n’est pas disponible.
Structure de la configuration
# beeuni.yaml
triggers:
- slug: daily-digest # required, lowercase + dashes, unique per project
name: Daily digest # optional, defaults to slug
type: cron # "cron" | "webhook" | "event" | "monitor", required
agent: beeuni # optional, defaults to "default"
model: anthropic/claude-sonnet-4-5 # optional, resolves at fire time if unset
enabled: true # optional, default true
cron: "0 0 9 * * 1-5" # 6-field expression, mutually exclusive with run_at
timezone: America/Los_Angeles # IANA name, default UTC
session_mode: reuse # "fresh" | "reuse" | "pinned" | "keyed", default "fresh"
filter: # optional, webhook payload guard
"body.data.direction": "inbound"
prompt: "Summarize {{ body.text }}" # required, template string
Un moniteur remplace les champs de planification par sa commande et sa forme :
# beeuni.yaml
triggers:
- slug: checkout-errors
type: monitor
run: ./monitors/checkout-errors.ts # required, repo-relative command
mode: poll # "poll" | "stream", required
interval: 60s # required on poll, invalid on stream
expect_event_within: 24h # optional silence watchdog
agent: oncall
session_mode: reuse # the monitor default
filter: # optional, same guard a webhook uses
"line.severity": "error"
prompt: "Checkout monitor emitted: {{ line }}"
Un déclencheur d’événement remplace les champs de planification par l’application et l’événement qu’il surveille. Voir Déclencheurs d’événements d’application.
L’ancien beeuni.toml utilise les mêmes champs dans un conteneur différent ; voir ancien format TOML.
Champs
| Champ | Requis | Valeur par défaut | Remarques |
|---|---|---|---|
slug |
oui | — | [a-z0-9][a-z0-9_-]{0,127}, unique par projet. |
type |
oui | — | cron, webhook ou monitor. |
prompt |
oui | — | Chaîne de modèle. S’affiche comme premier message de la session. |
name |
non | slug |
Libellé visible. |
agent |
non | default_agent |
Doit désigner une clé dans agents:. Omettez ce paramètre pour utiliser default_agent ; n’écrivez pas la valeur littérale default. |
model |
non | résolu au déclenchement | Format filaire provider/model, par exemple anthropic/claude-sonnet-4-5. |
enabled |
non | true |
Lorsque false, le planificateur et le récepteur du webhook ignorent l’entrée. |
session_mode |
non | fresh ou reuse pour un moniteur |
Voir Stratégie de session. |
session_id |
requis pour pinned |
— | Session exacte à relancer. |
session_key |
requis pour keyed |
— | Chaîne de modèle. La définir seule implique session_mode: keyed. |
filter |
non | — | Chemin à points → chaîne attendue. Une livraison de webhook qui ne correspond pas renvoie 200 et ne déclenche aucune session. |
cron |
soit cron/run_at, sur type: cron |
— | Expression à 6 champs : seconde, minute, heure, jour, mois, jour de la semaine. Se déclenche au plus une fois toutes les 60 secondes ; une expression plus rapide échoue beeuni validate et l’API. |
run_at |
soit cron/run_at, sur type: cron |
— | Horodatage ISO-8601. Se déclenche une fois, puis reste en veille. |
timezone |
non, cron uniquement | UTC |
Nom IANA. |
secret_env |
requis, webhook uniquement | — | Nom d’un secret de projet contenant la clé de signature. Le secret doit utiliser la livraison broker avec le consommateur connector. |
run |
requis, moniteur uniquement | — | Commande relative au dépôt dont les lignes de sortie standard constituent les événements. Une ligne, 1024 caractères maximum. |
mode |
requis, moniteur uniquement | — | poll relance run toutes les interval ; stream l’exécute une fois et le laisse actif. |
interval |
requis pour mode: poll |
— | Littéral de durée (30s, 5m, 24h, 7d), minimum 30s. Non valide sur mode: stream. |
expect_event_within |
non, moniteur uniquement | — | Littéral de durée, minimum 5m. Une absence d’activité supérieure à cette durée déclenche un événement de cycle de vie. |
Un déclencheur cron nécessite cron ou run_at, jamais les deux. Un déclencheur webhook sans secret_env est rejeté — les webhooks non authentifiés n’existent pas. Un moniteur nécessite run et mode, et rejette directement cron, run_at, timezone et secret_env — un manifeste qui annonce une planification que le moteur de moniteur ne lit jamais serait mensonger.
Configurez le secret de signature avant de créer ou de mettre à jour un déclencheur webhook :
beeuni secrets set WEBHOOK_SECRET=-
beeuni secrets delivery WEBHOOK_SECRET broker --consumer connector
Transmettez la valeur à la première commande via l’entrée standard. Si le secret utilisait auparavant la livraison sandbox, faites-le tourner après avoir modifié le mode de livraison, car un sandbox existant peut conserver l’ancienne valeur.
Stratégie de session
session_mode détermine quelle session est relancée lors d’un déclenchement. Beeuni essaie les modes ci-dessous dans l’ordre et passe au suivant si une étape échoue.
pinned— relance la sessionsession_idexacte. Si cette session a disparu ou a échoué, passe au mode suivant.keyed— appliquesession_keyà la charge utile, puis recherche la session non échouée la plus récente précédemment associée à cette clé exacte. Si la clé obtenue est vide ou qu’aucune session ne correspond, passe à une nouvelle session. Ne passe jamais à la session associée à une autre clé.reuse— relance la session non échouée la plus récente créée auparavant par ce déclencheur. Un déclencheur épinglé revient aussi à ce mode avant de passer au suivant.fresh— crée un nouveau sandbox et une nouvelle branche. Il s’agit du mode par défaut et du dernier recours pour tous les modes. La nouvelle session devient celle du déclencheur pour les prochains déclenchementsreuseetkeyed.
Une session reuse ou keyed dont l’historique ne tient plus dans le modèle, même après la compaction automatique, est retirée. Le déclenchement suivant démarre une nouvelle session. Toute autre erreur conserve la session pour le prochain déclenchement.
Un déclencheur cron fréquent qui ne doit pas renvoyer un historique sans cesse plus long peut renouveler sa session à la limite d’une période calendaire : session_key: "merge-{{ cron.scheduled_date }}" conserve une session sérialisée par jour UTC, et {{ cron.scheduled_hour }} une par heure UTC.
Exécutions échouées
Lorsqu’une exécution lancée par un déclencheur se termine par une erreur, Beeuni l’enregistre sur le déclencheur :
last_statusdevientfailedetlast_errorcontient la cause, par exempleOut of credits: Payment Required: Insufficient credits.- La page Schedule indique « La dernière exécution ne s’est pas terminée » et affiche la cause dans son panneau.
- Le propriétaire du compte reçoit une notification push mobile lors du premier échec. Un échec ultérieur met à jour la cause sans envoyer d’autre notification.
- Le déclencheur reste
failedtant qu’il continue de se déclencher. Un nouveau déclenchement ne prouve pas que son exécution fonctionne.
La prochaine exécution qui se termine efface l’échec. Une exécution que vous arrêtez vous-même, un sous-agent et un appel de modèle réessayé ne constituent pas des résultats d’exécution. Un déclenchement qui échoue avant le démarrage d’une exécution, par exemple parce qu’une session ne peut pas être créée, est effacé lors du prochain déclenchement réussi.
Accès aux sessions
Par défaut, les sessions créées par un déclencheur utilisent la politique privée. Elles appartiennent au compte de service de l’agent du déclencheur — l’identité d’un agent est un principal service_account, qui peut donc posséder une session et détenir des affectations comme tout autre principal. Un gestionnaire de projet peut toujours les ouvrir. Le propriétaire et un administrateur du compte disposent d’un accès équivalent à celui d’un gestionnaire sur chaque projet ; la même règle s’applique donc à eux. La personne qui a configuré le déclencheur ou l’a lancé manuellement n’obtient pas d’accès par cette action, sauf si elle détient l’un de ces rôles.
Les paramètres du déclencheur proposent trois politiques :
- Agent du déclencheur et gestionnaires de projet — aucun membre ordinaire du projet ne peut ouvrir la session.
- Coéquipiers sélectionnés — l’agent du déclencheur, les gestionnaires de projet et les membres du projet ou groupes de comptes sélectionnés.
- Projet entier — tous les membres du projet.
Cette politique est un paramètre de visibilité par ressource qui s’ajoute au modèle de rôles ; ce n’est pas un rôle. Elle détermine qui peut ouvrir les sessions d’un déclencheur donné. Elle n’accorde aucune autorisation refusée par la décision relative au rôle. Voir Comptes et accès.
La politique d’accès est un état d’exécution local au compte. Elle ne figure pas dans le manifeste beeuni.yaml portable, car les identifiants des principaux sont propres à chaque compte. Utilisez le tableau de bord pour la configurer.
La mise à jour de cette politique seule ne crée aucun commit Git. L’enregistrement d’une politique met également à jour les sessions antérieures créées par ce déclencheur.
Une session épinglée conserve ses propres paramètres de partage, car elle n’a pas été créée par le déclencheur. Si une session épinglée est indisponible et que le déclencheur crée une session de secours, la politique du déclencheur s’applique à cette nouvelle session.
Modélisation des charges utiles
prompt et session_key sont rendus avec le même moteur : {{ token.dotted.path }}. Une valeur manquante donne une chaîne vide — aucune erreur ni {{ }} résiduel. Les objets et les tableaux sont rendus au format JSON. session_key est supprimé des espaces superflus et tronqué à 512 caractères.
Chaque déclenchement reçoit également {{ trigger.slug }}, {{ trigger.type }} et {{ trigger.kind }} (toujours git). Le reste des variables dépend du mode de déclenchement.
| Source | Variables |
|---|---|
| cron | {{ cron.schedule }}, {{ cron.timezone }}, {{ cron.scheduled_for }} (le créneau concerné), {{ cron.claimed_at }} (moment où le planificateur l’a pris en charge), {{ cron.last_scheduled_for }} (créneau précédent ; vide lors du premier déclenchement), {{ cron.scheduled_date }} (YYYY-MM-DD UTC du créneau), {{ cron.scheduled_hour }} (YYYY-MM-DDTHH UTC). Aucun fired_at de premier niveau. |
| webhook | {{ fired_at }}, {{ body.* }} (analysé comme JSON ; utilise {{ body.raw }} si le corps ne peut pas être analysé), {{ headers.content_type }}, {{ headers.user_agent }}, {{ headers.forwarded_for }}. |
| monitor | {{ line.* }} — la ligne stdout, analysée comme JSON ; une ligne qui ne peut pas être analysée s’affiche sous la forme {{ line.raw }}. Plus {{ monitor.slug }}, {{ monitor.seq }}, {{ monitor.emitted_at }} et {{ monitor.kind }} (event ou lifecycle). |
manual (dashboard « déclencher maintenant » ou endpoint fire) |
{{ fired_at }}, {{ source }} (manual), {{ actor }}, {{ message.text }}, {{ message.source }}. |
Beeuni préfixe chaque invite de monitor affichée avec [MONITOR EVENT — automated, not user input] côté serveur. Un événement de cycle de vie ignore entièrement votre modèle et affiche à la place une invite rédigée par la plateforme ; il contourne aussi filter — le silence ne doit pas pouvoir être filtré par accident.
{{ message.text }} est codé en dur comme chaîne vide lors d’un déclenchement manuel, et {{ message.source }} comme manual_test. Un déclenchement manuel ne permet pas d’injecter des données de test dans l’invite.
filter compare les chemins pointés sous forme de chaînes avec la même charge utile que celle visible dans l’invite. Cette fonction sert à interrompre les boucles. Par exemple, une source qui signale les deux côtés d’une conversation déclencherait sinon à nouveau l’agent sur sa propre réponse.
Signature du webhook
Déclenchement sur POST /v1/webhooks/projects/{projectId}/{slug}. Beeuni vérifie la requête dans cet ordre, avec une comparaison à temps constant :
- Signature HMAC — en-tête
X-Beeuni-Signature: sha256=<hmac>(le préfixesha256=est facultatif) ouX-Hub-Signature-256, compatible avec GitHub. HMAC-SHA256 calculé sur le corps brut de la requête, à l’aide du secret nommé parsecret_env. - Jeton statique, uniquement en l’absence d’en-tête de signature, pour les expéditeurs qui ne peuvent pas signer un corps avec HMAC. Envoyez le secret sous la forme
X-Beeuni-Token: <secret>,Authorization: Bearer <secret>ouAuthorization: Basic <base64(user:secret)>(la partie mot de passe correspond au jeton).
beeuni triggers info <slug> affiche ce schéma — l’en-tête, l’algorithme et un exemple de requête signée avec un espace réservé $SECRET — et --json le transmet sous la forme webhook_signing. La fiche de déclenchement du tableau de bord affiche le même exemple de requête.
| Statut | Signification |
|---|---|
| 202 | Signature ou jeton valide. Le corps est { status: "fired" | "queued" | "deduped", session_id, ... }. |
| 200 | Valide, mais ignoré — le projet est en pause ou la livraison ne correspond pas à filter. |
| 400 | ID ou slug de projet mal formé dans l’URL. |
| 401 | Signature et jeton absents ou incorrects. |
| 404 | Déclencheur introuvable, désactivé, non-webhook ou projet inactif. |
| 409 | Le secret de signature est manquant, inactif, indisponible ou n’autorise pas le consommateur connector. La réponse inclut un code webhook_secret_* et des instructions pour résoudre le problème. |
| 500 | Authentification réussie, mais échec du déclenchement de la session. |
Endpoints
| Méthode + chemin | Autorisation requise | Remarques |
|---|---|---|
GET /v1/projects/{projectId}/triggers |
project.trigger.read |
Répertorie les déclencheurs, l’état d’exécution (last_fired_at, last_status, last_error, last_attempt_at) et les erreurs d’analyse du manifeste. Une entrée incorrecte apparaît dans errors[] ; elle n’affecte pas les autres déclencheurs. |
POST /v1/projects/{projectId}/triggers |
project.trigger.create |
Crée un déclencheur. Modifie directement le manifeste. |
PATCH /v1/projects/{projectId}/triggers/{slug} |
project.trigger.update |
Mise à jour partielle, fusionnée avec l’entrée actuelle. |
DELETE /v1/projects/{projectId}/triggers/{slug} |
project.trigger.delete |
Efface également l’état d’exécution du déclencheur. |
PATCH /v1/projects/{projectId}/triggers/activation |
project.trigger.update |
Corps { paused: boolean }. Voir Mettre en pause et reprendre. |
POST /v1/projects/{projectId}/triggers/{slug}/fire |
project.trigger.fire |
Déclenchement manuel. Le rôle intégré member du projet détient project.trigger.fire, ce qui permet à un membre ordinaire de déclencher un déclencheur. |
POST /v1/webhooks/projects/{projectId}/{slug} |
signature ou jeton | URL publique, protégée par le secret du webhook. |
Mettre en pause et reprendre
Un commutateur au niveau du projet arrête tous ses déclencheurs à la fois, indépendamment du champ enabled de chaque déclencheur. Pendant la pause, le planificateur ignore le projet et les webhooks entrants renvoient 200 avec { status: "skipped" } — aucune session n’est déclenchée. Le déclenchement manuel reste possible. Utilisez cette option lorsque le même dépôt s’exécute sur deux plans de contrôle (par exemple, développement et production), afin d’éviter un double déclenchement de cron. CLI : beeuni triggers pause et beeuni triggers resume. Consultez CLI pour découvrir le groupe de commandes beeuni triggers complet.
Limites et fiabilité
- Le planificateur interroge le système environ chaque seconde (1 000 ms par défaut ; configurable via
BEEUNI_TRIGGER_SCHEDULER_INTERVAL_MS). Une exécution cron ne démarre pas exactement à son créneau : chaque déclencheur reçoit un décalage fixe pouvant atteindre un quart de sa période, avec un maximum de 30 minutes, afin que de nombreux déclencheurs prévus à la même minute ne démarrent pas tous en même temps. La page de détail du déclencheur etGET /triggers(next_fire_at) indiquent l’heure de démarrage de la prochaine exécution. - Un déclenchement qui échoue définit le dernier statut du déclencheur comme ayant échoué, avec l’erreur. Cela vaut pour toutes les sources : cron, manuel, webhook, événement d’application et monitor. Le prochain déclenchement réussi efface l’échec. Un échec d’exécution est effacé comme décrit dans Échecs d’exécution.
- Par défaut, chaque projet autorise le provisionnement simultané de 3 sessions déclenchées. Un déclenchement qui dépasse cette limite renvoie
queued(202) au lieu d’échouer, et s’exécute dès que l’une des sessions a terminé son provisionnement. Le nombre de sessions exécutées simultanément n’est pas limité. - Les déclenchements manuels ou par webhook expirent au bout de 45 secondes. Le chargement du manifeste expire au bout de 30 secondes.
- Un déclenchement cron est associé au créneau d’échéance prévu ; ainsi, un déclenchement qui a expiré mais a effectivement abouti ne sera pas dupliqué lors d’une nouvelle tentative.
- Chaque livraison de webhook s’exécute une fois par événement. Beeuni lit l’ID d’événement à partir de
X-Beeuni-Delivery-Id,X-GitHub-Delivery,X-Gitlab-Event-UUID,Linear-Delivery,webhook-idousvix-id, dans cet ordre ; une nouvelle tentative avec le même ID renvoie202 { status: "deduped" }et n’exécute rien.X-Request-Idn’est pas un ID d’événement. En l’absence d’ID d’événement, un corps et une signature identiques reçus dans un délai de 10 minutes sont considérés comme le même événement ; au-delà, l’exécution est relancée. Ainsi, une tâche qui envoie le même corps statique à chaque déploiement s’exécute à chaque déploiement. EnvoyezX-Beeuni-Delivery-Idavec une nouvelle valeur pour chaque événement (l’exemple de requête utilise$(uuidgen)). - Une livraison dont une tentative précédente a définitivement échoué (par exemple, parce que le compte n’avait plus de crédits), ou dont la session a été supprimée, est relancée lors d’une nouvelle livraison avec le même ID. Un doublon ne modifie pas
last_fired_at.