An inbound lead qualification and research agent built with Next.js, AI SDK, Workflow DevKit, and the Vercel Slack Adapter. Hosted on the Vercel AI Cloud.
This is meant to serve as a reference architecture to be adapted to the needs of your specific organization.
Lead agent app that captures a lead in a contact sales form and then kicks off a qualification workflow and deep research agent. It integrates with Slack to send and receive messages for human-in-the-loop feedback.
- Immediate Response - Returns a success response to the user upon submission
- Workflows - Uses Workflow DevKit to kick off durable background tasks
- Deep Research Agent - Conducts comprehensive research on the lead with a deep research agent
- Qualify Lead - Uses
generateObjectto categorize the lead based on the lead data and research report - Write Email - Generates a personalized response email
- Human-in-the-Loop - Sends to Slack for human approval before sending
- Slack Webhook - Catches a webhook event from Slack to approve or deny the email
User submits form
↓
start(workflow) ← (Workflow DevKit)
↓
Research agent ← (AI SDK Agent)
↓
Qualify lead ← (AI SDK generateObject)
↓
Generate email ← (AI SDK generateText)
↓
Slack approval (human-in-the-loop) ← (Slack integration)
↓
Send email (on approval)
- Framework: Next.js 16
- Durable execution: Workflow DevKit
- AI: Vercel AI SDK with AI Gateway
- Human-in-the-Loop: Slack Bolt + Vercel Slack Bolt adapter
- Web Search: Exa.ai
This repo contains various empty functions to serve as placeholders. To fully use this template, fill out empty functions in lib/services.ts.
Example: Add a custom implementation of searching your own knowledge base in queryKnowledgeBase.
Additionally, update prompts to meet the needs of your specific business function.
- Node.js 20+
- pnpm (recommended) or npm
- Slack workspace with bot token and signing secret
- Reference the Vercel Slack agent template docs for creating a Slack app
- You can set the permissions and configuration for your Slack app in the
manifest.jsonfile in the root of this repo. Paste this manifest file into the Slack dashboard when creating the app - Be sure to update the request URL for interactivity and event subscriptions to be your production domain URL
- If Slack environment variables are not set, the app will still run with the Slack bot disabled
- Vercel AI Gateway API Key
- Exa API key
- Clone the repository:
git clone https://github.com/vercel-labs/lead-agent.git
cd lead-agent- Install dependencies:
pnpm install- Set up environment variables:
cp .env.example .env.localConfigure the following variables:
# Vercel AI Gateway API Key
AI_GATEWAY_API_KEY
# Slack Bot
SLACK_BOT_TOKEN
SLACK_SIGNING_SECRET
SLACK_CHANNEL_ID
# Exa API Key
EXA_API_KEY- Run the development server:
pnpm dev- Open http://localhost:3000 to see the application and submit a test lead.
lead-agent/
├── app/
│ ├── api/
│ │ ├── submit/ # Form submission endpoint that kicks off workflow
│ │ └── slack/ # Slack webhook handler (receives slack events)
│ └── page.tsx # Home page
├── lib/
│ ├── services.ts # Core business logic (qualify, research, email)
│ ├── slack.ts # Slack integration
│ └── types.ts # TypeScript schemas and types
├── components/
│ ├── lead-form.tsx # Main form component
└── workflows/
└── inbound/ # Inbound lead workflow
├── index.ts # Exported workflow function
└── steps.ts # Workflow steps
This project uses Workflow DevKit to kick off a workflow that runs the agent, qualification, and other actions.
Leads are automatically categorized (QUALIFIED, FOLLOW_UP, SUPPORT, etc.) using the latest OpenAI model via the Vercel AI SDK and generateObject. Reasoning is also provided for each qualification decision. Edit the qualification categories by changing the qualificationCategorySchema in lib/types.ts.
Uses the AI SDK Agent class to create an autonomous research agent. Create new tools for the Agent and edit prompts in lib/services.ts.
Generated emails are sent to Slack with approve/reject buttons, ensuring human oversight before any outbound communication.
The Slack message is defined with Slack's Block Kit. It can be edited in lib/slack.ts.
- Add new qualification categories in the
qualificationCategorySchemaintypes.ts - Adjust the prompts and configuration for all AI calls in
lib/services.ts - Alter the agent by tuning parameters in
lib/services.ts - Add new service functions if needed in
lib/services.ts - Follow Vercel Workflow docs to add new steps to the workflow
- Create new workflows for other qualification flows, outbound outreach, etc.
MIT