Bankr Dev - API Workflow について
Bankr Dev - API Workflowは、Bankr Agent APIを使うアプリ向けに非同期ジョブの手順を解説します。開発者を対象に、送信、状態確認、結果処理に加え、会話スレッドや進捗更新、エラー処理を扱います。
主な機能
- 01送信・ポーリング・完了の流れ
- 02ジョブ状態とキャンセル用エンドポイント
- 03会話スレッドの継続
- 04進捗と構造化データの処理
- 05ポーリングとエラー処理の指針
活用シーン
- 01非同期エージェントリクエスト用クライアントの構築
- 02ジョブの進捗と完了結果の表示
- 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 キーを確認します |
| 403 | Agent 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- 同期エンドポイント(ポーリングは不要)
コメント
Markdown 対応