# Quickstart — ZeroDev × AgentKit (LangChain chatbot) (/smart-accounts/permissions/agentkit)

> For the complete documentation index, see [llms.txt](/llms.txt)



> **Goal**: build a minimal LangChain chatbot whose on-chain wallet is a ZeroDev smart account, all in 50 lines of code.

The tutorial is a trimmed-down version of the full example that ships with AgentKit — `typescript/examples/langchain-zerodev-chatbot`. Here we swap the CDP MPC wallet for a local private key (via **Viem**) to keep things lightweight and dependency-free.

***

<div className="fd-steps">
  <div className="fd-step">
    ## Prerequisites & install [#prerequisites--install]

    • Node 18+\
    • An **OpenAI** key (for the LLM)\
    • A **ZeroDev Project ID** (grab one from the dashboard — Base Sepolia is perfect for testing)

    ```bash
    mkdir zerodev-agentkit-bot && cd zerodev-agentkit-bot
    npm init -y
    ```

    Core runtime deps:

    <Tabs items="[&#x22;npm&#x22;,&#x22;yarn&#x22;,&#x22;pnpm&#x22;,&#x22;bun&#x22;]">
      <Tab value="npm">
        ```bash
        npm i @coinbase/agentkit @coinbase/agentkit-langchain viem @langchain/core @langchain/openai @langchain/langgraph dotenv
        ```
      </Tab>

      <Tab value="yarn">
        ```bash
        yarn add @coinbase/agentkit @coinbase/agentkit-langchain viem @langchain/core @langchain/openai @langchain/langgraph dotenv
        ```
      </Tab>

      <Tab value="pnpm">
        ```bash
        pnpm add @coinbase/agentkit @coinbase/agentkit-langchain viem @langchain/core @langchain/openai @langchain/langgraph dotenv
        ```
      </Tab>

      <Tab value="bun">
        ```bash
        bun add @coinbase/agentkit @coinbase/agentkit-langchain viem @langchain/core @langchain/openai @langchain/langgraph dotenv
        ```
      </Tab>
    </Tabs>

    Nice-to-have for TypeScript:

    <Tabs items="[&#x22;npm&#x22;,&#x22;yarn&#x22;,&#x22;pnpm&#x22;,&#x22;bun&#x22;]">
      <Tab value="npm">
        ```bash
        npm i -D ts-node typescript @types/node
        ```
      </Tab>

      <Tab value="yarn">
        ```bash
        yarn add -D ts-node typescript @types/node
        ```
      </Tab>

      <Tab value="pnpm">
        ```bash
        pnpm add -D ts-node typescript @types/node
        ```
      </Tab>

      <Tab value="bun">
        ```bash
        bun add -d ts-node typescript @types/node
        ```
      </Tab>
    </Tabs>

    ***
  </div>

  <div className="fd-step">
    ## Environment variables [#environment-variables]

    Create a `.env` file (or export vars however you prefer):

    ```bash
    OPENAI_API_KEY=
    ZERODEV_PROJECT_ID=
    # Any *testnet* private key will work here
    PRIVATE_KEY=
    # optional – defaults to base-sepolia
    NETWORK_ID=base-sepolia
    ```

    ***
  </div>

  <div className="fd-step">
    ## The code (index.ts) [#the-code-indexts]

    ```ts title="index.ts"
    import {
      AgentKit,
      ViemWalletProvider,
      ZeroDevWalletProvider,
      NETWORK_ID_TO_VIEM_CHAIN,
      walletActionProvider,
    } from "@coinbase/agentkit";

    import { getLangChainTools } from "@coinbase/agentkit-langchain";
    import { ChatOpenAI } from "@langchain/openai";
    import { createReactAgent } from "@langchain/langgraph/prebuilt";
    import { HumanMessage } from "@langchain/core/messages";

    import { privateKeyToAccount } from "viem/accounts";
    import { createWalletClient, http } from "viem";

    import * as dotenv from "dotenv";
    dotenv.config();

    function mustGet(name: string) {
      const v = process.env[name];
      if (!v) throw new Error(`Missing env var ${name}`);
      return v;
    }

    async function main() {
      /* 1️⃣  Wallet setup (Viem → ZeroDev smart account) */
      const networkId = process.env.NETWORK_ID ?? "base-sepolia";

      const signerAccount = privateKeyToAccount(mustGet("PRIVATE_KEY") as `0x${string}`);

      const viemWalletProvider = new ViemWalletProvider(
        createWalletClient({
          account: signerAccount,
          chain: NETWORK_ID_TO_VIEM_CHAIN[networkId],
          transport: http(),
        }),
      );

      const zeroDevWalletProvider = await ZeroDevWalletProvider.configureWithWallet({
        signer: viemWalletProvider.toSigner(),
        projectId: mustGet("ZERODEV_PROJECT_ID"),
        entryPointVersion: "0.7",
        networkId,
      });

      /* 2️⃣  AgentKit instance */
      const agentkit = await AgentKit.from({
        walletProvider: zeroDevWalletProvider,
        actionProviders: [walletActionProvider()],
      });

      /* 3️⃣  LangChain agent */
      const llm = new ChatOpenAI({
        openAIApiKey: mustGet("OPENAI_API_KEY"),
        model: "gpt-4o-mini",
      });

      const tools = await getLangChainTools(agentkit);

      const lcAgent = createReactAgent({ llm, tools });

      console.log("Smart-account address:", zeroDevWalletProvider.getAddress());
      console.log("Ask me to do something on-chain (type ‘exit’ to quit)…\n");

      const rl = require("readline").createInterface({ input: process.stdin, output: process.stdout });
      for await (const line of rl) {
        const prompt = line.trim();
        if (prompt.toLowerCase() === "exit") break;

        const stream = await lcAgent.stream({ messages: [new HumanMessage(prompt)] });
        for await (const chunk of stream) {
          if ("agent" in chunk) process.stdout.write(chunk.agent.messages[0].content);
          else if ("tools" in chunk) console.log("\n[tool]", chunk.tools.messages[0].content);
        }
        console.log("\n---\n");
      }
    }

    main().catch(err => console.error(err));
    ```

    Run it:

    ```bash
    npx ts-node --env-file=.env index.ts
    ```

    ### Example session [#example-session]

    ```txt
    Smart-account address: 0xAAc5…eF32
    Ask me to do something on-chain (type ‘exit’ to quit)…

    Prompt: transfer 0.001 eth to 0x000000000000000000000000000000000000dEaD
    ✅  Sent a gas-sponsored transaction – hash 0x9eab…1d3a
    ---

    Prompt: what’s my eth balance?
    Your smart-account holds ~0.42 ETH on Base Sepolia.
    ---
    ```

    ***
  </div>

  <div className="fd-step">
    ## Next steps [#next-steps]

    • Swap the local key for a **CDP** or **Privy** wallet for MPC security.\
    • Add more `actionProviders` (ERC-20, ERC-721, DeFi, …) so the agent can do *real* work.\
    • Explore the [full chatbot example](https://github.com/coinbase/agentkit/tree/main/typescript/examples/langchain-zerodev-chatbot) for persistence, autonomous mode, and more advanced prompts.

    Happy hacking 🚀
  </div>
</div>
