Skip to main content
Referência completa do escopo do Outposts: a CLI do worker, a fleet API, a distribuição do binário devin-remote e o contrato de spawn para orquestradores personalizados.

Autenticação

Workers e orquestradores se autenticam com um token de API v3 pertencente a um usuário de serviço. A função atribuída ao usuário de serviço concede ao token os escopos do Outposts:
Os escopos antigos account.outposts.machine e account.outposts.orchestrator estão obsoletos. As funções que receberam esses escopos ainda funcionam (ambos implicam o escopo de gravação), mas novas funções devem usar Leitura de Outposts / Gravação de Outposts.
Os Outposts têm escopo no nível da sua conta e são compartilhados entre todas as organizações dela. devin worker start também pode ser executado sem um token pré-provisionado usando seu login existente na CLI — consulte Iniciar sem um token.

CLI

devin worker start

Consulta a fila de um outpost, reivindica sessões, baixa o binário devin-remote correto e executa as sessões. Execute-o a partir do diretório em que você deseja que as sessões trabalhem: os repositórios de uma sessão ficam no subdiretório repos desse diretório, portanto o checkout de your-org/app fica em $(pwd)/repos/app. Os repositórios já presentes ali são reutilizados; os ausentes são clonados no início da sessão.
O ambiente do worker também pode incluir DEVIN_CHROME_PATH para apontar as sessões para um binário do Chrome/Chromium para recursos do navegador.

Iniciar sem token

Não é necessário um token do Outposts pré-provisionado. Sem --token nem DEVIN_OUTPOSTS_TOKEN, devin worker start cria um outpost usando seu login atual na CLI e reutiliza o token de worker salvo em execuções posteriores.

Validação da plataforma

O worker verifica se o SO da máquina corresponde à plataforma do outpost e falha com uma mensagem clara em caso de incompatibilidade, em vez de reivindicar e liberar repetidamente sessões enfileiradas. Máquinas Windows x64 são compatíveis: o worker baixa o binário devin-remote correto e repassa o ambiente de sistema do Windows às sessões.

devin worker outpost create

Cria um outpost — uma fila nomeada de sessões operada pela sua infraestrutura. Requer o escopo de gravação.
Exibe o ID do novo outpost (outpost_env-...). Você também pode criar outposts no app web em Configurações → Ambiente → Outposts.

devin worker outpost delete

Exclui um outpost. Requer o escopo de gravação.

Fleet API

Todos os endpoints estão em https://api.devin.ai/opbeta/outposts/ e usam um token Bearer:
Os recursos seguem uma estrutura no estilo do Kubernetes de metadata / spec / status, e a fila segue a semântica list-then-watch do Kubernetes, com entrega de pelo menos uma vez.

Objetos

Entrada da fila (devins)

Cada sessão enfileirada é representada por uma entrada da fila: spec.network_policy informa se o acesso de rede da sessão está restrito (enabled) e quais são os destinos permitidos (allow): padrões de hostname ({"hostname": ...}), endereços/CIDRs IPv4 ({"ipv4": ...}) ou endereços/CIDRs IPv6 ({"ipv6": ...}). A política vem do perfil de segurança que rege a sessão; aplicá-la em suas máquinas é responsabilidade do operador do outpost.

Outpost

Listar sessões enfileiradas

Exemplo de resposta:
Paginação e semântica de entrega:
  • Passe o cursor de cada resposta para a próxima requisição enquanto has_next_page for true.
  • A entrega segue a semântica at-least-once: uma sessão na fronteira entre páginas pode aparecer em ambas, então faça upsert das entradas por metadata.session_id em vez de tratar cada item como novo (o reivindicar CAS torna duplicatas inofensivas).
  • Quando has_next_page se tornar false, salve o cursor retornado como posição inicial de um watch.

Monitorar alterações

