クライアント
createClient で Nodaro SDK のクライアントを作成し、ベース URL、認証、タイムアウト、ワークスペースを設定して、クライアントが公開するすべてのリソースを確認します。
クライアントは、createClient() が返すオブジェクトです。NodaroClient は、あなたのベース URL、認証プロバイダー、設定を保持し、client.workflows や client.nodes のように、Nodaro API のあらゆる部分をリソースとして公開します。クライアントは 1 回作成し、すべての呼び出しで再利用します。
クライアントを作成する
import { createClient, StaticTokenAuth } from "@nodaro/sdk"
const client = createClient({
baseUrl: "https://app.nodaro.ai",
auth: new StaticTokenAuth(process.env.NODARO_TOKEN!),
timeoutMs: 120_000,
})createClient(options: ClientOptions): NodaroClientProp
Type
NodaroClient はクラスとしてもエクスポートされているため、クライアントを受け取る関数の型を書けます。
import type { NodaroClient } from "@nodaro/sdk"
async function countWorkflows(client: NodaroClient, projectId: string) {
const { data } = await client.workflows.list({ projectId })
return data.length
}クライアントのリソース
各リソースは createClient によって作成され、client.<resource> としてアクセスします。
| リソース | 内容 | リファレンス |
|---|---|---|
client.workflows | ワークフロー:作成、更新、共有、エクスポート、インポート、実行 | ワークフローとプロジェクト |
client.projects | ワークフローを入れるプロジェクト | ワークフローとプロジェクト |
client.executions | ワークフロー全体の実行 | ジョブと実行 |
client.jobs | 単体の生成ジョブ | ジョブと実行 |
client.videoPro | 動画生成 Pro(Generate Video Pro)の実行を停止または継続 | ジョブと実行 |
client.nodes | ノードカタログと単体のノード実行 | ノードを実行する |
client.apps | 公開されたアプリとその実行 | アプリとテンプレート |
client.templates | テンプレートマーケットプレイス | アプリとテンプレート |
client.tutorials | チュートリアル動画とチュートリアルワークフロー | アプリとテンプレート |
client.llm | 言語モデルからの構造化出力 | LLM と Reduce |
client.reduce | 複数の結果から最良のものを選ぶか、組み合わせる | LLM と Reduce |
client.uploads | ファイルのアップロード | メディアとアップロード |
client.library | 保存済みのメディア | メディアとアップロード |
client.media | メディアのダウンロード、トリミング、キャプション、オーバーレイ、コラージュ | メディアとアップロード |
client.voices | ボイス、ボイスチェンジャー、ボイスデザイン、吹き替え | ボイスと音声 |
client.audio | 音声の分離、抽出、ミックス、トリミング、文字起こし | ボイスと音声 |
client.edit | 無音検出、オーディオ同期、編集プラン、EDL レンダリング | 編集 |
client.scene3d | 編集可能な 3D シーンと 3D レンダリング Pro(3D Render Pro) | 3D シーン |
client.characters | キャラクター | キャラクター |
client.locations | ロケーション | ロケーション |
client.objects | オブジェクトと小道具 | オブジェクトとクリーチャー |
client.creatures | 動物とクリーチャー | オブジェクトとクリーチャー |
client.community | 共有されたコミュニティのアセットライブラリ | コミュニティライブラリ |
client.studio | スタジオプロダクション | スタジオプロダクション |
client.shots | 共有リンクの背後にある共有ショットレコード | スタジオプロダクション |
client.recast | Recast の実行と、自分で書いたスクリプト | Recast |
client.pipelines | ストーリーから動画へのパイプライン | パイプライン |
client.copilot | Nodaro アプリ内限定の Copilot スレッド | Copilot |
client.models | モデルカタログ | モデルとクレジット |
client.credits | 残高とモデルの価格 | モデルとクレジット |
client.pickerCatalogs | 各ピッカーの有効なオプション | ピッカー、プリセット、プロンプト |
client.catalogs | すべてのピッカーカタログを 1 回の呼び出しで | ピッカー、プリセット、プロンプト |
client.presets | 保存済みのノードプリセットと標準プリセット | ピッカー、プリセット、プロンプト |
client.promptHelper | プロンプトウィザード | ピッカー、プリセット、プロンプト |
client.organizations | 組織、メンバー、招待 | 組織とワークスペース |
client.workspaces | ワークスペース、メンバー、参加コード | 組織とワークスペース |
client.developerApps | あなたが所有する OAuth アプリ | OAuth と開発者アプリ |
client.oauth | コード交換、トークンの取り消し、同意画面用のデータ | OAuth と開発者アプリ |
クライアント自体には、さらに 3 つのメソッドがあります。me()、withWorkspace()、request() です。
メソッドが返すもの
- エンベロープはそのまま保たれます。エンドポイントが
{ "data": ... }で応答する場合、メソッドはそのエンベロープをそのまま返すため、const { data } = await client.workflows.get(id)のように書きます。ページ分割された一覧では、dataの横にnextCursorのようなカーソルが加わります。 - 一部のリソースは、内容をそのまま返します。いくつかのメソッドは、レスポンスを展開して返します。たとえば
client.characters.list()は{ characters, nextCursor }を返し、client.credits.balance()は残高そのものを返します。正確な戻り値の型は、各リファレンスページに示されています。 - 削除とキャンセルは、通常
{ success: true }を返します。 - フィールド名は、通信時の形式に従います。
Jobは、API がその形で送るため、output_dataやcreated_atのような snake_case のフィールドを使います。WorkflowとWorkflowExecutionは camelCase を使います。
すべてのレスポンスと入力の型はエクスポートされているため、import type でインポートできます。型を参照してください。
me()
me(): Promise<UserIdentity & MeOrganizations>現在のトークンの持ち主の情報を返します(GET /v1/me)。有効なトークンであれば、API トークン、OAuth アクセストークン、ブラウザーセッションのいずれであっても、その所有者を返します。トークンがない場合や無効な場合は、UnauthorizedError をスローします。
const me = await client.me()
console.log(me.email, me.tier)| フィールド | 型 | 説明 |
|---|---|---|
id | string | Nodaro のユーザー ID です。 |
email | string | ユーザーのメールアドレスです。 |
displayName | string | null | 表示名です。設定されていない場合は null です。 |
avatarUrl | string | null | アバターの URL です。設定されていない場合は null です。 |
tier | string | 保存されているサブスクリプションのティアで、"free" や "pro" などです。実際に適用されるティア(従量課金を含む)については、client.credits.balance() の effectiveTier を読み取ってください。 |
isAdmin | boolean | ユーザーが管理者かどうかです。表示内容を決めるためだけに使ってください。権限のチェックは、サーバー自身がすべて行います。 |
組織機能のある Nodaro Cloud インスタンスでは、結果に organizations、workspaces、lastWorkspaceId、organizationsUnavailable も含まれます。この 3 つの状態は、それぞれ異なる扱いが必要です。
| 見えるもの | 意味 | 対応 |
|---|---|---|
| フィールドがない | インスタンスに組織機能がありません | ワークスペース切り替えを表示しないでください。 |
| フィールドはあるが空 | アカウントがどの組織にも属していません | 組織の作成または参加を提案してください。 |
organizationsUnavailable: true | 参照に失敗しました | それまでの選択をそのまま保ってください。アクセスを失ったとユーザーに伝えないでください。 |
withWorkspace(workspaceId)
withWorkspace(workspaceId: string | null): NodaroClientworkspaceId で動作する新しいクライアントを返します。新しいクライアントは、元のクライアントの認証、ベース URL、タイムアウト、fetch を共有します。個人スペースを使うには null を渡します。
const classroom = client.withWorkspace(workspaceId)
await classroom.workflows.run(workflowId) // runs in the workspace
await client.workflows.run(workflowId) // runs in the personal spaceこのメソッドは、現在のクライアントを変更するのではなく、新しいクライアントを返します。そのため、1 つのクライアントで同時に実行される 2 つの操作が、ワークスペースを取り違えることはありません。
ワークスペースが決めるのはスコープであって、アクセス権ではありません。一覧がどのワークスペースから読み取るか、新しいアイテムがどこに作られるかを決めます。ID で指定したアイテムの読み取り、変更、削除、実行は、そのアイテム自身のワークスペースによって決まります。ワークスペースの指定を忘れても自分の作業が見えなくなることはなく、間違ったワークスペースを指定しても、ほかの人の作業にアクセスすることはできません。
ワークスペースは、Nodaro Cloud の組織に属します。組織とワークスペースとワークスペースを参照してください。
request(method, path, options)
request<T>(method: string, path: string, options?: {
body?: unknown
query?: Record<string, string | number | boolean | undefined>
headers?: Record<string, string>
signal?: AbortSignal
}): Promise<T>任意のエンドポイントにリクエストを送ります。まだリソースメソッドがない、ごく一部のエンドポイント向けです。あなたの認証ヘッダーとワークスペースを追加し、body を JSON として送信し、timeoutMs を適用して、リソースメソッドと同じ型付きエラーをスローします。
// The same request that client.jobs.list() sends
const page = await client.request<{ data: unknown[]; next: string | null }>("GET", "/v1/jobs", {
query: { type: "llm-structured", limit: 20 },
})FormData のボディは、マルチパートアップロードとして送信されます。undefined のクエリ値は除外されます。すべてのエンドポイントとそのフィールドは、REST API リファレンスに一覧があります。
タイムアウトと独自の fetch
timeoutMs は、上限(デフォルトは 60 秒)を超えたリクエストを中断します。ほとんどの生成は、妥当な HTTP タイムアウトよりも長くかかるため、生成を開始してジョブをポーリングしてください。client.nodes.runAndWait() は、その両方を代わりに行います。ストリーミングを行うメソッドである client.copilot.stream() と client.media.downloadVideoProgress() は、数分間開いたままになることを想定しているため、タイムアウトを適用しません。
独自の fetch を渡すと、リクエストの送り方を変えられます。
- テスト。モックから、用意した
Responseオブジェクトを返します。 - リトライ。グローバルな
fetchを、5xx の応答でリトライするヘルパーでラップします。 - トレーシング。トレーシングやモニタリングのライブラリでラップします。
const client = createClient({
baseUrl: "https://app.nodaro.ai",
auth: new StaticTokenAuth(process.env.NODARO_TOKEN!),
fetch: (input, init) => tracedFetch(input, init),
})ランタイムとブラウザー
SDK が使うのは fetch と URL だけです。これらは、Node.js 20 以降、最新のブラウザー、React Native、Cloudflare Workers、Deno、Bun でグローバルに使えます。ポリフィルは必要ありません。
- OAuth トークンでの CORS。OAuth アクセストークンで Nodaro を呼び出すブラウザーアプリは、開発者アプリの
allowedOriginsに登録されたオリジンで動作する必要があります。OAuth と開発者アプリを参照してください。 - セッションでの CORS。
supabaseAuthを使うブラウザーアプリは、そのリストと照合されません。 - クライアントラベル。サーバーでは、SDK は
X-Nodaro-Client: sdk/<version>を送信し、Nodaro はこれを各ジョブの発信元として記録します。ブラウザーでは、ブラウザーのOriginヘッダーが既にあなたのアプリを示しているため、デフォルトのラベルは送信されません。自分で設定したclientLabelは、常に送信されます。
よくある質問
関連ページ
TypeScript SDK
認証
エラー
組織とワークスペース
型
最終更新