diff --git a/docs/docs.json b/docs/docs.json index 95a4c44acf..cff62e6d09 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -367,6 +367,7 @@ "guides/example-projects/product-image-generator", "guides/example-projects/realtime-csv-importer", "guides/example-projects/realtime-fal-ai", + "guides/example-projects/smart-spreadsheet", "guides/example-projects/turborepo-monorepo-prisma", "guides/example-projects/vercel-ai-sdk-deep-research", "guides/example-projects/vercel-ai-sdk-image-generator" diff --git a/docs/guides/ai-agents/overview.mdx b/docs/guides/ai-agents/overview.mdx index 3c3da8b2dd..0c27982a45 100644 --- a/docs/guides/ai-agents/overview.mdx +++ b/docs/guides/ai-agents/overview.mdx @@ -59,6 +59,13 @@ description: "Real world AI agent example tasks using Trigger.dev" > Use the Vercel AI SDK to generate comprehensive PDF reports using a deep research agent. + + Enrich company data using Exa search and Claude with real-time streaming results. + ## Agent fundamentals diff --git a/docs/guides/example-projects/smart-spreadsheet.mdx b/docs/guides/example-projects/smart-spreadsheet.mdx new file mode 100644 index 0000000000..ab1cc48a45 --- /dev/null +++ b/docs/guides/example-projects/smart-spreadsheet.mdx @@ -0,0 +1,92 @@ +--- +title: "Smart Spreadsheet" +sidebarTitle: "Smart Spreadsheet" +description: "An AI-powered company enrichment tool that uses Exa search and Claude to extract verified company data with source attribution." +--- + +import RealtimeLearnMore from "/snippets/realtime-learn-more.mdx"; + +## Overview + +Smart Spreadsheet is an AI-powered tool that enriches company data on demand. Input a company name or website URL and get verified information including industry, headcount, and funding details; each with source attribution. Results appear in the frontend in real-time as each task completes. + +- A [Next.js](https://nextjs.org/) app with [Trigger.dev](https://trigger.dev/) for background tasks +- [Exa](https://exa.ai/) – an AI-native search engine that returns clean, structured content ready for LLM extraction +- [Claude](https://anthropic.com/) via the [Vercel AI SDK](https://sdk.vercel.ai/) for data extraction +- [Supabase](https://supabase.com/) PostgreSQL database for persistence +- Trigger.dev [Realtime](/realtime/overview) for live updates to the frontend + +## Video + + + +## GitHub repo + + + Click here to view the full code for this project in our examples repository on GitHub. You can + fork it and use it as a starting point for your own project. + + +## How it works + +The enrichment workflow: + +1. **Trigger enrichment** – User enters a company name or URL in the spreadsheet UI +2. **Parallel data gathering** – Four subtasks run concurrently to fetch basic info, industry, employee count, and funding details +3. **AI extraction** – Each subtask uses Exa search + Claude to extract structured data with source URLs +4. **Real-time updates** – Results appear in the frontend as each subtask completes +5. **Persist results** – Enriched data is saved to Supabase with source attribution + +## Features + +- **Parallel processing** – All four enrichment categories run simultaneously using [batch.triggerByTaskAndWait](/triggering#batch-trigger-by-task-and-wait) +- **Source attribution** – Every data point includes the URL it was extracted from +- **Live updates** – Results appear in the UI as each task completes using [Realtime](/realtime/overview) +- **Structured extraction** – Zod schemas ensure consistent data output from Claude + +## Key code patterns + +### Parallel task execution + +The main task triggers all four enrichment subtasks simultaneously using `batch.triggerByTaskAndWait`: + +```ts src/trigger/enrich-company.ts +const { runs } = await batch.triggerByTaskAndWait([ + { task: getBasicInfo, payload: { companyName, companyUrl } }, + { task: getIndustry, payload: { companyName, companyUrl } }, + { task: getEmployeeCount, payload: { companyName, companyUrl } }, + { task: getFundingRound, payload: { companyName, companyUrl } }, +]); +``` + +### Live updates from child tasks + +Each subtask uses `metadata.parent.set()` to update the parent's metadata as soon as data is extracted: + +```ts src/trigger/get-basic-info.ts +// After Claude extracts the data, update the parent task's metadata +metadata.parent.set("website", object.website); +metadata.parent.set("description", object.description); +``` + +The frontend subscribes to these metadata updates using [Realtime](/realtime/overview), so users see each field populate as it's discovered. + +## Relevant code + +| File | Description | +| ---------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| [`src/trigger/enrich-company.ts`](https://github.com/triggerdotdev/examples/blob/main/smart-spreadsheet/src/trigger/enrich-company.ts) | Main orchestrator that triggers parallel subtasks and persists results | +| [`src/trigger/get-basic-info.ts`](https://github.com/triggerdotdev/examples/blob/main/smart-spreadsheet/src/trigger/get-basic-info.ts) | Extracts company website and description | +| [`src/trigger/get-industry.ts`](https://github.com/triggerdotdev/examples/blob/main/smart-spreadsheet/src/trigger/get-industry.ts) | Classifies company industry | +| [`src/trigger/get-employee-count.ts`](https://github.com/triggerdotdev/examples/blob/main/smart-spreadsheet/src/trigger/get-employee-count.ts) | Finds employee headcount | +| [`src/trigger/get-funding-round.ts`](https://github.com/triggerdotdev/examples/blob/main/smart-spreadsheet/src/trigger/get-funding-round.ts) | Discovers latest funding information | + + diff --git a/docs/guides/introduction.mdx b/docs/guides/introduction.mdx index 3671a0dfb0..16245c92f5 100644 --- a/docs/guides/introduction.mdx +++ b/docs/guides/introduction.mdx @@ -63,6 +63,7 @@ Example projects are full projects with example repos you can fork and use. Thes | [Python web crawler](/guides/python/python-crawl4ai) | Use Python, Crawl4AI and Playwright to create a headless web crawler with Trigger.dev. | — | [View the repo](https://github.com/triggerdotdev/examples/tree/main/python-crawl4ai) | | [Realtime CSV Importer](/guides/example-projects/realtime-csv-importer) | Upload a CSV file and see the progress of the task streamed to the frontend. | Next.js | [View the repo](https://github.com/triggerdotdev/examples/tree/main/realtime-csv-importer) | | [Realtime Fal.ai image generation](/guides/example-projects/realtime-fal-ai) | Generate an image from a prompt using Fal.ai and show the progress of the task on the frontend using Realtime. | Next.js | [View the repo](https://github.com/triggerdotdev/examples/tree/main/realtime-fal-ai-image-generation) | +| [Smart Spreadsheet](/guides/example-projects/smart-spreadsheet) | Enrich company data using Exa search and Claude with real-time streaming results. | Next.js | [View the repo](https://github.com/triggerdotdev/examples/tree/main/smart-spreadsheet) | | [Turborepo monorepo with Prisma](/guides/example-projects/turborepo-monorepo-prisma) | Use Prisma in a Turborepo monorepo with Trigger.dev. | Next.js | [View the repo](https://github.com/triggerdotdev/examples/tree/main/monorepos/turborepo-prisma-tasks-package) | | [Vercel AI SDK image generator](/guides/example-projects/vercel-ai-sdk-image-generator) | Use the Vercel AI SDK to generate images from a prompt. | Next.js | [View the repo](https://github.com/triggerdotdev/examples/tree/main/vercel-ai-sdk-image-generator) | | [Vercel AI SDK deep research agent](/guides/example-projects/vercel-ai-sdk-deep-research) | Use the Vercel AI SDK to generate comprehensive PDF reports using a deep research agent. | Next.js | [View the repo](https://github.com/triggerdotdev/examples/tree/main/vercel-ai-sdk-deep-research-agent) |