mcpField
B
Bankr Dev - API Workflow

Bankr Dev - API Workflow

github.com/bankrbot開発88340 回インストール31 週間前に更新
リポジトリ

Bankr Dev - API Workflow について

Bankr Dev - API Workflowは、Bankr Agent APIを使うアプリ向けに非同期ジョブの手順を解説します。開発者を対象に、送信、状態確認、結果処理に加え、会話スレッドや進捗更新、エラー処理を扱います。

主な機能

  1. 01送信・ポーリング・完了の流れ
  2. 02ジョブ状態とキャンセル用エンドポイント
  3. 03会話スレッドの継続
  4. 04進捗と構造化データの処理
  5. 05ポーリングとエラー処理の指針

活用シーン

  1. 01非同期エージェントリクエスト用クライアントの構築
  2. 02ジョブの進捗と完了結果の表示
  3. 03スレッドIDを使った会話の継続

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/bankrbot/claude-plugins --skill bankr-dev---api-workflow

インストール後、Claude Code で/bankr-dev---api-workflowを入力して読み込まれたか確認します。

詳細

API ワークフロー

Bankr Agent API で使用される非同期ジョブパターンの完全なリファレンスです。

基本パターン:送信・ポーリング・完了

1. SUBMIT  -> POST /agent/prompt   -> Get jobId + threadId
2. POLL    -> GET /agent/job/{id}  -> Check status every 2s
3. COMPLETE -> Terminal status      -> Process response + richData

エンドポイント

POST /agent/prompt
const response = await fetch(`${API_URL}/agent/prompt`, {
  method: "POST",
  headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({
    prompt: "What is my ETH balance?",
    threadId: "thr_XYZ789", // optional: continue conversation
  }),
});
// → { success: true, jobId: "job_abc123", threadId: "thr_XYZ789", status: "pending" }

リクエストフィールド:

  • prompt(文字列、必須):自然言語のプロンプト(最大10,000文字)
  • threadId(文字列、任意):既存の会話を続行します。新しいスレッドの場合は省略します。
GET /agent/job/{jobId}
const status = await fetch(`${API_URL}/agent/job/${jobId}`, {
  headers: { "x-api-key": API_KEY },
});
POST /agent/job/{jobId}/cancel
const cancel = await fetch(`${API_URL}/agent/job/${jobId}/cancel`, {
  method: "POST",
  headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
});

ジョブのステータス

ステータス説明アクション
pendingジョブはキューに登録されましたが、まだ開始されていませんポーリングを続けます
processingジョブを実行中ですポーリングを続け、statusUpdates を表示します
completed正常に完了しましたresponse と richData を読み取ります
failedエラーが発生しましたerror フィールドを確認します
cancelledキャンセルされましたこれ以上の操作は不要です

レスポンスフィールド

標準(すべての状態)
  • success、jobId、threadId、status、prompt、createdAt
完了時
  • response — 自然言語のテキスト
  • richData — 構造化データ(チャート、ソーシャルカード)の配列
  • transactions — 実行されたトランザクションの配列
  • completedAt、processingTime
処理中
  • statusUpdates — { message, timestamp } の配列
  • startedAt、cancellable
失敗時
  • error — エラーメッセージ
  • completedAt
キャンセル時
  • cancelledAt

ポーリングの実装

async function waitForCompletion(
  jobId: string,
  onProgress?: (message: string) => void
): Promise<JobStatusResponse> {
  const POLL_INTERVAL = 2000; // 2 seconds
  const MAX_POLLS = 150;      // 5 minutes max
  let lastUpdateCount = 0;

  for (let i = 0; i < MAX_POLLS; i++) {
    const status = await getJobStatus(jobId);

    // Report new status updates
    if (onProgress && status.statusUpdates) {
      for (let j = lastUpdateCount; j < status.statusUpdates.length; j++) {
        onProgress(status.statusUpdates[j].message);
      }
      lastUpdateCount = status.statusUpdates.length;
    }

    // Terminal states
    if (["completed", "failed", "cancelled"].includes(status.status)) {
      return status;
    }

    await new Promise((r) => setTimeout(r, POLL_INTERVAL));
  }

  throw new Error("Job timed out");
}
ポーリングのベストプラクティス
  • 2秒間隔 — これより短い間隔でポーリングしないでください
  • 5分のタイムアウト — その後はキャンセルを提案します
  • 表示済みの更新を追跡 — 新しい statusUpdates のみを表示します
  • ネットワークエラーに対処 — fetch に失敗した場合は、バックオフして再試行します

会話スレッド

// Start a conversation
const first = await submitPrompt("What is the price of ETH?");
const threadId = first.threadId;

// Continue the conversation (agent remembers context)
const second = await submitPrompt("And what about BTC?", threadId);

// Each response includes the same threadId

リッチデータ

完了したジョブには richData が含まれることがあります。

type RichData = {
  type?: string;          // "social-card", "chart", etc.
  [key: string]: unknown;
};

richData の内容にかかわらず、response フィールドには常にテキストの要約が含まれます。

エラー処理

ステータスエラー解決方法
400リクエストが無効です/プロンプトが長すぎます入力を確認します(最大10,000文字)
401認証が必要ですAPI キーを確認します
403Agent API が有効になっていませんbankr.bot/api で有効にします
404ジョブが見つかりませんjobId が正しいことを確認します
429レート制限を超過しましたresetAt のタイムスタンプまで待ちます
// Handle rate limits
if (response.status === 429) {
  const error = await response.json();
  const waitMs = error.resetAt - Date.now();
  console.log(`Rate limited. Resets in ${Math.ceil(waitMs / 60000)} minutes`);
}

完全な例

import { submitPrompt, waitForCompletion } from "./bankr-client";

async function main() {
  // Submit
  const { jobId } = await submitPrompt("Swap 0.1 ETH for USDC on Base");
  console.log(`Job: ${jobId}`);

  // Poll with progress
  const result = await waitForCompletion(jobId, (msg) => {
    console.log(`Progress: ${msg}`);
  });

  // Handle result
  if (result.status === "completed") {
    console.log(result.response);
    for (const tx of result.transactions || []) {
      console.log(`Transaction: ${tx.type}`);
    }
  } else if (result.status === "failed") {
    console.error(`Failed: ${result.error}`);
  }
}

関連スキル

  • bankr-api-basics - エンドポイントのドキュメントと TypeScript インターフェース
  • bankr-client-patterns - execute() ヘルパーを使った再利用可能なクライアントコード
  • bankr-sign-submit-api - 同期エンドポイント(ポーリングは不要)

コメント