メインコンテンツへスキップ

AIGNE

AIGNE クラスは、フレームワークの中心的な実行エンジンです。複数の Agent を統合して複雑な AI アプリケーションを構築し、Agent のインタラクション、メッセージパッシング、および全体的な実行フローの主要な調整ポイントとして機能します。

このガイドでは、AIGNE エンジンのインスタンス化と設定方法、invoke メソッドを使用した Agent の実行、およびアプリケーションのライフサイクル管理について説明します。

AIGNE

概要

AIGNE は、Agent アプリケーション全体のためのコンテナとして機能します。その主な責務は以下の通りです。

  • Agent 管理: 登録されたすべての Agent とスキルのライフサイクルを管理します。
  • モデル設定: チャットモデルと画像モデルに対するグローバルなデフォルト設定を提供します。これは個々の Agent によって継承または上書きできます。
  • 実行コンテキスト: 各呼び出しに対して分離されたコンテキストを作成・管理し、同時操作が互いに干渉しないようにします。
  • ライフサイクル制御: アプリケーションを正常に開始および停止するメソッドを提供し、すべてのリソースが適切に処理されることを保証します。

インスタンス化

AIGNE インスタンスを作成するには、主に2つの方法があります。コンストラクタを使用してプログラムによって作成する方法と、ディレクトリから設定を読み込む方法です。

コンストラクタの使用

最も直接的な方法は、オプションオブジェクトを渡して AIGNE コンストラクタを使用することです。このアプローチは、設定がコード内で動的に管理されるアプリケーションに最適です。

AIGNE のインスタンス化

typescript
import { AIGNE } from "@aigne/core";
import { OpenAIChatModel } from "@aigne/openai";

const aigne = new AIGNE({
  name: "MyFirstAIGNEApp",
  model: new OpenAIChatModel({
    apiKey: process.env.OPENAI_API_KEY,
    model: "gpt-4o-mini",
  }),
});

設定ファイルからの読み込み

より複雑なプロジェクトでは、aigne.yaml ファイルや他の Agent 定義を含むディレクトリにアプリケーション構造を定義することがベストプラクティスです。静的メソッド AIGNE.load() はこのディレクトリを読み込み、完全に設定されたインスタンスを構築します。これにより、ロジックから設定を分離することが促進されます。

ディレクトリから AIGNE を読み込む

typescript
import { AIGNE } from "@aigne/core";
import { join } from "node:path";

const configPath = join(process.cwd(), "my-aigne-project");
const aigne = await AIGNE.load(configPath);

設定オプション

AIGNE コンストラクタは、その動作を制御するために AIGNEOptions オブジェクトを受け入れます。

  • name string — AIGNE インスタンスの一意の名前。
  • description string — インスタンスの目的の簡単な説明。
  • rootDir string — Agent とスキルの相対パスを解決するためのルートディレクトリ。
  • model ChatModel — 独自のモデルを指定しないすべての Agent に対するグローバルなデフォルトチャットモデル。詳細は モデル を参照してください。
  • imageModel ImageModel — 画像生成タスク用のグローバルなデフォルト画像モデル。
  • agents Agent[] — 初期化時にエンジンに登録する Agent インスタンスの配列。
  • skills Agent[] — 他の Agent が利用できるようにするスキル Agent の配列。
  • limits ContextLimits — すべての呼び出しに適用される、タイムアウトや最大トークン数などの実行制限。
  • observer AIGNEObserver — 実行トレースを監視およびロギングするためのオブザーバーインスタンス。

Agent とライフサイクル管理

インスタンスが作成されたら、Agent を管理し、アプリケーションのライフサイクルを制御できます。

Agent の追加

Agent はコンストラクタで提供できますが、addAgent メソッドを使用して動的に追加することもできます。各 Agent は AIGNE インスタンスにアタッチされ、グローバルモデルのような共有リソースへのアクセス権を得ます。

Agent の動的追加

typescript
import { AIAgent } from "@aigne/core";
import { AIGNE } from "@aigne/core";

// 'aigne' が既存の AIGNE インスタンスであると仮定
const aigne = new AIGNE();

const myAgent = new AIAgent({
  instructions: "You are a helpful assistant.",
});

aigne.addAgent(myAgent);

シャットダウン

クリーンな終了と適切なリソースのクリーンアップを確実にするには、shutdown メソッドを呼び出します。これは、リソースリークを防ぐために長時間実行されるアプリケーションにとって重要です。エンジンはまた、SIGINT のようなプロセスの終了シグナルも自動的に処理します。

正常なシャットダウン

typescript
// 'aigne' が既存の AIGNE インスタンスであると仮定
await aigne.shutdown();

Agent の呼び出し

invoke メソッドは、Agent を実行するための主要なエントリーポイントです。これは、単純なリクエスト-レスポンスからリアルタイムストリーミングまで、いくつかのパターンをサポートするオーバーロードされたメソッドです。

標準的な呼び出し

最も一般的な使用例は、Agent と入力メッセージを提供することです。これは、Agent の最終的な出力で解決される Promise を返します。

標準的な Agent の呼び出し

typescript
// 'aigne' と 'myAgent' が設定済みであると仮定
const result = await aigne.invoke(myAgent, {
  message: "What is the AIGNE Framework?",
});

console.log(result.message);
// 期待される出力: フレームワークに関する説明的な回答。

ストリーミングレスポンス

チャットボットのような対話型アプリケーションでは、ストリーミングを有効にして応答をインクリメンタルに受信できます。オプションで streaming: true を設定すると、AgentResponseStream が返されます。その後、ストリームを反復処理して、データチャンクが到着するたびに処理できます。

Agent レスポンスのストリーミング

typescript
import { isAgentResponseDelta } from "@aigne/core";

// 'aigne' と 'myAgent' が設定済みであると仮定
const stream = await aigne.invoke(
  myAgent,
  { message: "Tell me a short story." },
  { streaming: true }
);

let fullResponse = "";
for await (const chunk of stream) {
  if (isAgentResponseDelta(chunk)) {
    const textDelta = chunk.delta.text?.message ?? "";
    fullResponse += textDelta;
    process.stdout.write(textDelta);
  }
}

console.log("\n--- End of Story ---");

User Agent の作成

メッセージなしで Agent を呼び出すと、UserAgent が作成されます。これは、複数の呼び出しにわたって会話のコンテキストを維持するステートフルなラッパーであり、対話型の体験を構築するのに理想的です。

ステートフルな UserAgent の作成

typescript
// 'aigne' と 'myAgent' が設定済みであると仮定

// コンテキストを維持するために UserAgent を作成
const userAgent = aigne.invoke(myAgent);

// 最初のインタラクション
const response1 = await userAgent.invoke({ message: "My name is Bob." });
console.log(response1.message); // 例: 「はじめまして、ボブ!」

// 2回目のインタラクションではコンテキストが維持される
const response2 = await userAgent.invoke({ message: "What is my name?" });
console.log(response2.message); // 例: 「あなたの名前はボブです。」

invoke メソッドは、マルチ Agent チームで最終的にアクティブになった Agent を返すなど、高度なシナリオのための追加のオーバーロードを提供します。シグネチャの完全なリストについては、API リファレンスを参照してください。

AIGNE エンジンについて明確に理解できたので、次はアプリケーションの構成要素であるさまざまな種類の Agent を探る準備ができました。