Outposts ist im Early Access. Die hier beschriebenen APIs und CLI-Befehle können sich ändern.
Wenden Sie sich an Ihr Account-Team, um Outposts für Ihre Organisation zu aktivieren.
- Sitzungen, die innerhalb Ihres Netzwerks in der Nähe interner Services, Registries und Secrets laufen
- Benutzerdefinierte Hardwareprofile (z. B. GPUs, Maschinen mit großem Arbeitsspeicher, spezifische OS-Images)
- Bestehende Dev-Box-, VM- oder Kubernetes-Infrastruktur zum Hosten von Devin-Workloads
- Enterprise-Steuerung für Netzwerkzugriff, Build-Ergebnisse und Monitoring
Wie es funktioniert
-
Der Worker (z. B.
devin worker start) — eine Binärdatei, die Sie auf einer Maschine ausführen, um eine einzelne in der Warteschlange befindliche Sitzung zu bedienen. Sie baut eine ausgehende Verbindung zu Devins Cloud auf und führt die Tool-Aufrufe der Sitzung lokal aus. Cognition stellt diese Binärdatei bereit; Sie müssen sie nie selbst entwickeln. Die Devin CLI enthält die Logik zum Abrufen und Ausführen dieser Binärdatei. - Der Orchestrator — Software, die die Fleet-API auf Sitzungen überwacht, die auf Worker warten, für jede davon eine VM oder einen Container bereitstellt und darin den Worker startet. Wir stellen einige Referenzimplementierungen für gängige Plattformen (wie Kubernetes) bereit, aber Sie können diese gerne anpassen (sie sind Open Source!) oder Ihre eigene schreiben.
Voraussetzungen
- Eine Organisation, für die Outposts aktiviert ist
- Ein v3-API-Token mit den entsprechenden Outposts-Scopes:
account.outposts.orchestratorfür Orchestratoren, die Outposts verwalten (schließt den Maschinen-Scope ein)account.outposts.machinefür Worker, die die Warteschlange lesen und Sitzungen beanspruchen/freigeben
- Ein Maschinenabbild (VM oder Container) mit:
- installiertem Devin CLI
- den unten aufgeführten Maschinenabhängigkeiten
- Ihren geklonten Repositorys mit konfigurierten Remotes
- Zugriff auf die Build-Tools, Paket-Registries, Secrets und internen Dienste, die Ihre Sitzungen benötigen
Abhängigkeiten der Maschine
Optional — installieren Sie diese, um bestimmte Funktionen freizuschalten:
Schnellstart: einen Outpost erstellen und einen Worker starten
devin worker start betrieben — kein Orchestrator erforderlich. Das ist der schnellste Weg, Outposts auf einer Entwicklungsmaschine auszuprobieren, und genau denselben Worker-Befehl führt ein Orchestrator auch im großen Maßstab aus.
1. Service-User-Token erstellen
UseOutpostsMachine → account.outposts.machine, ManageOutpostsOrchestrator → account.outposts.orchestrator). In der Devin Web-App:
- Eine Rolle mit Outposts-Zugriff erstellen. Fügen Sie unter Settings → Rollen eine Enterprise-Rolle hinzu und aktivieren Sie unter Outpost-Berechtigungen Use outpost machine (
UseOutpostsMachine). Aktivieren Sie außerdem Manage outposts (ManageOutpostsOrchestrator), wenn dieser Service-Benutzer Outposts erstellen oder löschen soll. - Den Service-Benutzer bereitstellen. Klicken Sie unter Settings → Devin API → Service users auf Provision service user, geben Sie einen Namen ein (z. B.
outposts-worker), weisen Sie die Rolle aus Schritt 1 zu und legen Sie ein Ablaufdatum fest. - Das Token kopieren. Das
cog_...-Token wird bei der Erstellung nur einmal angezeigt — kopieren Sie es jetzt; es kann später nicht mehr abgerufen werden.
2. Einen Outpost erstellen
outpost_env-...) aus — merken Sie sie sich für den nächsten Schritt. Sie können Outposts auch in der Web-App unter Settings → Outposts oder über die Outposts-API erstellen.
Nach der Erstellung erscheint der Outpost in Devin Cloud beim Starten einer Sitzung als Maschinenoption (neben Ubuntu, Windows usw.).
3. Worker starten
devin-remote-Binärdatei herunter und verarbeitet die Sitzung. Wenn die Sitzung endet, kehrt er zur Warteschlange zurück und wartet auf die nächste. Übergeben Sie stattdessen --once, um nach einer einzelnen Sitzung zu beenden, oder --session=<session_id>, um eine bestimmte Sitzung zu beanspruchen und zu verarbeiten.
Wenn weder --token noch DEVIN_OUTPOSTS_TOKEN gesetzt ist, gibt der Befehl einen Fehler aus. Wenn --outpost in einem interaktiven Terminal weggelassen wird, fordert der Worker Sie auf, einen Outpost aus Ihrem Konto auszuwählen.
4. Starten Sie eine Sitzung auf dem Outpost
Nutzen Sie Kubernetes? Der Open-Source-
devin-outpost-k8s
Operator wird über Helm installiert und führt Worker für einen Outpost auf jedem zertifizierten
Cluster (GKE, EKS, …) aus. Aus einem Klon dieses Repos heraus:
Der grundlegende Ablauf
1. Einen Outpost registrieren
rhel, gpu-h200 oder my-outpost). Erstellen Sie einen mit devin worker outpost create:
In der Fleet-API werden Outposts als
outposts-Ressourcen dargestellt, die
auf Ihr Konto beschränkt sind (und von allen zugehörigen Organisationen gemeinsam genutzt werden).2. Die Fleet-API auf wartende Sitzungen pollen
items:
first auf die Seitengröße (bis zu 200), und übergeben Sie dann den
Cursor jeder Antwort an die nächste Anfrage, solange has_next_page den Wert true hat:
metadata.session_id,
anstatt jedes Element als neu zu behandeln. Wenn has_next_page zu false wird, speichern Sie den
zurückgegebenen Cursor als Startposition für die Watch-API.
Änderungen beobachten
MODIFIED-Ereignisse, wenn sich der Warteschlangeneintrag einer Sitzung ändert, und
DELETED-Ereignisse, wenn er entfernt wird. Neu in die Warteschlange aufgenommene Sitzungen werden ebenfalls als
MODIFIED-Ereignisse übermittelt. Jedes SSE-data-Feld enthält JSON in dieser Form:
cursor auf oberster Ebene jedes Ereignisses, nachdem Sie es verarbeitet haben. Wenn die Verbindung
abbricht, verbinden Sie sich mit dem zuletzt persistierten Cursor erneut, um alle Änderungen
nachzuvollziehen, die während der Unterbrechung aufgetreten sind. Die Watch-Zustellung erfolgt ebenfalls mindestens einmal, daher müssen Clients
doppelte Ereignisse tolerieren. Streams enden nach spätestens fünf Minuten; eine
Watch-Schleife mit Wiederverbindung wird erwartet.
Der outpost-Filter gilt sowohl für Listen- als auch für Watch-Anfragen. Die Filter phase und
acceptor_id gelten nur für Listenanfragen und werden ignoriert, wenn
watch=true; filtern Sie beobachtete Ereignisse anhand der Felder im object des jeweiligen Ereignisses.
Wird der Cursor weggelassen, beginnt die Ausgabe am Anfang. Verwenden Sie daher für den
normalen Abgleich list-then-watch.
Bevor Sie eine Maschine für eine Sitzung starten, beanspruchen Sie sie atomar, damit kein anderer Worker sie übernimmt. Übergeben Sie eine acceptor_id — eine vom Worker selbst gemeldete Identität:
409. Das Beanspruchen garantiert, dass innerhalb der vom Server zugewiesenen Beanspruchungsfrist (status.claim_deadline) ein Worker bereitsteht; abgelaufene Beanspruchungen werden automatisch wieder in die Warteschlange eingereiht. Wenn die Bereitstellung fehlschlägt, geben Sie die Beanspruchung frei, damit die Sitzung sofort in die Warteschlange zurückkehrt:
3. Eine Maschine starten und den Worker ausführen
devin worker start aufgerufen wird:
repos
app
.git
infra
.git
devin worker start in repos/ ausführen, und die Sitzung sieht app/ und infra/ relativ zu ihrem Arbeitsverzeichnis.
Nützliche Flags:
Beispiele:
4. Die Remote-Binärdatei direkt herunterladen
devin worker start lädt automatisch die richtige devin-remote-Binärdatei herunter. Wenn Sie einen benutzerdefinierten Orchestrator erstellen, der nicht das Devin CLI verwendet, können Sie die Binärdatei direkt hier herunterladen:
Wenn der Queue-Eintrag der Sitzung eine
spec.remote_binary_sha enthält, verwenden Sie diese SHA anstelle von latest — damit wird die Sitzung an eine bestimmte getestete Version angepinnt.
Spawn-Kontrakt
devin-remote selbst startet, starten Sie ihn wie folgt:
Geben Sie der Remote-Komponente eine saubere Umgebung, die nur die oben genannten Variablen sowie grundlegende Systemvariablen enthält (
PATH, HOME, USER, LOGNAME, TMPDIR, LANG, TZ und — für die Bildschirmaufnahme des Desktop-Streams unter Linux/X11 — DISPLAY, WAYLAND_DISPLAY, XAUTHORITY). Geben Sie nichts an die Remote-Komponente weiter, das der Agent nicht sehen können soll: Diese Umgebung wird von der Shell des Agenten vererbt.
Zusätzliche Erwartungen an den Lifecycle:
- Arbeitsverzeichnis: Starten Sie die Remote-Komponente aus dem Verzeichnis, das die Repositorys der Sitzung enthält (dieselbe Regel wie bei
devin worker start). - Sitzungsende: Wenn die Sitzung endet (in den Ruhezustand wechselt oder beendet wird), benachrichtigt Devin die Remote-Komponente, und sie beendet sich von selbst mit Status 0. Werten Sie einen sauberen Exit als Ende der Sitzung: Vergewissern Sie sich, dass
status.session_statusdes Warteschlangeneintragssuspendedoderterminatedist (die Statusaktualisierung kann dem Beenden um einige Sekunden hinterherhinken, lesen Sie den Wert also einige Male erneut), und geben Sie dann das Beanspruchen frei. Als Fallback pollen Siestatus.session_statusauch, während die Remote-Komponente läuft, und beenden den Prozess selbst, sobald der Wertterminatederreicht ist (oder der Warteschlangeneintrag verschwindet).
5. Die Maschine beenden, wenn der Worker endet
devin worker start endet, ist die Sitzung beendet (oder wurde ausgesetzt). Beenden Sie die VM oder den Container. Wenn Ihr Outpost Sitzungen wieder aufnehmen kann, erstellen Sie vor dem Beenden einen Snapshot der Maschine, damit Sie sie wiederherstellen können, falls die Sitzung fortgesetzt wird.
Ihr Orchestrator kann die von ihm beanspruchten Sitzungen und deren Status nachverfolgen:
status.session_status einen der Werte pending, running, suspended oder terminated.
Planung ohne zentrale Koordination
Planen Sie, mehr als ca. 16 Koordinatoren (Worker oder Orchestratoren,
die einen Outpost überwachen und daraus beanspruchen) auszuführen? Wenden Sie
sich zuerst an Ihr Account-Team — größere Flotten erhöhen die
Konkurrenz um Beanspruchungen und die Leselast der Warteschlange, und wir möchten
sicherstellen, dass der Outpost dafür entsprechend bereitgestellt ist.
- Beanspruchungen sind der einzige Koordinationsmechanismus. Jeder Worker überwacht die Warteschlange unabhängig und versucht im Wettlauf, ausstehende Sitzungen zu beanspruchen. Die Beanspruchung ist ein atomisches Compare-and-Swap auf dem Server: Genau ein Worker gewinnt, und jeder Verlierer erhält einen
409und macht einfach mit der nächsten ausstehenden Sitzung weiter. Einen Wettlauf um eine Beanspruchung zu verlieren, ist normal und kein Fehler. - Jeder Worker hat eine eigene Identität. Die
acceptor_idbegrenzt die Beanspruchungen, Verlängerungen und die Wiederherstellung nach einem Neustart eines Workers ausschließlich auf diesen Worker.devin worker starterzeugt und speichert automatisch eine pro Maschine, sodass eine Flotte keine Identitätskonfiguration benötigt. Teilen Sie niemals eine Acceptor-ID (oder ein kopiertes Worker-Datenverzeichnis) zwischen Maschinen — kollidierende Worker nehmen sich gegenseitig die Beanspruchungen weg. - Fehler heilen sich selbst. Wenn ein Worker nach dem Beanspruchen ausfällt, läuft seine Beanspruchung bis zur Beanspruchungsfrist ab, und die Sitzung kehrt in die Warteschlange zurück, damit ein anderer Worker sie übernehmen kann. Eine flottenweite Zustandsüberwachung ist nicht erforderlich.
- Verwenden Sie den Watch-Endpunkt, nicht wiederholt vollständige Listen. Führen Sie einmal eine paginierte Liste aus, um den Anfangszustand aufzubauen, und halten Sie dann einen Watch-Stream ab dem zurückgegebenen Cursor offen. Die gesamte Warteschlange von jedem Worker immer wieder neu zu pollen skaliert schlecht und erhöht die Beanspruchungslatenz; der Watch-Stream liefert Änderungen, sobald sie auftreten.
- Sprechen Sie mit uns, bevor Sie über ~16 Maschinen pro Outpost hinausgehen. Beanspruchen ohne Koordination funktioniert bei kleinen Flottengrößen gut, aber größere Flotten erhöhen die Konkurrenz um Beanspruchungen und die Leselast der Warteschlange. Wenn Sie planen, mehr als etwa 16 Worker für einen einzelnen Outpost auszuführen, wenden Sie sich zuerst an Ihr Account-Team, damit wir sicherstellen können, dass der Outpost dafür entsprechend bereitgestellt ist.
API-Referenz
https://api.devin.ai/opbeta verfügbar und verwenden eine gemeinsame Ressourcenstruktur (metadata / spec / status). Listenantworten geben items, cursor, has_next_page und total zurück.
Devins (/outposts/devins)
Outposts (/outposts)
status.queue_depth und status.active_claims sind nützliche Signale für die Autoskalierung: Wenn sich die Warteschlange staut, kann Ihr Orchestrator mehr warme Maschinen bereitstellen.

