
Semaphore UI 2.21 exécute des agents de programmation IA. Deux nouvelles applications, Claude Code Agent et Codex Agent, lancent l’outil en ligne de commande de l’agent dans un dépôt et lui donnent un prompt. L’agent travaille de façon autonome et rend compte de ce qu’il fait dans le journal de la tâche. Le prompt peut reprendre des valeurs des groupes de variables et des variables de sondage, l’agent peut appeler les outils de serveurs MCP, et le journal présente son travail sous forme de transcription.
Semaphore 2.21 est en cours de développement. Il n’est pas encore publié : cette page décrit ce qui se trouve déjà dans la branche de développement et s’étoffera jusqu’à la sortie. Les détails peuvent encore changer.
Points forts
- Modèles Claude Code Agent et Codex Agent : un agent est un modèle comme un autre. Lancez-le à la main, par une planification, une intégration ou comme étape d’un workflow.
- Expressions de prompt :
${{ vars.extra.NAME }},${{ vars.env.NAME }},${{ secrets.extra.NAME }}et${{ secrets.env.NAME }}insèrent dans le prompt les valeurs des groupes de variables et des variables de sondage, comme dans GitHub Actions. - Prompt d’une tâche : un modèle peut autoriser la personne qui lance une tâche à remplacer le prompt pour une exécution.
- Inventaire MCP : un nouveau type d’inventaire contenant les serveurs MCP distants dont l’agent peut appeler les outils. Les jetons sont stockés chiffrés.
- Journal de tâche de l’agent : le texte de l’agent, les appels d’outils, les sous-agents et un résumé avec les tokens et le coût, mis à jour pendant que l’agent travaille.
- Isolation : chaque tâche reçoit son propre répertoire de configuration de l’agent, vide. Les jetons et les secrets insérés dans le prompt sont masqués dans le journal.
Modèles d’agents IA

