시작

클라이언트 설정과 오류

Werft 클라이언트의 옵션, 오류 종류, 재시도와 timeout

SDK 설치에서 만든 클라이언트의 나머지 설정과, 호출이 실패했을 때 SDK가 하는 일을 다룬다. 기능별 메서드는 세션, 메시지, 승인과 push 문서에 있다.

클라이언트 옵션

import { Werft } from "@werft-ai/sdk";

const werft = new Werft({
  baseUrl: "https://werft.example.com",
  apiKey: process.env.WERFT_API_KEY,
  maxRetries: 2,
  timeoutMs: 60_000,
});
옵션기본값설명
baseUrlWERFT_BASE_URL 환경 변수서버 주소. 기본 서버는 없어서 옵션이나 환경 변수 중 하나는 꼭 있어야 한다
apiKeyWERFT_API_KEY 환경 변수Authorization: Bearer 헤더로만 보낸다. 오류 메시지나 console.log에는 나오지 않는다
maxRetries2한 호출의 재시도 횟수
maxRetryDelayMs60000Retry-After가 이보다 길면 기다리지 않고 실패한다
timeoutMs60000한 번의 시도가 기다리는 시간
fetch전역 fetch요청을 보내는 함수. 프록시나 테스트용으로 바꾼다
dangerouslyAllowBrowserfalse브라우저(window가 있는 곳)에서 만들기를 허락한다. 페이지에 key를 두면 새므로 쓰지 않는다
allowInsecureHttpfalseloopback이 아닌 주소로 http://를 허락한다

승인용 key 따로 쓰기

workspace의 key(개인·에이전트)는 자기가 시작한 세션의 요청을 승인하지 못한다. 승인에는 다른 key나 사람이 필요하다. withOptions는 설정을 이어받은 두 번째 클라이언트를 만든다.

const approver = werft.withOptions({
  apiKey: process.env.WERFT_APPROVER_API_KEY,
});

에이전트 key는 profile_id와 repository_id 대신 자기 에이전트의 agent_release_id로 세션을 만든다. 에이전트 key에는 sessions:read, sessions:write, sessions:control, 승인자 key에는 sessions:read, sessions:approve가 필요하고, 세션의 공유 범위에 승인자가 들어 있어야 한다. 설정과 실제 출력은 샘플 README에 있다.

오류

서버 오류는 APIError이고 isApiError(error, code)로 가른다.

errors.ts
import { isApiError } from "@werft-ai/sdk";
import { werft } from "./werft.ts";

const sessionId = process.argv[2] ?? "";
const { revision } = await werft.sessions.get(sessionId);
try {
  await werft.sessions.pause(sessionId, { expected_revision: revision + 1 });
} catch (error) {
  if (isApiError(error, "REVISION_CONFLICT"))
    console.log(`${error.status} ${error.code}`);
  else throw error;
}
409 REVISION_CONFLICT
오류언제
APIError서버가 오류로 답했다. status, code, retryable, requestId, details가 있다
ConnectionError응답을 읽지 못했다. 명령이 실행됐는지 모른다
TimeoutError한 번의 시도가 timeoutMs를 넘었다
AbortedError넘긴 signal이 abort했다
TurnBlockedErrorwaitForTurn에서, 세션이 paused·stopped·recovery_required·closed라 turn이 스스로 끝나지 않는다

오류 코드 목록은 HTTP API 레퍼런스의 각 operation에 있다.

재시도와 Idempotency-Key

  • 다시 보내는 경우: 오류 본문이 retryable: true일 때(429 포함), 프록시가 낸 502·504, 응답을 읽지 못한 연결 실패와 시도 timeout. 프록시 502·504(API 오류 본문이 없는 것)와 연결 실패·timeout은 GET과 Idempotency-Key가 있는 명령만 다시 보낸다. key가 없는 openPullRequest·commentPullRequest는 서버가 이미 실행했을 수 있어 이 경우에는 다시 보내지 않는다. 오류 본문에 retryable: true가 있으면 명령 종류와 관계없이 다시 보낸다.
  • 다시 보내지 않는 경우: 409 전부, 500, retryable: true가 아닌 그 밖의 4xx.
  • Retry-After가 있으면 그만큼 기다린다. maxRetryDelayMs를 넘으면 기다리지 않고 실패한다.
  • sessions.create와 messages.send처럼 Idempotency-Key가 필요한 명령은 SDK가 호출마다 key를 하나 만들고, 그 호출의 재시도에 같은 key를 보낸다. 프로세스를 다시 띄운 뒤 같은 명령을 이어서 재시도하려면 오류의 idempotencyKey를 저장해 두고 { idempotencyKey }로 넘긴다.
  • expected_revision은 호출하는 쪽이 넘긴다. SDK는 대신 읽어 채우지 않는다.

