コンテンツにスキップ

エージェント

エージェントは、質問を受け取り、使用するツールを決定し、回答を生成するプログラムです。ReActループ(Reason + Act)を実行します:

ユーザーの質問
-> LLMが考え + ツールを選択
-> ツールを実行し、結果を返す
-> LLMが再び考える(ツール結果を含めて)
-> 最終回答(または別のツールを選択)

このループは、LLMが最終回答を生成するか、maxSteps(デフォルト:10)に達するまで続きます。

import { Schift, Agent, RAG } from "@schift-io/sdk";
const schift = new Schift({ apiKey: "sch_..." });
const rag = new RAG({ bucket: "my-docs" }, schift.transport);
const agent = new Agent({
name: "My Agent",
instructions: "You are a helpful assistant. Use the knowledge base.",
rag,
tools: [myCustomTool],
model: "gpt-4o-mini",
transport: schift.transport,
maxSteps: 15,
});
const result = await agent.run("What is Schift?");
console.log(result.output);

エージェントは、LLMへの接続に3つの方法をサポートします:

Schiftの/v1/chat/completionsエンドポイントを経由してルーティングします。OpenAI、Google、Anthropic間でモデルルーティングをサポートします。

const agent = new Agent({
name: "Cloud Agent",
instructions: "...",
model: "gpt-4o-mini", // または "claude-sonnet-4-6"、"gemini-2.5-flash"
transport: schift.transport,
});

OpenAI、Google、Anthropicのエンドポイントに直接接続します。LLM呼び出しはSchift Cloudをバイパスします(RAGは引き続きSchift Cloudを使用します)。

const agent = new Agent({
name: "Direct Agent",
instructions: "...",
model: "gpt-4o-mini",
baseUrl: "https://api.openai.com/v1",
apiKey: process.env.OPENAI_API_KEY,
});

Ollama、vLLM、LiteLLM、またはOpenAI互換エンドポイントに接続します。

const agent = new Agent({
name: "Local Agent",
instructions: "...",
model: "llama3",
baseUrl: "http://localhost:11434/v1",
});

詳細はセルフホスティングガイドを参照してください。

エージェント vs ワークフロー vs クライアント

Section titled “エージェント vs ワークフロー vs クライアント”
エージェントワークフロークライアント
使用する場合対話型Q&A、ツール呼び出し固定データパイプライン(ETL、バッチ)単純な埋め込み/検索呼び出し
ループReAct(動的、LLMが決定)DAG(固定ステップ、決定論的)なし
ツールはいブロックタイプ該当なし
メモリ会話履歴該当なし該当なし
オプションデフォルト説明
namestring必須表示名
instructionsstring必須LLM用のシステムプロンプト
modelModelId | string"gpt-4o-mini"LLMモデル識別子
transportTransportSchift Cloudトランスポート(schift.transportから)
baseUrlstringカスタムOpenAI互換エンドポイント
apiKeystring直接/セルフホストモード用のAPIキー
toolsAgentTool[][]エージェントが使用できるツール
ragRAGRAGインスタンス(ツールとして自動登録)
memoryMemoryConfig会話メモリ設定。ステートレスにする場合は省略
maxStepsnumber10最大ReActループ反復数
toolTimeoutMsnumber30000各ツール実行のタイムアウト(ミリ秒)
maxToolCallsnumbermaxSteps * 5実行あたりの最大ツール呼び出し数
parallelToolExecutionbooleanfalse1ターンあたり複数のツール呼び出しを並列実行する
skillsSkillsConfig動的スキル読み込み。Skillsを参照
extensionsArray拡張イニシャライザまたはモジュールパス
mcpMCPServerConfig[]MCPサーバー設定(将来互換性)

agent.run()に実行ごとのオプションを渡します:

const result = await agent.run("question", {
requestId: "req_abc123", // ログ全体でこの実行を追跡
signal: AbortSignal.timeout(30000), // 30秒後にキャンセル
});
オプション説明
requestIdstringロギング/トレーシング用の相関ID
signalAbortSignal中止時に実行をキャンセル

エージェントは実行中にイベントを発行します。agent.on()で購読します:

agent.on("tool_call", (event) => {
console.log(`Calling ${event.toolName}...`);
});
agent.on("agent_end", (event) => {
console.log(`Done in ${event.totalDurationMs}ms`);
});
// ワイルドカード:すべてのイベントをリッスン
agent.on("*", (event) => {
console.log(event.type, event);
});
イベント発火タイミング
agent_start実行が開始されたとき
turn_start各ReAct反復が開始されたとき
tool_callLLMがツール呼び出しを決定したとき
tool_resultツール実行が完了したとき
message_deltaLLMが最終回答テキストを生成したとき
agent_end実行が正常に完了したとき
errorエラーが発生したとき
policy_violationスキルポリシーがツール呼び出しをブロックしたとき

返されたクリーンアップ関数で購読を解除します:

const unsub = agent.on("tool_call", handler);
unsub(); // リスニングを停止

完全なイベントペイロードはEvents referenceを参照してください。

agent.run()AgentRunResultを返します:

interface AgentRunResult {
steps: AgentStep[]; // ReActループの各ステップ
output: string; // 最終回答テキスト
totalDurationMs: number; // 総実行時間
}

各ステップには、thinktool_calltool_resultfinal_answer、またはerrorのタイプがあります。