Un modèle d’agent lance Claude Code ou Codex dans un répertoire d’un dépôt et lui donne un prompt. Utilisez-le pour un travail que vous décririez autrement à un collègue : relire le dernier commit, trouver et corriger un test en échec, mettre à jour une dépendance et ouvrir une pull request.
Pour en créer un, allez dans Modèles de tâches, cliquez sur Nouveau modèle, puis sur Claude Code Agent ou Codex Agent.
| Champ | Description |
|---|---|
| Dépôt | Le dépôt dans lequel l’agent travaille. Semaphore le clone ou le met à jour avant la tâche, comme pour tout autre modèle. |
| Chemin du sous-répertoire | Facultatif. Le répertoire du dépôt dans lequel l’agent est lancé. |
| Serveurs MCP | Facultatif. Un inventaire MCP contenant les serveurs dont l’agent peut appeler les outils. |
| Groupes de variables | Variables et secrets pour l’agent : la clé API, les valeurs des expressions de prompt, les variables d’environnement du processus de l’agent. |
| Prompt | L’instruction avec laquelle l’agent s’exécute. |
| Arguments CLI | Arguments supplémentaires pour la commande de l’agent : le modèle, les limites, les permissions. |
| Variables de sondage | Questions posées au lancement de la tâche. Les réponses peuvent être insérées dans le prompt. |
Ce qu’il vous faut. L’outil en ligne de commande de l’agent doit être installé sur la machine qui exécute les tâches, le serveur Semaphore ou le runner :
| Application | Commande | Installation |
|---|---|---|
| Claude Code Agent | claude |
npm install -g @anthropic-ai/claude-code |
| Codex Agent | codex |
npm install -g @openai/codex |
Semaphore active une application lorsqu’il trouve sa commande dans PATH au démarrage. Un administrateur
peut aussi l’activer et définir le chemin de l’exécutable sur la page Applications.
Comment l’agent s’exécute. Semaphore lance l’agent dans le répertoire du dépôt en lui passant le prompt sur son entrée standard, de sorte que le prompt n’apparaît pas dans la liste des processus :
| Application | Commande |
|---|---|
| Claude Code Agent | claude -p --output-format=stream-json --verbose --include-partial-messages --mcp-config=<file> --strict-mcp-config --no-session-persistence <CLI args> |
| Codex Agent | codex exec --json --skip-git-repo-check <CLI args> - |
- Rien n’est conservé entre les tâches. Chaque exécution est une nouvelle session de l’agent. Ce qui doit survivre à une exécution a sa place dans le dépôt : un commit, une pull request, un fichier.
- Sur les runners Docker et Kubernetes, l’agent s’exécute dans un conteneur ; l’image de l’exécuteur doit donc
contenir la commande
claudeoucodex.
Clé API
L’agent lit sa clé API dans une variable d’environnement. Ajoutez la clé à un groupe de variables du modèle en tant que variable d’environnement secrète :
| Application | Variable | Également acceptée |
|---|---|---|
| Claude Code Agent | ANTHROPIC_API_KEY |
CLAUDE_CODE_OAUTH_TOKEN |
| Codex Agent | OPENAI_API_KEY |
CODEX_API_KEY |
La connexion de l’utilisateur qui exécute Semaphore n’est pas utilisée : le répertoire de configuration de l’agent est créé pour la tâche et il est vide ; une clé provenant d’un groupe de variables est donc le seul moyen de s’authentifier. Si aucune de ces variables n’est définie, le journal de la tâche indique laquelle ajouter.
Expressions de prompt
Le prompt d’un modèle peut reprendre des valeurs des groupes de variables du modèle. Écrivez une expression entre doubles accolades, comme dans GitHub Actions, et Semaphore la remplace au démarrage de la tâche :
| Expression | Valeur |
|---|---|
${{ vars.extra.NAME }} |
Une variable supplémentaire d’un groupe de variables. |
${{ vars.env.NAME }} |
Une variable d’environnement d’un groupe de variables. |
${{ secrets.extra.NAME }} |
Une variable supplémentaire secrète d’un groupe de variables. |
${{ secrets.env.NAME }} |
Une variable d’environnement secrète d’un groupe de variables. |
Find the flaky tests in services/api and fix them.
Open a pull request against ${{ vars.extra.base_branch }} and post its link
to ${{ vars.env.TRACKER_URL }} with the token ${{ secrets.env.TRACKER_TOKEN }}.
- Les variables de sondage sont des variables supplémentaires : la réponse à la variable de sondage
versionest${{ vars.extra.version }}, et une variable secrète est${{ secrets.extra.NAME }}. Une variable de sondage transmise comme variable d’environnement se trouve en revanche sousenv. Une variable de sondage laissée sans réponse donne une chaîne vide. - Une variable qui n’existe pas fait échouer la tâche avant le démarrage de l’agent, avec un message qui nomme l’expression. Semaphore n’exécute pas un agent dont le prompt comporte un trou.
- Une expression mal écrite est refusée à l’enregistrement du modèle :
${{ secrets.TOKEN }}n’a niextranienv. - Les autres expressions sont laissées telles quelles. Seules
vars.…etsecrets.…appartiennent à Semaphore ; un prompt peut donc demander à l’agent d’écrire un workflow contenant${{ github.sha }}. Pour conserver une expressionvarsousecretscomme texte, placez un signe dollar supplémentaire devant elle :$${{ secrets.env.NAME }}. - Une valeur est insérée telle quelle. Une chaîne est utilisée comme elle est écrite, une liste ou un objet en JSON. Une valeur n’est pas analysée de nouveau à la recherche d’expressions.
- Un secret inséré dans le prompt est masqué dans le journal de la tâche, partout où l’agent le répète.
Un secret dans le prompt est envoyé au fournisseur du modèle avec le reste du prompt. Préférez donner un secret aux outils de l’agent : comme variable d’environnement secrète d’un groupe de variables, ou comme jeton d’un serveur MCP.
Prompt d’une tâche
Lorsque la case Prompt est cochée dans le modèle, le formulaire de tâche affiche le prompt du modèle et permet de le modifier pour une exécution. Une planification, une intégration ou une étape de workflow peut conserver son propre prompt de la même manière. Via l’API, envoyez-le dans les paramètres de la tâche :
{
"template_id": 12,
"params": {
"prompt": "Review the changes of the last release and list the risky ones."
}
}
Un prompt fourni par une tâche est utilisé exactement tel qu’il est écrit : les expressions de prompt ne sont remplacées que dans le prompt stocké dans le modèle. Les variables et les secrets du projet restent ainsi hors de portée de quiconque peut seulement lancer des tâches. Si le modèle ne l’autorise pas, une tâche qui apporte un prompt est refusée.
Serveurs MCP