Transmite Server-Sent Events. Eventos MODIFIED são emitidos quando a entrada da fila de uma sessão é alterada (sessões recém-enfileiradas também são recebidas como MODIFIED); eventos DELETED são emitidos quando ela é removida. Cada campo data de SSE contém:
Semântica do watch:
  • Persista o cursor de nível superior de cada evento após processá-lo; reconecte-se com o último cursor persistido para receber novamente as alterações que ocorreram enquanto a conexão estava interrompida.
  • A entrega ocorre pelo menos uma vez — tolere eventos duplicados.
  • Os fluxos se encerram em, no máximo, cinco minutos; espera-se um loop de watch com reconexão.
  • Os filtros phase e acceptor_id são ignorados quando watch=true; filtre os eventos monitorados usando os campos do object de cada evento.
  • Omitir o cursor faz com que o processo comece do início, portanto use list seguido de watch para a reconciliação normal.

Buscar uma entrada da fila

Retorna a entrada da fila de uma sessão.

Reivindicar uma sessão

Reivindica a sessão de forma atômica para a identidade de worker fornecida. Se outro worker a reivindicou primeiro, a requisição falha com 409. Uma resposta de reivindicação bem-sucedida inclui status.connect_token e status.gateway_url — as credenciais de que o devin-remote precisa para se conectar (consulte o contrato de spawn). Ao reivindicar a sessão, o worker se compromete a ficar pronto dentro do prazo de reivindicação atribuído pelo servidor (status.claim_deadline); reivindicações expiradas retornam à fila automaticamente.

Remover uma reivindicação

Libera a reivindicação do worker para que a sessão volte imediatamente para a fila (por exemplo, em caso de falha no provisionamento).

Outposts

Corpo da requisição para criação:
criar e excluir exigem o escopo de gravação, get e listar exigem o escopo de leitura; cada resposta de outpost informa status.queue_depth e status.active_claims em tempo real.

Enviar uma mensagem do operador

Exibe um banner de Mensagem do Operador do Outpost na sessão de destino, útil para comunicar problemas de infraestrutura ou janelas de manutenção. Requer o escopo de gravação.
Comportamento:
  • Cada chamada substitui a mensagem anterior — a sessão exibe apenas a mais recente.
  • Enviar uma string vazia ({"message": ""}) limpa o banner.
  • As mensagens são exibidas como texto simples (até 2.000 caracteres; mensagens mais longas são rejeitadas com um erro de validação 422) — HTML e Markdown não são interpretados.
  • IDs de sessão desconhecidos, sessões em um outpost de outra conta e sessões concluídas retornam 404.
  • Limite de taxa de requisições: uma nova mensagem por sessão a cada 30 segundos (429 caso contrário). Limpar com uma string vazia é sempre permitido.
Resposta:

Distribuição remota de binários

O comando devin worker start baixa automaticamente o binário devin-remote correto. Orquestradores personalizados que não usam o Devin CLI podem baixá-lo diretamente de:
Identifique a versão mais recente:
Baixar e verificar:
Plataformas disponíveis: Se a entrada da fila da sessão incluir um spec.remote_binary_sha, use esse SHA em vez de latest — isso mantém a sessão fixada em uma versão específica testada.

Contrato de spawn

Se o seu orquestrador iniciar o devin-remote por conta própria em vez de usar devin worker start, inicie-o assim:
com as seguintes variáveis de ambiente: Forneça ao remoto um ambiente limpo contendo apenas as variáveis acima, além das variáveis básicas do sistema (PATH, HOME, USER, LOGNAME, TMPDIR, LANG, TZ e — para a captura de tela do stream de desktop no Linux/X11 — DISPLAY, WAYLAND_DISPLAY, XAUTHORITY). Não exponha ao remoto nada que o agente não deva conseguir ver: esse ambiente é herdado pelo shell do agente. Expectativas adicionais do ciclo de vida:
  • Diretório de trabalho: inicie o remoto a partir do diretório em que deseja que a sessão trabalhe — os repositórios ficam no subdiretório repos, isto é, $(pwd)/repos/<repo-name> (a mesma regra de devin worker start).
  • Fim da sessão: quando a sessão termina (entra em suspensão ou é encerrada), o Devin notifica o remoto e ele encerra por conta própria com status 0. Trate um encerramento limpo como o fim da sessão: confirme que status.session_status do item da fila é suspended ou terminated (a atualização de status pode demorar alguns segundos para refletir o encerramento, então consulte novamente algumas vezes) e, em seguida, libere a reivindicação. Como fallback, também consulte status.session_status enquanto o remoto estiver em execução e encerre você mesmo o processo assim que ele atingir terminated (ou o item da fila desaparecer).