はじめに

最初のセッションを作る

SDK でセッションを作り、ターンの終わりを待って、モデルの答えを読む

SDK のインストールで作った werft クライアントでセッションを 1 つ作り、最初のターンが終わるところまで見る。例は開発用サーバーを --fake-model で立ち上げた場合である。GATE-SPEC {…} メッセージは fake モデルが読む台本なので、実際の Claude が動くサーバーでは普通の文を送る。

プロファイルを選ぶ

セッションは、サーバーの運用者が登録したプロファイル(profile)のどれかで動く。接続を確認するで見た一覧である。開発用サーバーには、リポジトリを使う claude-coding-local(権限リクエストに人が答える)と claude-coding-auto(分類器が判定する)、リポジトリなしで動く general がある。ここでは claude-coding-local を使う。

セッションを作る

first-session.ts
import { waitForTurn } from "@werft-ai/sdk";
import { werft } from "./werft.ts";

const created = await werft.sessions.create({
  profile_id: "claude-coding-local",
  repository_id: "sample-app",
  message: 'GATE-SPEC {"id":"hello","steps":[],"final":"hello from Werft"}',
});
console.log(created);
{
  session_id: '…',
  turn_id: '1',
  receipt_id: '…',
  receipt_status: 'accepted',
  status: 'queued'
}
  • repository_id はセッションが clone するリポジトリである。開発用サーバーの読み取り専用 Git サーバーが sample-app を配信する。
  • message は最初のターンの入力である。この台本はツールを呼ばずに hello from Werft で終わる。
  • 作成は受け付けるだけである。結果はターンが終わってから読む。
  • セッションを作るリクエストには Idempotency-Key が必要である。SDK が呼び出しごとに 1 つ作って付け、その呼び出しをリトライするときは同じキーを送る。

ターンの終わりを待つ

scheduler が worker を立ち上げ、worker がリポジトリを clone してからターン 1 を実行する。最初は数十秒かかる。

first-session.ts (続き)
const turn = await waitForTurn(werft, created.session_id, created.turn_id, {
  signal: AbortSignal.timeout(5 * 60_000),
});
console.log(`turn ${turn.turn_id}: ${turn.status}`);
turn 1: completed

waitForTurn は、ターンの status が終わった値になるまで 2 秒ごとに確認する。completed・failed・interrupted・cancelled・outcome_unknown が終わった状態である。failed もエラーではなく status の値なので、作業ができたかはイベントで判断する。

モデルの答えを見る

セッションで起きたことはイベントストリームで届く。ストリームはターンが終わっても閉じないので、必要なイベントを受け取ったら自分で終える。

first-session.ts (続き)
const stream = werft.sessions.events.stream(created.session_id);
for await (const event of stream) {
  if (event.kind === "assistant") {
    console.log((event.payload as { text?: string }).text);
  }
  if (event.kind === "result") break;
}
stream.close();
hello from Werft

assistant イベントの text がモデルの送ったテキストである。3 つの断片をつなげた first-session.ts を WERFT_API_KEY=csp_… node first-session.ts で実行すると、上の出力が順に出る。

HTTP API で行うとき

同じ流れは POST /v1/sessions(Idempotency-Key ヘッダーが必要)、GET /v1/sessions/{id}/turns/{turn_id} のポーリング、GET /v1/sessions/{id}/events(SSE)である。

次のステップ

このページ