Un agent peut appeler les outils de serveurs MCP distants : un gestionnaire de tickets, une recherche dans la documentation, votre propre service. Les serveurs sont conservés dans un inventaire du nouveau type Inventaire MCP, et un même inventaire sert aux modèles Claude Code comme aux modèles Codex.
| Champ | Description |
|---|---|
| Interrupteur | Un serveur désactivé reste dans la liste et n’est pas transmis à l’agent. |
| Nom | Le nom sous lequel l’agent connaît le serveur : jusqu’à 64 lettres, chiffres, - et _. |
| URL | Une adresse http ou https d’un serveur qui parle MCP via HTTP ou SSE. Un nom d’utilisateur ou un mot de passe dans l’URL n’est pas accepté. |
| Jeton | Facultatif. L’agent l’envoie dans l’en-tête Authorization comme jeton bearer. |
- Un jeton enregistré est stocké chiffré et n’est plus jamais affiché : saisissez-en un nouveau pour le remplacer, ou supprimez-le.
- Le jeton parvient à l’agent comme variable d’environnement de son processus. Il n’est écrit ni dans le fichier de configuration de l’agent, ni sur la ligne de commande, ni dans le journal de la tâche.
- L’agent reçoit exactement ces serveurs. Leurs outils sont approuvés à l’avance, puisque personne n’est là pour confirmer un appel, et les serveurs MCP configurés pour l’utilisateur qui exécute Semaphore ne sont pas utilisés.
Journal de la tâche

Le journal de la tâche montre le travail de l’agent au fur et à mesure, sous forme de transcription et non sous la forme des événements JSON qu’imprime l’outil en ligne de commande :
- Le texte de l’agent, ligne par ligne. Codex imprime un message lorsqu’il est complet.
- Les appels d’outils, chacun sur une ligne : l’état, le serveur MCP et l’outil, les arguments. Cliquez sur une ligne pour voir les arguments et le résultat. Un appel en échec est déplié dès le départ.
- Les sous-agents : les lignes d’un sous-agent sont marquées de son nom.
- La première ligne d’une exécution Claude Code nomme le modèle et les serveurs MCP, ceux qui ne se sont pas connectés étant en rouge.
- Le résumé à la fin : le nombre de tours, la durée, les tokens et le coût, dans la mesure où l’agent les communique.
Journal brut affiche le même journal en texte brut.
Sécurité
- Un agent exécute des commandes. Dans les limites des permissions que lui donne son outil en ligne de commande, l’agent peut lire et modifier le répertoire du dépôt, exécuter des programmes en tant qu’utilisateur qui exécute les tâches et appeler les outils de ses serveurs MCP. Donnez à un modèle d’agent un dépôt et des jetons avec les droits les plus restreints qui suffisent au travail, et un runner séparé pour le travail que vous voulez tenir à l’écart du serveur.
- Chaque tâche a son propre répertoire de configuration de l’agent (
CLAUDE_CONFIG_DIR,CODEX_HOME), créé pour la tâche et supprimé après elle. Les paramètres, les connexions et les serveurs MCP de l’utilisateur qui exécute Semaphore n’atteignent pas l’agent, et une variable d’un groupe de variables ne peut pas rediriger ce répertoire. - Le prompt et ce que l’agent lit sont envoyés au fournisseur du modèle : les fichiers du dépôt, la sortie des commandes, les résultats des outils.
- Un dépôt peut donner des instructions à l’agent. Du texte dans les fichiers que l’agent lit, dans un ticket ou dans le résultat d’un outil peut changer ce que fait l’agent. Ne dirigez pas un agent doté de jetons puissants vers un contenu que vous ne contrôlez pas.
- Les jetons et les secrets sont masqués dans le journal de la tâche : les jetons des serveurs MCP et les secrets
insérés dans le prompt sont remplacés par
********. - Les variables et les secrets restent hors de la ligne de commande d’un agent, où la liste des processus les montrerait.
Documentation
Le guide de l’utilisateur contient une page avec chaque champ et chaque règle : Agents IA.
