Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.sendai.fun/llms.txt

Use this file to discover all available pages before exploring further.

React Native Integration

For React Native applications, you can integrate Solana Agent Kit with wallet adapters that work in a mobile environment. Here’s a simplified example using a custom wallet hook:
import { useCallback, useMemo, useState } from "react";
import { generateText, type Message } from "ai";
import { SolanaAgentKit, createVercelAITools } from "solana-agent-kit";
import TokenPlugin from "@solana-agent-kit/plugin-token";
import { Connection, PublicKey } from "@solana/web3.js";
import { useWallet } from "@/walletProviders"; // Your wallet provider hook

export function useChat({ id, initialMessages = [] }) {
  const [messages, setMessages] = useState(initialMessages);
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState(null);
  
  // Get wallet functionality from your custom wallet hook
  const { connected, address, signTransaction, signMessage, sendTransaction } = useWallet();

  // Initialize Solana tools with the connected wallet
  const solanaTools = useMemo(() => {
    if (connected && address) {
      const agent = new SolanaAgentKit(
        {
          publicKey: new PublicKey(address),
          signTransaction: async (tx) => await signTransaction(tx),
          signMessage: async (msg) => await signMessage(msg),
          sendTransaction: async (tx) => {
            const connection = new Connection("YOUR_RPC_URL", "confirmed");
            return await sendTransaction(tx, connection);
          },
          signAndSendTransaction: async (tx) => {
            const connection = new Connection("YOUR_RPC_URL", "confirmed");
            const signature = await sendTransaction(tx, connection);
            return { signature };
          },
        },
        "YOUR_RPC_URL",
        {}
      ).use(TokenPlugin);
      
      return createVercelAITools(agent, agent.actions);
    }
  }, [connected, address, signTransaction, signMessage, sendTransaction]);

  // Send a message to the AI assistant
  const sendMessage = useCallback(async (newMessage) => {
    if (!connected) {
      setError("You must be connected to your wallet to send messages");
      return;
    }

    setIsLoading(true);
    setError(null);
    
    // Update UI with user message
    setMessages((prev) => [...prev, newMessage]);

    try {
      // Generate AI response
      const res = await generateText({
        model: myProvider.languageModel("chat-model"),
        system: `You're a helpful Solana assistant that helps people carry out transactions. Connected wallet: ${address}`,
        messages: [...messages, newMessage],
        tools: solanaTools,
      });

      // Process and display assistant response
      const assistantMessage = res.response.messages.find(m => m.role === "assistant");
      if (assistantMessage) {
        setMessages((prev) => [...prev, {
          id: assistantMessage.id,
          content: assistantMessage.content,
          role: "assistant",
          parts: assistantMessage.parts,
        }]);
      }
    } catch (err) {
      setError(err.message || "An error occurred");
    } finally {
      setIsLoading(false);
    }
  }, [messages, solanaTools, connected, address]);

  return {
    messages,
    isLoading,
    error,
    sendMessage,
  };
}

Using with Vercel AI SDK

Once you’ve set up your agent and tools, you can use them with the Vercel AI SDK:
import { generateText } from "ai";

// Generate a response with your AI provider
const res = await generateText({
  model: myProvider.languageModel("your-model"),
  system: "You're a helpful Solana assistant that helps people carry out transactions on the Solana blockchain.",
  messages: messages, // Your chat messages
  tools: solanaTools, // The tools created above
});