Vai al contenuto principale
Riferimento completo per tutti i componenti di Outposts: la CLI del worker, l’API della flotta, la distribuzione del binario devin-remote e il contratto di spawn per orchestrator personalizzati.

Autenticazione

I worker e gli orchestratori si autenticano con un token API v3 associato a un utente di servizio. Il ruolo assegnato all’utente di servizio conferisce al token i relativi ambiti di Outposts: Outposts è associato al tuo account ed è condiviso tra tutte le relative organizzazioni.

CLI

devin worker start

Esegue il polling della coda di un outpost, rivendica le sessioni, scarica il binario devin-remote corretto e gestisce le sessioni. Eseguilo dalla directory che contiene i repository della sessione su cui è stato eseguito il checkout.
L’environment del worker può includere anche DEVIN_CHROME_PATH per indirizzare le sessioni a un file binario Chrome/Chromium per le funzionalità del Browser.

devin worker outpost create

Crea un outpost, ovvero una coda di sessioni con nome gestita dalla tua infrastruttura. Richiede l’ambito dell’orchestrator.
Stampa l’ID del nuovo outpost (outpost_env-...). Puoi anche creare outpost nell’app web in Settings → Environment → Outposts.

devin worker outpost delete

Elimina un outpost. Richiede l’ambito orchestrator.

API della flotta

Tutti gli endpoint si trovano in https://api.devin.ai/opbeta/outposts/ e richiedono un token Bearer:
Le risorse seguono una struttura in stile Kubernetes con metadata / spec / status, e la coda segue la semantica Kubernetes list-then-watch, con consegna almeno una volta.

Oggetti

Elemento della coda (devins)

Ogni sessione in coda è rappresentata da un elemento della coda: spec.network_policy indica se l’accesso di rete della sessione è limitato (enabled) e le destinazioni consentite (allow): pattern glob di hostname ({"hostname": ...}), indirizzi/CIDR IPv4 ({"ipv4": ...}) o indirizzi/CIDR IPv6 ({"ipv6": ...}).

Outpost

Elencare le sessioni in attesa

Risposta di esempio:
Semantica di paginazione e consegna:
  • Passa il cursor di ogni risposta alla richiesta successiva finché has_next_page è true.
  • La consegna segue una semantica at-least-once: una sessione al confine tra due pagine può comparire in entrambe, quindi aggiorna o inserisci le voci in base a metadata.session_id invece di considerare ogni elemento come nuovo (il CAS usato per la rivendicazione rende innocui i duplicati).
  • Quando has_next_page diventa false, salva il cursor restituito come posizione iniziale per un watch.

Monitora le modifiche

Trasmette eventi Server-Sent Events. Gli eventi MODIFIED vengono inviati quando cambia l’elemento in coda di una sessione (anche le sessioni appena messe in coda arrivano come MODIFIED); gli eventi DELETED vengono inviati quando viene rimosso. Ogni campo SSE data contiene:
Semantica di watch:
  • Salva il cursor di primo livello di ogni evento dopo averlo elaborato; riconnettiti con l’ultimo cursor salvato per recuperare le modifiche avvenute durante la disconnessione.
  • La consegna segue una semantica at-least-once — prevedi eventi duplicati.
  • I flussi terminano dopo al massimo cinque minuti; è previsto un ciclo di watch con riconnessione.
  • I filtri phase e acceptor_id vengono ignorati quando watch=true; filtra gli eventi monitorati usando i campi nell’object di ogni evento.
  • Se ometti il cursor, si parte dall’inizio, quindi usa list-then-watch per una riconciliazione standard.

Recupera un elemento della coda

Restituisce l’elemento della coda per una sessione.

Rivendica una sessione

Rivendica la sessione in modo atomico per l’identità del worker specificata. Se un altro worker l’ha rivendicata per primo, la richiesta restituisce 409. In caso di esito positivo, la risposta include status.connect_token e status.gateway_url — le credenziali necessarie a devin-remote per connettersi (vedi lo contratto di spawn). La rivendicazione implica che un worker sarà pronto entro il termine di rivendicazione assegnato dal server (status.claim_deadline); le rivendicazioni scadute tornano automaticamente nella coda.

Annullare una rivendicazione

Rilascia la rivendicazione del worker, così la sessione torna immediatamente in coda (ad es. quando il provisioning non va a buon fine).

Outposts

Corpo della richiesta di creazione:
La creazione, il recupero e l’eliminazione richiedono l’ambito orchestrator; ogni risposta dell’outpost riporta in tempo reale status.queue_depth e status.active_claims.

Distribuzione del binario remoto

Il comando devin worker start scarica automaticamente il binario devin-remote corretto. Gli orchestratori personalizzati che non usano la Devin CLI possono scaricarlo direttamente da:
Individua la versione più recente:
Scarica e verifica:
Piattaforme disponibili: Se la voce della coda della sessione include un spec.remote_binary_sha, usa quell’SHA invece di latest — in questo modo blocchi la sessione su una specifica versione testata.

Contratto di spawn

Se il tuo orchestrator avvia devin-remote direttamente anziché usare devin worker start, avvialo come segue:
con le seguenti variabili d’ambiente: Fornisci al processo remoto un ambiente pulito che contenga solo le variabili sopra, oltre alle variabili di sistema di base (PATH, HOME, USER, LOGNAME, TMPDIR, LANG, TZ e — per l’acquisizione dello schermo del flusso desktop su Linux/X11 — DISPLAY, WAYLAND_DISPLAY, XAUTHORITY). Non esporre al processo remoto nulla che l’agente non dovrebbe poter vedere: viene ereditato dalla shell dell’agente. Aspettative aggiuntive del lifecycle:
  • Directory di lavoro: avvia il processo remoto dalla directory che contiene le repo della sessione (la stessa regola di devin worker start).
  • Fine della sessione: quando la sessione termina (va in sleep o viene chiusa), Devin notifica il processo remoto e questo termina autonomamente con status 0. Considera un’uscita pulita come la fine della sessione: verifica che status.session_status dell’elemento della coda sia suspended o terminated (l’aggiornamento dello status può arrivare con alcuni secondi di ritardo rispetto all’uscita, quindi rileggilo alcune volte), quindi rilascia la rivendicazione. Come fallback, esegui anche il poll di status.session_status mentre il processo remoto è in esecuzione e termina tu stesso il processo quando raggiunge terminated (o se l’elemento della coda scompare).