😸

AIエージェントフレームワーク Solana Agent Kit v2 解説(1): 新アーキテクチャでNFT作成

に公開

はじめに

こんにちは!今回は4月18日に公開されたSolana Agent Kit v2に関してv1からの変更点を中心に私自身のキャッチアップも兼ねて調査したので解説していきます。
長くなりそうだったので、複数記事に分けて書いていこうと思います。今回は新しく導入されたアーキテクチャと新アーキテクチャでAIエージェントを利用してNFTコレクションを作ってみました。

AIエージェントフレームワーク Solana Agent Kit v2 解説記事

AIエージェントフレームワーク Solana Agent Kit v2 解説(2): 組み込みウォレット
https://zenn.dev/yukiki01/articles/0b1bafe9beeb2b
AIエージェントフレームワーク Solana Agent Kit v2 解説(3): モバイル対応とプロンプトパフォーマンス向上
https://zenn.dev/yukiki01/articles/d8ae09e8b16b3c
AIエージェントフレームワーク Solana Agent Kit v2 解説(4): MCPサーバーを立ててみる
https://zenn.dev/yukiki01/articles/07e78ee5194f9d

そもそもSolana Agent Kitとは?

Solana上でのトークン発行や多くのDefi、Dappsなどとの連携を可能にするAIエージェントフレームワークです。昨年末にリリースされて以来Solana上でのAIエージェントフレームワークとして普及してきました。

一方で下記のような課題もあったそうです。

  • Solana Agent Kit内でトランザクション発行する際に利用するWalletのプライベートキーが100%安全と言える方法で利用できない
  • Solana Agent Kitで実現できることが増えるあまりLLMに渡す際のツールコンテキストの量が増加し、それによるハルシネーションも増えた

v2では主に上記の課題に焦点を当てつつ新しい機能が増えています。

v2でのアップデート事項(1) アーキテクチャ変更

v1ではAgent Kitで利用できる全ツールがエージェントの呼び出し対象としてLLMに渡されていました。ただ、ツールが増えるにつれてハルシネーションの問題が増加し、v2ではエージェントが特定のタスクに関連するツールのみを呼び出せるようにある程度の粒度でツールがプラグインとして分割され、必要なプラグインのみを組み込むようなアーキテクチャに変更されました。

下記コードではv1で一挙にツールが定義されている様子を見ることができます。150以上のツールが定義されてますね。
https://github.com/sendaifun/solana-agent-kit/blob/dfb1bb1f1da97d8b6df31fd23bd673898341c737/src/agent/index.ts#L267-L1532

v2ではひとまとめにされていた多くのツールが下記5種類のプラグインとして分割されました。

  • Token: トークンの送金やウォレットのトークン残高の確認などトークン関連のツールがまとめられています。トークン価格を取得するツールなどもここに含まれています。
  • NFT: NFTの作成やミント、NFTマーケットプレイスへのリスティングなどNFTに関するツールがまとめられています。
  • DeFi: OrcaやRaydium、SanctumなどSolana上のDeFiプロトコルの操作ができるツールがまとめられています。
  • Blinks: BlinksというSolana上でのアクションを共有可能なリンクに変換してユーザーがより簡易にSolanaへアクセスできる機能があるのですが、そのBlinksとのやりとりができるツールがまとめられています。ただ現状はSend Arcadeというゲームの操作に関するBlinksのみが対応しているようです。Blinksの詳細についてはSuperteam Japanのゆうきさんの記事もおすすめです。
  • Misc: 上記以外でSolana上の様々なサービスやプロトコルの操作をするツールがまとめられています。

その結果v1で多くのツールが定義されていたファイルがv2ではかなりスッキリしました。必要なプラグインをuse関数を用いて組み込むような仕組みになっています。
https://github.com/sendaifun/solana-agent-kit/blob/v2/packages/core/src/agent/index.ts

Solana Agent Kit v2でNFTを作成してみる

アーキテクチャの変更に伴ってどのように使い方が変わったかをNFT作成のフローで見ていきたいと思います。v1でのNFTの作成はSolanaにおけるトークンやNFTの基礎から丁寧に解説してくださっている記事があるのでぜひこちらもご覧ください。
https://zenn.dev/mameta29/articles/402a4fe2fa319e

