Skip to main content
Les compétences et les agents sont actuellement en phase alpha. Cette fonctionnalité fonctionne mais est encore en évolution.
Les applications peuvent définir des fonctionnalités d’IA au sein de l’espace de travail — des instructions de compétences réutilisables et des agents avec des invites système personnalisées.
Les compétences définissent des instructions et des capacités réutilisables que les agents IA peuvent utiliser dans votre espace de travail. Utilisez defineSkill() pour définir des compétences avec validation intégrée :
src/skills/example-skill.ts
Points clés :
  • name est une chaîne d’identification unique pour la compétence (kebab-case recommandé).
  • label est le nom d’affichage lisible par l’utilisateur dans l’UI.
  • content contient les instructions de la compétence — c’est le texte que l’agent IA utilise.
  • icon (optionnel) définit l’icône affichée dans l’UI.
  • description (optionnel) fournit un contexte supplémentaire sur l’objectif de la compétence.
Les agents sont des assistants IA qui vivent dans votre espace de travail. Utilisez defineAgent() pour créer des agents avec un prompt système personnalisé :
src/agents/example-agent.ts
Points clés :
  • name est un identifiant unique pour l’agent (kebab-case recommandé).
  • label est le nom d’affichage montré dans l’UI.
  • prompt est le prompt système qui définit le comportement de l’agent.
  • description (optionnel) fournit un contexte sur ce que fait l’agent.
  • icon (optionnel) définit l’icône affichée dans l’UI.
  • modelId (optionnel) remplace le modèle d’IA par défaut utilisé par l’agent.
  • responseFormat (facultatif) contrôle la forme de la sortie de l’agent. Par défaut, la valeur est { type: 'text' } pour le texte libre. Utilisez { type: 'json', schema } pour forcer une sortie JSON structurée.
Par défaut, un agent renvoie du texte libre. Pour obtenir une sortie structurée, définissez responseFormat sur { type: 'json' } et fournissez un schema :
src/agents/structured-agent.ts
Remarques sur le schéma :
  • Le schéma est un objet plat : le type de chaque propriété doit être un type primitif (string, number ou boolean). Les objets imbriqués et les tableaux ne sont pas pris en charge.
  • description (facultatif) sur chaque propriété guide le modèle sur ce qu’il doit y mettre.
  • required (facultatif) répertorie les propriétés que le modèle doit toujours renvoyer.
  • additionalProperties: false (facultatif) interdit toute propriété non déclarée dans properties.
runAgent() permet à une fonction logique d’exécuter l’un des agents de votre application (avec ses compétences et ses outils). Identifiez l’agent à l’aide du universalIdentifier que vous avez passé à defineAgent(). Passez soit une chaîne de caractères prompt, soit un historique de conversation messages, mais pas les deux :
src/logic-functions/run-enricher.ts
Pour les bots multi-tours (Slack, Discord, Teams, …), passez l’historique du fil de discussion en messages au lieu d’un seul prompt :
src/logic-functions/reply-in-thread.ts
Points clés :
  • Fournissez exactement l’un des deux : prompt (string) ou messages (1 à 100 entrées de { role: 'user' | 'assistant', content: string }).
  • L’agent s’exécute de manière synchrone et peut lire/mettre à jour lui-même des enregistrements via ses propres outils — runAgent() se résout une fois l’exécution terminée.
  • Une application ne peut exécuter que ses propres agents.
  • Le rôle par défaut de l’application doit accorder l’indicateur d’autorisation AI — ajoutez SystemPermissionFlag.AI à ses permissionFlagUniversalIdentifiers (ou définissez canAccessAllTools: true). Sans cela, runAgent() échoue avec une erreur d’autorisation.
  • Définissez une valeur généreuse pour timeoutSeconds sur la fonction logique — les exécutions d’agent peuvent prendre plusieurs secondes.
  • success est true et result est non nul lorsque l’exécution se termine ; en cas d’échec, success est false, result est null, et error contient la raison (par exemple, lorsque l’espace de travail épuise ses crédits AI en cours d’exécution).
src/roles/default-role.ts
Évitez les boucles : si vous appelez runAgent() à partir d’un déclencheur d’événement de base de données *.updated et que l’agent met à jour le même enregistrement, limitez le déclencheur avec updatedFields à un champ que l’agent n’écrit jamais (par exemple l’URL source), ou vérifiez si un champ cible est encore vide avant d’appeler runAgent().

Exécution au nom d’un membre de l’espace de travail

Passez runAsWorkspaceMemberId lorsque l’exécution est déclenchée par une personne — par exemple un chatbot répondant à un message — afin que l’agent agisse comme ce membre plutôt qu’en tant qu’application :
src/logic-functions/answer-question.ts
L’exécution agit alors avec le propre rôle du membre : elle peut faire tout ce que ce membre peut faire et rien de plus, les enregistrements qu’elle crée lui sont attribués, et ses permissions au niveau des lignes s’appliquent. Le rôle de l’agent ne participe pas — il s’agit de la valeur par défaut de l’application pour les exécutions sans personne derrière. Omettez ce champ pour les exécutions autonomes (tâches planifiées, déclencheurs d’événements de base de données) : celles-ci conservent le rôle propre de l’agent. L’application qui agit reste rattachée au contexte de l’exécution à des fins de traçabilité, sans restreindre les permissions du membre.Votre application est responsable de faire correspondre la personne qui a déclenché l’exécution à un membre de l’espace de travail. Nommer un membre nécessite un jeton d’accès de l’application, et ce qu’un jeton peut nommer dépend du fait qu’il soit ou non associé à un utilisateur :
  • Un jeton sans utilisateur associé peut nommer n’importe quel membre. Une fonction logique s’exécute avec un tel jeton, tout comme les jetons créés via client_credentials ou à partir d’une clé d’API.
  • Un jeton émis au nom d’un utilisateur, comme en reçoit un composant frontal, ne peut nommer que le membre de cet utilisateur lui-même.
Tout autre type — une simple session utilisateur, une clé d’API sans jeton d’application — ne peut pas nommer de membre du tout.
runAgent() lève une exception lorsque le membre de l’espace de travail ne peut pas être résolu — un membre inconnu ou supprimé, ou un membre sans rôle. Elle ne revient jamais au rôle propre de l’agent, car cela accorderait plus d’accès que ce que l’appelant a demandé.