秒単位ではなく時間単位で稼働するエージェントを構築

OpenRouter 上で長時間にわたる複数ステップのエージェントループを実行できます。コストとステップ数の上限、再開可能な状態、進捗のストリーミング、音声入力、人間による承認を、すべて単一の SDK で利用できます。

機能

数時間にわたるループ

多くのステップ数と長いタイムアウトでエージェントループを実行できます。エージェント 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 で状態を永続化します。人によるレビューのために一時停止したり、デプロイ後に再起動したりして、中断した箇所からそのまま続行できます。

長時間稼働するエージェントを今日リリース

APIキーを取得してクックブックをコピーし、数時間にわたって稼働する音声対応エージェントを今週中に本番環境へ導入しましょう。