最初のセッションを作る
SDK でセッションを作り、ターンの終わりを待って、モデルの答えを読む
SDK のインストールで作った werft クライアントでセッションを 1 つ作り、最初のターンが終わるところまで見る。例は開発用サーバーを --fake-model で立ち上げた場合である。GATE-SPEC {…} メッセージは fake モデルが読む台本なので、実際の Claude が動くサーバーでは普通の文を送る。
プロファイルを選ぶ
セッションは、サーバーの運用者が登録したプロファイル(profile)のどれかで動く。接続を確認するで見た一覧である。開発用サーバーには、リポジトリを使う claude-coding-local(権限リクエストに人が答える)と claude-coding-auto(分類器が判定する)、リポジトリなしで動く general がある。ここでは claude-coding-local を使う。
セッションを作る
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 を実行する。最初は数十秒かかる。
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: completedwaitForTurn は、ターンの status が終わった値になるまで 2 秒ごとに確認する。completed・failed・interrupted・cancelled・outcome_unknown が終わった状態である。failed もエラーではなく status の値なので、作業ができたかはイベントで判断する。
モデルの答えを見る
セッションで起きたことはイベントストリームで届く。ストリームはターンが終わっても閉じないので、必要なイベントを受け取ったら自分で終える。
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 Werftassistant イベントの 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)である。
次のステップ
- 権限リクエストとクローズ: 権限リクエストに答え、メッセージを続けて送り、セッションを閉じる
- ストリーミングの受信: イベントの種類と再接続