Solana 生态系统见证了卓越的创新,尤其是在加密货币与人工智能的交叉领域,一些最激动人心的链上发展正在此展开。像 SendAI 这样的项目在推进这一愿景方面发挥着关键作用,为加密领域的人工智能代理铺平了道路。
在本文中,我们将探讨如何使用 SendAI 的 Solana Agent Kit 在 Solana 上构建我们自己的AI 代理- 这是一个开源工具包,旨在轻松在 Solana 协议上构建链上代理 AI。
与往常一样,我们将在文章末尾附上带有示例实现的 GitHub 存储库链接。
加密中的 AI 代理是什么?
加密 AI 代理是指一种由 AI 驱动的应用程序,它能够与底层区块链交互,使用自然语言提示执行交换和发送代币、读取钱包信息,甚至代表我们部署代币等任务。
具体来说,在 Solana 生态系统中,由于区块链的高吞吐量和低交易成本,人工智能代理正在迅速普及,使其成为人工智能和加密货币交叉领域增长和实验的理想环境。
要求
以下是您需要遵循本指南的内容:
-
Node.js 22.14.0 + npm(或 pnpm)
-
CoinGecko API密钥
-
Solana 钱包私钥
-
RPC网关
-
OpenAI API 密钥
-
困惑键(可选)
安装 Node
Node 是一个 JavaScript 运行时环境,它是本地执行 JavaScript 或 Typescript 所必需的。安装 node.js 的最快方法是打开一个新的控制台或终端窗口,然后输入与您的操作系统对应的命令:
# Download and install fnm: | |
winget install Schniz.fnm # Windows | |
curl -o- https://fnm.vercel.app/install | bash # Linux / Mac | |
# Download and install Node.js: | |
fnm install 22 | |
# Verify the Node.js version: | |
node -v # Should print "v22.14.0". |
获取 CoinGecko API 密钥
要获取 CoinGecko API 密钥,请前往开发者面板,然后点击右上角的“+添加新密钥” 。有关生成和设置密钥的详细说明,请参阅本指南。
在本教程中,我们将 使用 “按代币地址获取代币信息” 端点来利用 Solana Agent Kit 的 CoinGecko 集成。此端点在分析师层及以上级别可用,并且是 可选的。
获取钱包私钥
私钥允许 AI 代理代表您执行链上操作,并且是该工具正常运行所必需的。如果您使用的是Phantom,请导航至屏幕左上角的帐户设置,然后前往“设置”>“管理帐户” ,并选择要导出私钥的帐户。
在这里你应该会看到一个显示私钥的选项。点击它,然后将私钥复制到一个安全的地方。
获取 RPC 网关 URL
由于区块链是去中心化的网络,它们没有一个应用程序可以直接查询的中央服务器。相反,它们依赖于RPC 节点来处理并在用户和网络之间中继数据。要与Solana 网络交互,我们需要一个 RPC 网关 URL。
市场上有多家供应商——我们选择了 Helius,因为他们非常慷慨地提供免费计划。
继续在helius.dev上创建一个免费帐户,导航到左侧面板上的Endpoints ,然后复制 RPC URL。
获取 OpenAI API 密钥
Solana Agent Kit 使用 OpenAI API 来处理自然语言提示,因此我们需要一个 OpenAI API Key 才能使该工具运行。
要获取 API 密钥,请登录您的 OpenAI 帐户,然后导航到“组织”下的“API 密钥”。单击右上角的“+创建新密钥”并复制密钥。
获取 Perplexity API 密钥(可选)
除了 OpenAI 之外,Agent Kit 还支持可选的 Perplexity API Key,用于处理代理可能需要在网络上查找信息的情况。此步骤并非工具运行的必需步骤,但您可能会遇到代理尝试发出 Perplexity 请求并因缺少 API Key 而出错的情况。
要生成 API 密钥,请登录你的 Perplexity.ai 帐户,点击左下角的“设置”。然后前往“API”页面,选择 “+Generate”。
创建项目环境
有了凭证之后,我们现在可以专注于构建我们的代理!
首先创建一个空目录并初始化一个新的 node.js 项目:
npm innit -y |
接下来,让我们安装软件包要求并为我们的项目初始化 Typescript:
npm install solana-agent-kit typescript ts-node @types/node commander readline-sync | |
npx tsc --innit |
现在项目环境已配置完毕,请创建一个空的 .env 文件,并粘贴您在上一步中创建的 API 密钥、钱包私钥和 RPC URL:
OPENAI_API_KEY="OPENAI_KEY" | |
RPC_URL="RPC_URL" | |
SOLANA_PRIVATE_KEY="WALLET_PRIVATE_KEY" | |
COINGECKO_PRO_API_KEY="COINGECKO_PRO_API_KEY" | |
PERPLEXITY_API_KEY="PERPLEXITY_API_KEY" |
创建加密AI代理
Solana 代理套件简化了创建和管理 AI 代理的许多复杂性。首先,它使我们无需存储聊天记录并将其反馈给 LLM。它还抽象了编写自己的函数调用系统的需要,这意味着我们可以轻松地实例化代理并利用所有内置功能。
要创建代理,请在根目录中创建一个名为agent.ts的新文件。此文件将包含一个导出 AI 代理的函数,允许我们在代码库中的任何位置实例化它。
import { SolanaAgentKit, createSolanaTools } from "solana-agent-kit"; | |
import { ChatOpenAI } from "@langchain/openai"; | |
import { createReactAgent } from "@langchain/langgraph/prebuilt"; | |
import { MemorySaver } from "@langchain/langgraph"; | |
import * as dotenv from "dotenv"; | |
import * as bs58 from "bs58"; | |
dotenv.config(); | |
// Ensure the private key is Base58 encoded | |
const privateKeyBase58 = process.env.SOLANA_PRIVATE_KEY!; | |
let decodedPrivateKey: Uint8Array; | |
// Attempt to decode the private key to ensure it's in the correct format | |
try { | |
decodedPrivateKey = bs58.default.decode(privateKeyBase58); | |
if (decodedPrivateKey.length !== 64) { | |
throw new Error( | |
"Invalid Solana private key length. It should be 64 bytes." | |
); | |
} | |
} catch (error) { | |
console.error("Error decoding private key:", error); | |
throw error; | |
} | |
// We export this so that we can access CoinGecko through the Agent Kit | |
export const solanaKit = new SolanaAgentKit( | |
privateKeyBase58, | |
process.env.RPC_URL!, | |
{ | |
OPENAI_API_KEY: process.env.OPENAI_API_KEY, | |
COINGECKO_PRO_API_KEY: process.env.COINGECKO_PRO_API_KEY, | |
COINGECKO_DEMO_API_KEY: process.env.COINGECKO_DEMO_API_KEY, | |
PERPLEXITY_API_KEY: process.env.PERPLEXITY_API_KEY, | |
} | |
); | |
export async function initializeAgent() { | |
const llm = new ChatOpenAI({ | |
modelName: "gpt-4o", // Using gpt-4 as per the documentation will immediately result in a context limit error. | |
temperature: 0.7, | |
}); | |
const memory = new MemorySaver(); | |
const config = { configurable: { thread_id: "Solana Agent Kit!" } }; | |
const tools = createSolanaTools(solanaKit); | |
return createReactAgent({ | |
llm, | |
tools, | |
checkpointSaver: memory, | |
}); | |
} |
这里需要注意的是,SendAI Solana 代理套件要求钱包的私钥以 Base 58 编码,否则您在使用代理时会遇到错误。目前他们的文档中没有提到这一点,但如果不对密钥进行编码,该工具将无法工作。
与 Crypto AI Agent 交互
现在我们可以实例化 Agent 和 Kit 了,接下来该定义如何与它交互了。由于它处理自然语言提示,我们需要一个简单的接口来发送提示并显示输出。
实现此目的的一个简单方法是构建一个简单的 CLI 工具,它将允许我们使用命令行或终端与代理进行交互。
让我们在一个名为 index.ts 的新文件中定义它,它将作为我们应用程序的入口点。我们首先导入需求,定义 readline 接口,并将其保存在名为rl的常量中:
import { initializeAgent, solanaKit } from "./agent"; | |
import { HumanMessage } from "@langchain/core/messages"; | |
import readline from "readline"; | |
// Create a readline interface for interactive CLI | |
const rl = readline.createInterface({ | |
input: process.stdin, | |
output: process.stdout, | |
}); |
接下来,我们需要处理聊天会话的初始化。我们将通过定义一个名为initalizeChat()的新函数来实现这一点。在这里,我们将获取用户的输入,将其传递给代理,等待代理的响应,并将其显示在命令行工具中。为了清晰起见以及方便调试,我们包含了来自工具调用的消息。这些是代理在与各种工具(例如 CoinGecko API)交互时自身检索的 API 响应。响应的一致性取决于模型理解其所拥有函数的能力,当发生故障时,我们希望了解调用失败的原因。
const initializeChat = async () => { | |
const agent = await initializeAgent(); | |
const config = { configurable: { thread_id: "Solana Agent Kit!" } }; | |
console.log("Chat session started. Type 'exit' to quit."); | |
while (true) { | |
const userQuestion = await new Promise<string>((resolve) => { | |
rl.question("You: ", resolve); | |
}); | |
if (userQuestion.toLowerCase() === "exit") { | |
console.log("Exiting chat session..."); | |
rl.close(); | |
break; | |
} | |
// Send the user's message to the agent and display the response | |
try { | |
const stream = await agent.stream( | |
{ | |
messages: [new HumanMessage(userQuestion)], | |
}, | |
config | |
); | |
// Handle the response from the agent | |
for await (const chunk of stream) { | |
if ("agent" in chunk) { | |
console.log("Agent:", chunk.agent.messages[0].content); | |
} else if ("tools" in chunk) { | |
console.log("Tools:", chunk.tools.messages[0].content); | |
} | |
} | |
} catch (error) { | |
console.error("Error during chat interaction:", error); | |
} | |
} | |
}; |
最后,我们需要处理命令行程序的初始化:
// Command-line interface to decide between chatting or fetching token info | |
const program = async () => { | |
console.log("Welcome to the Solana Agent Chat CLI."); | |
initializeChat(); | |
}; | |
// Start the program | |
program(); |
现在剩下要做的就是启动程序,我们可以通过运行以下命令来执行此操作:
ts节点索引.ts
AI代理用例和示例
启动该程序后,您将看到如下消息:
让我们从聊天功能开始吧。
获取钱包余额
请注意,我们收到的不是单个消息响应,而是来自该工具的一系列消息。这正是代理功能得以展现的地方。查看输出,我们可以看到代理尝试调用一个函数,但输入与函数的模式不匹配,因此它提示自己重试并修复错误。经过几秒钟的反复尝试,代理成功调用了正确的函数,并返回了正确的响应,如“工具”中所示。
最后,代理解析了所调用函数的工具响应并回答了我们的问题,向我们展示了我们的 Solana 余额。
发送索拉纳
要将 Solana 发送到另一个地址,只需在提示中包含金额和地址即可。
与以前一样,代理将通过反复试验来解决所有这些问题。
部署令牌
使用 Agent Kit,您还可以通过单个提示在 Solana 上部署令牌:
获取代币信息
获取代币信息就像请求一样简单,但是与任何人工智能工具一样,可能需要一些反复试验才能让 LLM 正确执行任务。在这里,您可以看到 LLM 如何遇到错误并提示自己修复它,最终成功调用 来检索 USDC 的代币信息。
在撰写本文时,获取代币信息似乎有点不稳定,同一个提示会弹出不同的结果。这已在 OpenAI 的 GPT-4o 模型上进行了测试。为了获得更好的结果,可以考虑使用 o1 模型。或者,您可以尝试重新措辞您的提示,或者提醒法学硕士 (LLM) 它确实可以访问 CoinGecko API。
注意事项
虽然这是链上交互中令人难以置信的革命性新一步,但在使用 Agent Kit 时需要牢记以下几点:
-
通过保护私钥和 API 访问来优先考虑安全性,以防止未经授权的交易或数据泄露。
-
请注意来自 OpenAI 或 Perplexity 等第三方服务的成本以及 Solana 的交易费用,这些费用会随着频繁使用而累积。
-
与任何其他 LLM 一样,Agent Kit 偶尔可能会出现幻觉,显示错误信息或执行错误操作。与新兴技术交互时务必谨慎,避免执行任何可能危及您主钱包的敏感操作。