Nodaro ドキュメント
ドキュメントノードリファレンスモデルAI エージェント(MCP)開発者向けセルフホスティングリサーチ
TypeScript SDK

Copilot

client.copilot は、Copilot アシスタントのスレッドとストリーミングのターンを操作します。動作するのは Nodaro アプリの中だけで、ログイン中のユーザー自身のセッションが必要です。

Nodaro Cloud で利用できます

client.copilot は、ワークフロー用の Nodaro のアシスタントである Copilot を操作します。スレッドは、ワークフロー上で開かれる会話で、ターンは、1 つのメッセージと、それに答えるためにアシスタントが行うことすべてです。これらのメソッドは /v1/copilot/* を呼び出します。この機能については、ワークフロー Copilot を参照してください。

Copilot が動作するのは、Nodaro アプリの中だけです。すべてのルートは、ログイン中のユーザー自身のセッションを持たない呼び出し元を、403 in_app_only で拒否します。SDK はこれを ForbiddenError としてスローし、その code は forbidden になるため、message を確認してください。API トークンと OAuth トークンでは、誰の Copilot も操作できません。ブラウザーアプリからは、supabaseAuth を使って利用します。Copilot は Nodaro Cloud で動作します。この機能をオフにしているデプロイメントでは、スレッドを開いたりターンを送信したりすると 503 feature_disabled が返されます。

メソッド

メソッド内容
create(input)ワークフロー上、または新しいワークフロー上にスレッドを開きます
list(params)ワークフローの有効なスレッドを読み取ります
get(id, opts?)スレッドを、そのメッセージとともに読み取ります
archive(id)スレッドをアーカイブします
cancel(id)実行中のターンを停止します
stream(threadId, opts)メッセージを送信し、ターンのフレームを届くたびに読み取ります

これらのメソッドは、stream() を除き、API の { data } エンベロープをそのまま返します。stream() は、フレームを yield します。

client.copilot

create(input)

スレッドを開きます。既存の workflowId か、prompt を渡します。prompt を渡した場合は、サーバーがそれをもとにワークフローを作成します。すでに有効なスレッドがあるワークフローを開いた場合、2 つ目のスレッドではなく、その既存のスレッドが返されます。

create(input: { workflowId?: string; prompt?: string; name?: string }): Promise<{
  data: { thread: CopilotThread; workflow: CopilotThreadWorkflow }
}>

Prop

Type

const { data } = await client.copilot.create({ workflowId })
const threadId = data.thread.id

スレッドは、id、workflowId、runMode(実行を提案して待つ ask、または autoRunLimitCredits の範囲内で実行する auto)、modelTier、allowPublishing、userTurnCount、lastMessageAt、createdAt を持ちます。surface は、そのスレッドが属するアシスタントを示します。存在しない場合、デプロイメントがそれを示していません。

list(params)

ワークフローの有効なスレッドを読み取ります。存在しない場合は null です。

list(params: { workflowId: string }): Promise<{ data: { thread: CopilotThread | null } }>

Prop

Type

const { data: { thread } } = await client.copilot.list({ workflowId })

get(id, opts?)

スレッドを、そのメッセージとともに読み取ります。スレッドには、導出された status(running または idle)と activeTurnId も含まれます。

get(id: string, opts?: { after?: number; limit?: number }): Promise<{
  data: { thread: CopilotThread; messages: CopilotMessage[] }
}>

Prop

Type

const { data: { messages } } = await client.copilot.get(threadId, { after: lastSeq })

各メッセージは、id、seq、turnId、role、createdAt、parts(テキストの部分とツール呼び出しの部分)を持ちます。

archive(id)

スレッドをアーカイブします。メッセージは引き続き読み取れ、何も削除されません。実行中のターンがあるスレッドは、アーカイブできません。

archive(id: string): Promise<{ data: { archived: true } }>

Prop

Type

await client.copilot.archive(threadId)

cancel(id)

スレッドの実行中のターンを停止し、停止を要求したターンを返します。そのターンのストリームは、done フレームで終わります。

cancel(id: string): Promise<{ data: { cancelling: true; turnId: string } }>

Prop

Type

await client.copilot.cancel(threadId)

stream(threadId, opts)

メッセージを送信し、ターンのフレームをサーバー送信イベントとして、届くたびに yield します。完全な回答を待つのではなく、テキスト、ツールの動作、提案をリアルタイムで表示できます。ここで紹介するメソッドのうち、クレジットを消費するのはこれだけです。

stream(threadId: string, opts: {
  message: string
  baseVersion?: number
  tier?: "economy" | "standard" | "premium"
  signal?: AbortSignal
}): AsyncGenerator<CopilotStreamFrame>

Prop

Type

try {
  for await (const frame of client.copilot.stream(threadId, { message: "Tidy the graph" })) {
    if (frame.type === "token") appendText(frame.data.text)
    if (frame.type === "run_proposed") await askTheUser(frame.data)
    if (frame.type === "done") break
  }
} catch (err) {
  if ((err as Error).name !== "AbortError") throw err // a stopped turn is a normal ending
}

CopilotStreamFrame は、type で判別するユニオン型です。

フレーム内容
metadataターンの ID、モデル、runMode、autoRunLimitCredits、設定
token回答のテキストの断片
tool_callアシスタントが使うツールで、started の後に finished または failed になります
workflow_updated追加、変更、削除されたノードと、新しいバージョン
workflow_createdアシスタントが作成したワークフロー
run_proposed人による確認のための、ターンが実行しようとしている内容
memory_savedアシスタントが記憶することを選んだ内容
usage使用したトークンと creditsCharged
done終了です。completed、capped、cancelled のいずれかです。
errorターンが失敗したことを示し、code と message を伴います

フレームの data はそのまま渡されるため、この SDK がモデル化していないフィールドも受け取れます。モデル化されていない種類のフレームは、例外をスローするのではなくスキップされるため、新しいサーバーによって古いクライアントが壊れることはありません。このバージョンは、studio サーフェスのスレッドにある提案カードである action_proposed をモデル化していないため、その提案は呼び出し元に渡されません。

ターンの存続期間は、あなたが管理します。ターンは数分間実行されることがあるため、クライアントの timeoutMs は適用されません。signal を渡すか、反復処理を止めてください。どちらもリクエストを終了させます。中断すると、最初のフレームの前であれ、2 つのフレームの間であれ、NodaroError ではなく、ランタイム自身の AbortError で反復処理が拒否されます。開始リクエストのエラーステータスは、どのフレームより前に、通常の型付きエラーとして、引き続きスローされます。

よくある質問

最終更新

目次