Outposts est en accès anticipé. Les API et les commandes CLI décrites ici sont susceptibles d’évoluer.
Contactez l’équipe en charge de votre compte pour activer Outposts pour votre organisation.
- Sessions exécutées dans votre réseau, à proximité de services internes, de registries et de secrets
- Profils matériels personnalisés (p. ex. GPU, machines dotées de beaucoup de mémoire, images de système d’exploitation spécifiques)
- Infrastructure existante (postes de développement, VM ou Kubernetes) pour héberger les charges de travail Devin
- Contrôles Enterprise sur l’accès réseau, les sorties de build et la supervision
Fonctionnement
-
Le worker (p. ex.
devin worker start) — un binaire que vous exécutez sur une machine pour prendre en charge une seule session en file d’attente. Il ouvre une connexion sortante vers le cloud de Devin et exécute localement les appels d’outil de la session. Cognition fournit ce binaire ; vous n’avez jamais besoin de l’implémenter. Le Devin CLI contient la logique permettant de récupérer et d’exécuter ce binaire. - L’orchestrateur — un logiciel qui surveille l’API de flotte pour repérer les sessions en attente d’un worker, provisionne une VM ou un conteneur pour chacune d’elles, puis y démarre le worker. Nous fournissons quelques implémentations de référence pour les plateformes courantes (comme Kubernetes), mais vous pouvez librement les adapter (elles sont open source !) ou écrire la vôtre.
Prérequis
- Une organisation avec Outposts activé
- Un jeton d’API v3 avec les périmètres Outposts appropriés :
account.outposts.orchestratorpour les orchestrateurs qui gèrent les outposts (implique le périmètre machine)account.outposts.machinepour les workers qui lisent la file d’attente et prennent en charge/libèrent des sessions
- Une image de machine (VM ou conteneur) avec :
- Devin CLI installé
- Les dépendances de la machine ci-dessous
- Vos dépôts clonés, avec des remotes configurées
- Un accès aux build tools, aux package registries, aux secrets et aux services internes dont vos sessions ont besoin
Dépendances de la machine
Facultatif — installez-les pour débloquer des fonctionnalités spécifiques :
Démarrage rapide : créer un outpost et lancer un worker
devin worker start, sans orchestrator. C’est le moyen le plus rapide d’essayer Outposts sur une machine de développement, et c’est aussi la commande qu’un orchestrator utilise à grande échelle.
1. Créer un jeton d’utilisateur de service
UseOutpostsMachine → account.outposts.machine, ManageOutpostsOrchestrator → account.outposts.orchestrator). Dans l’application web Devin :
- Créez un rôle ayant accès à Outposts. Sous Settings → Roles, ajoutez un rôle Enterprise et activez Use outpost machine (
UseOutpostsMachine) dans Outpost permissions. Activez également Manage outposts (ManageOutpostsOrchestrator) si cet utilisateur de service doit créer ou supprimer des outposts. - Provisionnez l’utilisateur de service. Sous Settings → Devin API → Service users, cliquez sur Provision service user, donnez-lui un nom (par ex.
outposts-worker), attribuez-lui le rôle de l’étape 1 et définissez une date d’expiration. - Copiez le jeton. Le jeton
cog_...n’est affiché qu’une seule fois lors de sa création — copiez-le maintenant ; vous ne pourrez plus le récupérer par la suite.
2. Créer un outpost
outpost_env-...) — notez-le pour l’étape suivante. Vous pouvez aussi créer des outposts dans l’application web, sous Settings → Outposts, ou via l’API Outposts.
Une fois créé, l’outpost apparaît parmi les options de machine dans Devin Cloud (aux côtés d’Ubuntu, Windows, etc.) lors du démarrage d’une session.
3. Lancer le worker
devin-remote approprié et exécute la session. Lorsque la session se termine, il revient à la file et attend la suivante. Passez --once pour quitter après avoir exécuté une seule session, ou --session=<session_id> pour prendre en charge et exécuter une session spécifique.
Si --token et DEVIN_OUTPOSTS_TOKEN ne sont tous les deux pas définis, la commande échoue. Si --outpost est omis dans un terminal interactif, le worker vous invite à choisir parmi les outposts de votre compte.
4. Démarrer une session sur l’outpost
Vous utilisez Kubernetes ? L’opérateur open source
devin-outpost-k8s
s’installe via Helm et exécute des workers pour un outpost sur n’importe quel
cluster certifié (GKE, EKS, …). À partir d’un clone de ce dépôt :
Le processus principal
1. Déclarer un outpost
rhel, gpu-h200 ou my-outpost). Créez-en un avec devin worker outpost create :
Dans l’API de flotte, les outposts sont représentés par des ressources
outposts, rattachées à
votre compte (et partagées entre toutes ses organisations).2. Interroger périodiquement l’API de la flotte pour les sessions en attente
items :
first sur la taille de page (jusqu’à 200), puis transmettez le
cursor de chaque réponse dans la requête suivante tant que has_next_page vaut true :
metadata.session_id plutôt que de
traiter chaque élément comme un nouvel élément. Lorsque has_next_page devient false, enregistrez le
curseur renvoyé comme position de départ pour l’API point de surveillance.
Surveiller les modifications
MODIFIED lorsque l’entrée de file d’attente d’une session est modifiée et
des événements DELETED lorsqu’elle est supprimée. Les sessions nouvellement placées en file d’attente arrivent également sous forme
d’événements MODIFIED. Chaque champ SSE data contient du JSON avec cette structure :
cursor de premier niveau de chaque événement après son
traitement. Si la connexion se ferme, reconnectez-vous avec le dernier curseur
persisté pour rejouer toute modification survenue pendant la déconnexion. La
livraison en mode point de surveillance se fait elle aussi au moins une fois ; les clients
doivent donc tolérer les événements en double. Les flux se terminent au bout de
cinq minutes maximum ; une boucle point de surveillance avec reconnexion est donc attendue.
Le filtre outpost s’applique à la fois aux requêtes de liste et de point de surveillance. Les filtres phase et
acceptor_id s’appliquent uniquement aux requêtes de liste et sont ignorés lorsque
watch=true ; filtrez les événements observés à l’aide des champs de l’object de chaque événement.
Omettre le curseur démarre depuis le début, utilisez donc list-then-point de surveillance pour la
réconciliation normale.
Avant de démarrer une machine pour une session, prenez-la en charge de manière atomique afin qu’aucun autre worker ne la récupère. Transmettez un acceptor_id — une identité auto-déclarée pour votre worker :
409. La prise en charge garantit qu’un worker sera prêt avant l’échéance de prise en charge attribuée par le serveur (status.claim_deadline) ; les prises en charge expirées retournent automatiquement dans la file d’attente. Si le provisionnement échoue, libérez la prise en charge afin que la session retourne immédiatement dans la file d’attente :
3. Démarrer une machine et lancer le worker
devin worker start est lancé :
repos
app
.git
infra
.git
devin worker start depuis repos/, et la session voit app/ et infra/ par rapport à son répertoire de travail.
Options utiles :
Exemples :
4. Récupération directe du binaire distant
devin worker start télécharge automatiquement le binaire devin-remote approprié. Si vous créez un orchestrateur personnalisé qui n’utilise pas Devin CLI, vous pouvez récupérer le binaire directement depuis :
Si l’entrée de file d’attente de la session contient un
spec.remote_binary_sha, utilisez ce SHA au lieu de latest — cela verrouille la session sur une version testée spécifique.
Convention de lancement
devin-remote, faites-le démarrer comme suit :
Fournissez à l’instance distante un environnement propre ne contenant que les variables ci-dessus, ainsi que les variables système de base (
PATH, HOME, USER, LOGNAME, TMPDIR, LANG, TZ, et — pour la capture d’écran du flux du bureau sur Linux/X11 — DISPLAY, WAYLAND_DISPLAY, XAUTHORITY). N’exposez à l’instance distante aucune information que l’agent ne devrait pas pouvoir voir : cet environnement est hérité par le shell de l’agent.
Autres attentes concernant le cycle de vie :
- Répertoire de travail : lancez l’instance distante depuis le répertoire contenant les dépôts de la session (même règle que pour
devin worker start). - Fin de session : lorsque la session se termine (se met en veille ou prend fin), Devin avertit l’instance distante et celle-ci quitte d’elle-même avec le code de sortie 0. Traitez une sortie propre comme la fin de la session : confirmez que
status.session_statusde l’entrée de file d’attente vautsuspendedouterminated(la mise à jour du statut peut avoir quelques secondes de retard ; relisez donc plusieurs fois), puis libérez la prise en charge. En solution de repli, interrogez aussi périodiquementstatus.session_statuspendant l’exécution de l’instance distante et tuez vous-même le processus dès qu’il atteintterminated(ou que l’entrée de file d’attente disparaît).
5. Terminer la machine lorsque le worker s’arrête
devin worker start s’arrête, la session est terminée (ou a été suspendue). Terminez la VM ou le conteneur. Si votre outpost permet la reprise, créez un snapshot de la machine avant de la terminer afin de pouvoir la restaurer si la session reprend.
Votre orchestrateur peut suivre les sessions qu’il a prises en charge ainsi que leur état :
status.session_status égal à pending, running, suspended ou terminated.
Planification sans centralisation
Vous prévoyez d’exécuter plus de ~16 coordinateurs (workers ou orchestrateurs
qui surveillent un outpost et y effectuent des prises en charge) ? Contactez d’abord l’équipe en charge de votre compte — des
flottes plus importantes amplifient la contention sur les prises en charge et la charge de lecture de la file, et nous voulons
nous assurer que l’outpost est dimensionné en conséquence.
- Les prises en charge sont le seul mécanisme de coordination. Chaque worker surveille indépendamment la file et entre en concurrence pour effectuer des prises en charge sur les sessions en attente. La prise en charge est un compare-and-swap atomique sur le serveur : un seul worker l’emporte, et tous les autres reçoivent un
409puis passent simplement à la session en attente suivante. Perdre une course à la prise en charge fait partie du fonctionnement normal, ce n’est pas une erreur. - Chaque worker a sa propre identité.
acceptor_idlimite les prises en charge, les renouvellements et la récupération après redémarrage à ce worker uniquement.devin worker starten génère et en conserve un automatiquement par machine ; une flotte n’a donc besoin d’aucune configuration d’identité. Ne partagez jamais un ID d’acceptor (ni un répertoire de données de worker copié) entre plusieurs machines — des workers en conflit se voleront mutuellement leurs prises en charge. - Les défaillances se résorbent d’elles-mêmes. Si un worker s’arrête après une prise en charge, celle-ci expire à l’échéance de prise en charge et la session retourne dans la file pour qu’un autre worker la prenne en charge. Aucun suivi de l’état de santé à l’échelle de la flotte n’est nécessaire.
- Utilisez l’endpoint point de surveillance, pas des listes complètes répétées. Effectuez une liste paginée pour construire l’état initial, puis maintenez un flux de point de surveillance à partir du curseur renvoyé. Réinterroger périodiquement l’ensemble de la file depuis chaque worker passe mal à l’échelle et ajoute de la latence aux prises en charge ; le flux de point de surveillance transmet les modifications au fur et à mesure qu’elles se produisent.
- Parlez-nous avant de dépasser ~16 machines sur un outpost. Les prises en charge sans coordination fonctionnent bien pour des flottes de petite taille, mais les flottes plus importantes amplifient la contention sur les prises en charge et la charge de lecture de la file. Si vous prévoyez d’exécuter plus d’environ 16 workers sur un seul outpost, contactez d’abord l’équipe en charge de votre compte afin que nous puissions nous assurer que l’outpost est dimensionné en conséquence.
Référence API
https://api.devin.ai/opbeta et partagent une structure de ressource commune (metadata / spec / status). Les réponses de liste renvoient items, cursor, has_next_page et total.
Devins (/outposts/devins)
Outposts (/outposts)
status.queue_depth et status.active_claims sont des signaux utiles pour l’autoscaling : si la file d’attente s’accumule, votre orchestrateur peut allouer davantage de machines déjà prêtes.`

