機能メッセージ
送信
セッションにメッセージを送って次のターンを作り、そのターンの結果を読む
メッセージ 1 つがターン 1 つである。同じセッションのメッセージは、同じ worker、同じ作業ツリー、同じ Claude Code の会話で順に実行される。scope は sessions:write である。SDK の例は SDK のインストールで作った werft クライアントを、HTTP API の例はサーバーのアドレス API とキー KEY のシェル変数を使う。例の GATE-SPEC {…} メッセージは、開発用サーバーの fake モデルが読むスクリプトである(開始)。
セッションを 1 つ用意する
const created = await werft.sessions.create({
profile_id: "claude-coding-local",
repository_id: "sample-app",
message: 'GATE-SPEC {"id":"m1","steps":[],"final":"ready"}',
});
const sessionId = created.session_id;送信する
const sent = await werft.sessions.messages.send(sessionId, {
message:
'GATE-SPEC {"id":"m2","steps":[{"tool":"Bash","input":{"command":"ls","description":"list files"}}],"final":"listed"}',
});
console.log(sent);{
turn_id: '2',
receipt_id: '…',
receipt_status: 'accepted'
}レスポンスは 202 である。前のターンがまだ実行中なら、新しいターンは queued で待機し、順番が来たら実行される。
messageは UTF-8 で 32,768 バイトまでである。超えると 413 になる。- 1 つのセッションに溜められる待機中の入力は、デフォルトで 20 個である。超えると 429 になる。
Idempotency-Keyが必要である。レスポンスを受け取れなかったときは、同じキーと同じ本文でもう一度送る。ターンは 1 回だけ作られる。SDK はキーを作って付け、再試行にも同じキーを使う。
結果を読む
import { waitForTurn } from "@werft-ai/sdk";
const turn = await waitForTurn(werft, sessionId, sent.turn_id, {
signal: AbortSignal.timeout(5 * 60_000),
});
console.log(`turn ${turn.turn_id}: ${turn.status}`);turn 2: completedターンが終わったかどうかは、この status だけで判断する。5 つの値のどれかであれば終了している。completed は、エンジンがターンを正常に終えたという意味であり、依頼した作業をすべて終えたという意味ではない。モデルがツールを 1 つ呼んだだけで応答を終えても、ツールがエラーを受け取っても completed である。作業ができたかどうかは、ストリーミングの assistant・tool_result イベントを読んで判断し、不十分なら同じセッションに次のメッセージを送る。
送信できないとき
SDK では、下のレスポンスが APIError として届き、isApiError(error, "SESSION_PAUSED") のように判別する。409 は SDK が再送しない。
| レスポンス | 意味 |
|---|---|
409 SESSION_PAUSED | セッションが paused である。先に resume する(承認待ちと再開) |
409 RECOVERY_REQUIRED | 先に復旧判断が必要である(クローズ) |
409 SESSION_CLOSING, SESSION_CLOSED | 閉じている途中、または閉じている |
409 CHECKPOINT_UNAVAILABLE | checkpoint の問題で新しいターンを受け付けない。原因はレスポンスの message にある。会話履歴が上限を超えた場合は、新しいセッションを開く |
409 PROFILE_BLOCKED | オーナーがこのセッションの運用担当者のプロファイルをブロックした。ワークスペースプロファイルなら、そのベースがブロックされている(details.reason_code が base_blocked)。何もキューに入らない。ブロックが解除されれば、同じセッションにまた送れる |
| 413 | メッセージが長すぎる |
| 429 | 待機中の入力が上限に達した |
次のステップ
- ストリーミングの受信: ターンの実行中に進行状況を見る
- 添付