メインコンテンツへスキップ
Outposts の関連機能全体を網羅したリファレンスです。ワーカー CLI、fleet API、devin-remote バイナリの配布、およびカスタム オーケストレーター向けの spawn 仕様を扱います。

認証

ワーカーとオーケストレーターは、サービスユーザーに属する v3 API token を使って認証します。サービスユーザーに割り当てられたロールによって、トークンに付与される Outposts のスコープが決まります。 Outposts は account にスコープされ、その配下のすべての組織で共有されます。

CLI

devin worker start

アウトポストのキューをポーリングしてセッションを取得し、適切な devin-remote バイナリをダウンロードして、セッションを処理します。セッション用にチェックアウトされたリポジトリがあるディレクトリで実行します。
ワーカーの環境には、ブラウザ機能で使用する Chrome/Chromium 実行ファイルをセッションに指定するための DEVIN_CHROME_PATH を含めることもできます。

devin worker outpost create

アウトポストを作成します。アウトポストは、インフラストラクチャ上で提供されるセッションの名前付きキューです。orchestrator スコープが必要です。
新しいアウトポストの ID (outpost_env-...) を出力します。アウトポストは、Webアプリの Settings → Environment → Outposts から作成することもできます。

devin worker outpost delete

アウトポストを削除します。orchestrator スコープが必要です。

Fleet API

すべてのエンドポイントは https://api.devin.ai/opbeta/outposts/ 配下にあり、Bearer トークンを受け付けます:
リソースは Kubernetes スタイルの metadata / spec / status という構造に従っており、キューは Kubernetes の list-then-watch セマンティクスに従い、少なくとも 1 回の配信を保証します。

オブジェクト

キューエントリ (devins)

キューに入っている各セッションは、1 つのキューエントリとして表現されます。 spec.network_policy は、セッションのネットワークアクセスが制限されているかどうか (enabled) と、許可される宛先 (allow) を示します。宛先には、hostname の glob パターン ({"hostname": ...}) 、IPv4 アドレス/CIDR ({"ipv4": ...}) 、または IPv6 アドレス/CIDR ({"ipv6": ...}) があります。

アウトポスト

キュー内のセッションを一覧表示

レスポンス例:
ページネーションと配信のセマンティクス:
  • has_next_pagetrue の間は、各レスポンスの cursor を次のリクエストに渡します。
  • 配信は少なくとも1回行われます。ページ境界にあるセッションは両方のページに現れる可能性があるため、すべての項目を新規として扱うのではなく、metadata.session_id でエントリをアップサートしてください (claim CAS により重複は問題になりません) 。
  • has_next_pagefalse になったら、返された cursor を watch の開始位置として保存します。

変更の監視

Server-Sent Events をストリーム配信します。MODIFIED イベントはセッションのキューエントリが変更されたときに発生し (新たにキューに追加されたセッションも MODIFIED として届きます) 、DELETED イベントはキューエントリが削除されたときに発生します。各 SSE の data フィールドには次が含まれます:
Watch のセマンティクス:
  • 各イベントの最上位の cursor は、処理後に永続化してください。切断中に発生した変更を再生するには、再接続時に最後に永続化した cursor を使います。
  • 配信は at-least-once です。重複するイベントを許容してください。
  • ストリームは最長 5 分で終了するため、再接続を前提とした watch ループが必要です。
  • watch=true の場合、phaseacceptor_id のフィルタは無視されます。watch 対象のイベントは、各イベントの object に含まれるフィールドを使って絞り込んでください。
  • cursor を省略すると先頭から開始されるため、通常の整合には list-then-watch を利用してください。

キューエントリを取得

1 つのセッションのキューエントリを返します。

セッションを引き取る

指定されたワーカー識別情報に対して、このセッションをアトミックに引き取ります。別のワーカーが先に引き取っていた場合、このリクエストは 409 で失敗します。引き取りに成功したレスポンスには、status.connect_tokenstatus.gateway_url が含まれます。これらは、devin-remote が接続するために必要な認証情報です (spawn contract を参照) 。 セッションを引き取ると、サーバーが割り当てた引き取り期限 (status.claim_deadline) までにワーカーの準備が整うことが前提となります。期限切れになった引き取りは、自動的にキューに戻されます。

引き取りを解除する

ワーカーによる取得を解除し、セッションを直ちにキューに戻します (たとえば、プロビジョニングに失敗した場合) 。

Outposts

作成時のリクエストボディ:
Create、GET、Delete には orchestrator スコープが必要で、各アウトポストのレスポンスには現在の status.queue_depthstatus.active_claims が含まれます。

リモートバイナリの配布

devin worker start コマンドは、適切な devin-remote バイナリを自動的にダウンロードします。Devin CLI を利用しないカスタムオーケストレーターは、以下から直接入手できます。
最新バージョンを確認する:
ダウンロードして検証する:
利用可能なプラットフォーム: セッションのキューエントリに spec.remote_binary_sha が含まれている場合は、latest の代わりにその SHA を利用します。これにより、セッションはテスト済みの特定のバージョンに固定されます。

spawn の仕様

オーケストレーターが devin worker start を使わずに devin-remote を直接起動する場合は、次のように起動してください:
以下の環境変数を設定します。 リモートには、上記の変数に加えて、基本的なシステム変数 (PATHHOMEUSERLOGNAMETMPDIRLANGTZ、および Linux/X11 でデスクトップストリームの画面キャプチャに必要な DISPLAYWAYLAND_DISPLAYXAUTHORITY) のみを含むクリーンな環境を渡してください。エージェントが見るべきでない情報をリモートに漏らさないでください。これらはエージェントのシェルに引き継がれます。 追加のライフサイクル上の想定事項:
  • 作業ディレクトリ: セッションのリポジトリを含むディレクトリからリモートを起動してください (devin worker start と同じルールです) 。
  • セッション終了: セッションが終了したとき (スリープに入るか終了したとき) 、Devin はリモートに通知し、リモートは自動的に終了ステータス 0 で終了します。正常終了はセッション終了として扱ってください。キューエントリの status.session_statussuspended または terminated であることを確認し (ステータス更新は終了の数秒後になることがあるため、数回読み直してください) 、その後 claim を解放します。フォールバックとして、リモートの実行中も status.session_status をポーリングし、terminated に達した時点 (またはキューエントリが消えた時点) でプロセスを自分で終了してください。