SDK가 감싸는 API

메서드하는 일문서
sessions.create · get · list · usage · share세션 만들기·읽기·목록·사용량·공유시작
sessions.messages.send메시지 보내기보내기
sessions.turns.get · listturn 읽기보내기
sessions.events.stream이벤트 스트림스트리밍 받기
sessions.requests.list · answer권한 요청과 질문승인 대기와 재개
sessions.interrupt · pause · resume · terminate · close · changeProfile제어상태와 수명, 닫기
sessions.recoveryDecisions.create복구 결정상태와 수명
sessions.pushRequests.create · list · get · approve · reject · openPullRequest · commentPullRequestpush 승인과 PR요청
receipts.get, auth.me, limits.get, profiles.list, root.getreceipt, 내 정보, 한도, 프로필, 상태receipt

sessions.list와 turns.list는 await하면 첫 페이지, for await하면 모든 항목을 준다. 필드 이름은 HTTP API와 같은 snake_case다. 에이전트·멤버·key 관리처럼 웹 로그인으로만 부르는 API는 감싸지 않는다. limits.get은 로그인한 workspace owner만 읽으므로 API key로 부르면 403이다.

저장소의 예제

examples에는 유즈케이스별 샘플이 있다. key와 카탈로그 확인, 세션 목록, 이벤트 스트림 이어 받기, 재시도와 Idempotency-Key, 질문·권한 요청 답변, 세션 제어와 복구, 막힌 close, push 승인과 PR을 다루고, 어떤 SDK API를 어느 샘플이 쓰는지 표로 정리했다. 저장소 checkout의 루트에서 bun install 뒤에 돌린다.

승인 샘플의 인증 모드

이 절은 일반 SDK 클라이언트 전체가 아니라 세션 종료 승인 샘플의 인증 모드와 실행 입력이다. 샘플은 서버 주소와 사용자별 key를 받는다. 정해진 기본 서버는 없으므로 baseUrl 또는 WERFT_BASE_URL을 반드시 지정한다.

환경 변수동작
WERFT_PROFILE_ID사용자 key 모드에서 세션을 만들 profile ID. 생략하면 샘플은 claude-coding-local을 사용한다. agent release 모드에서는 사용하지 않는다.
WERFT_REPOSITORY_ID사용자 key 모드에서 세션을 만들 repository ID. 생략하면 샘플은 sample-app을 사용한다. agent release 모드에서는 사용하지 않는다.
WERFT_AGENT_RELEASE_ID에이전트 key로 실행할 배포 ID. 설정하면 세션 생성에 agent_release_id를 보내며 profile·repository 설정은 사용하지 않는다. 생략하면 기존 사용자 key 예제의 profile·repository 경로를 사용한다.
WERFT_APPROVER_API_KEY세션을 읽고 승인할 별도 사용자 key. sessions:read와 sessions:approve 및 세션 접근 권한이 필요하다. 생략하면 기본 SDK 클라이언트로 답한다. 세션을 시작한 key는 그 세션을 승인하지 못하므로 에이전트 경로에서는 별도 승인자(다른 key나 사람)가 필요하다.

샘플은 FAKE 모델 전용이다. API key를 소스나 로그에 넣지 않고 실행 환경으로 전달한다.

사용자 key와 에이전트 key를 공유하지 않는다. 에이전트 key는 고정된 agent release로 실행하고, 승인은 자기가 시작한 세션과 다른 key나 사람이 수행한다. 실행 권한 회수와 key 폐기는 첫 owner와 key를 따른다.

다음 단계

이 페이지