機能
数時間にわたるループ
多くのステップ数と長いタイムアウトでエージェントループを実行できます。エージェント SDK がツール呼び出し、再試行、ターンごとの状態を管理します。
コストとステップ数の上限
maxCost や stepCountIs などの停止条件で実行に上限を設けます。複数のガードを組み合わせて、予算を使い切ったときにエージェントが正常に終了するようにします。
再開可能な状態
会話メッセージ、ツールの結果、共有コンテキストを永続化します。クラッシュ、デプロイ、または人によるレビューの後に、長時間の実行を再生または再開できます。
ストリーミングの進捗
トークン、ツール呼び出し、ステップイベントをリアルタイムでストリーミングし、ダッシュボードや UI で長時間実行されるジョブの進捗を表示できます。
バックオフ付き再試行
一時的な API エラーに対する自動再試行により、プロバイダーで一時的な障害が発生しても、手動で介入することなく、数時間にわたって稼働するエージェントを維持できます。
音声入力
/api/v1/audio/transcriptions を組み込むことで、電話、プッシュトゥトーク、ライブマイクから同じエージェントループを実行できます。
ヒューマンインザループ
重大な影響を伴うツール呼び出しでは承認のために一時停止し、修正を加えてから、完全なコンテキストを保持したまま同じ実行を再開できます。
自己質問とレビュー
callModel を、エージェントが [DONE] を出力するまで実行される批判的な自己レビューループでラップします。リリース前に、抜け漏れ、ハルシネーション、未検証の主張を検出します。
一つのループで何時間もの作業
エージェント SDK は長期実行をコンパクトに保ちます。同じプリミティブで上限を設定し、状態を永続化し、進捗をストリーミングできます。
TypeScript
import { OpenRouter, tool, stepCountIs, maxCost } from '@openrouter/agent';
import { z } from '@openrouter-monorepo/lib-zod';
const openrouter = new OpenRouter();
const searchTool = tool({
name: 'search',
description: 'Search the web for information',
inputSchema: z.object({ query: z.string() }),
execute: async ({ query }) => {
return { results: await fetchResults(query) };
},
});
// Run for up to 200 steps OR $5 — whichever comes first
const result = openrouter.callModel({
model: '~anthropic/claude-opus-latest',
input: 'Research the fusion energy landscape and write a 5-page report.',
tools: [searchTool],
stopWhen: [stepCountIs(200), maxCost(5)],
});
// Stream tool calls as they happen so dashboards stay live
for await (const call of result.getToolCallsStream()) {
console.log('tool', call.name, call.arguments);
}
const text = await result.getText();音声入力、音声出力
電話、プッシュツートークアプリ、またはライブマイクから同じエージェントループを動かせます。OpenRouter は専用の /api/v1/audio/transcriptions および /api/v1/audio/speech エンドポイントを提供しています。
文字起こし
音声を /api/v1/audio/transcriptions に送信し、Whisper を含む OpenRouter 上の任意の STT モデルを選択してください。
エージェントを実行
テキスト駆動の実行で使用するものと同じツール、停止条件、状態を使って、文字起こしを callModel に渡してください。
音声で応答
結果を /api/v1/audio/speech に渡して、音声による応答を返すか、呼び出し元に音声をストリーミングします。
三回の呼び出しで音声駆動エージェントを構築
TypeScript
import { OpenRouter } from '@openrouter/sdk';
import { OpenRouter as Agent, stepCountIs, maxCost } from '@openrouter/agent';
import { readFile, writeFile } from 'node:fs/promises';
const sdk = new OpenRouter();
const agent = new Agent();
// 1. Voice in -> text
const audio = await readFile('./request.wav');
const { text: prompt } = await sdk.stt.createTranscription({
model: 'openai/whisper-1',
inputAudio: { data: audio.toString('base64'), format: 'wav' },
});
// 2. Long-horizon agent loop with ceilings + tool calls
const result = agent.callModel({
model: '~anthropic/claude-opus-latest',
input: prompt,
stopWhen: [stepCountIs(50), maxCost(2)],
});
const reply = await result.getText();
// 3. Text -> voice out
const stream = await sdk.tts.createSpeech({
model: 'openai/gpt-4o-mini-tts-2025-12-15',
input: reply,
voice: 'alloy',
responseFormat: 'mp3',
});
const chunks: Uint8Array[] = [];
const reader = stream.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) break;
chunks.push(value);
}
await writeFile('./reply.mp3', Buffer.concat(chunks));仕組み
1
キャプチャ
テキストまたは音声で入力を受け付けます。必要なときに、API 呼び出しだけで Whisper 相当の STT を利用できます。
2
実行
ツールと停止条件を指定して、リクエストを callModel に渡してください。SDK がループ、再試行、ストリーミングを処理します。
3
再開
StateAccessor で状態を永続化します。人によるレビューのために一時停止したり、デプロイ後に再起動したりして、中断した箇所からそのまま続行できます。