ライブラリインストール

nodeのバージョンはv23.11.1を利用します。
v1ではsolana-agent-kitのみのインストールでしたが、v2では利用するプラグインのインストールが必要となります。

# Soalan Agent Kitインストール
npm install solana-agent-kit

# Solana Agent Kit NFTプラグインのインストール
npm install @solana-agent-kit/plugin-nft

Agent Kit内で利用するwallet操作で利用するライブラリです。v2のEmbedded Walletとの統合については後ほど解説します。

npm install @solana/web3.js bs58

その他動作確認で利用するlangchainのライブラリもインストールします。

npm install @langchain/core @langchain/openai @langchain/langgraph dotenv

環境変数設定

.envファイルを設定します。テスト用ウォレットのプライベートキーとOpen AI APIキーを設定します。

.env
RPC_URL=https://api.devnet.solana.com
SOLANA_PRIVATE_KEY=solana_private_key
OPENAI_API_KEY=openai_api_key

エージェントの実装

mametaさんの記事を参考にターミナル上でAIとチャットできるようにagent.tsファイルを実装します。v2で変更があった箇所を中心に解説します。
v1ではSolanaAgentKitのインスタンスを作るだけで良かったですが、v2ではuseメソッドを使って必要なプラグインを組み込みます。今回はNFTを作るので.use(NFTPlugin)を追加します。

const agent = new SolanaAgentKit(wallet, process.env.RPC_URL!, {
  OPENAI_API_KEY: process.env.OPENAI_API_KEY,
}).use(NFTPlugin);

LangChainに渡すツールセットを作る際に、v1ではcreateSolanaToolsメソッドを使っていましたが、v2ではcreateLangchainToolsに名前が変わり、必要なactionを渡す引数も加わりました。

const tools = createLangchainTools(agent, agent.actions);

LangChain以外にもVercel AIのフレームワークに渡すためのツールセットにもできるようで、その場合はcreateVercelAIToolsメソッドを使ってツールセットにします。
コード全量は下記にアップロードしています。
https://github.com/yukikm/solana-agent-kit-v2-example/blob/main/nft-example/agent.ts

動作確認

node agent.tsコマンドでボットを起動します。
プロンプトを入力する表示が出るのであらかじめアップロードしておいたipfsのURIとともにPlease create a NFT collection. name: morning, symbol: MORNING, uri: https://azure-surviving-canid-559.mypinata.cloud/ipfs/bafkreihxnzn5gww7yjmccqr4yuc5277ggcmupvpqcdwcypdufjxjz3bw5uというようなNFT collectionを作成するプロンプトを入力してEnterボタンを押します。

Chat with Solana Agent Kit (type 'exit' to quit)
--------------------------------------------
You: Please create a NFT collection. name: morning, symbol: MORNING, uri: https://azure-surviving-canid-559.mypinata.cloud/ipfs/bafkreihxnzn5gww7yjmccqr4yuc5277ggcmupvpqcdwcypdufjxjz3bw5u

しばらくすると下記のようなメッセージが返ってきました。

Agent: {"status":"success","message":"Collection deployed successfully","collectionAddress":"2u8B6ieGmX4ysPA5wmr9bHKDS4ytpn15EmWPEXStrDHn","transaction":"5DzixP76GQeTs6AX323z2M6oRa6kQdejdrwni4XyMsv1GRMoRxQbW5snsLduB4zbCLazcpXs8doYfnUFHVv7DkMN","name":"morning"}The NFT collection "morning" has been deployed successfully. The collection address is `2u8B6ieGmX4ysPA5wmr9bHKDS4ytpn15EmWPEXStrDHn`.
--------------------------------------------

2u8B6ieGmX4ysPA5wmr9bHKDS4ytpn15EmWPEXStrDHnのアドレスでNFT collectionが作られたということでExplorerを確認してみると無事NFT collectionが作成されました。

まとめ

アーキテクチャ変更に伴う大きな変更点は利用したいプラグイン用ライブラリをインストールして設定する部分だと思います。useメソッドを利用してプラグインを組み込む所とツールセットを作るメソッド名が変わった所以外はv1と同じような使い方ができそうです。

次の記事では埋め込みウォレットのサポートについて解説しようと思います。

Discussion